Hallo Atmel Fans, ich arbeite gerade mit einem XMEGA 256A3U. Als IDE kommt der Codevision Compiler zum Einsatz. Mein Programm sieht wie folgt aus: 1. Im Mainprogramm werden mehrere Schrittmotoren über 2 seperate I2C Schnittstellen angesteuert. Ich habe z.B. Funktionen geschrieben wie SetNewPosition oder GetStatus. Diese Funktionen müssen z.B. 8 Bytes an ein externes Schrittmotor IC übertragen. Das IC2 Interface arbeitet mit 100kHz. Demnach benötigt man schon recht viel Zeit bis alle Daten an das externe IC übertragen sind. Das I2C Interface ist nicht Interrupt gesteuert. Sondern ich schreibe das zu übertragene Byte in das I2C Data Register und warte polle so lange bis die Übertragung abgeschlossen ist. Außerdem habe ich eine RS232 Interruptroutine geschrieben. Diese Interruptroutine empfängt Daten mit 115200 Bauts. Nun zu meinem Problem: Wenn ich gerade Daten an den externen Schrittmotortreiber per I2C übertragen trift eine RS232 Interrupt ein. Demnach wird die RS232 Interruptroutine ausgeführt und unterbricht die I2C Übertragung. Und genau hier habe ich bedenken. Erzeugt die RS232 Interruptroutine ein Backup von ALLEN ALU Registern (R1 bis 32)? Die Interruptroutine hat der Codevision Wizard erstellt. Demnach weis ich nicht was alles auf dem Stack gesichert wird. Hierzu müste ich den Assemble Code genauer analysieren. Jedoch kann die dies nicht interpretieren :-). Auf was muss ich denn genau achten. Ich könnte auch zu bestimmten Zeitscheiben den globalen Interrupt deaktivieren. Jedoch weis ich halt nicht wann dies sinnvoll ist.
Der Compiler sichert alle Register die in der ISR verwendet werden vorher ab und stellt sie vor dem verlassen der ISR wieder her. Außer du unterdrückst dies durch irgendeinen Compiler-Direktive in irgendeiner form. Bei AVR GCC gibt es dafür ISR_NAKED
:
Bearbeitet durch User
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.