Часы на DS3231 и ATMEGA8

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 1
Зарегистрирован: Пн апр 10, 2017 18:55:28
Откуда: Украина, Сумы

Сообщение GermanSumy »

Доброго здоровья всем форумчанам. В общем сделал я часы как в этой теме http://cxem.net/mc/mc316.php, всё хорошо, они работают, но захотелось внести в программу некоторые изменения. Когда пытаюсь компилировать в Аtmel Studio то сразу вылетает 88 ероров (скрин экрана прилагается). А когда пытаюсь то же скомпилировать в CVAVR то вылазит всего 1ерор:


Error: D:\...\(67): missing ';'

Проверял, тчк. с запятой стоят правильно. Библиотеки есть все и подключены.
Спойлер#define F_CPU 8000000L

#include <io.h>
#include <interrupt.h>
#include <delay.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <eeprom.h>


// библиотека преобразования двоично-десятичной системы и вывод на LCD
#include "bcd.h"

// библиотеки ЖК
#include "lcd_lib_2.h"

// библиотеки I2C
#include "i2c.h"

// библиотека кнопок
#include "buttons.h"

// дефайны адресов микросхемы
#define RTC_adr_write 0b11010000
#define RTC_adr_read 0b11010001

// переменные времени
unsigned char hour;
unsigned char min;
unsigned char sec;

// переменные даты
unsigned char day;
unsigned char wday;
unsigned char month;
unsigned char year;

// переменные температуры
unsigned int temp;
unsigned char t1;
unsigned char t2;

// переменные будильника
unsigned char alarm_hour;
unsigned char alarm_min;
unsigned char alarm_on;

// переменные настройки
unsigned char i=0; // переменная кнопок
unsigned char al_on; // переменная состояния будильника (вкл / выкл)
unsigned char al; // переменная сработки будильника
unsigned char j=1; // подуровни меню


#define LED_PORT PORTB
#define LED_DDR DDRB
#define LED PB0


uint8_t alarm_hour_ee EEMEM = 0;
uint8_t alarm_min_ee EEMEM = 0;
uint8_t alarm_on_ee EEMEM = 0;


// пользовательский символ колокольчика для индикаци будильника
const uint8_t alarm[] PROGMEM = {0x02,0x04,0x04,0x0E,0x0E,0x1F,0x1F,0x04};

// ============
// ============
// DS3231

// функции преобразования чисел (для корректного отображения значений) ================
unsigned char bcd (unsigned char data)
{
unsigned char bc;

bc=((((data&(1<<6))|(data&(1<<5))|(data&(1<<4)))*0x0A)>>4)+((data&(1<<3))|(data&(1<<2))|(data&(1<<1))|(data&0x01));

return bc;
}

unsigned char bin(unsigned char dec){

char bcd;

char n, dig, num, count;

num = dec;
count = 0;
bcd = 0;
for (n=0; n<4; n++) {
dig = num%10;
num = num/10;
bcd = (dig<<count)|bcd;
count += 4;
}

return bcd;
}


// функции с часами =============

// инициализация начальных установок
void RTC_init(void){

i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x0E); // передача адреса памяти
i2c_send_byte(0b00100000); // запустить преобразование температуры и выход на 1 Гц
i2c_send_byte(0b00001000); // разрешить выход 32 кГц
i2c_stop_cond(); // остановка i2c

}


// получение времени и даты
void RTC_read_time(void){

i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x00); // передача адреса памяти
i2c_stop_cond(); // остановка i2c

i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_read); // передача адреса устройства, режим чтения
sec = bcd(i2c_get_byte(0)); // чтение секунд, ACK
min = bcd(i2c_get_byte(0)); // чтение минут, ACK
hour = bcd(i2c_get_byte(0)); // чтение часов, ACK
wday = bcd(i2c_get_byte(0)); // чтение день недели, ACK
day = bcd(i2c_get_byte(0)); // чтение число, ACK
month = bcd(i2c_get_byte(0)); // чтение месяц, ACK
year = bcd(i2c_get_byte(1)); // чтение год, NACK
i2c_stop_cond(); // остановка i2c

}


// установка времени
void RTC_write_time(unsigned char hour1,unsigned char min1, unsigned char sec1){

i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x00); // передача адреса памяти
i2c_send_byte(bin(sec1)); // 0x00 скунды (целесообразно ли задавать еще и секунды?)
i2c_send_byte(bin(min1)); // 0x01 минуты
i2c_send_byte(bin(hour1)); // 0x02 часы
i2c_stop_cond(); // остановка i2c

}


// установка даты
void RTC_write_date(unsigned char wday, unsigned char day, unsigned char month, unsigned char year){

i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x03); // передача адреса памяти
i2c_send_byte(bin(wday)); // 0x03 адень недели (воскресенье - 1, пн 2, вт 3, ср 4, чт 5, пт 6, сб 7)
i2c_send_byte(bin(day)); // 0x04 день месяц
i2c_send_byte(bin(month)); // 0x05 месяц
i2c_send_byte(bin(year)); // 0x06 год
i2c_stop_cond(); // остановка i2c

}


// чтение температуры
void RTC_read_temper(void){


i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x11); // передача адреса памяти
i2c_stop_cond(); // остановка i2c

i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_read); // передача адреса устройства, режим чтения
t1 = i2c_get_byte(0); // чтение MSB температуры
t2 = i2c_get_byte(1); // чтение LSB температуры
i2c_stop_cond(); // остановка i2c

t2=(t2>>7); // сдвигаем на 6 - точность 0,25 (2 бита)
// сдвигаем на 7 - точность 0,5 (1 бит)
t2=t2*5;

}

// вывод дня недели
void put_wday (void) {
if (wday==1) {LCD_SendStr("Sun");}
if (wday==2) {LCD_SendStr("Mon");}
if (wday==3) {LCD_SendStr("Tue");}
if (wday==4) {LCD_SendStr("Wed");}
if (wday==5) {LCD_SendStr("Thu");}
if (wday==6) {LCD_SendStr("Fri");}
if (wday==7) {LCD_SendStr("Sat");}
}


//
// ============
// ============

ISR (TIMER0_OVF_vect) // вектор прерывания по переполнеинию таймера 0
{

BUT_Debrief (); // опрос 4х кнопок

}

int main (void)
{


// инициализации
LCD_Init();
i2c_init();
BUT_Init();
RTC_init();


LED_DDR |= (1<<LED);
LED_PORT &= ~(1<<LED);

// загрузить из eeprom значения будильника
alarm_hour = eeprom_read_byte(&alarm_hour_ee);
alarm_min = eeprom_read_byte(&alarm_min_ee);
alarm_on = eeprom_read_byte(&alarm_on_ee);


LCD_SetUserChar(alarm, 1); // загружаем пользовательский символ в ОЗУ дисплея


//инициализация таймера 0
TCCR0 |= 0b00000101; // Включаем предделитель 1/1024
TIMSK |= 0b00000001; // разрешаем прерывания по переполнению таймера T0.
TCNT0=0; // Обнуляем счётный регистр таймера T0

sei(); // глобально разрешить прерывания

main:
LCD_Clear();

while (1)
{

i=BUT_GetKey();

// вывод времени
RTC_read_time ();

LCD_Goto(0,0);
BCD_2Lcd(hour);
LCD_WriteData(':');
BCD_2Lcd(min);
LCD_WriteData(':');
BCD_2Lcd(sec);

// вывод даты
LCD_Goto(0,1);
BCD_2Lcd(day);
LCD_WriteData('/');
BCD_2Lcd(month);
LCD_WriteData('/');
BCD_2Lcd(year);

// вывод дня недели
LCD_Goto(10,0);
put_wday ();

// вывод температуры
RTC_read_temper();
LCD_Goto(10,1);
LCD_WriteData('+');
BCD_2Lcd(t1);
LCD_WriteData(',');
BCD_1Lcd(t2);

LCD_WriteData('C');

// будильник
if(alarm_on==1) {
if(alarm_hour==hour) {
if(alarm_min==min) {
if(sec==1) {
al=1;
}
}
}
}


// отображение включенности будильника
if (alarm_on==1) {LCD_Goto(15,0); LCD_WriteData(1);}
else {LCD_Goto(15,0); LCD_WriteData(' ');}


// отключение сигнала будильника (сброс флага при нажатии кнопки 3)
i=BUT_GetKey();

if (i==3)
{ al=0; }


// при сработке будильника совершит действие
if (al==1)
{

LED_PORT |= (1<<LED);

}

else
{

LED_PORT &=~(1<<LED);

}

//_delay_ms(200);


//=== дальше настройки ===========
//==============
// кнопка 1 заходит в меню и перелистывает уровни менюшки
// кнопка 2 увеличивает переменную на 1 (защита от переполнения предусмотрена)
// кнопка 3 немедленно выходит из меню настроек
//


if (i==1)
{

LCD_Clear();

while (3) // настрока будильника
{

i=BUT_GetKey();

if (i==1)
{
j++;
}

if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}

// индикация настроек будильника
if (j==1) {LCD_Goto(6,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(6,1); LCD_SendStr(" ^^");}
if (j==3) {LCD_Goto(9,1); LCD_SendStr(" ^^");}

LCD_Goto(0,0);
LCD_SendStr("Alarm");

LCD_Goto(6,0);
BCD_2Lcd(alarm_hour);
LCD_WriteData(':');
BCD_2Lcd(alarm_min);
LCD_WriteData('-');
if (alarm_on==1)
{ LCD_SendStr("on "); }
else
{ LCD_SendStr("off"); }

switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{

alarm_hour++;
if (alarm_hour>23) {alarm_hour=0;}

}
}

case (2):
{
if (j!=2) {break;}
if (i==2)
{

alarm_min++;
if (alarm_min>59) {alarm_min=0;}

}
}

case (3):
{
if (j!=3) {break;}
if (i==2)
{

alarm_on++;
if (alarm_on>1) {alarm_on=0;}

}
}

}


if (j==4) // сохранить настройки и продолжить
{
//сохранить значения в eeprom
eeprom_write_byte(&alarm_hour_ee, alarm_hour);
eeprom_write_byte(&alarm_min_ee, alarm_min);
eeprom_write_byte(&alarm_on_ee, alarm_on);
j=1;
LCD_Clear();
break;
}

}

while (2) // настройка времени
{

i=BUT_GetKey();

if (i==1)
{
j++;
}

if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}

// индикация настраевомого времени
if (j==1) {LCD_Goto(6,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(6,1); LCD_SendStr(" ^^");}

LCD_Goto(0,0);
LCD_SendStr("Time");

LCD_Goto(6,0);
BCD_2Lcd(hour);
LCD_WriteData(':');
BCD_2Lcd(min);
LCD_WriteData(':');
BCD_2Lcd(0);


switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{

hour++;
if (hour>23) {hour=0;}

}
}

case (2):
{
if (j!=2) {break;}
if (i==2)
{

min++;
if (min>59) {min=0;}

}
}

}


if (j==3) // сохранить настройки и продолжить
{
RTC_write_time(hour, min, 0);
j=1;
LCD_Clear();
break;
}


}

while (2) // настрока даты
{

i=BUT_GetKey();

if (i==1)
{
j++;
}

if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}

// индикация настраиваемой даты и дня недели
if (j==1) {LCD_Goto(5,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(5,1); LCD_SendStr(" ^^");}
if (j==3) {LCD_Goto(8,1); LCD_SendStr(" ^^");}
if (j==4) {LCD_Goto(11,1); LCD_SendStr(" ^^");}

LCD_Goto(0,0);
LCD_SendStr("Date");

LCD_Goto(5,0);
BCD_2Lcd(day);
LCD_WriteData('/');
BCD_2Lcd(month);
LCD_WriteData('/');
BCD_2Lcd(year);
LCD_WriteData(' ');
put_wday();


switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{

day++;
if (day>31) {day=1;}

}
}

case (2):
{
if (j!=2) {break;}
if (i==2)
{

month++;
if (month>12) {month=1;}

}
}

case (3):
{
if (j!=3) {break;}
if (i==2)
{

year++;
if (year>40) {year=12;}

}
}

case (4):
{
if (j!=4) {break;}
if (i==2)
{

wday++;
if (wday>6) {wday=0;}

}
}

}


if (j==5) // сохранить настройки и продолжить
{
RTC_write_date (wday, day, month, year);
j=1;
LCD_Clear();
break;
}

}


}


//=== конец настроек =============
//==============


} // end while(1)
} // end main
58e911f329c84_.png.4e5a87d7156b08fd2e914f41fa978139.png
(88.46 КБ) 427 скачиваний
Интересно то, что hex файл компилировался изначально на АтмелСтудио у автора, у меня же в ней не хочет компилиться. В Cvavr после бубна и добавления хидеров которых не хватает, вместо ";" требует "("... Бьюсь уже месяц сам, интернеты не помагают(
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Почему бы Вам к автору не обратиться ?
Он там обитает, да и на комменты вроде бы как отвечает.
Реклама
Ответить

Вернуться в «AVR»