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
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.
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
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. :-)
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
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.
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
Egal wie der Thread heisst, ich schau gleich noch mal drüber. Der Code ist ja oben!
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....
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
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.
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.
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
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.
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.
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
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
Genau so war es gedacht :D Ich wollte halt nur erst mal testen, und die Atmegas hatte ich noch :D
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.