Assembler-Beispiel für 1-Wire-Search mit DS2482-800 am ATmega168PA?

Antwort

Hier ist ein einfaches Beispiel in AVR-Assembler, das zeigt, wie du mit einem ATmega168PA über I²C (TWI) einen 1-Wire-Search-Befehl an einen DS2482-800 senden kannst. Das Beispiel beschränkt sich auf die Initialisierung und das Senden des Search-ROM-Kommandos, da eine vollständige 1-Wire-Search-Implementierung sehr umfangreich ist. Die eigentliche 1-Wire-Search-Logik (Bit für Bit) ist komplex und wird normalerweise in C oder höherer Sprache umgesetzt. **Voraussetzungen:** - TWI/I²C ist auf dem ATmega168PA initialisiert. - DS2482-800 ist korrekt angeschlossen (Adresse z.B. 0x18 für A0/A1/A2=GND). - Die Registeradressen und Kommandos des DS2482-800 sind bekannt. **Assembler-Beispiel:** ```assembly ; ATmega168PA, TWI/I2C auf 100kHz, F_CPU = 8MHz ; DS2482-800 I2C-Adresse: 0x18 (A0/A1/A2 = GND) ; 1-Wire Search ROM Kommando: 0xF0 .equ DS2482_ADDR = 0x30 ; 7-bit Adresse << 1 (0x18 << 1) .equ CMD_1WIRE_RESET = 0xB4 .equ CMD_1WIRE_WRITE_BYTE = 0xA5 .org 0x0000 rjmp main main: ; --- TWI/I2C initialisieren --- ldi r16, (1<<TWEN)|(1<<TWIE)|(1<<TWEA) out TWCR, r16 ldi r16, 72 ; TWBR Wert für 100kHz bei 8MHz out TWBR, r16 ; --- DS2482-800: 1-Wire Reset --- rcall i2c_start ldi r16, DS2482_ADDR ; Adresse + Write rcall i2c_write ldi r16, CMD_1WIRE_RESET rcall i2c_write rcall i2c_stop ; --- DS2482-800: 1-Wire Write Byte (Search ROM) --- rcall i2c_start ldi r16, DS2482_ADDR rcall i2c_write ldi r16, CMD_1WIRE_WRITE_BYTE rcall i2c_write ldi r16, 0xF0 ; Search ROM Kommando rcall i2c_write rcall i2c_stop ; Hier würde die eigentliche Search-Logik folgen... rjmp . ; --- I2C Routinen --- i2c_start: ldi r16, (1<<TWSTA)|(1<<TWEN)|(1<<TWINT) out TWCR, r16 wait_start: in r16, TWCR sbrs r16, TWINT rjmp wait_start ret i2c_write: out TWDR, r16 ldi r17, (1<<TWEN)|(1<<TWINT) out TWCR, r17 wait_write: in r17, TWCR sbrs r17, TWINT rjmp wait_write ret i2c_stop: ldi r16, (1<<TWSTO)|(1<<TWEN)|(1<<TWINT) out TWCR, r16 ret ``` **Hinweise:** - Die vollständige 1-Wire-Search-Logik ist sehr komplex und benötigt viele weitere Schritte (Bit- und Slot-Handling, Auswertung der Suchrichtung, usw.). - Für ein vollständiges Beispiel empfiehlt sich die Nutzung von C und die Verwendung der [Dallas/Maxim Application Notes](https://www.maximintegrated.com/en/design/technical-documents/app-notes/1/187.html). - Die I²C-Routinen sind sehr einfach gehalten und ohne Fehlerbehandlung. **Weitere Infos:** - [DS2482-800 Datenblatt](https://www.analog.com/media/en/technical-documentation/data-sheets/ds2482-800.pdf) - [AVR TWI/I2C Application Note](https://ww1.microchip.com/downloads/en/Appnotes/AVR315.pdf) Dieses Beispiel zeigt den grundsätzlichen Ablauf. Für eine vollständige 1-Wire-Search-Implementierung solltest du auf C oder eine Bibliothek zurückgreifen.

KI fragen