- fchao-Sinus-Wechselrichter AliExpress         
Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte
Ergebnis 31 bis 40 von 55

Thema: Programmieren mit Interrupts

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

    Praxistest und DIY Projekte
    und... probiert?
    teste das doch mal... wo hast du eigenlich die funktion startswitch her?
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  2. #32
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    @damaltor: Die Funktion StartSwitch() ist in der originalen asuro.c drin.

    @izaseba: Hab deinen Code mal auf meine Syntax umgeschrieben:
    Code:
    #include<avr/io.h> 
    #include<avr/interrupt.h>
    #include<avr/signal.h>
    
    SIGNAL(SIG_INTERRUPT1){ 
    PORTB &=~(1<<PB0); 
    PORTD = (1<<PD2); 
    } 
    
    int main(void) { 
    DDRB = (1<<PB0); 
    DDRD = (1<<PD2); 
    MCUCR = (1<<ISC11); 
    GICR = (1<<INT1); 
    sei(); 
    PORTB = (1<<PB0); 
    while(1); 
    return 0; 
    }
    Und er funktioniert nicht!

  3. #33
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.068
    oha... das hatte ich gar nicht mehr in erinnerung... fuktioniert folgender code?

    Code:
    #include "asuro.h"
    
    int main(void){
    Init();
    StartSwitch();
    switched=0;
    StatusLED(GREEN);
    while(1){
    if(switched==1) StatusLED(RED);
    }
    }
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  4. #34
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    Der Compiler behauptet, dass die Variable switched nicht deklariert wurde.
    Außerdem wird in der StartSwitch() auch auf keine Variable geschrieben, sie ist nur dazu da, um den Int1 auf die Schalter zu legen und den IR-Betrieb zu initialisieren.

  5. #35
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.068
    hm. schlecht.

    poste doch mal bitte deine startswitch funktion.
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #36
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    Hab den oberen Beitrag nochmal editiert...

    Hier is die StartSwitch():
    Code:
    void StartSwitch(void)
    {
    	SWITCH_OFF;
    	DDRD &= ~SWITCHES;	// Switches as Input => ext. Int 1
    	MCUCR &= ~((1 << ISC11) | (1 << ISC10));// Low level generates interrupt
    	GICR |= (1 << INT1);					// Enable external Interrupt 1 
    }

  7. #37
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    38
    Beiträge
    4.068
    soweit, so gut. ich sehe keine fehler mehr im moment, habe grad mal im irc nach hilfe gefragt. mal sehen was noch kommt...
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  8. #38
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    Vielleicht findet sich ja jemand, der den code testen würde...

  9. #39
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Gruß an alle.

    Interressant!
    izaseba gibt für MCUCR an: MCUCR = (1<<ISC11);
    Im original Source steht:
    MCUCR &= ~((1 << ISC11) | (1 << ISC10));// Low level generates interrupt
    (Im Übrigen muss ich damaltor zustimmen, dass Einwände höflicher gestaltet werden können.)

    Beim Programmcode kann ich izaseba allerdings nur zustimmen, dass sein Code auf alle Fälle 'richtiger' sein muss. Der INT1-Pin ist, ohne gedrückten Taster, über R24/1K und R23/1M auf U+ gelegt.
    Bei gedrücktem Taster, selbst K6 mit nur R30/68K, geht die Spannung auf alle Fälle in Richtung 0 Volt. Somit also tatsächlich eine fallende Flanke. Und damit sollte ISC11=1 und ISC10=0 laut ATmega8-Doku Seite 64, und izaseba, gesetzt werden.

    ------------------------
    Test 1:
    Letztes Programm von farratt ohne Motorbewegung, nur mit original Funktionen.
    - Asuro einschalten
    - LED geht auf gelb (Wartezeit zum download neuer Programme)
    - LED geht auf grün (Feststecken in der main() while(1)-Schleife nach dem Init() und StartSwitch()
    - beliebige Taste drücken: LED geht auf ROT
    Somit ist es erst einmal egal ob fallende oder steigende Flanke (wie im original Source) programmiert ist. Warum ist hier egal.
    Somit ist auch festgestellt, dass das Programm grundsätzlich funktioniert.

    ------------------------
    Test 2:
    Da ich die Funktion fahren() von farratt nicht habe, fahre ich nach Init() und StartSwitch() einfach mit MotorDir(FWD,FWD); und MotorSpeed(180,180) einfach so los.
    In der Interruptfunktion dann natürlich noch ein MotorSpeed(0,0).
    - Asuro einschalten
    - LED geht auf gelb (Wartezeit zum download neuer Programme)
    - LED geht auf grün (Feststecken in der main() while(1)-Schleife nach dem Init() und StartSwitch() und Motoren drehen
    - beliebige Taste drücken: LED geht auf ROT und Motoren stoppen

    Fazit:
    Mein Asuro schafft das gewünschte Problem zu bearbeiten.

    Was kann kaputt sein?
    Ich tippe auf eine unterbrochene Verbindung beim Widerstand R23/1M, da die Ermittlung der Tasten ja geht, aber der Widerstand R23 ja nur parallel zum R24/1K bei der Tastenmessung zu Buche schlägt, und sich dort somit fast nicht auswirkt.
    Ist die Verbindung aber unterbrochen, könnte es sein, dass dies vom AVR schon als LOW-Pegel 'gesehen' wird, und somit ein Tastendruck nicht noch mehr LOW erzeugen kann, und somit keine fallende Flanke am AVR ankommt.
    Messen kann man dies so:
    - AVR aus dem Sokel nehmen.
    - Asuro einschalten
    - Spannung zwischen Pin 1 (V+) und Pin 27 (PC4/ADC4) messen. Sollten mehr als 3 Volt sein.

    P.S.: Noch ein Wort zu SIGNAL() bzw. dem wohl gemeinten INTERRUPT().
    SIGNAL() hat ja die nette Eigenschaft, dass der gerade laufende Interrupthandler NICHT durch weitere Interrupts unterbrochen wird. Somit ist das Handling über dieses Macro auf alle Fälle überschaubarer.
    Wer sich auf INTERRUPT() einläßt, muss schliesslich noch mit gestaffelten Aufrufen rechnen, die auch noch, durch die in der Hardware festgelegte Priorität der Interrupts, nicht immer gestaffelt auftreten müssen. Dies dürfte hier aber nicht für jederman handelbar sein, und würde in diesem Fall auch keine Vorteile, geschweige den funktionierendes Verhalten, bringen.
    Lieber Asuro programieren als arbeiten gehen.

  10. #40
    Benutzer Stammmitglied
    Registriert seit
    23.08.2007
    Beiträge
    61
    [flüster]Das Programm läuft bei dir und bie mir nicht?[/flüster]

    [schrei]wuhaaaaaa...waruuuum?[/schrei]

    also zwischen Pin1 und Pin27 messe ich knapp 4,9V

Seite 4 von 6 ErsteErste ... 23456 LetzteLetzte

Berechtigungen

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

12V Akku bauen