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
Welcher Prozessor? Welche Programmiersprache? Welcher Compiler/Assembler?
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
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.
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(); ...
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.