PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR: I2C und ACK/NACK Bits



Murus
18.07.2007, 12:12
Hallo zusammen,

ich steuere ein I2C Thermometer (DS1631Z) mit einem AVR (Mega8) 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 Mega8) 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)



'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

PicNick
18.07.2007, 15:13
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.

Murus
18.07.2007, 17:18
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

PicNick
18.07.2007, 17:47
Eine Möglichkeit ist, jedesmal:
CALL WAIT_LOOP

und den Loop nur einmal schreiben

WAIT_LOOP:
DO .......
RETURN

Das spart ein bißchen