- fchao-Sinus-Wechselrichter AliExpress         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: Problem mit Interrupts

  1. #21
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Anzeige

    Praxistest und DIY Projekte
    Mit Flag meine ich eine globale Variable.
    Wenn der Speicherplatz knapp wird verwende ich für die Flags gerne struct.
    volatile struct {
    unsigned char Zaehler :1; /* Zählerstand auswerten */
    unsigned char Error :1; /* Wenn Error dann 0 */
    unsigned char Wert_neu :1; /* neue Werte berechnen */
    }flag;

    Aufgerufen wird das dann z.B. mit:
    if (flag.Error)

    Der Sinn einer ISR ist etwas erkennen, aber nicht abzuarbeiten. Das soll nach Möglichkeit in der Endlosschleife gemacht werden.

    StartSwitch aktiviert den INT1 Interrupt, sehe aber nicht wo dieser abgearbeitet wird.

    Eigentlich sollte es das gleiche wie PollSwitch sein, es wird erkannt das ein Taster (Bumper) betätigt wurde, ADC wird gestartet um zu eruieren welcher es ist.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  2. #22
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2009
    Beiträge
    14
    Zitat Zitat von Hubert.G
    Mit Flag meine ich eine globale Variable.
    Wenn der Speicherplatz knapp wird verwende ich für die Flags gerne struct.
    volatile struct {
    unsigned char Zaehler :1; /* Zählerstand auswerten */
    unsigned char Error :1; /* Wenn Error dann 0 */
    unsigned char Wert_neu :1; /* neue Werte berechnen */
    }flag;

    Aufgerufen wird das dann z.B. mit:
    if (flag.Error)

    Der Sinn einer ISR ist etwas erkennen, aber nicht abzuarbeiten. Das soll nach Möglichkeit in der Endlosschleife gemacht werden.
    Achso. Meine Idee wäre dann, das Abarbeiten in der Warte-Funktion durrchzuführen. Denn beim Beschleunigen z.B. ist er ja auch die meiste Zeit am warten, ich müsste also das Abarbeiten nur in einer Funktion machen. Müsste so gehen, oder?
    Zitat Zitat von Hubert.G
    StartSwitch aktiviert den INT1 Interrupt, sehe aber nicht wo dieser abgearbeitet wird.
    Eigentlich sollte es das gleiche wie PollSwitch sein, es wird erkannt das ein Taster (Bumper) betätigt wurde, ADC wird gestartet um zu eruieren welcher es ist.
    Wo müsste ich StartSwitch dann aufrufen? Am Ende der Interrupt-Routine? Oder nach dem Abarbeiten der Flags?

  3. #23
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Die INT1-ISR ist in asuro.c direkt nach der Timer2-ISR. Der Interrupt wird über R24 (nach Spannungsteiler mit R23 und den Tastenwiderständen/C7) an PD3 ausgelöst. Es wird nur der Tastendruck erkannt, welche Taste es war muss man anschliessend selbst ermitteln.

    Gruß

    mic

    Code:
    SIGNAL (SIG_INTERRUPT1)
    {
    switched=1;
    StopSwitch();
    }
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #24
    Neuer Benutzer Öfters hier
    Registriert seit
    28.10.2009
    Beiträge
    14
    Endlich, es funktioniert

    Ich habe es jetzt so gelöst:

    Die Interrupt-Routine setzt das Flag motor_unterbrochen und hält ihn an. In jeder Funktion, die sich nicht sofort beendet (z.B. beschleunige) wird bei jedem Schleifendurchlauf das Flag überprüft und ggf. die Funktion beendet.

    Danke an alle die mir geholfen haben

  5. #25
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Der INT1 Interrupt wäre dann:
    ISR(INT1_vect){
    Hier kommt dann der ADC--Aufruf zu feststellen des Taster.

    Das Abarbeiten in der Warte-Funktion sollte schon gehen.
    Dann besteht dann auch die Möglichkeit einer weiteren ISR.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  6. #26
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo scrawl und alle anderen natürlich auch.

    @scrawl
    Nur mal kurz, warum das Sleep(), Msleep() und auch dein Warte() nicht in einer Interruptfunktion funktionieren.
    Im Asuro wird eine Interruptfunktion in der Regel mit ISR(XXX_vect) oder SIGNAL (... ) (SIGNAL ist die alte Version von ISR) bekannt gegeben. Dies hat zur Folge, dass eine ISR erst beendet werden muss bevor eine andere ISR aufgerufen wird. Dies hatte schon Hubert.G geschrieben.

    Wenn du also in deiner ISR(INT1_vect) bist und dort Warte() aufrufst, wird der Timer-Interrupt nicht mehr aufgerufen. Deshalb wird die Variable count72kHz, oder count36kHz bei neuerer Lib, nicht mehr weitergezählt. Dann aber kann Sleep() und somit auch dein Warte() nie mehr beendet werden.
    Das alles stimmt aber nur dann, wenn man ISR() nur mit dem XXX_vect als Parameter aufruft. ISR geht aber auch so: ISR(XXX_vect, ISR_NOBLOCK). Dann aber spielt die Priorität der Interrupts eine Rolle, ob z.B. der Timer2 den Int0 unterbrechen darf. Wenn ja, dann kann Sleep auch im Tasteninterrupt benutzt werden. (Gehts, oder gehts nicht? Kapitel "Interrupt Vectors in ATmega8" bringt die Lösung.)

    Vor einiger Zeit hatte ich hier mal aufgeführt, wie man Interrupts nutzt. (Zufällig entspricht mein Beispiel dort genau deinem hier bearbeiteten Problem.)
    Ihr habt hier zwar genau die Lösung gefunden, aber vielleicht hilft dir das Geschreibsel ja zum Verständnis wenn es mal am Stück aufgeführt ist.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  7. #27
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    @Sternthaler
    Ich hoffe du kennst auch die Probleme die bei verwenden dieses Parameter ISR(XXX_vect, ISR_NOBLOCK) auftreten können.
    Eine Priorisierung wie bei z.B. 8051 gibt es bei den AVR nicht.

    Für diejenigen die nicht so versiert bei der Verwendung von ISR sind.
    Es werden notwendige Daten wie Variable im SRAM abgelegt.
    Im AVR-Studio werden diese Daten nach dem Compilieren unter Data angezeigt.
    Diese Daten werden am Beginn des SRAM abgelegt.

    Die CPU legt ihre für den Ablauf notwendigen Daten am Ende des SRAM im sogenannten Stack ab.
    Dazu gehören auch Daten bei Aufruf einer ISR.
    Dazu gehören Rücksprungadresse und notwendige Register.
    Nach beenden der ISR wird der Adresszeiger wieder zurückgestellt.
    Die jenigen die schon mal Assembler programmiert habe kennen diese push und pop Spielchen.

    Normalerweise kann keine ISR aufgerufen werden solange die laufende nicht beendet ist.
    Wird nun durch den Parameter ISR_NOBLOCK die ISR-Sperre gelöscht,
    das gleiche geschieht auch wenn man am Anfang der ISR-Routine ein (sei) schreibt,
    werden bei jedem weiteren ISR-Aufruf die Daten neuerlich im Stack gespeichert.
    Dies kann dazu führen das der Stack den vorhandene Datenbereich im SRAM erreicht und diesen dann überschreibt.
    Das Ergebnis sind scheinbar unerklärliche Ablauffehler.

    Also kein ISR_NOBLOCK und kein (sei) in einer ISR-Routine.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  8. #28
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo Hubert.G,

    ja, kenne ich. Deshalb hatte ich auch auf die Prio. hingewiesen. (Hoffnung: Lesen der Doku )

    [OT]
    Ahhh, noch ein 8051-Eingeweihter. Mein letzter war ein 80535, mit dem ich eine Sonnenverfolgungsmaschine zum fotografieren gebaut hatte. Hübsch in Assembler und mit Sheduler für viele, viel gleichzeitige Aufgaben.
    [/OT]


    Hier dann auch mal die Lösung für den AVR und die Prioritäten bei den Interrupts:
    Nein, es wird nicht gehen, da der INT1 eine höhere Prio hat als der Timer. Und somit unterbricht der Timer nicht die auf den Timer wartende INT1-Verarbeitung. (Katze und Schwanz-Problem)

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress