- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 12

Thema: Interrupt unterbricht Printbefehl

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Das heißt also, es gibt für jeden Interrupt (Timer0, INT0, etc.) sozusagen einen 1-Bit-Speicher (ganz doof ausgedrückt)?
    Grüße
    Thomas

  2. #2
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Für alle Interrupts gibt es je einen solchen Speicher (Flag Bit in den entsprechenden Registern). Nur wenn der Externe Interrupt auf Level angestellt ist, wird das Bit auch ggf. wieder gelöscht, wenn kein externes Signal mehr anliegt - da fehlt dann der Zwischenspeicher.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    51
    Beiträge
    2.253
    z.B. Datenblatt ATMega8:

    A flexible interrupt module has its control registers in the I/O space with an additional global
    interrupt enable bit in the Status Register. All interrupts have a separate Interrupt Vector in the
    Interrupt Vector table. The interrupts have priority in accordance with their Interrupt Vector position.
    The lower the Interrupt Vector address, the higher the priority.
    also für alle Interrupts gibts Sprungmarken, die man setzen muss wenn man den interrupt verwenden will.
    In Bascom schaut das dann z.B. so aus: On Urxc1 Zeichenempfang:

    The AVR Status Register – SREG – is defined as:
    Bit 7 – I: Global Interrupt Enable
    Das ist dann das SEI bzw. Enable Interrupts, also die generelle Aktivierung der Interrupts.
    Es kann in bestimmten Fällen sinnvoll sein einen Programmabschnitt unterbrechungslos zu programmieren, dann kann man einfach
    vor diesem Programmabschnitt ein "Disable Interrupts" oder CLI setzen und dahinter wieder "Enable Interrupts" oder SEI.

    wichtig in dem Zusammenhang:
    When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled.
    The user software can write logic one to the I-bit to enable nested interrupts. All enabled
    interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a
    Return from Interrupt instruction – RETI – is executed.
    wenn also ein Interrupt ausgeführt wird werden die anderen Interrupts generell abgeschaltet bis dieser abgearbeitet wurde. Dann werden die Interrupts wieder aktiviert. Man kann aber in einer Interruptroutine wiederum die Interrupts per SEI oder Enable Interrupts aktivieren, dann kann ein Interrupt in einem Interrupt erfolgen, was zu "interessanten" Ergebnissen führen kann. Kann aber in Ausnahmefällen sinnvoll sein.

    if one or more interrupt conditions occur while the global interrupt
    enable bit is cleared, the corresponding Interrupt Flag(s) will be set and remembered until the
    global interrupt enable bit is set, and will then be executed by order of priority.
    Das bedeutet, wenn z.B. der URXC Interrupt für Zeichenempfang aktiviert wurde, aber global die Interruptverarbeitung deaktiviert ist, so wird der Interrupt bei Zeichenempfang zwar ausgelöst, aber erst abgearbeitet wenn global die Interrupts aktiviert wurden.

    Einen Interrupt kann man je nach dem auch löschen, z.B. um bei der UART zu bleiben, da steht im UCSRA Register als Bit7

    This flag bit is set when there are unread data in the receive buffer and cleared when the receive
    buffer is empty (that is, does not contain any unread data). If the Receiver is disabled, the
    receive buffer will be flushed and consequently the RXC bit will become zero. The RXC Flag can
    be used to generate a Receive Complete interrupt
    Du kannst nun dieses Interruptflag auf zwei Arten löschen ... einmal indem Du einfach in das Bit eine 0 hinein schreibst UCSRA.7=0
    oder indem Du das empfangene Zeichen auf dem zugehörigen Datenregister UDR ausliest: Dummmybyte=UDR

    Generell gilt, die Interrupts immer knackig kurz halten, nur das was unbedingt hinen muss dort auch rein packen.
    Resourcenfressende Routinen wie LCD-Ausgaben oder Print oder Input / Waitkey oder Kalkulationen mit Single-Variablen, die Rechenzeit fressen, haben da wenig drinnen verloren.
    Man sollte also die Aufgaben dann teilen, z.B. den Zeichenempfang für ein UART-Protokoll. Die Daten empfangen und im Ringspeicher ablegen in den Interrupt, dort dann auch ein Flag setzen und die Verarbeitung dann von der Mainloop aus anspringen.
    Geändert von Vitis (06.10.2012 um 21:54 Uhr)
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo Vitis,
    wo hast du diese Info her?
    Zitat Zitat von Vitis Beitrag anzeigen
    Du kannst nun dieses Interruptflag auf zwei Arten löschen ... einmal indem Du einfach in das Bit eine 0 hinein schreibst UCSRA.7=0
    oder indem Du das empfangene Zeichen auf dem zugehörigen Datenregister UDR ausliest: Dummmybyte=UDR
    Ich dachte, dass man das einmal gesetzte Flag nur durch Lesen des UDR oder durch disablen des Receivers (UCSRB.RXEN=0) wegbekommt.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    51
    Beiträge
    2.253
    Versuch macht kluch, hab ich mal so gemacht, war in dem Fall aber Käse, ist unterm Strich genau so schnell wenn man einfach das Register liest und ggf. Inhalt verwirft.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Ähnliche Themen

  1. probleme beim printbefehl mit rn schrittmotor
    Von manus im Forum Software, Algorithmen und KI
    Antworten: 1
    Letzter Beitrag: 20.06.2009, 16:15
  2. Taster unterbricht Stromkreis
    Von Newbee im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 09.09.2007, 15:40
  3. Printbefehl verkürzen
    Von Picht im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 06.09.2006, 00:37
  4. [ERLEDIGT] Interrupt waehrend Interrupt
    Von thomas05 im Forum PIC Controller
    Antworten: 7
    Letzter Beitrag: 08.11.2005, 06:13
  5. Problem mit Printbefehl
    Von ElektronikLutz im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 05.07.2005, 15:35

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress