реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Странное поведение DS1302
Pepper
сообщение Dec 21 2007, 10:19
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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! sad.gif
может быть кто нить сталкивался с такой проблемой?
Прощу прощения у модераторов за размещение темы не в нужном месте smile.gif внимания сразу не обратил, а как перенести не нашел smile.gif

Сообщение отредактировал Pepper - Dec 21 2007, 10:37
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Dec 21 2007, 10:26
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(Pepper @ Dec 21 2007, 13:19) *
Прикупил RTC DS1302. хочу подключить ее к МК AVR. использую Attiny2313. подключил 4 7-ми сигментных индикатора и хочу отображать время в режиме ЧЧ:ММ
пишу на ASM`е. написал программную реализацию протокола... и вот тут у меня начались приколы: к примеру, записал в регистр секунд значение 0! и в вечном цикле опрашиваю RTC и вывожу значение секунд на индикатор. на индикаторе идут секунды, все хорошо, но!!! если значение секунд четное то на индикаторе появлятются 00!!! если не четные, то все нормально...
проверял - это касается не только секунд, но и всего остального
пробовал даже записывать данные в RAM - та же история: в ячейку RAM пишу 0х55 - читается как 0х55, записываю в эту же ячейку 0хАА - читается как 0х00! sad.gif
может быть кто нить сталкивался с такой проблемой?

ну вообще-то неплохо было бы привести хоть какие-то исходники (протокола например). навскидку можно предположить, что Вы где-то напортачили с реализацией протокола (насколько я помню, там операция чтения/записи как раз определяется последним битом адреса, то есть четностью числа)
Go to the top of the page
 
+Quote Post
Pepper
сообщение Dec 21 2007, 10:35
Сообщение #3


Участник
*

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



Цитата(sergik_vrn @ Dec 21 2007, 13:26) *
ну вообще-то неплохо было бы привести хоть какие-то исходники (протокола например). навскидку можно предположить, что Вы где-то напортачили с реализацией протокола (насколько я помню, там операция чтения/записи как раз определяется последним битом адреса, то есть четностью числа)

main.asm
.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
rjmp mainloop

.include "delay.inc"
.include "7-s.inc"
.include "time.inc"
.include "timer.inc"

.dseg
LedNum: .db '\x00'
DisplayNum: .db '\x00', '\x00', '\x00', '\x00'

и собственно реализация протокола time.inc:
.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


сразу прошу прощения за размещение AVRASM-кода в ветке PIC.
сразу внимания не обратил, а когда уже добавил, не нашел возможности перенести куда надо smile.gif
Go to the top of the page
 
+Quote Post
Pepper
сообщение Dec 21 2007, 10:54
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
adc
сообщение Dec 21 2007, 11:10
Сообщение #5


Местный
***

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



пожалуйста код в студию.
Обращаю Ваше внимание на то что в интерфейсе записи все байты пишутся по переднему фронту SCLK. А при чтении установка данных из МС осуществляется по заднему фронту SCLK.

Вот на вскидку перед чтением бита из порта после передачи адреса.. сделайте задержку. У вас получается что вы практически после установки заднего фронта (через 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 // Проверяем бит на входе                                   //<<<<<<<<<<<<<<<<<<<<<<<<<


Сообщение отредактировал adc - Dec 21 2007, 11:26


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
Pepper
сообщение Dec 21 2007, 11:32
Сообщение #6


Участник
*

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



Принял на заметку... исправил... не помогло... sad.gif
вот код основной программы:

.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м битом определяется операция чтения или записи... думал, может это как связано... но, к сожелению, изыскания в этой области ни к чему не привели
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Dec 21 2007, 11:48
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(Pepper @ Dec 21 2007, 13:35) *
Код
// Установить секунды
    ldi r16, 0x80
    ldi r17, 0x00
    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
    rjmp mainloop

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 - перейти

сразу скажу, что разбирать асм-код такого размера - удовольствие для людей, обремененных большим количеством свободного времени. скажите, а в 1302 разве не I2C протокол? если да, то я не совсем понял, чем у Вас отличаются команды чтения и записи (насколько я понял Ваш код, адрес передается в r16 в инвертированном порядке?) и там, и там последний бит 1 - то есть режим чтения? а где Вы обеспечиваете I2C Start condotion?
Go to the top of the page
 
+Quote Post
Pepper
сообщение Dec 21 2007, 11:57
Сообщение #8


Участник
*

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



Цитата(sergik_vrn @ Dec 21 2007, 14:48) *
сразу скажу, что разбирать асм-код такого размера - удовольствие для людей, обремененных большим количеством свободного времени. скажите, а в 1302 разве не I2C протокол? если да, то я не совсем понял, чем у Вас отличаются команды чтения и записи (насколько я понял Ваш код, адрес передается в r16 в инвертированном порядке?) и там, и там последний бит 1 - то есть режим чтения? а где Вы обеспечиваете I2C Start condotion?

в том то и дело, что это не I2C! это какой то другой протокол, на который в инете мало документации.
адрес действительно передается в регистре r16, но с чего вы взяли что в инвертированном виде?

// Установить секунды
ldi r16, 0x80
ldi r17, 0x00
rcall DataWrite
тут вроде все в норме, никакой инверсии...
Комманды чтения и записи отличаются тем, что для записи я передаю сначала адрес, потом данные. при чтении передается адрес ячейки памяти, а затем информация считывается из RTC.
Go to the top of the page
 
+Quote Post
adc
сообщение Dec 21 2007, 12:06
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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) и сразу включаете.


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
sergik_vrn
сообщение Dec 21 2007, 12:13
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 152
Регистрация: 11-10-05
Из: Воронеж
Пользователь №: 9 491



Цитата(Pepper @ Dec 21 2007, 14:57) *
в том то и дело, что это не I2C! это какой то другой протокол, на который в инете мало документации.
адрес действительно передается в регистре r16, но с чего вы взяли что в инвертированном виде?

// Установить секунды
ldi r16, 0x80
ldi r17, 0x00
rcall DataWrite
тут вроде все в норме, никакой инверсии...
Комманды чтения и записи отличаются тем, что для записи я передаю сначала адрес, потом данные. при чтении передается адрес ячейки памяти, а затем информация считывается из RTC.

пришлось скачать даташит. насчет инверсии - это просто передача оказывается lsb first. в общем все выглядит нормально, за исключением того, что я не до конца понял, почему Вы читаете секунды по адресу 0x83, а не 0x81. ну если это исключить, то единственную причину проблем с четными значениями можно предполагать в рассинхронизации клоков и битов данных. если, например, предположить, что микросхема младший бит данных(2-го байта) воспринимает как старший бит данных первого байта, тогда 0 будет восприниматься как запрет обмена. кстати, не потому ли у вас как раз 0x83?
Go to the top of the page
 
+Quote Post
Pepper
сообщение Dec 21 2007, 12:14
Сообщение #11


Участник
*

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



и снова вы правы, но опять не помогло
поставил задержку в 10 мкс, думаю более чем достаточно, что бы RTC успел среагировать на перепад уровней...
я в мануале еще нашел вот такую строчку
When reading or writing the time and date registers, secondary (user) buffers are used to prevent errors when the internal registers update. When reading the time and date registers, the user buffers are synchronized to the internal registers the rising edge of CE.

как ее использовать я не пойму... может быть стоит после каждой комманды дергать CE?
может быть это данные не записываются во внутренние регистры?
Go to the top of the page
 
+Quote Post
adc
сообщение Dec 21 2007, 12:15
Сообщение #12


Местный
***

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



Цитата(Pepper @ Dec 21 2007, 13:54) *
// Передача адреса закончена, переходим к приему данных
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, то переход

Все хорошо, а ГДЕ у ВАС задержка после установки заднего фронта CLK? поставте некоторую задержку.. Хоть в DS и написано 200нс.. но всеже.. для отладки не повредит. Потом уберете если все нормально.

Сообщение отредактировал adc - Dec 21 2007, 12:21


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
Pepper
сообщение Dec 21 2007, 12:18
Сообщение #13


Участник
*

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



Цитата(sergik_vrn @ Dec 21 2007, 15:13) *
пришлось скачать даташит. насчет инверсии - это просто передача оказывается lsb first. в общем все выглядит нормально, за исключением того, что я не до конца понял, почему Вы читаете секунды по адресу 0x83, а не 0x81. ну если это исключить, то единственную причину проблем с четными значениями можно предполагать в рассинхронизации клоков и битов данных. если, например, предположить, что микросхема младший бит данных(2-го байта) воспринимает как старший бит данных первого байта, тогда 0 будет восприниматься как запрет обмена. кстати, не потому ли у вас как раз 0x83?

1. кто сказал, что я считываю секунды с 83? я считываю оттуда минуты для того, что бы отображать время в формате ЧЧ:ММ... 83 - минуты, 85 - часы...
Go to the top of the page
 
+Quote Post
Pepper
сообщение Dec 21 2007, 12:24
Сообщение #14


Участник
*

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



Цитата(adc @ Dec 21 2007, 15:15) *
Все хорошо, а ГДЕ у ВАС задержка после установки заднего фронта CLK?



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
DelayUs 10 // подержать 10 мкс
dec r18 // уменьшить счетчик бит на 1
brne dr_l4
не работает! sad.gif

Цитата(adc @ Dec 21 2007, 15:15) *
Все хорошо, а ГДЕ у ВАС задержка после установки заднего фронта CLK? поставте некоторую задержку.. Хоть в DS и написано 200нс.. но всеже.. для отладки не повредит. Потом уберете если все нормально.


даже вот так вот
// Передача адреса закончена, переходим к приему данных
rcall PortToIn // Переводим порт на вход
DelayUs 10 // Задержка <<<<<<<<<<<<<<<<<<<<<<<<<<< чтение нулевого бита
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
DelayUs 10 // подержать 10 мкс
dec r18 // уменьшить счетчик бит на 1
brne dr_l4
Go to the top of the page
 
+Quote Post
adc
сообщение Dec 21 2007, 12:35
Сообщение #15


Местный
***

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



эээ приведите код где у вас массив "Digits"..
что то у вас здесь немудрено.. вы прибавляет без учета старшего регистра ZH:
Код
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


Сообщение отредактировал adc - Dec 21 2007, 12:36


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01542 секунд с 7
ELECTRONIX ©2004-2016