Moin moin, ich versuche momentan meinen code für einen Skyliner (ähnlich Propellerclock) zum laufen zu bringen. Ich will über eine 3x4 Tastatur Buchstaben eingeben und diese in ein Array speichern. Dann will ich über einen Reed-Kontakt den Int0 auslösen und damit die ausgabe der Zeichen aus dem Array starten. (Also ein Int pro Umdrehung) Problem: Mein Code funzt in einer Do Loop ohne Probleme, aber wenn ich ihn in die ISR von Int= kopiere, geht gar nichts mehr oder nur komische Zeichen, aber keine Buchstaben. Frage: Ist man in der ISR aus bestimmte Zeiten beschränkt oder sollte man es vermeiden, im Int0 auf ein Array zuzugreifen? Hier die beiden relevanten Code-Stellen: (Ist noch alles im Rohbau und optimierungsfähig, also deshalb bitte nicht meckern!) --------------------------------------------------------------------- Das Array hat 10 Stellen (1-10), in die Dezimalzahlen eingetragen sind, die zu Buchstaben gehören: Stellen_Array(1) = 1 'Steht für ein A Stellen_Array(1) = 2 'Steht für ein B . . . --------------------------------------------------------------------- Die ISR des Int0: IsrInt0: For Stelle = 1 To 10 Call Zeichenausgabe(stellen_array(stelle)) Next Stelle Waitms 200 Return --------------------------------------------------------------------- Die Ausgabe Sub wurde nach dem Beispiel Bascom - Tabellen von Roboternetz.de entwickelt: http://www.roboternetz.de/wissen/index.php/Bascom_Tabellen Sub Zeichenausgabe(byval Zeichen As Byte) Index = Lookdown(zeichen , Mapping , 28) Temp = Index - 1 Temp = Temp * 5 Portb = Lookup(temp , Patterntab) Incr Temp Waitms 2 'Pause zwischen den Spalten 'des 5x8 Buchstabens, die 'angezeigt werden Portb = Lookup(temp , Patterntab) Incr Temp Waitms 2 Portb = Lookup(temp , Patterntab) Incr Temp Waitms 2 Portb = Lookup(temp , Patterntab) Incr Temp Waitms 2 Portb = Lookup(temp , Patterntab) Incr Temp Waitms 2 Portb = &B11111111 'Alle LED aus Waitms 4 'Pause zwischen den Zeichen End Sub --------------------------------------------------------------------- Mapping: '-----"A"-"B"-"C"... Data 1 , 2 , 3 ,... --------------------------------------------------------------------- Patterntab: 'A Data &B00000000 , &B01101111 , &B01101111 , &B01101111 , &B00000000 'B Data &B00000000 , &B01101110 , &B01101110 , &B01101110 , &B10010001 . . .
Edit Die zweite Stelle im Array hat natürlich die Nummer 2 und nicht 1... --------------------------------------------------------------------- Das Array hat 10 Stellen (1-10), in die Dezimalzahlen eingetragen sind, die zu Buchstaben gehören: Stellen_Array(1) = 1 'Steht für ein A Stellen_Array(2<----) = 2 'Steht für ein B . . . ---------------------------------------------------------------------
Wartezeiten im Interrupt sind tödlich. Sowas tut man nicht. Reed-Kontakte prellen, sie rufen den Interrupt also mehrfach auf. ...
Ok, sowas in die Richtung wollte ich hören. Dann wäre meine Schlussfolgerung, dass ich einfach den Int Kram weglassen und den Pin als Eingang nehme und dann über ein If PinX = 0 then meine Ausgabe aufrufe. Ist das besser? Entprellen würde ich dann natürlich auch noch. Zu Int nochmal, ich war davon ausgegangen, dass man einen Int nicht prellen kann, zum einen, weil ich ihn als Low Level definiert habe und zum anderen, weil er erst die ISR ausführt, bevor er auf irgendwas anderes reagiert.. Aber ist mein erstes mal mit dem Int, daher kenn ich mich da noch nicht so aus.. Danke soweit.
> ... dass man einen Int nicht prellen kann, ... Bei Auftreten eines Int-auslösenden Ereignisses wird dessen Interrupt-Flag im Interrupt-Flagregister per Hardware gesetzt. Beim Aufruf der ISR über den Interrupt-Vektor (Sprungtabelle) wird (von der Hardware) das betreffende Int-Flag wieder gelöscht, zusätzlich wird das I-Flag im SREG gelöscht und bei Verlassen der ISR wieder gesetzt. Tritt ein weiteres Interrupt-Ereignis während der Abarbeitung der ISR auf, dann wird das entsprechende Interrupt-Flag erneut gesetzt. Daraufhin wird nach Verlassen der ISR sofort ein neuer Interrupt ausgelöst und die ISR ein zweites mal aufgerufen. > weil ich ihn als Low Level definiert habe ... Low-Level-Interrupt ist noch etwas anders. Da das Interrupt-Flag sofort erneut gesetzt, solange der Low-Pegel anliegt. Ich nutze den LL-Interrupt daher nur zum Aufwecken des AVRs aus dem Power-Down-Sleep. Dazu deaktiviere ich den LL-Int sofort nach Aufruf der ISR und schalte den Sleep-Mode auf Idle zurück. Dann werden die Taster im Timer-Int entprellt. Meine Ausführungen beziehen sich auf das direkte Ansprechen der Hardware mit Assembler. Ein AVR kann nur Maschinensprache, auch C-Code wird letztendlich in Maschinencode übersetzt, der 1:1 ASM entspricht. ...
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.