Перейти к содержанию
    

У меня такая проблема. Писал код "с нуля" на ассемблере, все согласно даташиту. В итоге датчик реагирует, но как то странно. При включении показывает температуру +85 С(0550h в первых двух считанных байтах, затем считывание прекращаю, подавая "ресет" ). Насколько я понял, так и должно быть, НО затем он начинает фиксировать изменения температуры относительно этого значения, как будто калибруется при подаче питания. И еще одна странность - младший бит байта 0 - всегда ноль, т.е. при нагреве (если коснуться датчика пальцами) температура начинает расти так - 0550h,0552h,0554h и т.д. Перепроверял все по нескольку раз, симулировал в Proteus - работает как надо, уже грешу на датчик. Может кто сталкивался?

 .include "m8535def.inc"

.equ clk = 0
.equ data = 1
.equ load = 7


.def hexL = r16 ; Младший байт шестнадцатиричного слова
.def hexH = r17 ; Старший байт шестнадцатиричного слова
.def hexHH = r18 ; Самый старший байт шестнадцатиричного слова
.def BCD0 = r22 ; BCD- разряды 2 и 1
.def BCD1 = r23 ; BCD- разряды 4 и 3
.def BCD2 = r24 ; BCD- разряды 6 и 5
.def BCD3 = r25 ; BCD- разряды 8 и 7

.def cnt = r19 ; Счетчик
.def tmp1 = r20 ; Рабочий регистр


;--------------------------------------------------------------

.ORG 0x0 ;?????? ?????? ?? RESET
rjmp RESET ; Reset Handler
rjmp EXT_INT0 ; IRQ0 Handler
rjmp EXT_INT1 ; IRQ1 Handler
rjmp TIM2_COMP ;TIM2_COMP Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
rjmp TIM1_CAPT ; Timer1 Capture Handler
rjmp TIM1_COMPA ; Timer1 Compare A Handler
rjmp TIM1_COMPB ; Timer1 Compare B Handler
rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
rjmp ADC_ ; ADC Conversion Complete Handler
rjmp EE_RDY ; EEPROM Ready Handler
rjmp ANA_COMP ; Analog Comparator Handler
rjmp TWSI ; Two-wire Serial Interface Handler
rjmp EXT_INT2 ; IRQ2 Handler
rjmp TIM0_COMP ; Timer0 Compare Handler
rjmp SPM_RDY ; Store Program Memory Ready Handler

RESET:
ldi r16,high(RAMEND) ; Main program start
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16

Start:

rcall INIT_PORTS
;rcall INIT_UART
;rcall getc ;for test comunication - nullmodem
;rcall putc

;ldi r16, 0x80
;out GICR, r16
;out GIFR, r16



;ldi r18, 0x01
;ldi r19, 0x03



main:
;ttest3:
;sbic PinD,2
;rjmp ttest3


rcall Init
rcall SkipROM
rcall ConvertT
rcall Init
rcall SkipROM
rcall ReadScratchpad
;ldi r27,0x17
;ldi r26,0x15

;lsr r27
;ror r26

mov r18,r27
mov r19,r27

andi r18,0x0f
andi r19,0xf0

lsr r19
lsr r19
lsr r19
lsr r19

mov r16,r19
ldi r17,0x08
rcall CIFRA
rcall CIFERBLAT

mov r16,r18
ldi r17,0x08
rcall CIFRA
rcall CIFERBLAT

mov r20,r26
mov r21,r26

andi r20,0x0f
andi r21,0xf0

lsr r21
lsr r21
lsr r21
lsr r21



mov r16,r19
ldi r17,0x08
rcall CIFRA
rcall CIFERBLAT



mov r16,r18
ldi r17,0x08
rcall CIFRA
rcall CIFERBLAT





ttest:
rjmp ttest


;rcall DataOut






rjmp main

/*---------------------------Write Time Slots----------------------------*/

write0:
in r16,DDRC
ori r16,0x04; !!!?????????!!
out DDRC, r16
cbi PortC,2

ldi r16, 0x23;70us
rcall TmrDelay

in r16,DDRC
andi r16,0xfb
out DDRC, r16; release line

rcall delay_15us

ret

write1:
in r16,DDRC
ori r16,0x04
out DDRC, r16
cbi PortC,2

ldi r16, 0x03; 6us
rcall delay

in r16,DDRC
andi r16,0xfb
out DDRC, r16; release line

ldi r16, 0x23;70us
rcall TmrDelay

ret


/*------------------------Read Time Slots-------------------------------*/
read:
in r16,DDRC
ori r16,0x04
out DDRC, r16
cbi PortC,2

ldi r16, 0x02; 4us
rcall delay

in r16,DDRC
andi r16,0xfb
out DDRC, r16; release line


ldi r16, 0x02; 4us
rcall delay

sbic PinC,2
ori r22,0x80

ldi r16, 0x30; 50us
rcall TmrDelay

ret

read_1byte:
ldi r21,0x08
ldi r22,0x00

loop_1byte:
lsr r22
rcall read
dec r21
cpi r21,0x00
brne loop_1byte
ret
/*------------------------------------------------------------------------*/





Init:

in r16,DDRC
ori r16,0x04; !!!?????????!!
out DDRC, r16

ldi r16,0xf0;480us
cbi PortC,2
rcall TmrDelay; Reset pulse


in r16,DDRC
andi r16,0xfb; !!!?????????!!
out DDRC, r16; release line

ldi r16,0x28;80us
rcall TmrDelay

sbic PinC,2;Presence pulse
rcall Error

ldi r16,0xc8;400us
rcall TmrDelay

sbis PinC,2;check if the sensor has released line
rcall Error

ret

Send:
ldi r21,0x08

start1:
ror r20
brcs wr

rcall write0
dec r21
cpi r21, 0x00
breq end1
rjmp start1
wr:
rcall write1
dec r21
cpi r21, 0x00
breq end1
rjmp start1
end1:
ret

SkipROM:;CCh
ldi r20,0xcc
rcall Send
ret


ReadScratchpad:;BEh

ldi r20,0xBE
rcall Send

reading:

rcall read_1byte
mov r26,r22

rcall read_1byte
mov r27,r22

rcall Init

ret

ConvertT:;44h

ldi r20,0x44
rcall Send

in r16,DDRB
ori r16,0x08
out DDRB, r16
cbi PortB,3;switch LED

ldi r22,0x00

converting:

rcall read
cpi r22,0x00
breq converting


in r16,DDRB
andi r16,0xf7
out DDRB, r16
cbi PortB,3;turn off LED

ret




ConfTmr0:



ldi r17,0x02
out TIMSK, r17;Compare Match interrupt is enabled

out OCR0,r16
sei

ldi r17,0x0a
out TCCR0,r17;CTC Mode, T=2us

ret


TmrDelay:
subi r16,6
rcall ConfTmr0
ldi r18,0x00

loop9:
cpi r18, 0xff
brne loop9
cli

nop ;correction
nop
nop

ret

Error:
go:
ldi r17,0x00

ldi r16, 0x08
out DDRB, r16
cbi PortB,3;switch LED

rjmp go
ret


delay:


loop1:
dec r16
cpi r16,0x00
nop
brne loop1
ret

delay_15us:
ldi r16, 0x06

loop_15us:
dec r16
cpi r16,0x00
nop
brne loop1
ret
/*---------functions for debugging-----------------------------*/

switch_LED:

loop_LED:
ldi r16, 0x08
out DDRB, r16
cbi PortB,3;switch LED
rjmp loop_LED
ret

CIFRA:
cpi r16, 0x00
breq L0
cpi r16, 0x01
breq L1
cpi r16, 0x02
breq L2
cpi r16, 0x03
breq L3
cpi r16, 0x04
breq L4
cpi r16, 0x05
breq L5
cpi r16, 0x06
breq L6
cpi r16, 0x07
breq L7
cpi r16, 0x08
breq L8
cpi r16, 0x09
breq L9
cpi r16, 0x0A
breq LA
cpi r16, 0x0B
breq LB
cpi r16, 0x0C
breq LC
cpi r16, 0x0D
breq L0D
cpi r16, 0x0E
breq LE
cpi r16, 0x0F
breq LF

L0: ldi r16,0xC0
ret
L1: ldi r16,0xF9
ret
L2: ldi r16,0xA4
ret
L3: ldi r16,0xB0
ret
L4: ldi r16,0x99
ret
L5: ldi r16,0x92
ret
L6: ldi r16,0x82
ret
L7: ldi r16,0xF8
ret
L8: ldi r16,0x80
ret
L9: ldi r16,0x90
ret
LA: ldi r16,0x88
ret
LB: ldi r16,0x83
ret
LC: ldi r16,0xC6
ret
L0D: ldi r16,0xA1
ret
LE: ldi r16,0x86
ret
LF: ldi r16,0x8E
ret



CIFERBLAT:

lsl r16
brcs SS1
cbi PortC, data
cbi PortC, clk
sbi PortC, clk
rjmp End_SS
SS1:
sbi PortC, data
cbi PortC, clk
sbi PortC, clk
End_SS:
dec r17
cpi r17, 0x00
brne CIFERBLAT
ret

HexBCD: ; xxxx (Hex) -> 0abcde (BCD)
rcall Div10 ; hexH:hexL / 10, ??????? - ? tmp1
mov BCD0,tmp1 ; ????????? - ? hexH:hexL, tmp1 = ?????? 1
rcall Div10 ; ??????? = ?????? 2
swap tmp1 ; ?????? 2 – ? ??????? ????????
or BCD0,tmp1 ; ?????????? ??????? 2 ? 1 ? BCD0
rcall Div10 ; ??????? = ?????? 3
mov BCD1,tmp1 ; ? BCD1
rcall Div10 ; ??????? = ?????? 4
swap tmp1 ; ?????? 4 – ? ??????? ????????
or BCD1,tmp1 ; ?????????? ??????? 4 ? 3 ? BCD1
rcall Div10 ; ??????? = ?????? 5
mov BCD2,tmp1 ; ? BCD2
rcall Div10 ; ??????? = ?????? 6
swap tmp1 ; ?????? 6 – ? ??????? ????????
or BCD2,tmp1 ; ?????????? ??????? 6 ? 5 ? BCD2
rcall Div10 ; ??????? = ?????? 7
mov BCD3,tmp1 ; ? BCD3
rcall Div10 ; ??????? = ?????? 8
swap tmp1 ; ?????? 8 – ? ??????? ????????
or BCD3,tmp1 ; ?????????? ??????? 6 ? 5 ? BCD3
ret


Div10: ; ??????? hexHH:hexH:hexL ?? 10,
; ????????? – ? hexHH:hexH:hexL, ??????? - ? tmp1
clr tmp1
lsl hexL
rol hexH
rol hexHH;
rol tmp1 ; ??????? ??????? ???? ???????? ?? 10
lsl hexL ; ????? ???? ? ??????????
rol hexH ; ?????? 0
rol hexHH
rol tmp1
lsl hexL
rol hexH
rol hexHH
rol tmp1
ldi cnt,21 ; ??????? ??? ?????????? 21 ????????s
Loop10:
lsl hexL ; ????? ???????? ????? ?? 1 ??????
rol hexH
rol hexHH
rol tmp1 ; ???????????? ? tmp1
subi tmp1,10 ; ????????: ???????????? > 10 ?
brlo HB1 ; ???????, ???? ???
inc hexL ; ??????????? ??????? ??????? ?? 1
rjmp HB2
HB1:
subi tmp1,-10 ; ????????? ???????? ????????
HB2:
dec cnt ; ?????????????? ??????? ????????
brne Loop10 ; ???????, ???? ??? ?? ??? ???????
ret

DataOut:
lsl r27
lsl r27
lsl r27
lsl r27
lsl r27
lsr r26
lsr r26
lsr r26
or r26,r27

mov r16,r26
lsr r16
ldi r17,0x00
ldi r18,0x00

rcall HexBCD

ldi r16,0x00
ldi r17,0x08
rcall CIFRA
rcall CIFERBLAT

mov r16,r23
ldi r17,0x08
rcall CIFRA
rcall CIFERBLAT

mov r18,r22
mov r19,r22
andi r18,0x0f
andi r19,0xf0
lsr r19
lsr r19
lsr r19
lsr r19

mov r16,r19
ldi r17,0x08
rcall CIFRA
rcall CIFERBLAT

mov r16,r18
ldi r17,0x08
rcall CIFRA
rcall CIFERBLAT


;ttest:
;rjmp ttest

ret

/*-------------------------------------------------------------*/

INIT_UART:
ldi r16,00
out UBRRH,r16
ldi r16,25
out UBRRL,r16
ldi r16,24 ; UART for TX and RX
out UCSRB,r16
ldi r16,0x86
out UCSRC,r16
ret

getc:
sbis UCSRA,RXC
rjmp getc
in r16,UDR
ret

putc:
sbis UCSRA,UDRE
rjmp putc
out UDR,r16
ret




















INIT_PORTS:
ldi r16, 0x00
out DDRA, r16 ;??? ?????

ldi r16, 0x00
out DDRB, r16

ldi r16, 0x03
out DDRC, r16

ldi r16, 0x10 ;??? LCD ???????, ??? LED ???????? ?? 0, 2->TXD
out DDRD, r16
ret




EXT_INT0: ; IRQ0 Handler+-

reti

EXT_INT1: ; IRQ1 Handler
reti
main2:
reti
TIM2_COMP:
reti ; Timer2 Compare Handler
TIM2_OVF:
reti ; Timer2 Overflow Handler
TIM1_CAPT:
reti ; Timer1 Capture Handler
TIM1_COMPA:
reti ; Timer1 Compare A Handler
TIM1_COMPB:
reti ; Timer1 Compare B Handler
TIM1_OVF:
reti ; Timer1 Overflow Handler
TIM0_OVF:
reti; Timer0 Overflow Handler
SPI_STC:
reti ; SPI Transfer Complete Handler
USART_RXC:
reti ; USART RX Complete Handler
USART_UDRE:
reti ; UDR Empty Handler
USART_TXC:
reti ; USART TX Complete Handler

ADC_:
reti

EE_RDY:
reti ; EEPROM Ready Handler
ANA_COMP:
reti ; Analog Comparator Handler
TWSI:
reti ; Two-wire Serial Interface Handler
EXT_INT2:
reti ; IRQ2 Handler
TIM0_COMP:

ldi r17,0x00
out TCCR0,r17
ldi r17,0x00
out TIMSK, r17
ldi r17,0x00
out TCNT0,r17;reset timer

ldi r18, 0xff

reti ; Timer0 Compare Handler
SPM_RDY:
reti ; Store Program Memory Ready Handler

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да , разобраться в Вашем коде .. . Давайте сделаем так , я дам Вам два кода с разными подходами к работе с датчиком . Попробуйте разобраться. что к чему и почему , на сайте , где-то выкладывал описание работы на русском языке (DS) Два файла ,не asm, Вам потребуются для расшифровки ASM файлов. И почитайте учебники по программированию, что бы привить себе стиль написания кода.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за помощь, но оказывается дело было в датчике, поменял его и все хорошо заработало.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...