Ringbuffer & Interrupt Problem

Gast #168502
1.) Habe einen Ringbuffer im RAM, möchte jetzt den ersten Wert des
Buffers auslesen. Wie kann ich das machen. Irgendwie einen Zeiger auf
die Adresse des ersten Bytes
2.) Wie kann ich ein Interrupt an einem bestimmten PORT auslösen, nicht
aber an den beiden INT0 und INT1 diese sind schon belegt
Gast #168506
Es gibt ja die Möglichkeit mehrere PINs über Dioden mit INT0 oder INT1
zu verschalten. Dann bekommst Du z.B immer den INT0 Interrupt. In der
ISR kannst Du dann prüfen welcher der in Frage kommenden PINS
tatsächlich die Ursache war.

Gruß FrazK
Gast #168507
Beim mega32 kannst Du zB den ICP1 als Interrupt "missbrauchen". Den
gespeicgerten Zählerstand kannst Du einfach ignorieren. Allerdings kann
es je nach programmierung 4 takte zusätzliche verzögerung geben (input
filter). Einfach mal im datenblatt den Timer1 Input Capture studieren.
Gast #168508
Ringbuffer:
(ich kenne den CV nicht, also teilweise nur funktionale beschreibung)

Beispiel, nicht optimiert sondern soll das konzept verdeutlichen.

char buffer[32];
char nBytes = 0;
char inPtr  = 0;
char outPtr = 0;

Interrupt der den ringbuffer füllt
...
   char data = lesedatenVonIrgedwoher();
   if(nBytes == sizeof(buffer)/sizeof(char))  //
        buffer Voll - Fehler;
   else
   {
       buffer[inPtr++] = data;
       nBytes++;  // ein byte mehr drin
       if(inPtr == sizeof(buffer)/sizeof(char))
          inPtr = 0;
       if(nBytes == sizeof(buffer)/sizeof(char))  //
           handshake_operation - sperre datenquelle
   }
...

Auslesen:
 ...
  char retByte;

  // Atomare operation -
  // darf nicht durch empfangsinterrupt unterbrochen werden.
  disable_interrupts();
  if(inPtr > 0)
  {
     retByte = buffer[outPtr++];
     nBytes--;
     if(outPtr == sizeof(buffer)/sizeof(char))
          outPtr = 0;
     if(nBytes == sizeof(buffer)/sizeof(char)-1)  //
           handshake_operation - gebe datenquelle frei
  }
  else
     buffer_empty_error();
  restore_previvous_interrupt_state();
  ...
#168509
"INT0 und INT1 diese sind schon belegt"

Das ist aber sehr selten, daß man wirklich 3 sauschnelle und prellfreie
Interruptquellen hat.

Oftmals hat man aber mechanische prellende Quellen und da kommts nicht
auf die µs an.
Dann ist man wesentlich besser bedient, wenn man diese per
Timerinterrupt abfragt und nebenbei gleich mit entprellt.

http://www.mikrocontroller.net/articles/Entprellung


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.