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

Часы на atmega8515

08.01.2019, 15:12. Просмотров 804. Ответов 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  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2019, 15:12
Ответы с готовыми решениями:

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

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

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

Генератор на ATmega8515
Народ может кто делал НЧ генератор на этом контроллере. Меня больше интересует прошивка, т.к. я в...

ATMega8515 и обучение
Здравствуйте! Решил я заняться изучением микроконтроллеров. надыбал программатор stk500. В...

7
alexey6689
88 / 60 / 14
Регистрация: 15.11.2012
Сообщений: 382
Завершенные тесты: 1
09.01.2019, 01:50 2
А какого рода проблемы-то? Телепатов здесь, скорее всего, нет.
PS. А вообще бросайте этот mega8515, мой личный опыт говорит, что и 90s8515, и его "перемаркированный" потомок mega8515 очень легко "слетают" по любым наводкам. Используйте вместо него mega16 например - проблем со слетом от наводок на нем не наблюдалось.
0
pyzhman
1152 / 510 / 74
Регистрация: 15.05.2012
Сообщений: 2,902
09.01.2019, 09:08 3
Зачем всё так сложно - через работу с внешними устройствами? ЖКИ можно напрямую управлять с мк с помощью библиотеки lcd.h, которая есть в составе CVAVR.
0
Anastasia_Sail
0 / 0 / 0
Регистрация: 23.04.2017
Сообщений: 64
09.01.2019, 15:47  [ТС] 4
Не работает прерывания. По сути, секунды должны прибавляться но никаких изменений нет.
0
09.01.2019, 15:47
locm
2224 / 982 / 124
Регистрация: 28.10.2011
Сообщений: 3,299
Записей в блоге: 6
09.01.2019, 16:18 5
Цитата Сообщение от Anastasia_Sail Посмотреть сообщение
секунды должны прибавляться но никаких изменений нет.
volatile.
0
alexey6689
88 / 60 / 14
Регистрация: 15.11.2012
Сообщений: 382
Завершенные тесты: 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
Модератор
7818 / 5817 / 758
Регистрация: 14.02.2011
Сообщений: 19,941
Завершенные тесты: 1
09.01.2019, 16:34 7
Цитата Сообщение от Anastasia_Sail Посмотреть сообщение
Не работает прерывания.
А почему они должны срабатывать?
в коде не нашел строк с разрешением прерываний
0
Anastasia_Sail
0 / 0 / 0
Регистрация: 23.04.2017
Сообщений: 64
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
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2019, 18:30

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

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

Подключение ЖКИ к atmega8515
Пытаюсь подключить напрямую ЖКИ к атмега, но видимо что-то не так. Может вы подскажете что не так...


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

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

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