TWI Kommunikationsproblem (TWINT FLag)

#2896254
Lesenswert?

Hallo!

Bin gerade dabei ein TWI auf meinem ATMEGA168 zu programmieren. Nun hab 
ich schon ausprobiert ob er mit dem anderen Prozessor kommuniziert, was 
er leider nicht macht. Am oszilloskop bekomm ich nur eine Start- Flanke.

Da ich nur das STK500 verwende zum draufprogrammieren verwend ich nur 
den Simulator um ein paar Sachen zu testen. Hab also im Simulator das 
TWI Programm, zumindest den Anfang, getestet.
Was mir dabei aufgefallen is, dass er bei meiner Start Routine das TWINT 
Flag nicht setzt obwohl ich es gesetzt habe.

Kann das der Grund sein? Und wie kann ich es dazu bringen es zu setzen?

ldi   temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
sts   TWCR, temp

So sieht die start routine aus nur eben im simulator sehe ich nicht dass 
das TWINT gesetzt wird nach den befehlszeilen.
Geht das gar nicht im SImulator? Normal müsste es funktionieren oder?

MfG
Lukas
#2896326
Lesenswert?

Ja ich benutze das AVR Studio 4.19.

Alles klar. Glaube jedoch trotzdem das es daran liegen könnte warum 
meine Kommunikation nicht funktioniert.
Wenn ich eben mit dem Slave kommuniziere wird am Oszi nur eine Start 
Flanke (sieht zumindest so aus) angezeigt beim Pin Data. Beim Pin Clock 
bekomm ich überhaupt eine seltsam aussehende Flanke.
Weißt du vllt was das Problem ist ?

LG Lukas
Gast #2896344
Lesenswert?

Hi

>Weißt du vllt was das Problem ist ?

Was kommt denn nach deinen 2 Zeilen? Bei mir sieht das so aus:
1
                      ; Startbedingung senden
2
                      ; out: Z=1 wenn ok
3

4
                      .if use_start_i2c
5

6
start_i2c:            ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
7
                      sts TWCR, r16              ; Start senden
8
                                       
9
start_i2c10:          lds r16,TWCR
10
                      sbrs r16,TWINT
11
                      rjmp start_i2c10
12
                      lds r16,TWSR               ; Statusregister
13
                      andi r16,$F8               ; Prescaler ausblenden
14
                      ret

MfG Spess
#2898443
Lesenswert?

So bekomme jetzt Daten aus dem TWI heraus.
Habs jetzt soweit überprüft, dass beim SDA nur die Start Daten
herauskommen.
Also nach dem Start einfach mal ein rjmp main  und eine Warteschleife 
gesetzt.
Diese 2 Zeilen immer wieder hintereinander:

ldi   temp,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
sts   TWCR, temp

Jetzt sehe ich am Oszi aber  in einem Zyklus (also nach der 
Warteschleife) 01010101010101010101 statt einer Start
Flanke (01). Wie kommt der TWI zu dem Bitmuster?

LG Lukas
Gast #3039386
Lesenswert?

Hallo,

ich kapere diesen halbwegs aktuellen Thread mit einer kleinen 
Zusatzinfo, die vielleicht anderen auch helfen kann.

Das Problem: TWINT wird nicht gesetzt und der Controller hängt bei
1
while  (!(TWCR & (1<<TWINT)));
nach dem Setzen der Start Condition.

Benutzt habe ich die Lib von Peter Fleury, Hardware TWI an einem 
ATmega32, 10k Pull-Ups an SCL und SDA auf dem Breakboard des PCA9685

Auf dem Oszi bzw. Logic Analyzer habe ich eine korrekte Start Condition 
gesehen, danach passierte nichts mehr.
Durch LED blinken lassen habe ich herausgefunden, dass der Controller 
hängt und es bis auf obige Codezeile eingegrenzt.

Alles mehrfach überprüft, aber alles schien ok.
Letzter Verdacht waren die LEDs mit Vorwiderstand an meinen SCL und SDA 
Pins.
Und siehe da, diese waren die Ursache... LEDs entfernt und es läuft!

Hoffe jemandem geholfen zu haben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren