-         

Ergebnis 1 bis 4 von 4

Thema: AVR: I2C und ACK/NACK Bits

  1. #1
    Murus
    Gast

    AVR: I2C und ACK/NACK Bits

    Anzeige

    Hallo zusammen,

    ich steuere ein I2C Thermometer (DS1631Z) mit einem AVR (Mega an.
    Dazu möchte ich die hardwareseitige Lösung im AVR benutzen. Dazu eine Frage zu den ACK/NACK Bits.

    Wenn der AVR die Temperaturdaten des Thermometers empfängt, werden zwei Datenpakete vom Thermometer geschickt. Nach dem ersten Datenpaket muss der Master (der Mega mit einem "ACK" antworten. Dann wird das zweite Datenpaket mit den Temperaturdaten geschickt. Nach diesem zweiten Paket muss der Mater mit einem "NACK" antworten. Danach kommt die Stop-Bedingung.

    Hier mal mein Code fürs Emfpangen der Temperaturdaten: (Bascom)

    Code:
    'Temperaturwert einlesen:
    
        Twcr = &B10100100                  ' Start erzeugen
        Do : Loop Until Twcr.twint = 1      ' Warten bis Start erzeugt
    
        Twdr = &B10010000                   ' Slave Adresse senden (write)
        Twcr = &B10000100                   ' Aktion auslösen
        Do : Loop Until Twcr.twint = 1      ' Warten bis fertig
    
        Twdr = &B10101010                   ' Befehl senden  (Temp. ausgeben)  
        Twcr = &B10000100                   ' Aktion auslösen
        Do : Loop Until Twcr.twint = 1      ' Warten bis fertig
    
        Twcr = &B10100100                   ' Erneut Start erzeugen
        Do : Loop Until Twcr.twint = 1      ' Warten bis Start erzeugt
    
        Twdr = &B10010001                   ' Slave Adresse senden (read)
        Twcr = &B10000100                   ' Aktion auslösen
        Do : Loop Until Twcr.twint = 1      ' Warten bis fertig
    
        Twcr = &B10000100                    ' Temp.Daten einlesen
        Do : Loop Until Twcr.twint = 1
        Twidaten1 = Twdr                       ' erstes Datenpaket 
    
        Twcr = &B10000100                    ' Temp. Daten einlesen
        Do : Loop Until Twcr.twint = 1
        Twidaten2 = Twdr                       ' zweites Datenpaket
    
        Twcr = &B10010100                   ' Stop
    Hier habe ich jetzt nichts spezielles gemacht, damit der Master mit Ack/Nack antwortet. Nach dem Emfpangen von "TWIdaten1" muss er ein Ack schicken. Frage: Muss ich dies explizit erwähnen, oder macht mir das die Hardware automatisch?
    Nach dem zweiten Datenpaket möchte ich ein Nack senden... Wie bringe ich das dem AVR bei? Welche Register muss man da wie setzen, damit das geht?

    Und noch eine Frage: Warum braucht dieser Code (direkte Ansteuerung der AVR-Register) mehr Speicherplatz als die Software-Emulation von Bascom??

    Herzlichen Gruss und vielen Dank
    Mario

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    ACK oder nicht, entscheidet das TWEA-Bit (2^^6)

    der mehrfache "LOOP until BIT-Set" ist seeehr teuer und braucht mächtig.
    das kann der Grund sein.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Murus
    Gast
    Ok, dann setz ich einfach beim Empfangen im TWCR-Register das Bit, oder eben nicht, danke!

    Wie würdest du dann die Abfrage machen, wann die I2C-Aktion beendet ist, und man weitermachen kann?

    Herzlichen Gruss und Danke

    Mario

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Eine Möglichkeit ist, jedesmal:
    CALL WAIT_LOOP

    und den Loop nur einmal schreiben

    WAIT_LOOP:
    DO .......
    RETURN

    Das spart ein bißchen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

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