Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 27.01.2013, 09:32  
sibiryak983
Частый гость
 
Аватар для sibiryak983
 
Регистрация: 26.01.2013
Адрес: Новый Уренгой
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sibiryak983 на пути к лучшему
По умолчанию Помогите найти ошибку 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.
sibiryak983 вне форума  
Непрочитано 27.01.2013, 10:15  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Помогите найти ошибку AVR asm

sibiryak983, Оформите код как положено .
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 27.01.2013, 10:58  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Помогите найти ошибку AVR asm

1. В ините всегда будет ошибка - нет предварительной установки флага "Т"
2. В чтении бита не выдержаны тайминги
Очень глупые подпрограммы DQ_lo, DQ_hi и тд. Если уж очень хочется, то оформите как макросы.
Запись не смотрел - слабо читаемый код. Оформите с тегами code или PHP. Расширенный режим - там сразу видно.
omercury вне форума  
Непрочитано 27.01.2013, 11:06  
sibiryak983
Частый гость
 
Аватар для sibiryak983
 
Регистрация: 26.01.2013
Адрес: Новый Уренгой
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sibiryak983 на пути к лучшему
По умолчанию Re: Помогите найти ошибку AVR asm

Сообщение от dosikus Посмотреть сообщение
sibiryak983, Оформите код как положено .
Это как ?
Код:
так что ли ?
sibiryak983 вне форума  
Непрочитано 27.01.2013, 11:11  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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 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
;----------------------------- 
omercury вне форума  
Непрочитано 27.01.2013, 11:12  
sibiryak983
Частый гость
 
Аватар для sibiryak983
 
Регистрация: 26.01.2013
Адрес: Новый Уренгой
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sibiryak983 на пути к лучшему
По умолчанию Re: Помогите найти ошибку AVR asm

Вот исходник если что.
Вложения:
Тип файла: zip TermoDS18B20.zip (1.9 Кб, 58 просмотров)
sibiryak983 вне форума  
Непрочитано 27.01.2013, 17:19  
Boba_spb
Почётный гражданин KAZUS.RU
 
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Помогите найти ошибку AVR asm

Сообщение от sibiryak983 Посмотреть сообщение
Вот исходник если что.
Это записки сумашедшего, а не программа !!
"Если что" - это к чему?

Это начать рассказ, что такое и для чего стек, что такое программа, подпрограмма, вход в подпрограмму, выход из нее, про прерывания чуток пройтись ?

Или, испульзуя ваши идентификаторы, напмсать работу с DS...?
Boba_spb вне форума  
Непрочитано 27.01.2013, 17:47  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Помогите найти ошибку AVR asm

Сообщение от Boba_spb Посмотреть сообщение
что такое и для чего стек
Ну здрасте!
Вот именно со Stapel-ем всё в порядке.
omercury вне форума  
Непрочитано 27.01.2013, 18:01  
sibiryak983
Частый гость
 
Аватар для sibiryak983
 
Регистрация: 26.01.2013
Адрес: Новый Уренгой
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
sibiryak983 на пути к лучшему
По умолчанию 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.
sibiryak983 вне форума  
Непрочитано 27.01.2013, 18:31  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию 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 соответственно старший и младший байты значения температуры.
Вложения:
Тип файла: zip 1-wire_tn15.zip (792 байт, 48 просмотров)

Последний раз редактировалось omercury; 27.01.2013 в 18:35.
omercury вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку barbuss Микроконтроллеры, АЦП, память и т.д 9 16.10.2013 18:05
Помогите найти ошибку в моделировании 172senator Proteus 0 22.12.2010 14:18
Помогите найти ошибку в исходнике (+) Don_Ambrosio Микроконтроллеры, АЦП, память и т.д 1 29.04.2008 18:30
Помогите найти ошибку в PROTEUS maxNTF Proteus 2 29.11.2007 10:26
Помогите найти ошибку в схеме с двумя симисторами lisergin Автоматика и аппаратура связи 7 07.08.2005 00:39


Часовой пояс GMT +4, время: 04:38.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot