zalg 0 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба У меня такая проблема. Писал код "с нуля" на ассемблере, все согласно даташиту. В итоге датчик реагирует, но как то странно. При включении показывает температуру +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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба Да , разобраться в Вашем коде .. . Давайте сделаем так , я дам Вам два кода с разными подходами к работе с датчиком . Попробуйте разобраться. что к чему и почему , на сайте , где-то выкладывал описание работы на русском языке (DS) Два файла ,не asm, Вам потребуются для расшифровки ASM файлов. И почитайте учебники по программированию, что бы привить себе стиль написания кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zalg 0 16 сентября, 2010 Опубликовано 16 сентября, 2010 · Жалоба Спасибо за помощь, но оказывается дело было в датчике, поменял его и все хорошо заработало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться