www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts für Anfänger


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich bin noch ein mutiger Anfänger in Sachen MC und möchte ein relativ 
Programm schreiben für das ich auch schon ein paar Codeschnipsel 
gefunden hab. Dabei soll auf dem MC eine real time clock implementiert 
werden. Die Uhr wird durch einen Timerinterrupt jede Sekunde 
weitergezählt. Nun möchte ich einen externe Interruptpin durch einen 
Taster von VCC auf GND ziehen und es soll die Zeit gestoppt werden, wie 
lange ich auf den Taster drücke. Die Uhr soll aber ständig laufen und 
nicht nur wenn der Taster gedrückt wird. Geht das denn so einfach? Wenn 
ein Interrupt durch den Taster ausgeführt wird, kann dann noch der 
Timerinterrupt für die Uhr ausgelöst werden wenn der Taster z.B. für 4 
sek gedrückt wird??? Der Mikrocontroller befindet sich doch dann in der 
Interruptroutine für den externen Interrupt, oder?!

Gruß
Mike

Autor: Kalle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Üblicherweise setzt man in den ISR nur Flags und wertet diese dann im 
Main aus. So gibt es dann auch keine Probleme mit sich gegenseitig 
blockierenden Interruptroutinen.

MfG

Kalle

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mike wrote:
> Hi!
>
> Ich bin noch ein mutiger Anfänger in Sachen MC und möchte ein relativ
> Programm schreiben

Was ist ein "relativ Programm"?

> für das ich auch schon ein paar Codeschnipsel
> gefunden hab. Dabei soll auf dem MC eine real time clock implementiert
> werden. Die Uhr wird durch einen Timerinterrupt jede Sekunde
> weitergezählt.

Warum nicht jede 10ms, dann kann der Interrupt auch gleich die Tasten 
mit entprellen?

Oder alle 1ms, dann kann der Interrupt auch gleich die Anzeige 
synchronisieren?

> Nun möchte ich einen externe Interruptpin durch einen
> Taster

Sehr schlechte Idee, denn (mechanische) Taster prellen. Der einzige 
sinnvolle Grund, einen mechanischen Bedienungstaster an einen 
Interrupt-Pin anzuschließen, ist das Aufwecken des MCs aus dem 
"Tiefschlaf" (z.B. Power-down" beim AVR). Ansonsten fragt man Taster 
zyklisch ab (Timer-Interrupt), such mal in der Codesammlung nach 
"bulletproof" und in der Artikelsammlung nach "entprellung".

> von VCC auf GND ziehen und es soll die Zeit gestoppt werden, wie
> lange ich auf den Taster drücke.

Das geht auch sehr gut im Timer-Interrupt.

> Die Uhr soll aber ständig laufen und
> nicht nur wenn der Taster gedrückt wird. Geht das denn so einfach?

Ja, wenn man es richtig macht.

> Wenn
> ein Interrupt durch den Taster ausgeführt wird, kann dann noch der
> Timerinterrupt für die Uhr ausgelöst werden wenn der Taster z.B. für 4
> sek gedrückt wird??? Der Mikrocontroller befindet sich doch dann in der
> Interruptroutine für den externen Interrupt, oder?!

Deshalb hält man die Interrupt-Routinen so kurz wie möglich und fragt 
Taster im Timer-Interrupt ab. Wie das im Einzelfall am günstigsten geht, 
wird durch die anderen Aufgaben des Programms bestimmt. Z.B. von der 
Ansteuerung eines LCDs oder dem Multiplexen einer mehrstelligen 
Siebensegmentanzeige oder was auch immer sonst noch gemacht werden muss.

>
> Gruß
> Mike

...

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, das verstehe ich jetzt nich so richtig. Also dir RTC würde ich so 
implementieren:
void Uhr_weiterzaehlen()//zählt die Uhr um 1 Sec weiter
{
  sek++;
  if (sek == 60)
  {
    sek = 0;
    min++;
    if (min == 60)
    {
      min = 0;
      std++;
      if (std == 24)
      {
        std = 0;
        tag++;
      }
    }
  }
}



SIGNAL(SIG_OUTPUT_COMPARE1A)//Interupt Routine die beim Überlaufen (TOP) von Timer 1 ausgeführt wird
{
  Uhr_weiterzaehlen();// Uhr weiterzählen
}


Und den externen Interrupt dann einfach ähnlich:
SIGNAL(SIG_INTERRUPT0){
solange PINX ==0 soll Zähler hochlaufen;
gib Zähler aus z.b via UART

Geht das so ohne das die RTC stehen bleibt???

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry die antwort war jetz auf kalle bezogen...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mike:
Wenn Du ein wirklich "mutiger Anfänger" bist, dann installiere am besten 
auch gleich die aktuellste Software. Die Syntax für die Interrupt 
Handler mit "SIGNAL" ist veraltet.

Ansonsten haben Hannes und Kalle recht: Lass einen Timer mit einem 
sinnvollen Basistakt Interrupts auslösen. Im Interrupt Handler setzt Du 
ein Flag (also irgendein Bit in irgendeiner globalen Variablen, volatile 
bei der Deklaration nicht vergessen) und fragst dieses Flag im 
Hauptprogramm ab. Wenn das Flag gesetzt ist, liest Du die Taster ein und 
zählst bei Bedarf Deinen Sekundenzähler rauf. Bei der Tasterauswertung 
speicherst Du jeweils den Zustand und vergleichst im jeweils nächsten 
Zyklus mit dem neuen Zustand, um festzustellen, ob sich was geändert hat 
und wenn ja, was sich geändert hat (Taster gedrückt oder Taster 
losgelassen). In welchem Zeitraster Du das genau machst, bleibt Dir 
selbst überlassen.

Generell gilt: Warteschleifen in Interrupt Handlern sind auf jeden Fall 
zu vermeiden und Interrupt Handler sollten so kurz wie möglich sein, da, 
wie Du ja schon richtig vermutet hast, während ihrer Ausführung das 
komplette System blockiert ist.

Viel Spaß beim Anfang!

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.