Gast
#324972
Hallo. Ich bin am verzweifeln. Habe den DS1621 Chip folgendermaßen angeschlossen: Vcc an +5V A0 bis A2 an +5V -> Adresse 111 GND an Masse SDA an PD2 (einen 2.7k von +5V zusätzlich darauf als Pull-Up) SCL an PD7 (einen 2.7k von +5V zusätzlich darauf als Pull-Up) Wollte zum testen, da ich zum ertsen Mal was mit I2C mache zuerst das Config Register beschreiben und danach wieder auslesen. Habe die Routinen von hier benutzt: http://www.kreatives-chaos.com/index.php?seite=i2croutinen dann mein Programm so: .include "8515def.inc" .include "i2c.inc" .equ scl = 7 .equ sda = 2 .equ i2c_port = PORTD .equ i2c_pin = PIND .equ i2c_ddr = DDRD .equ UBRRVAL = 51 ;8MHz, 9600 Baud .def temp = r16 .def rTempL = r18 ;16 Bit Zählregister definieren für pause_10ms .def rTempH = r19 ; Stackpointer initialisieren ldi R16, LOW(RAMEND) out SPL, R16 ldi R16, HIGH(RAMEND) out SPH, R16 ; Baudrate einstellen ldi temp, UBRRVAL out UBRR, temp sbi UCR, TXEN ;TX aktivieren cbi UCR, CHR9 ;8Bit Transfer ;register schreiben rcall i2c_start ldi r16, 0x9E ; Adresse des Chips senden ( 0x9F = lesen , 0x9E = schreiben) rcall putbyte ldi r16, 0xAC rcall putbyte ; Bytewert AC (=10101100) an den Chip senden ldi r16, 1 ; 1SHOT-Bit in Config-Register setzen rcall putbyte rcall i2c_stop rcall pause_10ms ;register lesen rcall i2c_start ldi r16, 0x9E ; Adresse des Chips senden ( 0x9F = lesen , 0x9E = schreiben) rcall putbyte ldi r16, 0xAC ;config-Register rcall putbyte rcall i2c_start ;repeated Start, diesmal mit lesen ldi r16, 0x9F rcall putbyte rcall getbyte ; Wert vom Chip lesen -> r16 rcall i2c_stop subi r16, -48 ; In ASCII wandeln rcall send_serial ende: rjmp ende ;programm einfach anhalten send_serial: sbis USR,UDRE ; Warten bis UDR für das nächste ; Byte bereit ist rjmp send_serial out UDR, r16 ret pause_10ms: ldi rTempL, 0b01000000 ;Den 16 Bit Wert Value ldi rTempH, 0b00011111 ;in das Zählregister laden. Delay2ka: subi rTempL, 0x01 ;Das Zählregister um eins sbci rTempH, 0x00 ;dekrementieren. brne Delay2ka ;Solange ungleich Null, Vorgang wiederholen. ;hier eventuelle NOP's einfügen ret klappt aber nich. Im Hyperterminal tut sich nix. Habe auch schon mit den original ATMEL Routinen probiert. Da hatte ich zumindest einen '/' im Terminal. Was mach ich falsch?