- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 7 von 7

Thema: externer Interrupt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    writeString_P_WIFI(" m5: "); writeInteger_WIFI(m5, DEC);
    Sowas packt man nicht in ISRs rein.
    Das gehört in die Hauptschleife.
    ISRs müssen so schnell wie möglich abgearbeitet werden - Ausgaben auf Text Displays (und übers UART) sind aber sehr langsam
    weil die Dinger mit sehr niedrigem Takt laufen.
    Klar funktionieren sollte es aber kann andere Teile der Software stören...

    Zähler inkrementieren in ISR reicht ja in diesem Fall auch schon, den Rest extern machen.

    Du musst die ISRs vorher erstmal noch aktivieren in den passenden Registern sonst passiert sowieso nix.
    s. ATMEGA2560 Datenblatt bzw. google AVR pcint

    MfG,
    SlyD

  2. #2
    Neuer Benutzer Öfters hier Avatar von Jumptime
    Registriert seit
    02.11.2012
    Ort
    mitten in Sachsen
    Beiträge
    26
    Danke erstmal für die Antworten.

    writeString_P_WIFI(" m5: "); writeInteger_WIFI(m5, DEC);
    klar
    Sowas packt man nicht in ISRs rein.
    Die Ausgabe ist in dem Beispiel nur zur Kotrolle. In der ISR soll letztendlich nur die Variable (m5) gezählt werden (vorwärts erhöhen / rückwärts verringern), um so die relative Position des Gelenkes zu haben.
    Ich habe mitlerweile herausgefunden, dass das Interrupthändling mit dem Befehl sei(), gestartet werden muß und mit cli(), beendet.
    Die ISR muß nach dem sie abgearbeitet wurde mit reti abgeschlossen werden.
    Du musst die ISRs vorher erstmal noch aktivieren in den passenden Registern sonst passiert sowieso nix.
    s. ATMEGA2560 Datenblatt bzw. google AVR pcint
    Und genau damit stelle ich mich zur Zeit etwas blöd an. Mal schauen was sich im Datenblatt findet.

    Gruß Kai

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Bezeichnung für den Interrupt sieht mir mit INT0_6 zumindest verdächtig aus. Dabei ist GCC recht pingelig - die neuere Version sollte aber wenigstens eine Warnung geben wenn das falsch ist.

    Das Ende der ISR mit RTI macht der Compiler schon, darum muss man sich nicht künnern, wenn man es nicht expizit verlangt. Man muss noch daran denken die Zählervariable als volatile zu deklarieren, damit der Compiler nicht zu viel wegoptimiert.

    Für einen Incrementalgeber muss man aber schon etwas mehr machen als nur die Interrupts Zählen, denn einen Interrupt gibt es in beide Richtungen. Das mindeste ist eine unterscheidung nach hoch oder runter zählen, je nachdem ob die 2. Lichtschranke zu dem Incrementalgeber H oder L ist, oder notfalls auch noch nach der Polung am Motor.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    sei()
    nein das wird schon in der RP6Lib gemacht das meinte ich nicht - Du musst die passenden Pin Change Interrupts aktivieren!

    MfG,
    SlyD

  5. #5
    Neuer Benutzer Öfters hier Avatar von Jumptime
    Registriert seit
    02.11.2012
    Ort
    mitten in Sachsen
    Beiträge
    26

    Lächeln externer Interrupt geschafft

    Hallo,
    ich möcht das von mir begonnene Thema noch beenden. Eure Antworten haben mich zumindest auf den Weg gebracht. Die Lib half mir nicht wirklich weiter, aber der Hinweis zum Pin Change Interrupt und zum Datenblatt (Datenblatt - eher Datenbuch mit 447 Seiten ) brachte den Erfolg. Eigentlich gar nicht schwer. Und so hat es geklappt:

    Ich habe den PCINT16 an Port PK0 gewählt

    Code:
            DDRK &= ~(1<< PINK0);	// PORT K PIN 0 als Eingang	
            PORTK |= (1<< PINK0);		// Pull Up eingeschalten
    	PCMSK2 = (1<< PCINT16);	// Bit 0 im Pin Change Mask Register PCINT16 gesetzt
    	PCICR = (1<<PCIE2);		// Pin Change Interrupt Control Register 
    						// Bit 2 des Pin Change Interrupt Enable gesetzt
    
    ISR(SIG_PIN_CHANGE2)	               // Interruptroutine
    {
    	if (status_RL ==1)
    	{
    		RA_M5++;
    	}
    	else if (status_RL ==2)
    	{
    		RA_M5--;
    	}
            if ((RA_M5> 20) || (RA_M5< -20))
    	{
    		ARM_STOP();
    	}
    	//reti();
    }
    Aber so richtig verstanden habe ich das Ganze noch nicht wirklich, naja wenn's funktioniert.

    Mit freundlichen Grüßen, Kai
    mein Bot: RP6v2, M256 WiFi Erweiterungsmodul, Liniensensor und Roboterarm mit Ansteuerung

Ähnliche Themen

  1. externer Interrupt
    Von 1udo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 04.02.2009, 10:56
  2. Externer Interrupt
    Von simple im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 22.08.2006, 08:44
  3. Externer Interrupt
    Von Brands_Freund im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 25.02.2006, 12:22
  4. Externer Interrupt ATMega8
    Von Ronnie.B im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 19.12.2005, 17:40
  5. Externer Interrupt will nicht :(
    Von Lionic im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 04.10.2005, 18:30

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress