AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
27.01.2013, 09:32
|
|
Частый гость
Регистрация: 26.01.2013
Адрес: Новый Уренгой
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Помогите найти ошибку AVR asm
Всем привет прилагаю исходник по работе датчика температуры D18B20
Цель принять показания датчика в регистры LED2, LED3 и все.
В регистры принимается какая-то чушь. Мне кажется, что ошибка в приеме байта.
Помогите разобраться
Код:
|
.NOLIST
.INCLUDE "m8def.inc" ; ATMEGA8
.LIST
.def Temp=r16 ; Рабочий регистр
.def Temp_1=r17 ; Для задержки
.def Temp_2=r18 ; Для задержки
.def LED0=r19
.def LED1=r20 ; Ст. байт температуры
.def LED2=r21 ; Мл. байт температуры
.def LED3=r22 ; Приём 8 бит
.def LED4=r23 ; Флаг
.def Byte=r24
.DSEG
.ORG 0X0060
.CSEG
.ORG $0000
rjmp RESET ;Запрос сброса
reti // INT0 ;Запрос на внешнее прерывание по входу INT0
reti // INT1 ;Запрос на внешнее прерывание по входу INT1
reti // TIMER2 COMP ;Срабатывание компаратора таймера-счетчика 2
reti // TIMER2 OVF ;Переполнение таймера-счетчика 2
reti // TIMER1 CAPT ;Захват фронта таймером-счетчиком 1
reti // TIMER1 COMPA;Срабатывание компаратора А таймера-счетчика 1
reti // TIMER1 COMPB;Срабатывание компаратора В таймера-счетчика 1
reti // TIMER1_OVF ;Переполнение таймера-счетчика 1
reti // TIMER0_OVF ;Переполнение таймера-счетчика 0
reti // SPI ;Завершение последовательной передачи интерфейсом SPI
reti // UART ;Завершение приема УСАПП 0
reti // UART ;Регистр данных UART PORTD 0 18свободен
reti // UART ;Завершение передачи УСАПП 0
reti // ADC_INT ;Завершение преобразования АЦП
reti // EE_RDY ;Готовность ЭСППЗУ
reti // ANA_COMP ;Аналоговый компаратор
reti // TWI ;Двухпроводной последовательный интерфейс
reti // SPM_RDY ;Готовность записи в память программ
RESET:
; Initiire Stapel
ldi temp, HIGH(RAMEND) ; Initiiere MSB Stapel
out SPH,temp
ldi temp, LOW(RAMEND) ; Initiiere LSB Stapel
out SPL,temp
; Init Port B
ldi temp,0
out DDRB,temp
ldi temp,0xff
out DDRD,temp
ldi temp,0
out PORTB,temp
ldi temp,1‹‹ACD
out ACSR,temp
sei
;************************************************* ****************
; Инициализация DS18B20
;************************************************* ****************
Next: rcall DQ_Init ; Инициализация DS18B20
ldi Temp, 0xCC ; Передача команды
rcall DQ_write ; Skip ROM (CCH)
ldi Temp, 0x44 ; Передача команды
rcall DQ_write ; Start Conv (44H)
;************************************************* ****************
; Проверка окончания преобразования температуры в DS18B20
;************************************************* ****************
Wait: rcall IN_bite ; Приём байта от DS18B20
cpi Temp, 0xFF ; Конвертирование закончено?
brne Wait ; Нет, ждём
rcall DQ_Init ; Да, повторная инициализация
ldi Temp, 0xCC ; Передача команды
rcall DQ_write ; Skip ROM (CCH)
ldi Temp, 0xBE ; Передача команды
rcall DQ_write ; Read Scratchpad (0BEH)
rcall IN_bite ; Приём байта temp_LSB от DS18B20
mov LED2, Temp ; Сохраним в LED2
rcall IN_bite ; Приём байта temp_MSB от DS18B20
mov LED1, Temp ; Сохраним в LED1
rjmp Next
;************************************************* ****************
; Инициализация DS18B20
;************************************************* ****************
DQ_Init: rcall DQ_hi ; PB на вход
rcall DQ_lo ; PB на выход
ldi Temp_1, 120 ; Пауза
rcall DS_delay ; 600 uSecs
rcall DQ_hi ; DQ на вход
ldi Temp_1, 14 ; Пауза
rcall DS_delay ; 70 uSecs
sbic PINB, PB2 ; Отклик есть?
rjmp Err_DQ ; Нет, ошибка
clt ; Сброс флага
ldi Temp_1, 100 ; Пауза
rcall DS_delay ; 500 uSecs
ret ; Возврат
;************************************************* ****************
; ошибка
;************************************************* ****************
Err_DQ:
rjmp DQ_Init ; Повтор инициализации
;************************************************* ****************
; Настройка DQ на вход
;************************************************* ****************
DQ_hi: cbi DDRB, PB2 ; PB на вход
ret ; Возврат
;************************************************* ****************
; Настройка DQ на выход
;************************************************* ****************
DQ_lo: cbi PORTB, PB2 ; PB2 в 0
sbi DDRB, PB2 ; PB на выход
ret ; Возврат
;************************************************* ****************
; Приём байта от DS18B20
;************************************************* ****************
IN_bite: ldi LED3, 8 ; Приём 8 бит
clr Temp ; Подг. приёмный рег-р
IN_bite_1: rcall DQ_lo ; PB на выход
rcall DQ_hi ; PB на вход
nop ; Калибровочный nop
sbis PINB, PB2 ; На линии 0 или 1 ?
clc ; 0, С=0
sbic PINB, PB2 ; 1, еще одна проверка состояния линии
sec ; 1, С=1
ror Temp ; Заполнение Temp
ldi Temp_1, 8 ; Пауза
rcall DS_delay ; 40 uSecs
dec LED3 ; Байт принят?
brne IN_bite_1 ; Нет, следующий бит
ret ; Возврат
;************************************************* ****************
; Передача байта в DS18x20
;************************************************* ****************
DQ_write: ldi LED3, 8 ; Передача 8 бит
Metka_1: lsr Temp ; лог сдвиг 0 бит -› CF
brcs Out_1 ; пререход если CF=1
rjmp Out_0 ;
Metka_2: dec LED3 ;
brne Metka_1 ;
ret ; Возврат
;************************************************* ****************
; Передача бита с уровнем "0"
;************************************************* ****************
Out_0: rcall DQ_lo ; PB на выход
ldi Temp_1, 12 ; Пауза
rcall DS_delay ; 60 uSecs
rcall DQ_hi ; DQ на вход
rjmp Metka_2 ;
;************************************************* ****************
; Передача бита с уровнем "1"
;************************************************* ****************
Out_1: rcall DQ_lo ; PB на выход
rcall DQ_hi ; PB на вход
ldi Temp_1, 12 ; Пауза
rcall DS_delay ; 60 uSecs
rjmp Metka_2 ; ;
;************************************************* ****************
; Пауза 5 uSecs * Temp_1
;************************************************* ****************
DS_delay: ldi Temp_2, 10 ;
cycle: dec Temp_2 ;
brne cycle ;
nop ;
rjmp XX ;
XX: rjmp XXX ;
XXX: rjmp XXXX ;
XXXX: dec Temp_1 ;
brne DS_delay ;
ret ; Возврат |
Последний раз редактировалось dosikus; 27.01.2013 в 17:46.
|
|
|
|
27.01.2013, 10:15
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
sibiryak983, Оформите код как положено .
__________________
Осторожно , злой кот
|
|
|
|
27.01.2013, 10:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
1. В ините всегда будет ошибка - нет предварительной установки флага "Т"
2. В чтении бита не выдержаны тайминги
Очень глупые подпрограммы DQ_lo, DQ_hi и тд. Если уж очень хочется, то оформите как макросы.
Запись не смотрел - слабо читаемый код. Оформите с тегами code или PHP. Расширенный режим - там сразу видно.
|
|
|
|
27.01.2013, 11:06
|
|
Частый гость
Регистрация: 26.01.2013
Адрес: Новый Уренгой
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
Сообщение от dosikus
|
sibiryak983, Оформите код как положено .
|
Это как ?
|
|
|
|
27.01.2013, 11:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
Да, либо PHP либо вложенным файлом.
Код:
|
;-----------------------------
; Output : T - presence bit
;-----------------------------
OWReset:
cbi w1Port,w1 ;Подключили порт
sbi w1Dir,w1 ; "0" в шину
ldi w1del,48 ;480 микросекунд(470)
rcall Del_10 ;Ждём
cbi w1Dir,w1 ; "1" в шину
ldi w1del,7 ;70 микросекунд(70)
rcall Del_10 ;Ждём
set
sbis w1Pin,w1
clt
ldi w1del,24 ;240 микросекунд(240)
rcall Del_10 ;Ждём
ret
;----------------------------- |
PHP код:
|
;-----------------------------
; Output : T - presence bit
;-----------------------------
OWReset:
cbi w1Port,w1 ;Подключили порт
sbi w1Dir,w1 ; "0" в шину
ldi w1del,48 ;480 микросекунд(470)
rcall Del_10 ;Ждём
cbi w1Dir,w1 ; "1" в шину
ldi w1del,7 ;70 микросекунд(70)
rcall Del_10 ;Ждём
set
sbis w1Pin,w1
clt
ldi w1del,24 ;240 микросекунд(240)
rcall Del_10 ;Ждём
ret
;-----------------------------
|
|
|
|
|
27.01.2013, 11:12
|
|
Частый гость
Регистрация: 26.01.2013
Адрес: Новый Уренгой
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
Вот исходник если что.
|
|
|
|
27.01.2013, 17:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
Сообщение от sibiryak983
|
Вот исходник если что.
|
Это записки сумашедшего, а не программа !!
"Если что" - это к чему?
Это начать рассказ, что такое и для чего стек, что такое программа, подпрограмма, вход в подпрограмму, выход из нее, про прерывания чуток пройтись ?
Или, испульзуя ваши идентификаторы, напмсать работу с DS...?
|
|
|
|
27.01.2013, 17:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
Сообщение от Boba_spb
|
что такое и для чего стек
|
Ну здрасте!
Вот именно со Stapel-ем всё в порядке.
|
|
|
|
27.01.2013, 18:01
|
|
Частый гость
Регистрация: 26.01.2013
Адрес: Новый Уренгой
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
Сообщение от Boba_spb
|
Это записки сумасшедшего, а не программа !!
|
Вообще то не я ее писал, я вообще в программинге не очень силен.
Сообщение от Boba_spb
|
"Если что" - это к чему?
|
А это к тому, что-бы Вы уважаемые смогли увидеть тут ошибку и помочь мне.
Цитата:
|
Или, испульзуя ваши идентификаторы, написать работу с DS...?
|
И я не прошу разбирать весь код, а посмотреть лишь этот участок.
Код:
|
;************************************************* ****************
; Приём байта от DS18B20
;************************************************* ****************
IN_bite: ldi LED3, 8 ; Приём 8 бит
clr Temp ; Подг. приёмный рег-р
IN_bite_1:
rcall DQ_lo ; PB на выход
rcall DQ_hi ; PB на вход
rcall Del_14us ; Калибровочный nop
sbis PINB, PB2 ; На линии 0 или 1 ?
clc ; 0, С=0
sbic PINB, PB2 ; 1, еще одна проверка состояния линии
sec ; 1, С=1
ror Temp ; Заполнение Temp
ldi Temp_1, 8 ; Пауза
rcall DS_delay ; 40 uSecs
dec LED3 ; Байт принят?
brne IN_bite_1 ; Нет, следующий бит
ret ; Возврат |
Последний раз редактировалось dosikus; 27.01.2013 в 18:52.
|
|
|
|
27.01.2013, 18:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Помогите найти ошибку AVR asm
sibiryak983, ломатушки разбирать Вашу красоту, хотя и без стакана понятно, что с таймингами беда.
Давайте лучше уж свой положу, тем более что
Сообщение от sibiryak983
|
я вообще в программинге не очень силен
|
Все тайминги рассчитаны для клока 1,6МГц.
w1Port - регистр порта(PORTx), на котором висит DS, запись
w1Dir - регистр направления порта(DDRx), на котором висит DS
w1Pin - регистр порта(PINx), на котором висит DS, чтение
w1 - номер бита порта (PINx.y), на котором висит DS
w1del - регистр счётчика задержки в десятках микросекунд (r16 - r31)
w1cnt - счётчик принятых/переданных битов (r16 - r31)
w1rdbuf - буфер приёмника/передатчика
Пример вызова.
PHP код:
|
start:
rcall OWReset
ldi w1rdbuf,$CC rcall OWWriteByte
ldi w1rdbuf,$44 rcall OWWriteByte
ldi r17,255 ;Цикл задержки на измерение температуры delay650: ldi w1del,255 ;2,55 милисекунды(2550us) rcall Del_10 ;Ждём dec r17 brne delay650
rcall OWReset
ldi w1rdbuf,$CC rcall OWWriteByte
ldi w1rdbuf,$BE rcall OWWriteByte
rcall OWReadByte mov Command_h,w1rdbuf
rcall OWReadByte mov Command_l,w1rdbuf
|
Command_h и l соответственно старший и младший байты значения температуры.
Последний раз редактировалось omercury; 27.01.2013 в 18:35.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:31.
|
|