mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ringbuffer & Interrupt Problem


Autor: Hans (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu 2: z.B. Counter-Eingang, Analog-Comparator.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Prozessor?
Welche Programmiersprache?
Welcher Compiler/Assembler?

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Werner B.

Atmega32L
C
CodeVision AVR
AVR-Studio

Autor: FranzK (Gast)
Datum:

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

Autor: Werner B. (Gast)
Datum:

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

Autor: Werner B. (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.