Hallo, ich möchte einen ATmega16 als TWI-Slave betreiben, wobei aber die I2C-Verarbeitung NICHT als Interrupt realisiert ist, sondern in einer Endlosschleife im Hauptprogramm läuft. Grund dafür ist, dass in einer Interruptroutine ein Schrittmotor angesteuert werden soll und diese Routine soll nicht durch einen zweiten Interrupt gestört oder verzögert werden. In meinem jetzigen Programm wird der Motor häufig gestört, wenn die TWI-Kommunikation dazwischenfunkt. Bei TWI im Hauptprogramm müsste die TWI-Verarbeitung halt kurz auf das Ende des Motor-IRQs warten, das wäre aber nicht schlimm. Wo finde ich ein kleines Beispiel für einen TWI-Slave ohne Interrupt, möglichst in Assembler ? Gruß, Martin
Was wäre wenn du die Interupts in der Routine des Motors erst deaktivierst und dann wieder anschaltest, wenn du fertig damit bist? Gruß ErgoProxy
>In meinem jetzigen Programm wird der Motor häufig gestört,
Das kann nur bei relative schlichter Programmierung oder
Schrittfrequenzen > 20kHz der Fall sein.
Aber wenn Du unbedingt den TWI-Int vermeiden möchtest, laß ihn doch
einfach deaktiviert und frage hin und wieder das Flag ab.
Hallo Andreas und Dino, >Was wäre wenn du die Interupts in der Routine des Motors erst >deaktivierst und dann wieder anschaltest, wenn du fertig damit bist? danke, das macht der Prozessor sowieso, weil das I-Flag innerhalb einer Interruptroutine weitere Interrupts verhindert. Das Problem ist eher, dass wenn bereits ein TWI-Interrupt läuft (dann auch weitere Interrupts gesperrt sind), ein anstehender Motor-IRQ bis zu Ende der TWI-Routine warten muss. Wenn ich in der TWI-Routine weitere (Motor-)Interrupts freigebe, treten weitere TWI-Interrupts auf, was eigentlich nicht sein sollte (?). >Das kann nur bei relative schlichter Programmierung oder >Schrittfrequenzen > 20kHz der Fall sein. Die Interruptroutine für den Motor läuft mit 64 KHz, fragt einen Encoder ab und sendet bei jedem vierten Aufruf neue Daten zum Motortreiber, also mit 16 KHz. In den anderen drei Aufrufen werden Berechnungen durchgeführt (Schrittzähler erhöhen, Mikrostep-Sinustabelle auslesen usw.). Die CPU ist etwa 2/3 ihrer Zeit im Interrupt. Die Störungen bringen den Motor nicht aus dem Tritt, also keine großen Probleme. Man fühlt und hört es aber am Motor, etwa wie ein leichter Lagerschaden oder Sandkörnchen im Lager. Nicht so gut, wenn man eine Präzisionsmaschine (Teleskopmontierung) damit antreiben will. >Aber wenn Du unbedingt den TWI-Int vermeiden möchtest, laß ihn doch >einfach deaktiviert und frage hin und wieder das Flag ab. Danke, ich wusste nicht, das es so einfach ist. Einen TWI-Master habe ich so schon programmiert, aber ich dachte, ein Slave könnte vom sendenden Master 'überfahren' werden, wenn er mal nicht rechtzeitig reagiert.
>aber ich dachte, ein Slave könnte vom >sendenden Master 'überfahren' werden, Das gerade nicht! Das ist der Vorteil vom IIC gegenüber USART Übertragung. Der Nachteil ist der, daß ein fehlerhafter Slave den Bus unbegrenzt blockieren kann. Ein timeout vorzusehen (ggf. watchdog), kann hilfreich sein. >Die Interruptroutine für den Motor läuft mit 64 KHz, fragt einen Encoder >ab und sendet bei jedem vierten Aufruf neue Daten zum Motortreiber, Dann läuft Dein Controller schon mit 16-20MHz. Vielleicht gelingt es Dir, die 64kHz (Über-)Abtastung zu reduzieren. Auch ein Umschalten der Mikroschritte auf Vollschrittbetrieb ab 2-3kHz kann den Controller deutlich entlasten. Mikroschritte sind nur für langsame Bewegung sinnvoll.
Nochmal ganz kurz: In die Motorinterruptroutine kommt an den Anfang das beenden der globalen Interupts am Ende schaltest du sie wieder ein. In die TWIinterruptroutine kommt am Anfang einfach das Aktivieren weiterer Interrupts -> es kann eigendlich(kenn den Prog ned) nurnoch der Motorinterrupt kommen und der Beendet ja die Interupts. Aus der Schachtelung ergibt sich das der TWI immer unterbrochen werden kann aber der Motor immer durchläuft. Problem wäre nur wenn innerhalb der TWI-Verarbeitung ein weiterer Interuppt für TWI ausgelöst wird. Würde halt Chaos geben, aber da müsste ich halt wissen wie genau du was auslöst, m das genau sagen zu können. Gruß ErgoProxy
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.