-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Wie viele Interrupts / Impulse/s verkraftet ein Atmega

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500

    Wie viele Interrupts / Impulse/s verkraftet ein Atmega

    Anzeige

    Hallo,

    bin gerade dabei den Rasenmäher und die Software umzubauen, etwa in verbesserte Drehzahlregelung.
    Da stellt sich die Frage wie sehr Interrupts den Kontroller auslasten, so dass das eigentliche Programm vielleicht nicht mehr richtig ausgeführt werden kann.
    An Interrupts gibt es:
    Motordrehzahl 1: 180 Impulse/s nur zählen
    Motordrehzahl 2: 180 Impulse/s nur zählen
    Motordrehzahl 3: 200 Impulse/s nur zählen
    USART mit 9600Baud, FiFo Buffer, Buffer wird erst gestartet wenn Startzeichen erkannt wird
    Timer mit 10ms, im Timer Interrupt regelmäßig PID Berechnung Motordrehzahlen

    Mit diesem Timer werden wie Tasks rechenintensive Funktionen getriggert, zB 8x in der Sekunde PID Motordrehzahl 1 und 2 berechnen, 4x in der Sekunde PID Motordrehzahl 3. Ein neuer Task wird mit mindestens 10ms Abstand vergeben, lt Simu benötigt die längste Funktion 0.7ms.
    zB Tasks timen:
    Code:
    tasktimer++;
    
        if (tasktimer>=TASKdauer_ms) {tasktimer=0;}
        if (tasktimer==TASK250ms) {taskflag=task250msflag;}
        
        if (tasktimer==TASKFunkdatenA) {taskflag=FunkdatentaskA;} 
        if (tasktimer==TASKFunkdatenB) {taskflag=FunkdatentaskB;} 
        if (tasktimer==TASKmessermotor)
            {
                drehtemp=(short)60*(short)odo_messer;
             .
             .
            }
    Kann das ein Atmega mit 16Mhz schaffen?
    Momentan gibt es nur Motordrehzahl 3 und PID Regelung im Interrupt, Motor 1 und 2 max 4 Impulse/s und UART durch polling.
    Wenn noch das Erfassen der Motordrehzahlen 1 und 2 sowie USART als Interrupts dazukommen, geht das noch, oder kommt er aus den Interrupts gar nicht mehr raus?

    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    150
    Das schaut für mich von den Interrupts jetzt gar nicht so wild aus. Ich würde vermuten, dass das mit den 16MHz locker geht.
    Ich kann nicht genau abschätzen, was die PID-Regelung frisst.


  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von damfino Beitrag anzeigen
    Wenn noch das Erfassen der Motordrehzahlen 1 und 2 sowie USART als Interrupts dazukommen, geht das noch, oder kommt er aus den Interrupts gar nicht mehr raus?
    Das hängt im wesentlichen davon ab, wie viel Rechenzeit der AVR in den Interrupts verbringt. Wenn du die ISRs schlank programmierst, kommst du bei den Zähl-ISRs mit vielleicht 20-30 Instruktionen aus. Bei 16MHz und ~600 Pulsen/Sekunde in Summe ergibt das überschlagen etwas mehr als eine Millisekunde Rechenzeit. Da ist also noch viel Luft nach oben.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von malthy
    Registriert seit
    19.04.2004
    Ort
    Oldenburg
    Beiträge
    1.379
    Hi,

    wenn ich das Gefühl habe dass es irgendwo knapp werden könnte, messe ich die Ausführungzeiten von den Teilen die "parallel" laufen sollen. Ich setze am Beginn des entpsrechenden Programmteils irgendeinen Pin, den ich dann am Ende wieder lösche. Die high-Phase guck ich mir dann mit dem Oszi an. Auf diese Weise kann man auch die Aufenthaltsdauer in einer ISR in etwa bestimmen. Dabei muss man natürlich noch bedenken, dass da ggf noch Register gesichert werden, bevor der Pin gesetzt, bzw nachdem er wieder gelöscht wird.

    Gruß
    Malte

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500
    Die Zähl ISR sehen zB so aus:
    Code:
    ISR(INT6_vect) // Odo_li
    {
    odo_li++;
    odo_speed_li++;
    status_motor_li_count=0;
    Motor_Fehler_Status_links= Motor_ok;
    }

    Einzig die Timer ISR ist länger da hier zum Teil die PID Regler berechnet werden. Muss am Abend das durch den Simu lassen, glaube es waren um die 700 Takte. Sind alles Festkomma Berechnungen.
    3x das gleiche Schema, teilweise wird Anfangs von volatile auf lokale Variablen kopiert da damit der Ablauf schneller sein soll:
    Code:
    if (tasktimer==TASKmessermotor)
            {
                drehtemp=(short)60*(short)odo_messer;
                drehzahl_ist=(unsigned short)drehtemp;
                odo_messer=0;
    
                if (drehzahl_soll>drehzahl_max) drehzahl_soll=drehzahl_max;
                v = ((short)drehzahl_soll-drehtemp);                   
                v=v/10;
                i_summe = i_summe + v;    
    
                if (i_summe < 0) i_summe = 0;            
                if (i_summe > 1280) i_summe = 1280;    
                // PI Regler 0,3*(v/100+1/1,2*i_summe)    
    
                temp_mower=(10*i_summe)/12;
                mowersp= (v+temp_mower)*3;
                mowersp=mowersp/10;
    
                if (mowersp < 100) mowersp = 100;            //Begrenzung Stellgröße
                if (mowersp >= 240) mowersp = 240;
                  
                mowerspeed=(unsigned char)(mowersp);
                Mower=mowerspeed;
            }

    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.08.2006
    Ort
    Würzburg, Germany
    Beiträge
    672
    Hallo,

    die sehr kurze Zähl-ISR werden kein Problem. Sollte es trotzdem optimiert werden: Die AVR's habe doch spezielle Zähl-Eingänge, die die Timer/Counter automatisch zählen.

    Viele Grüße
    Andreas

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    31.05.2009
    Beiträge
    251
    Zitat Zitat von malthy Beitrag anzeigen
    Hi,

    wenn ich das Gefühl habe dass es irgendwo knapp werden könnte, messe ich die Ausführungzeiten von den Teilen die "parallel" laufen sollen. Ich setze am Beginn des entpsrechenden Programmteils irgendeinen Pin, den ich dann am Ende wieder lösche. Die high-Phase guck ich mir dann mit dem Oszi an. Auf diese Weise kann man auch die Aufenthaltsdauer in einer ISR in etwa bestimmen. Dabei muss man natürlich noch bedenken, dass da ggf noch Register gesichert werden, bevor der Pin gesetzt, bzw nachdem er wieder gelöscht wird.

    Gruß
    Malte
    Noch komfortabler wird diese Taktik + Logik-Analyser.
    Bei mehreren ISR kann sehr schön die Dauer und zeitliche Abfolge verfolgt werden.
    Diese Teile sind machmal mehr als Gold wert............
    mfG
    Willi

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    06.08.2008
    Ort
    Graz
    Beiträge
    500
    Oszi und Logik Analyzer wären toll, aber nicht vorhanden. Für die 3x im Jahr wo ich diese brauchen würde zahlt sich ein Kauf nicht aus. Ich behelfe mich mit dem Simu indem ich die notwendigen Takte für Funktionen überprüfe und so auf Geschwindigkeit optimiere. Der PI Regler oben benötigt 737 Takte (jetzt gemessen).

    Das Projekt und die ISR haben sich laufend weiter entwickelt. Zuerst ein einfacher Zähler, dann ein PI Regler, dann 3 PI Regler, und die Odometriezähler so erweitert dass auf defekte (Wackelkontakt) Hallsensoren reagiert werden kann. Damit kann man schlecht auf Counter wechseln.

    LG!
    alles über meinen Rasenmäherroboter (wer Tippfehler findet darf sie gedanklich ausbessern, nur für besonders kreative Fehler behalte ich mir ein Copyright vor.)

  9. #9
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das sieht noch alles recht harmlos aus. Bei weniger 1 MHz Takt müsste man ggf. nochmal genau nachrechnen. Die Simulation ist schon ganz gut geeignet um die Laufzeiten je ISR raus zu bekommen. Damit kann man dann auch ganz gut ausrechnen wieviel Rechenzeit die ISRs verbrauchen, und wie lang die Reaktionszeit im ungünstigsten Fall wird.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    150
    Hi,
    Laufzeitmessungen mach ich auch so, dass ich im untersten Level eine Schleife mit NOPs durchlaufen lasse.
    Dann messe ich die Zeit einmal ohne Interrupts und einmal mit Interrupts. (Die Zeit ohne Interrupts sollte schon mal ein paar Sekunden dauern...)

    Die Differenz ist dann die Zeit, die die Interrupts schlucken.
    Wenn ich dann die Differenz zur gesamt-Zeit mit Interrupts ins Verhältnis stelle habe ich eine prozentuale Auslastung des System.

    Also:
    To: Zeit ohne Interrupts
    Tm: Zeit mit Interrupts
    Td = Tm-To: Zeit der Interrupts
    (Td/Tm)*100%: Prozentuale Auslastung des Systems durch die Interrupts.

    Gruß,
    Drew


Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Wie viele PWM-Kanäle hat der ATmega 2560?
    Von NeroII im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 13.02.2010, 00:07
  2. Antworten: 28
    Letzter Beitrag: 10.12.2008, 10:40
  3. ATmega8/48 und wie viel Spannung verkraftet der?
    Von Michael 123 im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 05.05.2006, 07:55
  4. Wie viele Stifte hat ein 8 pol ic Sockel?
    Von Lars. im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 30.05.2005, 16:58
  5. Wie viele Interrupts sind gesund?
    Von cht im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 21.05.2004, 07:47

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •