INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Timer-gesteuerter Interrupt
06.10.2014, 14:24
Beitrag #1
Timer-gesteuerter Interrupt
Ich habe folgendes Problem: in meinem aktuellen Projekt möchte ich die Bildschirmausgaben (2*IC2 4*20 Zeichen LCD_Modul) und die Abfrage diverser Sensoren, sowie die Motorkontrolle (I2C MD23 Kontroller, 2 Motoren mit Hallgeber) im Interrupt abarbeiten. Alle 50 Millisekunden soll der Interrrupt abgearbeitet werden. Ich werde aber aus der Referenz bei Arduino.cc nicht ganz schlau. Ist es möglich einen internen Timer für die Interruptauslösung zu programmieren oder muss ich den Interrupt über einen externen Timer auslösen? Ach ja, es handelt sich um einen Arduino Mega 2560.

Wenn der IC raucht wird viel Strom verbraucht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2014, 15:55
Beitrag #2
RE: Timer-gesteuerter Interrupt
Hi,
das sollte schon gehen. Die Frage ist nur, ob das wirklich das richtige für Dich ist. Das Coding in einer Interrupt-Routine sollte so kurz wie möglich sein. Das Problem ist, dass das System keine anderen Interrupts abarbeiten kann, während es in einer Interrupt-Routine ist. Es kann dann z.B. vorkommen, dass man serielle Daten verliert.
Das, was Du da machen willst, würde ich mit einer Kombination aus einzelnen Routinen machen, die per millis()-Abfrage prüfen ob es (wieder) was zu tun gibt. Das ist meiner Meinung nach einfacher und flexibler.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2014, 15:59
Beitrag #3
RE: Timer-gesteuerter Interrupt
(06.10.2014 15:55)Thorsten Pferdekämper schrieb:  Hi,
das sollte schon gehen. Die Frage ist nur, ob das wirklich das richtige für Dich ist. Das Coding in einer Interrupt-Routine sollte so kurz wie möglich sein. Das Problem ist, dass das System keine anderen Interrupts abarbeiten kann, während es in einer Interrupt-Routine ist. Es kann dann z.B. vorkommen, dass man serielle Daten verliert.
Das, was Du da machen willst, würde ich mit einer Kombination aus einzelnen Routinen machen, die per millis()-Abfrage prüfen ob es (wieder) was zu tun gibt. Das ist meiner Meinung nach einfacher und flexibler.
Gruß,
Thorsten

Das wollte ich eigentlich eben vermeiden, der Code wird so sehr schnell unübersichtlich. Interruptprogrammierung bin ich mich noch von früher gewohnt, damals in Assembler. Ich dachte daher das sei einfacher. Nun dann werde ich wohl in den sauren Apfel beissen müssen.

Wenn der IC raucht wird viel Strom verbraucht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2014, 16:25
Beitrag #4
RE: Timer-gesteuerter Interrupt
Hi,
naja, sooo unübersichtlich muss das nicht werden. Du schreibst Dir für jede Aufgabe, die zeitgesteuert ablaufen soll eine Routine, die in etwa so aussieht:

Code:
void handleBlabla() {

   static unsigned long last = 0;
   unsigned long now = millis();

   if(now - last < 50) return;
   last = now;   // oder last += 50;

  ... Dein Coding  

};

Diese Routinen rufst Du immer wieder aus loop() heraus auf. Die 50 dann durch das Intervall ersetzen, welches die einzelnen Routinen brauchen.

Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2014, 17:40
Beitrag #5
RE: Timer-gesteuerter Interrupt
Danke erst mal. Ich muss mir nun zuerst überlegen ob ich einige Funktionena auf ein weiteres Board auslagern soll.

Wenn der IC raucht wird viel Strom verbraucht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2014, 18:45 (Dieser Beitrag wurde zuletzt bearbeitet: 06.10.2014 19:09 von HaWe.)
Beitrag #6
RE: Timer-gesteuerter Interrupt
ich habe bei mir die Timer Interrupts anders gelöst:
ich rufe den IRQ 1 für schnelles Encoder-Lesen und PID-Steuerung alle 250µs (4khz) auf, mit inzwischen größerem Teiler (prescaler) eht es ntl auch länger:
OCR1A =511;

1023 ergibt also 500µs,
2047 alle 1ms usw.
(Immer 2^n -1, da die Null mitgezählt wird.)

Code:
//********************************************************************************​****
// setup
//********************************************************************************​****
    int   __mainloopcnt__=0;             // counter for priority prescaler in main loop

    void setup()
    {
       //------------------------------------------------------------------------------------
      
       Wire.begin(DEV_ADDR_I_ARDUINO);   // join i2c bus with MY (I_ARDUINO) dev address
       Wire.onReceive(receiveEvent);     // register event
       Wire.onRequest(requestEvent);     // register event

    

       //------------------------------------------------------------------------------------
       // timer interrupt for encoder readings
       noInterrupts(); // Jetzt keine Interrupts / disable

           TIMSK1 |= (1<<OCIE1A);  // Timer 1 PIDOutput Compare A Match Interrupt Enable
           TCCR1A = 0;             // "Normaler" Modus
           // WGM12: CTC-Modus einschalten (Clear Timer on Compare match)
           //        Stimmen OCR1A und Timer überein, wird der Interrupt ausgelöst
           // Bit CS12 und CS10 setzen

           // => Prescaler=8:
           TCCR1B = (1<<WGM12) | (1<<CS11);                // Frequenz = 16000000 / 1024 / 15 = rd. 1042Hz = 1kHz
          
           // Prescaler OCR1A  einstellen:
           // Frequenz = 16,000,000 / 8 / 64 = rd. 31 kHz (64-1=63)
           // Frequenz = 16,000,000 / 8 / 128 = rd. 16 kHz (128-1=127)
           // Frequenz = 16,000,000 / 8 / 512 = rd. 4 kHz (512-1=511)
           // Frequenz = 16,000,000 / 8 /1024 = rd. 2 kHz (1024-1=1023)
           OCR1A =511;      // also 4kHz = alle 250µs

       interrupts(); // Interrupts wieder erlauben / enable
       //------------------------------------------------------------------------------------

       // reset PID parameters
       // ...
      

       }
      

    }

//

was beim Interrupt passieren soll, steht bei mir in:

Code:
//------------------------------------------------------------------------------------
// Interrupt Service Routine: encoder readings at Interrupt
//------------------------------------------------------------------------------------
ISR(TIMER1_COMPA_vect) {  // Timer IRQ 1:  read encoder values
    
      ISRab [ 0] <<= 2;
      ISRab [ 0] &= B00001100;
      ISRab [ 0] |= (digitalRead(pinmenc0A) << 1) | digitalRead(pinmenc0B);
      motenc[ 0] += schrittTab[ISRab[0]];           //

      ISRab [ 1] <<= 2;
      ISRab [ 1] &= B00001100;
      ISRab [ 1] |= (digitalRead(pinmenc1A) << 1) | digitalRead(pinmenc1B);
      motenc[ 1] += schrittTab[ISRab[1]];           //
      
      ISRab [ 2] <<= 2;
      ISRab [ 2] &= B00001100;
      ISRab [ 2] |= (digitalRead(pinmenc2A) << 1) | digitalRead(pinmenc2B);
      motenc[ 2] += schrittTab[ISRab[2]];           //
      
      ISRab [ 3] <<= 2;
      ISRab [ 3] &= B00001100;
      ISRab [ 3] |= (digitalRead(pinmenc3A) << 1) | digitalRead(pinmenc3B);
      motenc[ 3] += schrittTab[ISRab[3]];           //
      
      ISRab [ 4] <<= 2;
      ISRab [ 4] &= B00001100;
      ISRab [ 4] |= (digitalRead(pinmenc4A) << 1) | digitalRead(pinmenc4B);
      motenc[ 4] += schrittTab[ISRab[4]];           //
      
      ISRab [ 5] <<= 2;
      ISRab [ 5] &= B00001100;
      ISRab [ 5] |= (digitalRead(pinmenc5A) << 1) | digitalRead(pinmenc5B);
      motenc[ 5] += schrittTab[ISRab[5]];           //
      
      
}



Kompletter Code hier:

http://www.mindstormsforum.de/viewtopic....015#p65015
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2014, 19:24
Beitrag #7
RE: Timer-gesteuerter Interrupt
Hi,
wenn man etwas alle 250µs braucht, dann hat man wohl kaum eine andere Chance...
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.10.2014, 23:27 (Dieser Beitrag wurde zuletzt bearbeitet: 06.10.2014 23:28 von HaWe.)
Beitrag #8
RE: Timer-gesteuerter Interrupt
würde ich jetzt immer so machen -
egal ob 10µs oder 10ms.

Am besten wäre ntl ein Echtzeit-Multitasking wie schon mal hier irgendwo gepostet (ERIKA), aber dafür fehlt mir das Wissen als Einzelkämpfer, und dazu bräuchten wir hier auch eine breite User-Group an Spezialisten.

Auf dem Due geht aber auch das kooperative Multitasking als Alternative (Scheduler lib), ansonsten eben die verlinkten Timer-IRQs - die haben eine klare Struktur, lassen sich exakt planen klappen wenigstens 100%ig.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  while Schleife nach sleep mode interrupt tklaus 13 239 23.11.2016 17:40
Letzter Beitrag: Tommy56
  NRF24L01 Interrupt MeisterQ 22 512 02.11.2016 15:50
Letzter Beitrag: MeisterQ
  Countdown Timer Uwe1475 23 724 19.10.2016 18:33
Letzter Beitrag: Uwe1475
  Interrupt matthias3579 5 219 15.10.2016 13:23
Letzter Beitrag: hotsystems
  Interrupt und Sicherung der Prozessorregister MKc 5 224 31.08.2016 11:17
Letzter Beitrag: MKc
  Interrupt bei Serieller Übertragung Binatone 8 357 21.06.2016 14:09
Letzter Beitrag: Scheams
  (Mega) Timer 3 A, B & C Scheams 0 227 04.06.2016 17:09
Letzter Beitrag: Scheams
  Interrupt wenn softwareSerial Daten BennIY 3 441 01.05.2016 18:39
Letzter Beitrag: tiny85fan
  Arduino MEGA2560 Timer PWM Einsteiger94 3 654 04.04.2016 10:38
Letzter Beitrag: RMR
  Timer Interrupt Anfängerprobleme Fox 4 618 05.03.2016 02:28
Letzter Beitrag: Fox

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste