Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Anastasia_Sail
0 / 0 / 0
Регистрация: 23.04.2017
Сообщений: 33
1

Часы на atmega8515

08.01.2019, 15:12. Просмотров 168. Ответов 7
Метки нет (Все метки)

Помогите сделать хотя-бы просто часы на atmega8515.
Собираю в протеусе. Задача сделать часы-будильник, с термометром, но у меня начались проблемы на самой реализации часов.
Буду рада любой помощи!



C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <mega8515.h>
#include <delay.h>
#include <stdio.h>
#include <1wire.h>
#include <ds18b20.h>
 
#asm
   .equ __w1_port=0x18 ; PORTB
   .equ __w1_bit=2
#endasm
 
unsigned char *LCD_CMD=(unsigned char *)0x8004;//Регистр управления ЖКИ
unsigned char *LCD_DATA=(unsigned char *)0x8005;//Регистр данных ЖКИ
 
unsigned char ClockHour ;
unsigned char ClockMinute; 
unsigned char ClockSek ;
unsigned char BuzzerHour ;
unsigned char BuzzerMinute ;
unsigned char BuzzerSek ;
float    Temperature;
 
interrupt [TIM0_OVF] void timer_overflow0 (void) 
{
// Place your code here
  TCNT1H=0;
  TCNT1L=0;
  ClockSek++; // инкрементируем секунду 
  BuzzerSek++;     
  *LCD_CMD=0x0000001;
}
//инициализация ЖКИ
void init_gki()
{
    delay_ms(20);//пауза 20мс
    *LCD_CMD=0x30;//1 Установка парамметров
    delay_ms(10);
    *LCD_CMD=0x30;//2 Установка парамметров
    delay_ms(1);
    *LCD_CMD=0x30;//3 Установка парамметров
    delay_ms(40);
    *LCD_CMD=0x38;//4 Установка разрядности интерфейса 8 бит (Function set)
    delay_ms(40);
    *LCD_CMD=0x0e;//5 Установка парамметров курсора (Display on/off control)
    delay_ms(5);
    *LCD_CMD=0x06;//6 После ввода символа автоматически перемещает на 1 вправо 
    delay_ms(1);
 
}
//Функция установки курсора в позицию х,у 
void set_cursor(unsigned char x,unsigned char y)
{
    switch (y)
    {
        case 0: y=0; break;
        case 1: y=0x40; break;
        case 2: y=0x10; break;
        case 3: y=0x50; break;
    }
    y=y+x;
    y=(y | 0x80);//Установили старший бит
    *LCD_CMD=y;//Установили курсор в позицию
    delay_us(100);
}     
//Вывод строковой переменной 
void string_to_hd(unsigned char x, unsigned char y, char *string)
{
    set_cursor(x,y);
    while((y = *string++))
    {
        *LCD_DATA = y;
        delay_us(100);
    }
}
 
void main()
{   
    char STR[]; 
     TIMSK |= (1 << TOIE0);
  TCCR0 = 0b00000011;
    // Timer(s)/Counter(s) Interrupt(s) initialization
   
    MCUCR=(MCUCR | 0b11000000);//срабатывает по низкому уровню
              
    w1_init();
    ds18b20_init(0, -20, 50, DS18B20_12BIT_RES);   
    init_gki();//Инициализация ЖКИ        
                   
    while(1){     
        set_cursor(0,0);
        Temperature=ds18b20_temperature(0);  
        sprintf(STR,"Temp: %.2f\xdf C", Temperature);
        string_to_hd(0, 3, STR);                                 
       // delay_ms(20);    
       if(PINB.0==0){
            if (PINB.4==0) // если нажата первая кнопка
           {
              delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
               ClockMinute++; // к значению минуты добавляем еденицу 
           }
 
           if (PINB.3==0) // если нажата вторая кнопка
          {
             delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
             ClockHour++; // к значению часов добавляем единицу
           }
                ///// Условия часов. 
           if(ClockSek==60) // если сек = 60 
           {
              ClockMinute++; // добавляем 1 к переменной "минута" 
              ClockSek=0; // зануляем переменную "секунда"
           }
            if(ClockMinute==60) // если мин = 60 
            {
               ClockHour++; // добавляем 1 к переменной "час" 
               ClockMinute=0; // зануляем переменную "минута"
             }
          if (ClockHour==24) // так как у нас часы имеют 24 часовый формат
           { // при достижении 24 часов, онулируем все переменные.
             ClockHour=0;
             ClockMinute=0;
             ClockSek=0;
            } 
       } 
       //else { ClockHour=0; ClockMinute=0; ClockSek=0;}
       /*     
       if(PINB.1==0){
            if (PINB.4==0) // если нажата первая кнопка
           {
              delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
               BuzzerMinute++; // к значению минуты добавляем еденицу 
           }
 
           if (PINB.3==0) // если нажата вторая кнопка
          {
             delay_ms(250); // задержка 1/4 сек. (для удобства) выбора
             BuzzerHour++; // к значению часов добавляем еденицу
           }
                ///// Условия часов.
            if(BuzzerMinute==60) // если мин = 60 
            {
               BuzzerHour++; // добавляем 1 к переменной "час" 
               BuzzerMinute=0; // зануляем переменную "минута"
             }
          if (BuzzerHour==24) // так как у нас часы имеют 24 часовый формат
           { // при достижении 24 часов, аннулируем все переменные.
             BuzzerHour=0;
             BuzzerMinute=0;
            } 
       }   */
       //*LCD_CMD=0x0000001;   
       sprintf(STR,"%d : %d : %d", ClockHour/10+0x18, ClockMinute/10+0x18, ClockSek/10+0x18);
       string_to_hd(0,0,STR);
       // sprintf(STR," Buzzer  %d : %d ", BuzzerHour/10+0x18, BuzzerMinute/10+0x18);
      // string_to_hd(0,1,STR);   
       
       
    }
}
0
Миниатюры
Часы на atmega8515  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2019, 15:12
Ответы с готовыми решениями:

АЦП на atmega8515
Здравствуйте, я начинающий программист. совсем ещё как бы чайник, разобрал пока самое простенькое...

Фьюзы Atmega8515
Собираю эту схему http://g-a-v.pisem.net/cdplr.htm и там написано : &quot;При программировании...

ATMega8515. ШИМ
Срочно завтар экзамен, сдавать нужно, программа для микро контроллера ATMega8535. Задание: ...

ATmega8515 + SRAM
Доброго всем время суток ! Ковыряю/ремонтирую древний промышленный девайс. Суть: Есть Атмега8515...

AVR ATmega8515
Здравствуйте! Может кто нибудь работал с этим микроконтроллером. Удобно ли с ним работать, легко ли...

7
alexey6689
59 / 35 / 10
Регистрация: 15.11.2012
Сообщений: 186
Завершенные тесты: 1
09.01.2019, 01:50 2
А какого рода проблемы-то? Телепатов здесь, скорее всего, нет.
PS. А вообще бросайте этот mega8515, мой личный опыт говорит, что и 90s8515, и его "перемаркированный" потомок mega8515 очень легко "слетают" по любым наводкам. Используйте вместо него mega16 например - проблем со слетом от наводок на нем не наблюдалось.
0
pyzhman
785 / 480 / 65
Регистрация: 15.05.2012
Сообщений: 2,718
09.01.2019, 09:08 3
Зачем всё так сложно - через работу с внешними устройствами? ЖКИ можно напрямую управлять с мк с помощью библиотеки lcd.h, которая есть в составе CVAVR.
0
Anastasia_Sail
0 / 0 / 0
Регистрация: 23.04.2017
Сообщений: 33
09.01.2019, 15:47  [ТС] 4
Не работает прерывания. По сути, секунды должны прибавляться но никаких изменений нет.
0
locm
2179 / 905 / 117
Регистрация: 28.10.2011
Сообщений: 2,910
Записей в блоге: 6
09.01.2019, 16:18 5
Цитата Сообщение от Anastasia_Sail Посмотреть сообщение
секунды должны прибавляться но никаких изменений нет.
volatile.
0
alexey6689
59 / 35 / 10
Регистрация: 15.11.2012
Сообщений: 186
Завершенные тесты: 1
09.01.2019, 16:28 6
Товарищ locm хотел сказать, что объявления
C
1
2
unsigned char ClockSek ;
unsigned char BuzzerSek ;
следует прописать как
C
1
2
volatile unsigned char ClockSek ;
volatile unsigned char BuzzerSek ;
Видимо, большая крутость и занятость не оставляет ему на это времени.
0
ValeryS
Модератор
7401 / 5599 / 710
Регистрация: 14.02.2011
Сообщений: 19,047
Завершенные тесты: 1
09.01.2019, 16:34 7
Цитата Сообщение от Anastasia_Sail Посмотреть сообщение
Не работает прерывания.
А почему они должны срабатывать?
в коде не нашел строк с разрешением прерываний
0
Anastasia_Sail
0 / 0 / 0
Регистрация: 23.04.2017
Сообщений: 33
09.01.2019, 18:30  [ТС] 8
Даже если и так
И насчёт использования жки как внешнего устройства, по заданию сказали сделать так, как курсачи дают, так и мучаемся, их делая

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <mega8515.h>
#include <delay.h>
#include <stdio.h>
#include <1wire.h>
#include <ds18b20.h>
 
#asm
   .equ __w1_port=0x18 ; PORTB
   .equ __w1_bit=2
#endasm
   
unsigned char *LCD_CMD=(unsigned char *)0x8004;//Регистр управления ЖКИ
unsigned char *LCD_DATA=(unsigned char *)0x8005;//Регистр данных ЖКИ
 
int ClockHour = 0, ClockMinute = 59, ClockSek = 55 ;
int BuzzerHour=0,  BuzzerMinute=0;
float    Temperature;
  char STR[]; 
  
                     
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
    ClockSek++;
   if(ClockSek>59)
   {
      ClockSek=0;  
      ClockMinute++;
      //LCD_CMD=0x0000001;
   }       
   if(ClockMinute>59){  
   ClockMinute=0;
   ClockSek=0; 
     ClockHour++;
   }  
   if(ClockHour>59){
    ClockSek=0;
    ClockMinute=0;
    ClockHour=0;
   }
   
  TCNT1=0;
  //TCNT1L=0;
}                   
 
//инициализация ЖКИ
void init_gki()
{
    delay_ms(20);//пауза 20мс
    *LCD_CMD=0x30;//1 Установка парамметров
    delay_ms(10);
    *LCD_CMD=0x30;//2 Установка парамметров
    delay_ms(1);
    *LCD_CMD=0x30;//3 Установка парамметров
    delay_ms(40);
    *LCD_CMD=0x38;//4 Установка разрядности интерфейса 8 бит (Function set)
    delay_ms(40);
    *LCD_CMD=0x0e;//5 Установка парамметров курсора (Display on/off control)
    delay_ms(5);
    *LCD_CMD=0x06;//6 После ввода символа автоматически перемещает на 1 вправо 
    delay_ms(1);
 
}
//Функция установки курсора в позицию х,у 
void set_cursor(unsigned char x,unsigned char y)
{
    switch (y)
    {
        case 0: y=0; break;
        case 1: y=0x40; break;
        case 2: y=0x10; break;
        case 3: y=0x50; break;
    }
    y=y+x;
    y=(y | 0x80);//Установили старший бит
    *LCD_CMD=y;//Установили курсор в позицию
    delay_us(100);
}     
//Вывод строковой переменной 
void string_to_hd(unsigned char x, unsigned char y, char *string)
{
    set_cursor(x,y);
    while((y = *string++))
    {
        *LCD_DATA = y;
        delay_us(100);
    }
}
 
void main()
{  
/* 
TCCR0=((1<<CS02) | (0<<CS01) | (0<<CS00));//регист управления таймера-счеткчика 0 (256)
TIMSK=(1<<TOIE0);//регистр масок прерываний, устанавливает  прерывания по переполнению ТС 0
      */
 
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1=0x00;
 
TIMSK=0x10;     
 
#asm("sei")  
    MCUCR=(MCUCR | 0b11000000);//срабатывает по низкому уровню
              
    w1_init();
    ds18b20_init(0, -20, 50, DS18B20_12BIT_RES);   
    init_gki();//Инициализация ЖКИ        
                   
    while(1){  
       // set_cursor(0,0);
        Temperature=ds18b20_temperature(0);                                              
      
       if(PINB.0==0){
            if (PINB.4==0) // если нажата первая кнопка
               ClockMinute++; // к значению минуты добавляем единицу 
 
           if (PINB.3==0) // если нажата вторая кнопка
             ClockHour++; // к значению часов добавляем единицу                
       } 
        
       if(PINB.1==0){
            if (PINB.4==0) // если нажата первая кнопка
               BuzzerMinute++; // к значению минуты добавляем еденицу 
 
           if (PINB.3==0) // если нажата вторая кнопка
             BuzzerHour++; // к значению часов добавляем еденицу
               
       }   
            
       sprintf(STR,"  %d : %d : %d", ClockHour, ClockMinute, ClockSek);
       string_to_hd(0,1,STR); 
       timer();
       sprintf(STR," Buzzer  %d : %d ", BuzzerHour, BuzzerMinute);
       string_to_hd(0,2,STR); 
       sprintf(STR,"Temp: %.2f\xdf C", Temperature);
       string_to_hd(0, 3, STR);         
    } ;
}
0
09.01.2019, 18:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2019, 18:30

Зажечь светодиод по кнопке на ATMega8515
Есть микроконтроллер ATMEGA 8515. Требуется считывать порты В (0 и 1 пина). И при обнаружении 1 на...

не хочет прожигать atmega8515 в isp
Добрый день. Прожигал мк в режиме ysp, потом поставил фьюзовый бит отвечающий за тактовый сигнал...

Мигание светодиодом на ATMega8515 (Proteus)
Доброго времени дня. Подскажите, как реализовать мигание светодиодом определенное количество раз?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru