- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: Hilfe bei Interruptprogrammierung und Go()

  1. #21
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    Anzeige

    Powerstation Test
    interrupts werden aufgerufen von einem ereignis, z.B. wenn die taster gedrückt werden. also wird die main funktion abgearbeitet, und wenn ein taster gedrückt wird dann hat die main funktion sozusagen pause und die interrupt-routine wird abgearbeitet. wenn die fertig ist, dann geht der prozessor wieder zu der stelle zurück, an der er stehen geblieben ist und macht die main funktion weiter.
    bei der programmierun kann ich dir leider nicht helfen, da musst du mal abwarten...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  2. #22
    Neuer Benutzer Öfters hier
    Registriert seit
    19.10.2006
    Beiträge
    23
    Aah, praktische Funktion... Ja so ein Beispiel wäre jetzt nicht schlecht.
    KAnn mir da einer weiterhelfen?

  3. #23
    Neuer Benutzer Öfters hier
    Registriert seit
    19.10.2006
    Beiträge
    23
    ich Suche immernoch Hilfe

  4. #24
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    da hilft schieben aber gar nix... benenn den thread um in "suche hilfe bei interrupt-programmierung", das könnte helfen. (deinen ersten post bearbeiten und dne titel ändern)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  5. #25
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    01.11.2006
    Beiträge
    433
    ähem. also wenn du jetzt einfach den thread umbenennst, hast du das problem, das die alten beiträge ja nicht verschwinden. das sieht jetzt ein bisschen merkwürdig aus.

    mfg EDH

  6. #26
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    Macht nix... ich zum beispiel klicke immer gleich auf "zum letzten beitrag".

    ausserdem sollte das hier keine bedienungsanleitung für das forum sien sondern eine hilfesuche bei der interruptprogrammierung =)

    ansonsten: neuen thread (nach benutzuing der suche) aufmachen. irgend jemand muss das hier doch können... ich versuch mich mal da reinzulesen.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  7. #27
    Neuer Benutzer Öfters hier
    Registriert seit
    09.11.2006
    Beiträge
    20
    ne sorry, war nichts...

  8. #28
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.063
    Soooo dann will ich dir mal was über interrupts erzählen...
    (habe mich selbst dmit noch nicht befasst; ich lese quasi nur vor was ich rausgefunden hab..)

    Folgende Interrupts gibt es:

    SIG_INTERRUPT0 //kann von einer Erweiterungsplatine genutzt werden
    SIG_INTERRUPT1 //Wird von den Tastern verwendet. Dieser Interrupt wird nur dann ausgelöst, wenn vorher StartSwitch() aufgerufen wurde, und wird nicht mehr ausgelöst nachdem StopSwitch() aufgerufen wurde.
    SIG_OUTPUT_COMPARE2 //Sowie der Counter2 einen bestimmten Wert erreicht hat, wird dieser Interrupt ausgelöst.
    SIG_OVERFLOW2 //Wenn der Counter Überläuft (bzw wieder 0 ist, weil er seinen maximalen Wert Erreicht hat)

    (es gibt noch einige andere interrupts, aber die spare ich mir jetzt hier. genaueres dazu im Buch "MEHR SPAß MIT ASURO I".

    um zu definieren, was beim auslösen eines interrupts (z.B. dem Tasterinterrupt) passieren soll, mach folgendes:

    SIGNAL(SIG_INTERRUPT1)
    {

    Hier deine anweisungen... vergiss auf keinen fall, dass hier StopSwitch stehen muss, sonst wird diese Routine in alle ewigkeiten ausgeführt weil die taster ja immer gedrückt bleiben und der interrupt somit ewig ausgelöst wird.
    Beispiel:
    Hindernis_entdeckt=1;
    StopSwitch();
    }


    ... und in der Main Funktion wird dann, sowie hindernis_entdeckt nicht mehr null ist, eine entsprechende Maßnahme eingeleitet.

    Beispiel: die Sleep-Funktion. (nicht Msleep!)

    Der Interrupt SIG_OUTPUT_COMPARE2 wird 36000mal pro sekunde aufgerufen. die Routine dazu sieht folgendermaßen aus:

    SIGNAL(SIG_OUTPUT_COMPARE2)
    {
    count36kHz++;
    }


    Die Variable count36kHz wird also 36000x pro sekunde um eins erhöht.

    die Sleep-Funktion sieht folgendermaßen aus:

    void Sleep(unsigned char time36kHz)
    {
    count32kHz=0;
    //Die Variable, die 36000x pro sekunde erhöht wird, wird auf null gesetzt
    while(count36kHz < time36kHz); // in dieser while schleife bleibt der Prozessor so lange, bis count36kHz so weit hoch gezählt wurde dass sie größer ist als time36kHz (der Parameter der Sleepfunktion)
    }

    Die Sleep Funktion wartet also time36kHz mal 1/36000 sekunden, bevor das programm weiter läuft. und weil in der sleep funktion nur der startwert 0 und die bedingung zum verlassen der schleife steht, wird mit einem 36000mal pro sekunde ausgelöstem interrupt die variable erhöht, um irgendwann wieder rauszukommen aus der sleep funktion.

    was noch wichtig ist:

    mit sei(); werden alle Interrupts aktiviert.
    mit cli(); werden alle interrupts deaktiviert (ACHTUNG! hier kann z.B. die Sleep Funktion eine endlosschleife werden, schliesslich wird count36kHz ja nicht mehr erhöht...)

    so ich hoffe, das hilft dir ein wenig... schreib mir wenn nicht =)

    viel Glück!
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

Labornetzteil AliExpress