Скачал оттуда пример для Меги32 и портировал его на Тини2313А. Подправил кое-что и оно завелось и засветилось, но увы работает не совсем корректно. Вобщем все примерно соответствует первому посту этой темы http://radiokot.ru/forum/viewtopic.php?f=61&t=64022 Датчик реагирует на изминения температуры, но показывает неверное значения, сейчас дома около +28, а показывает +2 градуса. При зажимании датчика между пальцами, быстро подскакивает чуть ли до +40. Но у меня датчик DS18B20, а не просто DS1820 или DS18S20. Что я сделал не так ? Или изначальный код примера с ошибкой ? К сожаления самому проверить последний вопрос не представляеться возможным, в связи с отсутствием у меня Меги 32(16).
Мой вариант под спойлером. Пишу в АВР Студио 4.19
Спойлер
.include "tn2313Adef.inc" ; Use AtTiny2313A; Macro ======
; End macro ======
; RAM ======
.DSEG
.equ XTAL = 8000000
.equ BaudRate = 9600
.equ BaudDivider = XTAL/(16*BaudRate)-1
.def Temp1=R16
.def Temp2=R17
.def Temp3=R18
.def Temp4=R19
.def Flag=R20
;R25 assigned for 1-wire
TempDigit: .byte 2
; End RAM ======
; FLASH
.CSEG
.ORG 0
RJMP Reset ; Reset Handler
.ORG 0x0E
RJMP TIM1_COMPA ; Timer1 CompareA Handler
.include "DS1820.asm" ; Unit for DS18B20
; Interrupts ======
TIM1_COMPA:
LDI R16,0
OUT TCNT1H,R16
OUT TCNT1L,R16
RCALL GetTemp
RETI
; End Interrupts ======
; Reset and Initialization ======
RESET:
; Stack Pointer Initialization
LDI R16,RAMEND
OUT SPL,R16
; Variables Init
LDI R16,0
STS TempDigit,R16
STS TempDigit+1,R16
LDI Flag,0
; Configure I/O Ports
LDI R16,0xFF
OUT DDRB,R16 ;PortB полностью на вывод, для выводов A-G 7-сегментного индикатора
LDI R16,0b0111111
OUT DDRD,R16 ;PortD тоже не вывод, для общих проводов индикатора, но оставяем вывод PD6 на вход для датчика DS18B20
OUT PortD,R16
; Configure Timer, prescaler 1/256, compare to 0x7A12
LDI R16, (1<<OCIE1A)
OUT TIMSK,R16
LDI R16, (1<<CS12)
OUT TCCR1B,R16
LDI XL,LOW(0x7A12)
LDI XH,HIGH(0x7A12)
OUT OCR1AH,XH
OUT OCR1AL,XL
LDI R16,0
OUT TCNT1H,R16
OUT TCNT1L,R16
; Enable Interrupts Globally
SEI
; End Reset and Initialization ======
; Main ======
Main:
RCALL Display
RJMP Main
; End Main ======
; Procedure ======
Decoder:
LDI ZL,Low(DcMatrix*2)
LDI ZH,High(DcMatrix*2)
ADD ZL,Temp1
LDI Temp2,0
ADC ZH,Temp2
LPM Temp1,Z
RET
DcMatrix:
; hgfedcba hgfedcba
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
TempTable:
.db 0b00000000,0b00000000;0,0,0,0
.db 0b00000000,0b00000110;0,6,2,5
.db 0b00000001,0b00000010;1,2,5,0
.db 0b00000001,0b00001000;1,8,7,5
.db 0b00000010,0b00000101;2,5,0,0
.db 0b00000011,0b00000001;3,1,2,5
.db 0b00000011,0b00000111;3,7,5,0
.db 0b00000100,0b00000011;4,3,7,5
.db 0b00000101,0b00000000;5,0,0,0
.db 0b00000101,0b00000110;5,6,2,5
.db 0b00000110,0b00000010;6,2,5,0
.db 0b00000110,0b00001000;6,8,7,5
.db 0b00000111,0b00000101;7,5,0,0
.db 0b00001000,0b00000001;8,1,2,5
.db 0b00001000,0b00000111;8,7,5,0
.db 0b00001001,0b00000011;9,3,7,5
Delay:
LDI Temp1,0
LDI Temp2,4
Dll:
DEC Temp1
BRNE Dll
DEC Temp2
BRNE Dll
RET
Display:
/* LDI Temp1,0b00111110 ;Не знаю что делают это строки !!!
OUT PortD,Temp1
MOV Temp1,Flag
ANDI Temp1,0b01000000
OUT PortB,Temp1
RCALL Delay */
LDI Temp1,0b0101111 ;Выводим десятки градусов на вывод PD4
OUT PortD,Temp1
LDS Temp1,TempDigit+1
RCALL Decoder
ORI Temp1,0b10000000
OUT PortB,Temp1
RCALL Delay
LDI Temp1,0b0011111 ;Выводим еденицы градусов на вывод PD5
OUT PortD,Temp1
LDS Temp1,TempDigit
RCALL Decoder
OUT PortB,Temp1
RCALL Delay
RET
GetTemp:
; Reset 1-wire
RCALL Init_1W
; Skip address
LDI Temp1,CMD_SKIP_ROM
MOV R0, Temp1
RCALL Send_1W
; Read ScratchPad
LDI Temp1,CMD_R_SCRATCHPAD
MOV R0, Temp1
RCALL Send_1W
; Read bytes
RCALL ReadBytes_1w
; Reset 1-wire
RCALL Init_1W
; Skip address
LDI Temp1,CMD_SKIP_ROM
MOV R0, Temp1
RCALL Send_1W
; Convert temperature
LDI Temp1,CMD_CONVERT_T ; команда "измерить температуру"
MOV R0, Temp1
RCALL Send_1W
LDI Temp1,0
STS TempDigit,Temp1
STS TempDigit+1,Temp1
ANDI Flag,0b10111111
;***********************************************************
; Integer
LDS Temp2,Buffer ; Load LS
LDS Temp1,Buffer+1 ; Load MS
CPI Temp1,0x08
BRLO IsPlus
NEG Temp2
COM Temp1
STS Buffer,Temp2
STS Buffer+1,Temp1
ORI Flag,0b01000000
IsPlus:
ANDI Temp2, ~(0x0F)
OR Temp2, Temp1
SWAP Temp2
LDI Temp1, 0
IntLoop:
CPI Temp2,10
BRLO IntNext
SUBI Temp2,10
INC Temp1
RJMP IntLoop
IntNext:
STS TempDigit+1,Temp2
;***********************************************************
; Frac
LDS Temp3,Buffer ; Load LS
ANDI Temp3,0x0F ; Оставили дробную часть
; Умножая ее на 0.0625 получим табличное значение
LDI ZL,LOW(TempTable*2)
LDI ZH,HIGH(TempTable*2)
CLR R24
ADD ZL,Temp3
ADC ZH,R24
ADD ZL,Temp3
ADC ZH,R24
LPM Temp1,Z+
LPM Temp2,Z+
CPI Temp2,5
BRLO FracAdd
BREQ FracAdd
INC Temp1
FracAdd:
STS TempDigit,Temp1
GetTempExit:
ret
; End Procedure ======

