/* ******************************************************************************** Funktion: ATtiny13a (4.8MHz) empfängt ROM und ROM Daten von DS18B20 oder DS18S20 im 5 Sekunden-Takt. Die Daten werden umgerechnet und per I2C über PCF8574 zum LCD1602/2004 übertraben. Line1: Anzeige DS18B20 oder DS18S20 (und im Fehlerfall der Code angezeigt). Line2: Temperatur -55,000 … 125,000°C. Taste: ca. 2 Sekunden ROM-, dann ca. 2 Sekunden RAM-Daten plus CRC Ergebnis angezeigt. TOGGSE bei Bedarf zum Testen */ ; Programm Code weiterentwickelt von Manfred Gabriel manfred.gabriel@hotmail.de ; auf Bitte von Manfred hier eingestellt ; https://www.mikrocontroller.net/topic/499008 ; https://www.mikrocontroller.net/attachment/463169/14_4_T13_I2C_PCF_LCD_MC.asm ; ********************************************************************************* ; ; ATtiny13A ; 4,8 MHz ; -------- ; |* | ; RESET |1 8| VCC ; SCL <-- PB3 |2 7| PB2 (SCK) --< Taste ; SDA <-- PB4 |3 6| PB1 (MISO) --> TOGGSE ; GND |4 5| PB0 (MOSI) <-> DS18x20 ; | | ; -------- ; ; -------------------------------- ; Standard > 4,8 MHz ; -------------------------------- ; SPIEN 0 = 0 ; EESAVE 1 = 1 ; WDTON 1 = 1 ; CKDIV8 0 > 1 < ; SUT1 1 = 1 ; SUT0 0 = 0 ; CKSEL1 1 > 0 < ; CKSEL0 0 > 1 < ;---------------------------------------------------------------------------------- .def NULL = R1 ; NULL = 0 .def Divisor = R15 ; Divisor 0b10001100 ; ------------------------------ .def Temp0 = R16 ; .def Temp1 = R17 ; .def Temp2 = R18 ; .def Temp3 = R19 ; .def Temp_Wait = R20 ; .def RAM_High = R21 ; Umrechnung OW_Temp_MSB ==> RAM_High .def RAM_Low = R22 ; Umrechnung OW_Temp_LSB ==> RAM_Low .def Curr_CRC_2 = R23 ; CRC_Ausgabe .def Fehler_Bit = R24 ; Fehler_Bit .equ DS_RESET = 0 ; DS18x20 RESET Fehler .equ CRC_ROM = 1 ; DS18x20 RAM CRC Fehler .equ CRC_RAM = 2 ; DS18x20 ROM CRC Fehler ;---------------------------------------------------------------------------------- .equ PORT_B = PORTB ; Port definieren .equ PORT_DDR = DDRB ; Datenrichtungsregister für Port .equ PORT_IN = PINB ; data Input .equ PORT_B1 = PB1 ; TOGGSE .equ Taste = PB2 ; Taste .equ SCL = PB3 ; I2C_SCL .equ SDA = PB4 ; I2C_SDA ;---------------------------------------------------------------------------------- .cseg .org 0x0000 rjmp RESET ; 0x0000 Reset Handler /* .org INT0addr rjmp INT_ERROR ; External Interrupt 0 .org PCI0addr rjmp INT_ERROR ; External Interrupt Request 0 .org OVF0addr rjmp INT_ERROR ; Timer/Counter0 Overflow .org ERDYaddr rjmp INT_ERROR ; EEPROM Ready .org ACIaddr rjmp INT_ERROR ; Analog Comparator .org OC0Aaddr rjmp INT_ERROR ; Timer/Counter Compare Match A .org OC0Baddr rjmp INT_ERROR ; Timer/Counter Compare Match B .org WDTaddr rjmp INT_ERROR ; Watchdog Time-out .org ADCCaddr rjmp INT_ERROR ; ADC Conversion Complete ; ********************************************************************************* INT_ERROR: reti ;************************************************************************** ATiny13a 4.8MHz / DS18x20 / PCF8574 / LCD2004 Manfred G. : Stand 18.03.2022 */ Version1: .db "Version 1.03" ; ********************************************************************************* .include "Write_4800kHz.asm" ;------------------------------------------- .include "Sklave_LCD_Init.asm" .include "I2C_Master.asm" ;------------------------------------------- .include "DS18x20_Read.asm" ; DS18x20 auslesen .include "DS18x20_0C_Display.asm" ; DS18x20 berechnen .include "DS18x20_RAM_ROM_LCD.asm" ; DS18x20 RAM / ROM anzeigen .include "DS18x20_LCD_Line_1.asm" ; DS18x20 LCD_Line_1 ;------------------------------------------- .include "TOGGSE.asm" ; TOGGSE bei Bedarf zum Testen ; ********************************************************************************* RESET: ;---------------------------------------------------------------------------------- ; cli ; Interrupt deaktivieren ldi Temp0, LOW(RAMEND) ; LOW-Byte der RAM-Adresse out SPL, Temp0 ;------------------------------------------- clr NULL ; R1 = 0b00000000 ldi Temp0, CRC_Code ; CRC Code definieren mov Divisor, Temp0 ; CRC 0b10001100 ;------------------------------------------- sbi PORT_DDR, PORT_B1 ; TOGGSE PB1 Input sbi PINB, Taste ; Taste Input High ;------------------------------------------- sbi PORT_DDR, SCL ; I2C_SCL = Outpot sbi PORT_B, SCL ; Output => High sbi PORT_DDR, SDA ; I2C_SDA = Outpot sbi PORT_B, SDA ; Output => High ;------------------------------------------- rcall Wait_15mS ; warte 15mS rcall Init_LCD_Sklave ; LCD_Sklave einschalten ;------------------------------------------- ; sei ; Interrupt aktivieren ; ********************************************************************************* LOOP: ;---------------------------------------------------------------------------------- rcall Temperatur_lesen ; Temperatur lesen rcall LCD_Line_1 ; LCD => DS18B20 oder DS18S20 rcall DS18x20_error ; bei Fehler: Code anzeigen ;------------------------------------------- rcall TOGGSE_1 ; TOGGSE bei Bedarf zum Testen rcall Wait_Loop ; Loop Wait ~5s ;------------------------------------------- sbic PINB, Taste ; Taste gedrückt ?? rjmp LOOP ; nein: Loop ; ********************************************************************************* rcall Line_ROM ; LCD: DS18x20-ROM anzeigen rcall Wait_RAM_ROM ; Wait: ~2 sec rcall Line_RAM ; LCD: DS18x20-RAM anzeigen rcall Wait_RAM_ROM ; Wait: ~2 sec rjmp LOOP ; zurück zur LOOP ; *********************************************************************************