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
Hi >Lese schon zum 20ten mal den Code durch und finde einfach den Fehler >nicht :S Wie sieht deine Hardware aus? MfG Spess
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
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
Joa probiere eh nur einen anzusprechen gerade ^^ Werde es mal ohne Interrupt probieren und vergleichen! Danke erstmal! :)
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
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
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
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
Ist halt ne Schleife um solange zu warten bis TWINT gesetzt ist und dann TWSR auszulesen.. Kann ich das nicht so machen??
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
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
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
Die TSSOP16 Version, also mit 7 Addressbits, wovon alle bis auf A0 auf Masse geschlossen sind MfG Fabian
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.