Forum: Mikrocontroller und Digitale Elektronik TWI kommunikation hängt sich auf


von L. G. (macuser)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich versuch mich gerade darin eine Servo mit TWI zu Steuern.


Das Slave uC steuerter den Servo mittels Interupts,  so wie es hier 
beschrieben ist :

http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung


Zur TWI kommunikation nutze ich diese Klasse:

Beitrag "AVR TWI Master und Slave Funtionen in C"

Der Master sendet abhängig von der Tasten eingabe an Port B Pin 1 und 0
eine 1 oder 2. Der Slave stellt darauf das Signal um (Orca1 wird 
überschrieben). Gleichzeitig wird am Master uC an Port D Pin 1 oder 0 
auf High bzw. Low gesetzt.


Das Problem liegt nun darin das nach einmaligen umschalten, es sich 
nicht mehr Umschalten lässt. D.h. nach start ist eine änderung möglich, 
danach keine mehr.

Ich hoffe ihr könnt mit dem code etwas anfangen.

Über Hilfe würde ich mich sehr freuen

Viele Grüße Lars

von Jens (Gast)


Lesenswert?

Am Besten du machst dir in deinen Code noch eine UART mit rein und 
schreibst dir zu den verschiedenen Zuständen in deinem Programm 
ausgaben. Wie z.B.: "Signal gesendet" usw.
Du kannst dann genau feststellen, wo sich deine Kommunikation aufhängt. 
Außerdem hab ich beim Überfliegen von deinem Code nicht gesehen, wo du 
dir Errors abfängst. Der Bus kann die direkt erzeugen und die könntest 
du direkt ausgeben.

von L. G. (macuser)


Lesenswert?

Danke für den Tip mit dem Uart , manchmal denkt man auch nicht nach.

Also das TWI wirde gesendet, danach geht das Programm sofort wieder in 
die Hauptschleife,
dort allerdings kommt es zum sende versuch, dieser schlägt fehl.

Edit: Habe nun noch eine Pause eingefügt, so das bei einem drücken die 
if verzweigung nicht mehrmals anspricht, immer wenn versucht wir das 2 
mal über TWI zusenden ist schluss

Jens schrieb:
> Außerdem hab ich beim Überfliegen von deinem Code nicht gesehen, wo du
> dir Errors abfängst. Der Bus kann die direkt erzeugen und die könntest
> du direkt ausgeben.

Wie meinst du das?

Über weitere Hilfe und Anregungen würde ich mich freuen

Lars

von Jens (Gast)


Lesenswert?

Du kannst beim TWI Modul auch direkt das Statusregister auslesen und die 
Fehler erkennen. Wie z.B.: Stop gesendet oder eben nicht. Ich tippe 
darauf, dass deine Start und Stop Bedingungen nicht richtig stimmen.
Bei mir hat der Bus auch probleme gemacht. Schau dir hier im Forum mal 
das Tutorial zum TWI an und das Datenblatt vom Controller.
Deine Uart-Ausgabe musst du weiter aufschlüsseln. Nach jedem Schritt 
eine Ausgabe machen und du weisst genau wann der Controller aussteigt.
Morgen bin ich wieder da. Ich hab jetzt Feierabend. :-)

von L. G. (macuser)


Lesenswert?

Danke für die Schnelle antwort

Das Tutorial kenne ich natürlich :D

Der Uart ist ziemlich auf geschlüsselt,

Ich kann sagen das das erste senden Problemlos funktioniert,
erst wenn die sende Routine  das 2mal aufgerufen wird reagiert nichts 
mehr, selbst die if verzweigung die eigentlich das start bit überwacht, 
wird nicht mehr ausgeführt

von Jens (Gast)


Lesenswert?

Dann lies dir an dieser Stelle mal das TWI Statusregister aus. Da müsste 
ja ein Fehlercode drin stehen, warum nichts mehr gesendet wird. Ich 
tippe immer noch auf die fehlende Stop-bedingung.
Zudem kannst du im Slave auch mal mit UART debuggen was da passiert.
Und poste mal dein gesamtes Projekt. Ich kann es dann auf dem EVALBoard 
nachstellen und mit dem JTAG schauen was los ist.

von L. G. (macuser)


Lesenswert?

Ich habe es jetzt gefunden :D
Es lag am Slave es fehlte die quittierung, ganze viel dank für die nette 
und schnelle hilfe Jens :D Mnachmal braucht man einen denk anschub

Jetzt habe ich ein neues Problem, was auch schon bei meinem RS232 
Servosteuerung auftratt.

Der Orca1 Ausgang, wecheslt ab und an das Potential, heißt in diesem 
fall, bei initialsierung ligen für 1.5ms +5V an dancha für 20ms 0V. Vor 
der Änderung war es so, dass ich die Zeit bei +5V varieren konnte.

Jetzt ist es so das sobald die zeit +5V verändert wird das Potential 
tausch d.h. ich habe für 2 oder 1ms 0V und für 20ms +5V.


Leider kann ich den title nicht ändern/ aussage Kräftiger gestallten :D

von Jens (Gast)


Lesenswert?

Egal wie der Thread heisst, ich schau gleich noch mal drüber. Der Code 
ist ja oben!

von Jens (Gast)


Lesenswert?

Nimm als erstes mal die ganzen cli() und sei() aus deinem Hauptprogramm 
raus. Die blockieren sich vielleicht gegenseitig. Wie man die 
Interruptroutinen nicht unterbrechbar macht, liesst du am besten nochmal 
im Tutorial nach.
Ansonnsten kannst du den Timer umstricken und dir zwei Zeiten setzen. 
EIne für an und die andere für aus. Die werden dann un der 
Interruptroutine abwechselnd aufgerufen. Du brauchst dann auch nur den 
Overflow Interrupt. Versuch mal....

von L. G. (macuser)


Angehängte Dateien:

Lesenswert?

Moin Jens

wenn einmal was schief geht geht gleich alles schief...

nach dem ich heute noch ein paar sachen ausprobiert habe, gings los,
zu erst leif das TWI nicht mehr als nächstes ging mein ISP kable kapput, 
und nun scheint der Slave kontroller durch einen Kurzschluss hinüber ( 
beim abreisen des ISP Kables passiert)

Zu dem Problem mit dem TWI habe ich mal das gesamte Projekt angehangen. 
26.9.2011


So und zu den Interupts ich wüsste nicht wie ich das anderes als mit 
einem Compare match lösen sollte.

 Wenn die interupt routine die Zustände einzeln aufruft habe ich doch 
immer die gleiche Zeitspanne, es sei denn ich ändere ständig den 
Prescaler. Außerdem würde ich dann doch alle 1-2ms den Programm ablauf 
unterbrechen.


Wenn ich darin noch einen Gedanken fehler habe würde ich mich über
Hinweise Freuen :D

von Jens (Gast)


Lesenswert?

Dann müsstest du den Programmablauf unterbrechen. Das ist richtig. Mir 
ist aber noch was anderes eingefallen.
Du verwendest den CTC Mode vom Timer1. Das bedeutet, dass beim Compare 
Match der Ausgangspin getoggelt wird. Aber warum lösst du auch noch 
zusätzlich den Interrupt dazu aus? Den brauchst du nicht. Die OCR1A 
Register kannst du ja zu jeder Zeit ändern. Aber auch nur, wenn du einen 
neuen Wert über TWI bekommen hast.
Schmeiss doch im Slave die Interrupt Routine mal raus und änder den 
OCR1A Wert nur, wenn der neue Wert da ist.

von L. G. (macuser)


Lesenswert?

mhm gut frage

Wahrscheinlich habe ich nur mal was ausprobiert, es hat funktiniert und 
habe es dann so gelassen :D

So erst mal muss ich ein neues ISP Kable besorgen, bzw. die 
Steckkontakte :D
Bin ja noch anfänger da hat man nicht immer alles da :(

Danach hoffe ich das TWI wieder zum Laufen zu bekommen und danach 
kümmere ich mich wieder um den Steuerimpuls :D

Das mit dem Toggeln ist richtig, ich dachte  es ist besser die 
Zeitkritische Anwendung an ein Hardwearmodul des uC zu geben.

Sobald es ich den Stand von Gestern wieder ereicht habe, werde ich mal 
den Interupt rausnehmen.

von Jens (Gast)


Lesenswert?

Das machst du mal. Ich schau wieder rein...

von L. G. (macuser)


Angehängte Dateien:

Lesenswert?

SO es gibt neues von der front, also ich habe den stand von gestern 
wieder ereicht, das verlieren des TWI war wohl auf das verabschieden des 
uC zurück zuführen.

Ich habe dann auch mal den interupt raus genommen, jetzt habe ich keinen 
Potential Tausch mehr :D

Allerdings fährt der Servo nun nicht, einzige änderung zu vorher das Up 
und Down zeit nun gleich sind, sollte aber eigentlich für den Servo 
keine rolle spielen...

Ich glaube das es daran lieg das das Signal nun keinen vollen +5V 
ereicht,
warum auch immer, ich hoffe das der uC sich nicht auch bald schon wieder 
verabschiedet... was äußerst merkwürdig wäre.

Achgja im anhang das neue c -file für den slave

von L. G. (macuser)


Lesenswert?

Soderle mal wieder Tomaten auf den Augen gehabt, meine Spannungs 
Versorgung reichte nicht aus :D Jetzt Funktioniert es.

Im nächsten Schritt muss der Master nun mehrer Slaves Steuern :D

Ich melde mich wenn es was neues zu Vermelden gibt.

von Jens (Gast)


Lesenswert?

Mal eine Frage:
Steuerst du den Servo direkt an, oder hast du das Signal noch mit einem 
Transistor entkoppelt? Wäre von Vorteil um den µC nicht so zu stressen. 
Einfach einen Emitterfolger danach und das Signal am µC invertieren, 
oder eine Push-Pull Stufe mit zwei Transistoren und das Signal kann 
bleiben.
Soll ich dir nen Schaltplan schicken?
Kennst du: http://www.lynxmotion.com/
Da schaust du mal nach dem SSC32. Das ist ein 32facher Servomultiplexer. 
Genau das was du wahrscheinlich versuchst zu machen. Kommunikation aber 
nicht über I²C sondern über RS-232.

von L. G. (macuser)


Lesenswert?

zu 1. Momentan Steuere ich den Servo direkt an, genau wie die LED zur 
Rückmeldung im Slave Programm.
Bei der LED war es geplant noch einen Transistor als Treiber zu nutzen, 
beim Servo eigentlich nicht, da das Signal ja keine Leistung 
beansprucht.


Ich habe mir den SSC32 angeschaut, vieleicht sollte ich was zu dem 
Projekt sagen.

Zu erst habe ich den Servo per RS232 gesteuert mit Bedien Oberfläche am 
PC , einfach um zu lernen. Also in etwa so wie der SSC32, nur mit einem 
Servo

Bekannte von mir suchten dann eine möglickeit um Weichen im Modellbahn 
bereich per Servos zu steuern. Da diese Bekannten keine Feste Anlage 
bauen, sondern einzelne Module, somit  wäre eine Kommerziele Lösung mit 
sehr viel Verkabellungs aufwand verbunden gewesen.


Das Ziel war  es, eine Möglichst  dezentrale Steuerung, d.h. auch nur 
ein Controller für eine Weiche.

Ziel ist es also Pro Master 4Weichen (Slaves) Steuern zu Können, dies 
Geschieht über Taster, gleichzeitig gibt es eine Rückmeldung per LED.


Die Schaltung für Master- und Slaveplatine sind noch nicht angefangen, 
außer die nötigste Beschaltung auf meinem Steckbrett, d.h. wäre ich für 
weitere Anregung in diese Richtung sehr Dankbar

von Jens (Gast)


Lesenswert?

Naja, dann brauchst du ja nicht viel. Die Leitungen vom I²C schön 
verdrillen und auf die maximale Länge achten. Als Slave würde ich dann 
einen kleinen Tinyirgendwas nehmen und den I²C in Software 
implementieren. Dann ist der schön klein. Spannungsversorgung kannst du 
über die Bus-Leitung machen. Fertig ist die Laube. Als Stecker eignet 
sich dann vielleicht ein USB oder sowas. Die sind billig.
Taster mit dran (schön entprellen) und fertig.
Schönes Projekt!

Grüße, Jens

von L. G. (macuser)


Lesenswert?

Genau so war es gedacht :D

Ich wollte halt nur erst mal testen, und die Atmegas hatte ich noch :D

von Jens (Gast)


Lesenswert?

Du könntest dein Projekt nach Abschluss in der Codesammlung posten, weil 
da gibt es noch nicht so viel und das wird auch oft gefragt.

Grüße und viel Spass noch, Jens

von L. G. (macuser)


Lesenswert?

Mhm Ich weiß nicht, ob da in die Code Sammlung gehört
Die eigene Leistung von mir ist bei dem Code auch sehr gering,
Der Code ist Schlecht Kommentiert usw.

Als Stecker werden wohl normale RJ45 stecker verwendet, da die eh oft in 
den Modulen zum Einsatz kommen.

Als Slave werden wohl auch weiterhin Atmegas8 zum Einsatz kommen, da ich 
sie Günstig bekommen kann :D, hätte den Vorteil das man später auch noch 
mal Weichenlaternen oder anderes Zubehör Schalten kann :D

Viele Grüße und Danke für die Tipps

Lars

von Jens (Gast)


Lesenswert?

Bei RJ45 Steckern aufpassen. Die sind meisstens mit integriertem 
Übertrager. Da kannst du die Versorgungsspannung nicht mit übertragen.

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.