Forum: Mikrocontroller und Digitale Elektronik Ringbuffer & Interrupt Problem


von Hans (Gast)


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

von A.K. (Gast)


Lesenswert?

Zu 2: z.B. Counter-Eingang, Analog-Comparator.

von Werner B. (Gast)


Lesenswert?

Welcher Prozessor?
Welche Programmiersprache?
Welcher Compiler/Assembler?

von Hans (Gast)


Lesenswert?

@Werner B.

Atmega32L
C
CodeVision AVR
AVR-Studio

von FranzK (Gast)


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

von Werner B. (Gast)


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.

von Werner B. (Gast)


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();
  ...

von Peter D. (peda)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.