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.
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)
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?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
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
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.
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
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.
Lesezeichen