|
Странное поведение DS1302 |
|
|
|
Dec 21 2007, 10:19
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 21-12-07
Из: г.Астрахань
Пользователь №: 33 511

|
Прикупил RTC DS1302. хочу подключить ее к МК AVR. использую Attiny2313. подключил 4 7-ми сигментных индикатора и хочу отображать время в режиме ЧЧ:ММ пишу на ASM`е. написал программную реализацию протокола... и вот тут у меня начались приколы: к примеру, записал в регистр секунд значение 0! и в вечном цикле опрашиваю RTC и вывожу значение секунд на индикатор. на индикаторе идут секунды, все хорошо, но!!! если значение секунд четное то на индикаторе появлятются 00!!! если не четные, то все нормально... проверял - это касается не только секунд, но и всего остального пробовал даже записывать данные в RAM - та же история: в ячейку RAM пишу 0х55 - читается как 0х55, записываю в эту же ячейку 0хАА - читается как 0х00!  может быть кто нить сталкивался с такой проблемой? Прощу прощения у модераторов за размещение темы не в нужном месте  внимания сразу не обратил, а как перенести не нашел
Сообщение отредактировал Pepper - Dec 21 2007, 10:37
|
|
|
|
|
 |
Ответов
|
Dec 21 2007, 10:54
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 21-12-07
Из: г.Астрахань
Пользователь №: 33 511

|
Прикупил RTC DS1302. хочу подключить ее к МК AVR. использую Attiny2313. подключил 4 7-ми сигментных индикатора и хочу отображать время в режиме ЧЧ:ММ пишу на ASM`е. написал программную реализацию протокола... и вот тут у меня начались приколы: к примеру, записал в регистр секунд значение 0! и в вечном цикле опрашиваю RTC и вывожу значение секунд на индикатор. на индикаторе идут секунды, все хорошо, но!!! если значение секунд четное то на индикаторе появлятются 00!!! если не четные, то все нормально... проверял - это касается не только секунд, но и всего остального пробовал даже записывать данные в RAM - та же история: в ячейку RAM пишу 0х55 - читается как 0х55, записываю в эту же ячейку 0хАА - читается как 0х00! может быть кто нить сталкивался с такой проблемой? функции, реализующие протокол: .equ CE = PD3 .equ CLK = PD1 .equ IO = PD0
.cseg InitPort: sbi DDRD, CE sbi DDRD, CLK
cbi PORTD, CE cbi PORTD, CLK ret
PortToIn: cbi DDRD, IO ret
PortToOut: sbi DDRD, IO ret
DataWrite: // Передаем коммандный байт // r16 - комманда cli push r18 push r19 sbi DDRD, CLK ldi r18, 8 // Счетчик бит rcall PortToOut // Переключаем порт на выход данных, что бы передать коммандый байт cbi PORTD, CLK // Подготавливаем RTC к передачи данных DelayUs 10 // Временная задержка, что бы CLK успел переключится sbi PORTD, CE // Включием RTC DelayUs 10 // Временная задержка, что бы CE успел переключится dw_l1: mov r19, r16 // Скопируем адрес во временный регистр andi r19, 0x01 // извлечем 0й бит tst r19 // проверим на 0 breq dw_l2 // если 0, то перейти sbi PORTD, IO // иначе записать в порт данных 1 rjmp dw_l3 // продолжить выполнение dw_l2: cbi PORTD, IO // Записать лог. 0 dw_l3: DelayUs 10 // задержка для формирования данных на ноге контроллера sbi PORTD, CLK // сформировать нарастающий фронт CLK DelayUs 10 // подержать 10 мкс cbi PORTD, CLK // сформировать стадающий фронт CLK lsr r16 // Сдвигаем адрес, что бы получить следующий бит dec r18 // уменьшить значение переданных бит brne dw_l1 // если переданы еще не все 8 - перейти
// Передача адреса закончена, переходим к передаче данных ldi r18, 8 // Снова инициализируем счетчик бит dw_l4: mov r19, r17 // Скопируем данные во временный регистр andi r19, 0x01 // извлечем 0й бит tst r19 // проверим на 0 breq dw_l5 // если 0, то перейти sbi PORTD, IO // иначе записать в порт данных 1 rjmp dw_l6 // продолжить выполнение dw_l5: cbi PORTD, IO // Записать лог. 0 dw_l6: DelayUs 10 // задержка для формирования данных на ноге контроллера sbi PORTD, CLK // сформировать нарастающий фронт CLK DelayUs 10 // подержать 10 мкс cbi PORTD, CLK // сформировать стадающий фронт CLK lsr r17 // Сдвигаем данные, что бы получить следующий бит dec r18 // уменьшить значение переданных бит brne dw_l4 // если переданы еще не все 8 - перейти // Адрес и данные переданы, завершаем DelayUs 10 // Задержка cbi PORTD, CE // Выключаем RTC DelayUs 10 // Подержим немного 0 rcall PortToIn // Переключим порт на вход cbi DDRD, CLK pop r19 pop r18 sei ret
DataRead: // Передаем адрес cli push r18 push r19 sbi DDRD, CLK ldi r18, 8 // Счетчик бит rcall PortToOut // Переключаем порт на выход данных, что бы передать коммандый байт cbi PORTD, CLK // Подготавливаем RTC к передачи данных cbi PORTD, IO // Подготавливаем RTC к передачи данных DelayUs 10 // Временная задержка, что бы CLK успел переключится sbi PORTD, CE // Включием RTC DelayUs 10 // Временная задержка, что бы CE успел переключится dr_l1: mov r19, r16 // Скопируем адрес во временный регистр andi r19, 0x01 // извлечем 0й бит tst r19 // проверим на 0 breq dr_l2 // если 0, то перейти sbi PORTD, IO // иначе записать в порт данных 1 rjmp dr_l3 // продолжить выполнение dr_l2: cbi PORTD, IO // Записать лог. 0 dr_l3: DelayUs 10 // задержка для формирования данных на ноге контроллера sbi PORTD, CLK // сформировать нарастающий фронт CLK DelayUs 10 // подержать 10 мкс cbi PORTD, CLK // сформировать стадающий фронт CLK lsr r16 // Сдвигаем адрес, что бы получить следующий бит dec r18 // уменьшить значение переданных бит brne dr_l1 // если переданы еще не все 8 - перейти // Передача адреса закончена, переходим к приему данных rcall PortToIn // Переводим порт на вход ldi r18, 8 // Инициализация счетчика бит clr r17 // Очищаем регистр выходных данных dr_l4: lsr r17 // Сдвигаем вправо на 1 бит sbis PIND, IO // Проверяем бит на входе rjmp dr_l5 // переход, если = 0 ori r17, 0x80 // Если 1, то устанавливаем 1 в старший разряд выходного регистра dr_l5: DelayUs 10 // задержка для формирования данных на ноге контроллера sbi PORTD, CLK // сформировать нарастающий фронт CLK DelayUs 10 // подержать 10 мкс cbi PORTD, CLK // сформировать стадающий фронт CLK dec r18 // уменьшить счетчик бит на 1 brne dr_l4 // Если переданы не все 8, то переход // Адрес и данные переданы, завершаем сеанс DelayUs 10 // Задержка cbi PORTD, CE // Выключаем RTC rcall PortToIn // Переводим порт на вход DelayUs 10 // Задержка cbi DDRD, CLK pop r19 pop r18 sei ret
Сообщение отредактировал Pepper - Dec 21 2007, 11:05
|
|
|
|
|
Dec 21 2007, 11:32
|
Участник

Группа: Новичок
Сообщений: 22
Регистрация: 21-12-07
Из: г.Астрахань
Пользователь №: 33 511

|
Принял на заметку... исправил... не помогло...  вот код основной программы: .include "tn2313def.inc" .equ LED1 = PD2 .equ LED2 = PD6 .equ LED3 = PD4 .equ LED4 = PD5 .cseg .org 0x00 rjmp main .org 0x01 rjmp main .org 0x02 rjmp main .org 0x03 rjmp main .org 0x04 rjmp main .org 0x05 rjmp main .org 0x06 rjmp main .org 0x07 rjmp main .org 0x08 rjmp main .org 0x09 rjmp main .org 0x0a rjmp main .org 0x0b rjmp main .org 0x0c rjmp main .org 0x0d rjmp t0_compa .org 0x0e rjmp main .org 0x0f rjmp main .org 0x10 rjmp main .org 0x11 rjmp main .org 0x12 rjmp main t0_compa: push r16 push r17 push ZH push ZL lds r16, LedNum cpi r16, 0x01 breq t0_l1 cpi r16, 0x02 breq t0_l2 cpi r16, 0x03 breq t0_l3 cpi r16, 0x04 breq t0_l4 rjmp t0_l5 t0_l1: cbi PORTD, LED1 sbi PORTD, LED2 sbi PORTD, LED3 sbi PORTD, LED4 lds r17, DisplayNum rjmp t0_l5 t0_l2: sbi PORTD, LED1 cbi PORTD, LED2 sbi PORTD, LED3 sbi PORTD, LED4 lds r17, DisplayNum + 1 rjmp t0_l5 t0_l3: sbi PORTD, LED1 sbi PORTD, LED2 cbi PORTD, LED3 sbi PORTD, LED4 lds r17, DisplayNum + 2 rjmp t0_l5 t0_l4: clr r16 sbi PORTD, LED1 sbi PORTD, LED2 sbi PORTD, LED3 cbi PORTD, LED4 lds r17, DisplayNum + 3 rjmp t0_l5 t0_l5: ldi ZH, high(Digits << 1) ldi ZL, low(Digits << 1) add ZL, r17 lpm r17, Z cpi r16, 0x02 brne t0_l6 ori r17, 0x80 t0_l6: com r17 out PORTB, r17 inc r16 sts LedNum, r16 t0_exit: pop ZL pop ZH pop r17 pop r16 reti main: ldi r16, RAMEND out SPL, r16 clr r16 sts LedNum, r16 rcall InitLedPort rcall InitTimer rcall InitPort // Сбросить защиту от записи ldi r16, 0x8E ldi r17, 0x00 rcall DataWrite //Установить часы ldi r16, 0x84 ldi r17, 0x12 rcall DataWrite //Установить минуты ldi r16, 0x82 ldi r17, 0x30 rcall DataWrite // Установить секунды ldi r16, 0x80 ldi r17, 0x00 rcall DataWrite //Установить День ldi r16, 0x86 ldi r17, 0x21 rcall DataWrite //Установить месяц ldi r16, 0x88 ldi r17, 0x12 rcall DataWrite //Установить год ldi r16, 0x8C ldi r17, 0x07 rcall DataWrite // читаем минуты и секунды и выводим их на экран mainloop: ldi r16, 0x85 rcall DataRead mov r18, r17 andi r17, 0b00001111 sts DisplayNum + 1, r17 swap r18 andi r18, 0b00001111 sts DisplayNum + 0, r18 ldi r16, 0x83 rcall DataRead mov r18, r17 andi r17, 0b00001111 sts DisplayNum + 3, r17 swap r18 andi r18, 0b00001111 sts DisplayNum + 2, r18 rcall maindelay rjmp mainloop .include "delay.inc" .include "7-s.inc" .include "time.inc" .include "timer.inc" maindelay: push r16 ldi r16, 20 md_l1: DelayUS 65000 dec r16 brne md_l1 pop r16 ret .dseg LedNum: .db '\x00' DisplayNum: .db '\x00', '\x00', '\x00', '\x00' четное или нечетное число определяется 0м битом, так же этим 0м битом определяется операция чтения или записи... думал, может это как связано... но, к сожелению, изыскания в этой области ни к чему не привели
|
|
|
|
|
Dec 21 2007, 12:06
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата(Pepper @ Dec 21 2007, 14:32)  //Установить год ldi r16, 0x8C ldi r17, 0x07 rcall DataWrite//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
// читаем минуты и секунды и выводим их на экран mainloop: ldi r16, 0x85 rcall DataRead//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< mov r18, r17 andi r17, 0b00001111 sts DisplayNum + 1, r17 swap r18 andi r18, 0b00001111 sts DisplayNum + 0, r18 вот еще.., на "скорость" может не влияет но по даташиту у мс DS1302 CE Inactive Time tCWH =1мкс. У Вас очень "близко"(,без установки интервала) располагаются вызов ПП rcall DataWrite и rcall DataRead. Т.е. работаете почти на пределе скорости. Выключаете CE(ChipEnable) и сразу включаете.
--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
|
|
|
|
Сообщений в этой теме
Pepper Странное поведение DS1302 Dec 21 2007, 10:19 sergik_vrn Цитата(Pepper @ Dec 21 2007, 13:19) Прику... Dec 21 2007, 10:26 Pepper Цитата(sergik_vrn @ Dec 21 2007, 13:26) н... Dec 21 2007, 10:35  sergik_vrn Цитата(Pepper @ Dec 21 2007, 13:35) Код//... Dec 21 2007, 11:48   Pepper Цитата(sergik_vrn @ Dec 21 2007, 14:48) с... Dec 21 2007, 11:57    sergik_vrn Цитата(Pepper @ Dec 21 2007, 14:57) в том... Dec 21 2007, 12:13     Pepper Цитата(sergik_vrn @ Dec 21 2007, 15:13) п... Dec 21 2007, 12:18  adc Маленький совет по динамической индикации:Во время... Dec 27 2007, 05:44   Pepper Цитата(adc @ Dec 27 2007, 08:44) Маленьки... Dec 27 2007, 06:03 Pepper и снова вы правы, но опять не помогло
поставил зад... Dec 21 2007, 12:14  sergik_vrn Цитата(Pepper @ Dec 21 2007, 15:14) и сно... Dec 21 2007, 12:51   Pepper Цитата(sergik_vrn @ Dec 21 2007, 15:51) р... Dec 21 2007, 12:57    sergik_vrn Цитата(Pepper @ Dec 21 2007, 15:57) согла... Dec 21 2007, 13:12     Pepper Цитата(sergik_vrn @ Dec 21 2007, 16:12) д... Dec 21 2007, 13:21      sergik_vrn Цитата(Pepper @ Dec 21 2007, 16:21) к сож... Dec 21 2007, 13:27       Pepper Цитата(sergik_vrn @ Dec 21 2007, 16:27) п... Dec 21 2007, 14:12        sergik_vrn Цитата(Pepper @ Dec 21 2007, 17:12) тогда... Dec 21 2007, 14:24         Pepper Цитата(sergik_vrn @ Dec 21 2007, 17:24) с... Dec 21 2007, 14:30 adc Цитата(Pepper @ Dec 21 2007, 13:54) // Пе... Dec 21 2007, 12:15  Pepper Цитата(adc @ Dec 21 2007, 15:15) Все хоро... Dec 21 2007, 12:24 adc пожалуйста код в студию.
Обращаю Ваше внимание на... Dec 21 2007, 11:10 adc эээ приведите код где у вас массив "Digits... Dec 21 2007, 12:35 Pepper Цитата(adc @ Dec 21 2007, 15:35) эээ прив... Dec 21 2007, 12:40 adc Цитата(Pepper @ Dec 21 2007, 15:40) там в... Dec 21 2007, 13:02 Pepper Цитата(adc @ Dec 21 2007, 16:02) да.. дол... Dec 21 2007, 13:13 sergik_vrn Цитата(adc @ Dec 21 2007, 16:02) Что Вы п... Dec 21 2007, 13:15 Pepper только что обнаружил еще более странный глюк: при ... Dec 26 2007, 11:53 adc Цитата(Pepper @ Dec 26 2007, 14:53) тольк... Dec 26 2007, 12:20  Pepper Цитата(adc @ Dec 26 2007, 15:20) Выложите... Dec 26 2007, 12:36 Pepper Я кажется понял где грабли:
у меня моя железка пит... Dec 26 2007, 14:04 adc Скажите, а в схеме у Вас батарейный элемент питани... Dec 27 2007, 06:37 Pepper Цитата(adc @ Dec 27 2007, 09:37) Скажите,... Dec 27 2007, 06:39 adc В начале программы хорошо бы сделать инициализацию... Dec 27 2007, 08:58 Pepper у меня стоит начальная инициализация:
Код// Сброс... Dec 27 2007, 11:30  adc Цитата(Pepper @ Dec 27 2007, 13:59) разоб... Dec 27 2007, 11:32   Pepper Цитата(adc @ Dec 27 2007, 14:32) Странно?... Dec 27 2007, 11:59    adc Цитата(Pepper @ Dec 27 2007, 14:59) в общ... Dec 27 2007, 13:14
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|