запись-чтение в/из DS 1307

Обсуждаем контроллеры компании Atmel.
Ответить
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Здравствуйте. Ну в принципе читать/записывать переменные типа unsiged char и unsigned int в DS 1307 я могу,как бы в этом ничего сложного нету.но тут возникла надобность в отправке и приёме переменной типа unsigned long int(4 байтовой). почему-то читаются-записываются только 0й и 1й байты.2й и 3й байты читаться-записываться упорно не хотят. Подскажите пожалста,мож я чё не так сделал? Эта фигня нужна в изобретаемом мною велокомпьютере для того чтоб контроллер(мега 16) записывал-читал в/из DS 1307 данные пробега в метрах.. Код прилагается... Спасибо. Да,вспомнил!! Создаётся сиё чудо в среде CV AVR на Си..
Вложения
Велокомп.zip
(706 байт) 153 скачивания
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Вы как минимум читаете неправильно

Код: Выделить всё

probeg_m = 0;
for( i=0x0С; i>=0x0A; i-- )
{
	probeg_m <<= 8;
	probeg_m |= rtc_read( i );
};
Реклама
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Приблизительно ясно.. Значит записывать надо в обратном порядке?:

for(i=0x0A; i>=0x0C; i++;)

{ rtc_write(i,probeg_m>>8);}
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Код: Выделить всё

for(i=0x0A; i<=0x0C; i++;)
{ 
rtc_write(i,probeg_m);
probeg_m >>= 8;
}
В принципе разложить и склеить длинные числа можно через юнионы и указатели.
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Странно,но с циклом for читается 0.. Т.е. видимо данные не записываются..
Реклама
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Ну разверните циклы, посмотрите что у вас происходит.
Подключитесь отладчиком, в крайнем случае симулятором, чтобы глянуть как байты меняются.
Для простоты замените rtc_read, rtc_write на свои отладочные ф-ции с доступом к массиву ОЗУ чтобы исключить RTC. Это позволит быстрее понять где ошибка в вашей программе.
Реклама
Нашел транзистор. Понюхал.
Сообщения: 171
Зарегистрирован: Вс июн 17, 2012 16:32:42

Сообщение eduardo »

Короче сделал по-другому:unsigned long int перед записью разделил на 2 unsigned int; А после чтения 2 unsigned int совместил в unsigned long int. Делал всё через операции сдвига с присваиванием.Вроде получилось... Ну по крайней мере в Протеусе(другими средствами отладки не владею).. Спасибо за помощь!!! :beer:
Ответить

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