.include "m128def.inc" .equ LCD_PORT = PORTa .equ LCD_DDR = DDRa .equ PIN_RS = 5 .equ PIN_E = 4 .ifndef XTAL .equ XTAL = 14745600 ; .endif .def befehl = r0 ;enthält den auszugebenden 8bit-befehl . .def temp4 = r16 .def temp = r17 .def temp1 = r18 .def temp2 = r19 .def temp3 = r20 .def delay1 = r21 .def delay2 = r22 .dseg ;SRAM-Variablen temp_lsb: .byte 1 temp1_lsb: .byte 1 temp_msb: .byte 1 th_reg: .byte 1 tl_reg: .byte 1 res1: .byte 1 res2: .byte 1 count_re: .byte 1 count_pc: .byte 1 crc: .byte 1 id_rom: .byte 1 .CSEG .org 0x000 .include"Lcd_routines.inc" reset: ldi temp, LOW(RAMEND) ;LOW-Byte der obersten RAM-Adresse out SPL, temp ldi temp, HIGH(RAMEND) ;HIGH-Byte der obersten RAM-Adresse out SPH, temp rcall lcd_init ; Display initialisieren rcall lcd_clear ; Display löschen ;****************************************************************************** ; Hauptschleife ;****************************************************************************** main: ;rcall reset_pulse ;rcall rom_id ;Match Rom senden ;rcall read_sens ; rcall reset_pulse; ; rcall skip_rom ; rcall convert_t ; rcall reset_pulse ; rcall skip_rom ; rcall read_scratchpad ; rcall reset_pulse ;ID auslesen rcall reset_pulse rcall rom_id ;Match Rom senden ;OK ID des Sensors auslesen ;temperatur auslesen rcall reset_pulse rcall skip_rom rcall convert_t rcall reset_pulse ;hier muss jetzt rcall read_sens ;einen sensor mit seiner id direkt ansprechen ;hin um DIESEN einen Sensor auszuwähen ;SKIP-Rom würde wieder alle Sensoren gleichzeitig ansprechen rcall read_scratchpad ;und dessen Daten auszulesen rcall reset_pulse main1: ldi temp1, 0b11000000 ;Cursor auf 2. Zeile/1. Stelle rcall lcd_command ldi temp1,'I' rcall lcd_data ;und auf das Display ausgeben ldi temp1,'D' rcall lcd_data ;und auf das Display ausgeben ;SENSOR ID ANZEIGEN lds temp1, id_rom+0 ;ror temp1 rcall lcd_number lds temp1, id_rom+1 ;ror temp1 rcall lcd_number lds temp1, id_rom+2 ;ror temp1 rcall lcd_number lds temp1, id_rom+3 ;ror temp1 rcall lcd_number lds temp1, id_rom+4 ;ror temp1 rcall lcd_number lds temp1, id_rom+5 ;ror temp1 rcall lcd_number lds temp1, id_rom+6 ;ror temp1 rcall lcd_number lds temp1, id_rom+7 ;ror temp1 rcall lcd_number ;Temp-amzeigen ldi temp1,' ' rcall lcd_data ;und auf das Display ausgeben ldi temp1,'T' rcall lcd_data ;und auf das Display ausgeben ldi temp1,'e' rcall lcd_data ;und auf das Display ausgeben ldi temp1,'m' rcall lcd_data ;und auf das Display ausgeben ldi temp1,'p' rcall lcd_data ;und auf das Display ausgeben lds temp1, temp_lsb ;temp_lsb ror temp1 rcall lcd_number ;und auf das Display ausgeben rcall warten rjmp main ;****************************************************************************** ;****************************************************************************** ;ds18s20 routinen ;****************************************************************************** reset_pulse: sbi ddrd, 0 ;pd0 als ausgang cbi portd, 0 rcall wait500us ;mcu hält bus für mindestens 480us low cbi ddrd, 0 ;lässt den bus los, geht in rx-mode rcall wait70us ;wartet 70 us wait_presence_pulse: sbic pind, 0 rjmp wait_presence_pulse ;wartet auf presence pulse wait_presence_pulse_end: sbis pind, 0 rjmp wait_presence_pulse_end ;wartet bis presence pulse fertig rcall wait410us ;wartet 412 us ret ;****************************************************************************** write_1: ;schreibt eine 1 sbi ddrd, 0 ;PB0 Ausgang cbi portd, 0 ;bus auf low rcall wait6us ;wartet 8us (maximum sind 15us) cbi ddrd, 0 ;lässt bus los, nun durch ext R auf high rcall wait64us ;slot muss mind. 60us lang sein ret ;****************************************************************************** write_0: ;schreibt eine 0 sbi ddrd, 0 ;PB0 ausgang cbi portd, 0 ;bus auf low rcall wait60us cbi ddrd, 0 ;lässt bus los, nun durch ext R auf high rcall wait10us ;slot muss mind. 60us lang sein ret ;****************************************************************************** write_command: ;gibt einen befehl aus, lsb zuerst sbrs befehl, 0 rcall write_0 sbrc befehl, 0 rcall write_1 ror befehl ;nächstes bit ldi temp, 7 write_command_1: sbrs befehl, 0 rcall write_0 sbrc befehl, 0 rcall write_1 ror befehl dec temp brne write_command_1 ret ;****************************************************************************** skip_rom: ;gibt den befehl "Skip Rom" an den ldi temp, 0xCC ; sensor aus mov befehl, temp rcall write_command ret ;****************************************************************************** convert_t: ;gibt den befehl "Convert T" an den ldi temp, 0x44 ; sensor aus mov befehl, temp rcall write_command cbi portd, 0 sbi ddrd, 0 ;bus low für 6us rcall wait6us cbi ddrd, 0 ;bus loslassen rcall wait9us ;nach 9us samplen convert_t_1: sbis pind, 0 ;wartet bis conversion zu ende ist rjmp convert_t_1 ret ;****************************************************************************** read_scratchpad: ;gibt den befehl "Read Scratchpad" ldi temp, 0xBE ; an den sensor aus mov befehl, temp rcall write_command rcall read_bit ;nach dem befehl werden alle 9 byte sts temp_lsb, temp2 ; geschickt und eingelesen rcall read_bit sts temp_msb, temp2 rcall read_bit sts TH_reg, temp2 rcall read_bit sts TL_reg, temp2 rcall read_bit sts res1, temp2 rcall read_bit sts res2, temp2 rcall read_bit sts count_re, temp2 rcall read_bit sts count_pc, temp2 rcall read_bit sts crc, temp2 ret ;***************************************************** read_bit: ldi temp2, 0 ;temp2 auf 0 ldi temp, 8 ;8mal durchführen read_bit_0: ror temp2 cbi portd, 0 sbi ddrd, 0 ;bus low für 6us rcall wait6us cbi ddrd, 0 ;bus loslassen. rcall wait9us ;nach 9us samplen sbis pind, 0 ;schaut nach ob nun eine 0 anliegt rjmp read_bit_1 ;wenn ja, springe weiter ldi temp1, 128 ;add temp2, r26 add temp2, temp1 rjmp read_bit_2 read_bit_1: ldi temp1, 0 add temp2, temp1 read_bit_2: rcall wait55us dec temp brne read_bit_0 ;zum schluss steht das fertige byte in tmp3 ret ;;ROM-ID auslesen rom_id: ldi temp, 0x33 ;READ_ROM mov befehl, temp rcall write_command rcall read_bit ;nach dem befehl werden alle 9 byte sts id_rom+0, temp2 ; geschickt und eingelesen rcall read_bit sts id_rom+1, temp2 rcall read_bit sts id_rom+2, temp2 rcall read_bit sts id_rom+3, temp2 rcall read_bit sts id_rom+4, temp2 rcall read_bit sts id_rom+5, temp2 rcall read_bit sts id_rom+6, temp2 rcall read_bit sts id_rom+7, temp2 ret read_sens: ; an den sensor aus ;****************************************************************************** ldi ZL, LOW(ID_Tabelle*2) ldi ZH, HIGH(ID_Tabelle*2) ldi temp, 0x55 ; MATCH-ROM mov befehl, temp rcall write_command ldi temp3,8 ;8 Byte ausgeben loop: lpm befehl,Z+ ;Byte aus Flash holen rcall write_command dec temp3 brne loop ;;EINEN Sensor auslesen ; ldi temp, 0x55 ; MATCH-ROM ; mov befehl, temp ; rcall write_command ; lds befehl,id_rom+0 ; rcall write_command ; lds befehl,id_rom+1 ; rcall write_command ; lds befehl,id_rom+2 ; rcall write_command ; lds befehl,id_rom+3 ; rcall write_command ; lds befehl,id_rom+4 ; rcall write_command ; lds befehl,id_rom+5 ; rcall write_command ; lds befehl,id_rom+6 ; rcall write_command ; lds befehl,id_rom+7 ; rcall write_command ret wait500us: ldi delay2, 6 ldi delay1, 200 wait500us_1: inc delay1 brne wait500us_1 dec delay2 brne wait500us_1 ret ;****************************************************************************** wait410us: ldi delay2, 5 ldi delay1, 185 wait410us_1: inc delay1 brne wait410us_1 dec delay2 brne wait410us_1 ret ;****************************************************************************** wait70us: ldi delay1, 185 wait70us_1: dec delay1 brne wait70us_1 ret ;****************************************************************************** wait64us: ldi delay1, 170 wait64us_1: dec delay1 brne wait64us_1 ret ;****************************************************************************** wait60us: ldi delay1, 160 wait60us_1: dec delay1 brne wait60us_1 ret ;****************************************************************************** wait55us: ldi delay1, 141 wait55us_1: dec delay1 brne wait55us_1 ret ;****************************************************************************** wait10us: ldi delay1, 26 wait10us_1: dec delay1 brne wait10us_1 ret ;****************************************************************************** wait6us: ldi delay1, 13 wait6us_1: dec delay1 brne wait6us_1 nop nop ret ;****************************************************************************** wait9us: ldi delay1, 21 wait9us_1: dec delay1 brne wait9us_1 nop nop ret warten:;************************************************** ; ============================= ; Warteschleifen-Generator ; 11059000 Zyklen: ; ----------------------------- ; warte 11058993 Zyklen: ldi R23, $BB WGLOP0: ldi R24, $4D WGLOP1: ldi R25, $FF WGLOP2: dec R25 brne WGLOP2 dec R24 brne WGLOP1 dec R23 brne WGLOP0 ; ----------------------------- ; warte 6 Zyklen: ldi R23, $02 WGLOP3: dec R23 brne WGLOP3 ; ----------------------------- ; warte 1 Zyklus: nop ; ============================= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; LCD-Routinen ;; ;; ============ ;; ;; (c)andreas-s@web.de ;; ;; ;; ;; 4bit-Interface ;; ;; DB4-DB7: PD0-PD3 ;; ;; RS: PD4 ;; ;; E: PD5 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;sendet ein Datenbyte an das LCD lcd_data: push temp2 push temp3 mov temp2, temp1 ; "Sicherungskopie" für ; die Übertragung des 2.Nibbles swap temp1 ; Vertauschen andi temp1, 0b00001111 ; oberes Nibble auf Null setzen sbr temp1, 1<