-         
+ Antworten
Ergebnis 1 bis 2 von 2

Thema: TWI funzt nicht - bitte um Hilfe

  1. #1
    Gast

    TWI funzt nicht - bitte um Hilfe

    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ö

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    13.07.2004
    Beiträge
    19
    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

+ Antworten

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •