Hallo,
benutzt man Interrupt-Service-Routinen in Bascom, werden bei Aufruf der ISR fast alle CPU-Register gesichert. Abhängig von der ISR ist das aber oft nicht notwendig und man kann die ISR schneller machen, indem man den Parameter "nosave" bei der "ON interrupt" Anweisung verwendet. Der Compiler sichert dann keine Register was PUSH/POP Befehle spart aber man muß die in der ISR verwendeten Register selbst händisch sichern.
Um die ISR möglichst schnell ablauffähig zu bekommen verwende ich dort öfter Assembler, der innerhalb von Bascom Programmen sehr einfach zu verwenden ist. Dabei kommt es vor, daß ich in der ISR Flags abfragen oder setzen muß um zB zu entscheiden, ob der Rückwärtsfahr-Portpin oder der Vorwärtsfahr-Portpin geschaltet werden muß.
Dabei bin ich auf Bit 4, 5, 6 und 7 von Register r6 gestoßen, die man anstelle von Flagvariablen nutzen könnte. Nur die Bits 0..3 werden in der Bascom Hilfe als vom Bascom Compiler verwendet erwähnt. r6 selbst wird bei Aufruf einer ISR weder gesichert noch wiederhergestellt. Ich gehe davon aus, das die 4 oberen Bits in r6 in einem Bascom Programm nicht verwendet/verändert werden. (r6 wird jedoch am Beginn eines Programms vom Compiler mit 0 initialisiert).
Man spart damit Zugriffe auf Flagvariable und auch etwas RAM für die Variable. Nicht viel aber wenn man schon beim Zyklenzählen ist ...
Nachstehend ein Programmfragment, wie so etwas aussehen könnte. Kritik und natürlich Zustimmung erwünscht, da ich mir da etwas unsicher bin. Erste einfache Versuche verliefen gut.
Gruß
Searcher
Code:$regfile = "attiny44.dat" $crystal = 8000000 $hwstack = 36 $swstack = 32 $framesize = 32 Const Forward = 0 Const Backward = 1 Dim Direction As Byte On Compare0a Isr_pwmpulse_on Nosave 'kein Registersichern bei ISR Aufruf Enable Compare0a On Timer0 Isr_pwmpulse_off Nosave 'kein Registersichern bei ISR Aufruf Enable Timer0 Enable Interrupts Do Debounce Portb.1 , 0 , Toggle_direction , Sub Loop 'Denkbar Ist Also Zb ein Unterprogramm Toggle_direction: Disable Interrupts 'Inkonsistenz zwischen SET/CLT und BLD vermeiden If Direction = Forward Then !SET 'T-Flag in SREG setzen !BLD r6 , 5 'T-Flag nach r6 Bit5 sichern Direction = Backward Else !CLT 'T-Flag in SREG löschen !BLD r6 , 5 Direction = Forward End If Enable Interrupts Return 'In der ISR zB Isr_pwmpulse_on: 'PWM Portpin abhängig von Fahrtrichtung einschalten !SBRS r6 , 5 'Check Bit 5 in r6 !sbi porta,1 'Setze Portpin für VorwärtsPWMpuls !SBRc r6 , 5 'Check Bit 5 in r6 !sbi porta,2 'Setze Portpin für RücwärtsPWMpuls Return Isr_pwmpulse_off: 'PWM Pulse ausschalten !CBI porta,1 !CBI porta,2 return







Hoffentlich liegt das Ziel auch am Weg
Zitieren
Lesezeichen