- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 6 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 55

Thema: Programmieren mit Interrupts

Hybrid-Darstellung

farratt Programmieren mit Interrupts 17.09.2007, 15:18
damaltor du musst in der... 17.09.2007, 16:39
farratt Stimmt zwar, aber die... 17.09.2007, 16:42
farratt Wir können mal einen... 17.09.2007, 16:54
damaltor diese endlosschleife bewirkt,... 17.09.2007, 17:26
KayH Hi, da ich leider die... 17.09.2007, 17:28
damaltor irqs sind automatisch... 17.09.2007, 17:32
damaltor probier mal folgenden code:... 17.09.2007, 17:36
KayH Ich bin mir nicht sicher,... 17.09.2007, 17:38
damaltor ohne return werden jedoch die... 17.09.2007, 17:42
izaseba Wo hast Du diesen Quatsch her... 17.09.2007, 17:50
farratt Danke für Eure Hilfe. Aber... 17.09.2007, 17:55
damaltor nu mal langsam... davon bin... 17.09.2007, 18:07
farratt Das hab ich alles schon... 17.09.2007, 18:17
damaltor das ist natürlich ein... 17.09.2007, 18:23
izaseba aha, die Aussage beruht also... 17.09.2007, 18:23
farratt Ne, die Taster werden mit... 17.09.2007, 18:37
damaltor izaseba: beherrsch dich.... 17.09.2007, 19:17
farratt wo muss ich da was... 17.09.2007, 19:31
damaltor ok... öffne doch mal die... 17.09.2007, 19:33
farratt Ich finde einen solchen... 17.09.2007, 19:35
damaltor ok. welche lib benutzt du?... 17.09.2007, 19:37
farratt ich benutzte die originale 17.09.2007, 19:38
damaltor achso, ok. mir ist... 17.09.2007, 19:47
farratt Nö, es geht nicht. Das hier... 17.09.2007, 19:51
damaltor ok. nimm mal unter die... 17.09.2007, 19:53
farratt diese beiden Zeilen sind in... 17.09.2007, 19:56
izaseba Was ist los ? Ich glaube,... 17.09.2007, 20:01
damaltor ich bin leider nicht in der... 17.09.2007, 20:01
farratt @izaseba: Diese Funktion ISR... 17.09.2007, 20:05
damaltor und... probiert? :) teste... 17.09.2007, 20:06
farratt @damaltor: Die Funktion... 17.09.2007, 20:14
damaltor oha... das hatte ich gar... 17.09.2007, 20:21
farratt Der Compiler behauptet, dass... 17.09.2007, 20:23
damaltor hm. schlecht. poste doch... 17.09.2007, 20:25
farratt Hab den oberen Beitrag... 17.09.2007, 20:28
damaltor soweit, so gut. ich sehe... 17.09.2007, 20:31
farratt Vielleicht findet sich ja... 17.09.2007, 20:32
Sternthaler Gruß an alle. ... 17.09.2007, 23:23
farratt [flüster]Das Programm läuft... 18.09.2007, 12:05
farratt Ich hab mal noch die Spannung... 18.09.2007, 12:17
damaltor drück mal mehrere taster... 18.09.2007, 14:01
farratt nein die spannung bleibt bei... 18.09.2007, 14:55
farratt nein die spannung bleibt bei... 18.09.2007, 14:56
damaltor flashe nochmal den... 18.09.2007, 16:03
farratt Im Selbsttest funktioniert... 18.09.2007, 16:10
izaseba Hallo, prüfe nochmal... 18.09.2007, 16:25
farratt Leute, ich hab den Fehler... 18.09.2007, 16:39
izaseba Ich habe es doch noch... 18.09.2007, 16:40
damaltor sehr gut... so kleine fehler... 18.09.2007, 21:03
Sternthaler @farratt UFF, das war aber... 18.09.2007, 21:30
farratt Na vertauscht ist nicht... 19.09.2007, 11:03
damaltor oha.. das kenn ich... =) 19.09.2007, 11:15
Sternthaler @farratt macht nix, wie du... 19.09.2007, 19:53
damaltor tja... also wiederstände... 19.09.2007, 20:01
Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61

    Programmieren mit Interrupts

    Hallo Leute!

    Ich möchte mich nun mal an das Programmieren mit Interrupts heranwagen und hab dazu mittlerweile einiges gelesen. Nun zum konkreten Beispiel. Ich hab mir eine Funktion void fahren(int strecke) programmiert, die Asuro geradeaus fahren lässt. Sie funktioniert auch sehr gut, also das eigentliche Problem liegt nicht im Fahren an sich. Das Problem ist, dass ich keine Kontrolle über Asuro habe, so lange er fährt, da er ja solange in der Funktion fahren steckt. Das heißt ich kann Asuro nicht auf einen Schalter reagieren lassen, während er fährt. Die Lösung: Interrupts!
    Aber irgendwie krieg ichs nicht hin. Ich zeig euch mal wie ichs probiert hab:

    Code:
    #include asuro.h
    #include fahren.h
    
    SIGNAL(SIG_INTERRUPT1)
    {
    	StatusLED(RED);
    	while(1);
    }
    
    int main(void)
    {
    	Init();
    	
    	StartSwitch();
    	fahren(2000); //lässt Asuro 2000mm geradeaus fahren
    	StopSwitch();
    			
       while(1);
       return 0;
    }
    Dieses Programm soll Asuro 2000mm geradeaus fahren lassen und soll ihn anhalten lassen, wenn ein Schalter betätigt wird.

    Aber leider funktioniert es nicht. Asuro fährt seine 2000mm, egal ob ein Taster gedrückt wird oder nicht. Wo ist der Fehler?

    Gruß farratt

    PS: Ich nutze die originale "asuro.h", bin mehr so der Selbermach-typ...

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.069
    du musst in der interruptroutine die motoren auch abstellen... =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    Stimmt zwar, aber die StatusLED wird nicht rot, also muss irgendwo noch ein fehler sein.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    Wir können mal einen einfacheren Code betrachten:

    Code:
    #include "asuro.h"
    
    int main(void)
    {
    	Init();
    	
    	StartSwitch();
    		
    	while(1);
    	return 0;
    }
    
    SIGNAL(SIG_INTERRUPT1)
    {
    	StatusLED(RED);
    	StopSwitch();
    	while(1); //Diese Endlosschleife kann man weglassen, oder?	
    }
    Nachdem die Init() ausgeführt wurde, ist die StatusLED krühn.
    Der Code sollte die StatusLED auf rot schalten, falls ein Schalter gedrückt wird, tut er aber nich. Sie bleibt grün.

    Wo is der Fehler?

    Einen Hardware-Fehler kann ich ausschließen, weil die Taster im Polling-Betrieb einwandfrei funktionieren.

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.069
    diese endlosschleife bewirkt, dass die interruptroutine niemals verlassen wird. tödlich!!

    ansonsten verwende mal nicht startswitch sondern nutze die register um niterupts zu aktivieren. entferne startswitch und stopswitch, und schreibe stattdessen sei(); hinter init();.

    welche version des GCC compilers benutzt du?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    10.08.2007
    Beiträge
    47
    Hi,

    da ich leider die ASURO lib nicht kenne, kann ich nur allg. Betrachtungen anstellen. Aber vielleicht hilft das ja schon...

    Die Interrupts muessen auch aktiviert sein, sind sie das auch standardmaessig? Du hast zumindest keinen expliziten Code dafuer ...

    Eine Endlosschleife in einer ISR halte ich fuer keine gute Idee. Eine ISR sollte kurz sein, was man von einer Endlosschleife nicht gerade behaupten kann.

    Innerhalb einer einfachen ISR wird meisst zunaechst der IRQ disabled um nested IRQs zu vermeiden. Am Ende der ISR wird er dann wieder altiviert.

    HTH
    Kay

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.069
    irqs sind automatisch deaktiviert beim start der routine. es fehlt jedoch ein return am ende!!!
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.069
    probier mal folgenden code:
    [code]#include "asuro.h"

    int main(void)
    {
    Init();
    StatusLED(GREEN);

    while(1);
    return 0;
    }

    SIGNAL(SIG_INTERRUPT1)
    {
    StatusLED(RED);
    return;
    }
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    10.08.2007
    Beiträge
    47
    Ich bin mir nicht sicher, sind ISR nicht void Funktionen ...?
    Dann braucht man nicht unbedingt ein return, mit verlassen des Blocks kehrt er automatisch zurueck. "return value" braucht man nur zwingend bei nicht void-Funktionen, oder?

    Aber es ist zumindest besser zu lesen und macht die Absicht des Entwicklers deutlicher (nicht nur "aus Versehen" zurueck) ...

  10. #10
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.069
    ohne return werden jedoch die interrupts nicht wieder aktiviert...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

Seite 1 von 6 123 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests