Hallo Bow-Hunter,
ich habe mal versucht bisherige Vorschläge in einem ungetesteten Entwurf für direkte Reaktion auf Tastendruck und Vermeidung von WAITs unterzubringen. Das Debounce Kommando fragt die Taste ab und entprellt auch gleich.
Gruß
Searcher
Code:
'### hwstack vergrößern. Wichtig bei Verwendung von Interrupts
$hwstack = 34
'### Alle Variablen können als Byte deklariert werden (spart Speicher im kleinen Tiny13)
'### Der Timer0 wird für die Blink- bzw. Schaltfrequenz konfiguriert
Compare0a = 116 '99,84ms Interruptperiode bei 1,2MHz µC-Takt
Config Timer0 = Timer , Prescale = 1024 , Clear_timer = 1 'Timer0 im Clear Timer on Comparematch
On Compare0a Isr_blink 'ISR wird bei Compare Match A aufgerufen
'### In der Haupschleife steht nur die Tastenabfrage inclusive Tastenentprellung
Do 'Beginn Hauptschleife
Debounce Pinb.0 , 1 , Changemodus , Sub 'Führt Unterprogramm aus, wenn Pinb.0 auf 1 wechselt
Loop 'Ende Hauptschleife
'### Nach Tastendruck wird dieses Unterprogramm ausgeführt, daß den Lichteffekt weiterschaltet und
'### die nötigen Parameter für die Interruptserviceroutine setzt.
Changemodus: 'Unterprogramm setzt Werte für Lichteffekt nach Tastendruck
Disable Compare0a 'Vermeidet Inkonsistenzen in der ISR
If Modus < Anzahlmodi Then Incr Modus Else Modus = 1
Select Case Modus
Case 1 : Anzahlphasen = 0 'Muß Anzahl der Daten in den DATA-Zeilen entsprechen
Case 2 : Anzahlphasen = 5 'Wert von 0 = ein Eintrag, 5 = sechs Einträge bei DATA
Case 3 : Anzahlphasen = 1 '.
End Select
Phase = 0
Enable Compare0a
Return
'### In der Interruptserviceroutine wird alle 100ms das neue Schaltmuster für die LEDs gelesen und
'### die LEDs geschaltet.
Isr_blink: 'wird alle ca. 100ms aufgerufen und schaltet die LEDs
If Phase < Anzahlphasen Then Incr Phase Else Phase = 0 'setzt die nächste Effektphase
Select Case Modus 'entsprechend dem Modus wird das Bitmuster für LEDs geholt
Case 1 : Pattern = Lookup(phase , Lichteffekt1)
Case 2 : Pattern = Lookup(phase , Lichteffekt2)
Case 3 : Pattern = Lookup(phase , Lichteffekt3)
End Select
Portb.1 = Pattern.3 'LED wird geschaltet
Portb.2 = Pattern.2 'LED wird geschaltet
Portb.3 = Pattern.1 'LED wird geschaltet
Portb.4 = Pattern.0 'LED wird geschaltet
Return
End 'end program
'### Hier sind die Schaltmuster abgelegt.
Lichteffekt1:
Data &B0000
Lichteffekt2:
Data &B1010 , &B1001 , &B1010 , &B0101 , &B0110 , &B0101
Lichteffekt3:
Data &B1111 , &B0000
Lesezeichen