Forum: Mikrocontroller und Digitale Elektronik Kein ACK von PCA9633 auf TWI


von Fabian E. (stingreydid)


Lesenswert?

Hallo Leute! :)

Ist mein erster Thread auf dem Forum, also bitte nicht zu hart sein mit 
mir :D

Bin gerade dabei eine LED Steuerung über einen ATMEGA1280 (Assembler) zu 
schreiben, welcher die Befehle zur Steuerung über den TWI oder I²C Bus 
schicken soll.

Zuerst setze ich TWCR auf 10100101.. setze also das TWINT bit zurück 
(mit logischer 1), aktiviere Start Condition, aktiviere TWI und 
aktiviere den TWI-Interrupt

Dann warte ich auf den Interrupt von TWINT und überprüfe ob das TWSR 
0x08 ist (ohne Prescaler) - also ob die Start Condition gesendet wurde - 
und schicke danach die Slave-Adresse die ich ansprechen will:
ldi temp,0b00000010   //Set SLA+W...Address (1) + Write bit to Data 
Register
sts TWDR,temp

lds temp,TWCR
ori temp,0b10000011   //Clear TWINT (with logic 1) -> next step
andi temp,0b11011111  //Clear Start Condition Bit
sts TWCR,temp
sei
call WaitForInterrupt

Sobald der Interrupt auftritt überprüfe ich, ob ich 0x18 empfangen habe, 
was ACK entsprechen würde, empfange allerdings immer 0x20.. auch wenn 
ich als Adresse 0b00000000 nehme.. was ja alle Adressen ansprechen 
würde..

Die Adresse des PCA9633 ist allerdings hardwaremäßig auf 1 gesetzt und 
sollte daher passen..

Lese schon zum 20ten mal den Code durch und finde einfach den Fehler 
nicht :S

MfG Fabian

von spess53 (Gast)


Lesenswert?

Hi

>Lese schon zum 20ten mal den Code durch und finde einfach den Fehler
>nicht :S

Wie sieht deine Hardware aus?

MfG Spess

von Fabian E. (stingreydid)


Lesenswert?

ATMEGA 1280 SDA und SDL mit 10k auf 5V.. Von da aus auf ne andere 
Platine mit Kabel mit mehreren PCA9633 drauf mit gleicher Versorgung und 
gleicher Masse

Falls du mehr Details brauchst bitte einfach fragen

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>ATMEGA 1280 SDA und SDL mit 10k auf 5V...

Die Pullups können ruhig kleiner sein.

>Zuerst setze ich TWCR auf 10100101.. setze also das TWINT bit zurück
>(mit logischer 1), aktiviere Start Condition, aktiviere TWI und
>aktiviere den TWI-Interrupt
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^

Wozu? Du willst doch keinen Interrupt benutzen.

>Von da aus auf ne andere
>Platine mit Kabel mit mehreren PCA9633

Du solltest erst mal mit einem Slave anfangen.

Ich habe dir mal meine TWI-Lib angehangen. Da kannst du mal vergleichen.

MfG Spess

von Fabian E. (stingreydid)


Lesenswert?

Joa probiere eh nur einen anzusprechen gerade ^^

Werde es mal ohne Interrupt probieren und vergleichen! Danke erstmal! :)

von Fabian E. (stingreydid)


Angehängte Dateien:

Lesenswert?

Immer noch nichts :S

Hier der relevante Teil des Codes.. vll findest du einen Fehler

Hoffe ist alles dabei, dass du brauchst, habe nur schnell die wichtigen 
Teile rüberkopiert

von spess53 (Gast)


Lesenswert?

Hi

> vll findest du einen Fehler

Du wartest nicht auf das Ende deiner ausgelösten Aktionen. Wenn du z.B. 
eine Startbedingung auslöst
1
start_i2c:            ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
2
                      sts TWCR, r16              ; Start senden
3
                                       
4
start_i2c10:          lds r16,TWCR      
5
                      sbrs r16,TWINT     
6
                      rjmp start_i2c10
7
                      ....

Musst du warten, bis das TWINT-Bit wieder gesetzt ist. Erst dann kannst 
du TWSR auslesen.

MfG Spess

von Fabian E. (stingreydid)


Angehängte Dateien:

Lesenswert?

OK, habe jetzt den Code umgeschrieben, auf Grund von hoffentlich 
besserer Lesbarkeit und besserer Funktion haha..

Habe auch das mit TWINT probiert, Code ist im Anhang..

Sonst noch einen Lösungsvorschlag? haha :D

MfG Fabian

von spess53 (Gast)


Lesenswert?

Hi

>    ....
>    sbrc  temp,TWINT          //Skip ReadTWSR, if TWINT is not set yet
>    call  ReadTWSR
>    cpi    temp,0x08          //Check if TWSR = 0x08...Start Condition sent
>    brne  WaitForStartAnswer

Bei einem Fehler hängt er sich hier auf.

MfG Spess

von Fabian E. (stingreydid)


Lesenswert?

Ist halt ne Schleife um solange zu warten bis TWINT gesetzt ist und dann 
TWSR auszulesen.. Kann ich das nicht so machen??

von spess53 (Gast)


Lesenswert?

Hi

>Kann ich das nicht so machen??

Es geht nicht um TWINT. Dein Code wartet bis der Statuscode für eine 
erfolgreiche Aktion kommt. Und wenn der nie kommt?

Du kannst dir auch mal den Assembler-Code im Datenblatt ansehen. Der ist 
etwas 'übersichtlicher' gehalten.

MfG Spess

von Fabian E. (stingreydid)


Lesenswert?

Ja das ist mir schon klar, probiere ja nur erstmal das ganze zu debuggen 
und ein Datenbyte an den Empfänger zu senden.
Danach werden Fehlerbehandlungen natürlich eingebaut, aber mein Problem, 
dass ich kein ACK zurückbekomme besteht immer noch :S

von spess53 (Gast)


Lesenswert?

Hi

>aber mein Problem, dass ich kein ACK zurückbekomme besteht immer noch :S

Welchen PCA9633 hast du eigentlich? Lt. Datenblatt gibt es den mit 
verschiedenen Möglichkeiten der Adresskonfiguration.

MfG Spess

von Fabian E. (stingreydid)


Lesenswert?

Die TSSOP16 Version, also mit 7 Addressbits, wovon alle bis auf A0 auf 
Masse geschlossen sind

MfG Fabian

von Fabian E. (stingreydid)


Lesenswert?

Niemand ne Idee? :S

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.