www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Skyliner mit Mega8 - Int0 Probleme


Autor: Sönkrrr Bert (eldelirio)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
.
.
.

Autor: Sönkrrr Bert (eldelirio)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
        .
        .
        .
---------------------------------------------------------------------

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wartezeiten im Interrupt sind tödlich. Sowas tut man nicht.
Reed-Kontakte prellen, sie rufen den Interrupt also mehrfach auf.

...

Autor: Sönkrrr Bert (eldelirio)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... 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.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.