PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] TWI funzt nicht - bitte um Hilfe



13.07.2004, 13:56
Hallo!

Ich kämpfe vergeblich darum meinen Hardware TWI zum Laufen zu bekommen. Ich verwende einen mega32 auf stk500 und als slave einen EEPROM 24C64.

Ich hab einen Software TWI mit RTC erfolgreich am laufen, verzweifle aber seit Tagen am Versuch den HardwareTWI mit dem Speicher zum Laufen zu bekommen. Ich habe eine Codevorlage, aber es nützt nichts. Das Programm läuft ohne Hänger durch aber wenn ich was schreibe und rücklese bleibt das Ausgaberegister leer.

Ich weis die Fehlersuche ist ekelig, aber eventuell erbarmt sich ja einer. Danke!

by Pö

14.07.2004, 09:45
Ok, ich finde den Fehler immer noch nicht, ich poste hier mal den Code, eventuell gibt es ja jemand der sich mit TWI gut auskennt. Möglicherweise liegt der Fehler gar nicht im Code sondern irgendwie am drumherum.

Danke!

Im Hauptprogramm laufen nacheinander die Routinen

rcall H_TWI_WRITE ; EEPROM beschreiben
rcall H_TWI_READ ; vom EEPROM lesen

es gibt neben den Standartvereinbarungen folgende Vereinbarungen:

.equ HSCLP = 0
.equ HSDAP = 1
.equ TWIrd = 1
.equ TWIwr = 0
.equ EEPROM = 174 ; 1010 für EEPROM, 111x für individuelle Geräteadresse

Der dazugehörige Code lautet auf:

H_TWI_START:

cbi TWSR, TWPS1
cbi TWSR, TWPS0
ldi r16,0x0C ; Original: 0x0B
out twbr,r16
sei
H_TWI_SSTART:

clr r16
ldi r16,(1<<TWINT) | (1<<TWSTA) | (1<<TWEN)
out TWCR,r16
H_TWI_START_w:
in r16,TWCR
sbrs r16,TWINT
rjmp H_TWI_START_w
ret

;***Hardware TWI Datentransfer von r=16 ***

H_TWI_DATA:
out TWDR,r16
clr r16
ldi r16, (1<<TWINT) | (1<<TWEN)
out TWCR,r16
H_TWI_DATA_w:
in r16,TWCR
sbrs r16,TWINT
rjmp H_TWI_DATA_w
ret

;***Hardware TWI Stop***

H_TWI_Stop:
clr r16
ldi r16, (1<<TWINT) | (1<<TWSTO) | (1<<TWEN)
out TWCR,r16
ret

;***Hardware TWI_WRITE - Schreibroutine***
H_TWI_WRITE:

rcall H_TWI_START

ldi r16,EEPROM+TWIwr ; IC Adressieren und schreiben
rcall H_TWI_DATA
ldi r16,0x00 ; Pointer Speicherplatz HIGH / Daten auf BUS legen
rcall H_TWI_DATA
ldi r16,0x00 ; Pointer Speicherplatz LOW / Daten auf bus legen
rcall H_TWI_DATA

ldi r16,0x01 ; Übertragungsdaten
rcall H_TWI_DATA

rcall H_TWI_STOP

ret


;***Hardware TWI_READ - Empfangsroutine***
H_TWI_READ:

rcall H_TWI_START ;Start

ldi r16,EEPROM+TWIwr ; IC Adressieren und schreiben
rcall H_TWI_DATA

ldi r16,0x00 ;Pointer auf Speicherplatz setzen
rcall H_TWI_DATA ;Befehle/Daten auf Bus legen

ldi r16,0x00 ;Pointer auf Speicherplatz setzen
rcall H_TWI_DATA ;Befehle/Daten auf Bus legen

rcall H_TWI_SSTART ;Neues Start zeichen

ldi r16,EEPROM+TWIrd ; IC Adressieren und schreiben
rcall H_TWI_DATA

ldi r16,0x00
rcall H_TWI_DATA ;Leeres Datenpaket schicken und damit Clock erzeugen DA BIN ICH NICHT SICHER DAD DAS SO GEHT

rcall H_TWI_STOP ;Stop ausgeben

ret