-         

Ergebnis 1 bis 7 von 7

Thema: Interruptproblem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2007
    Beiträge
    19

    Interruptproblem

    Anzeige

    Hallo, ich habe ein RN Controll Mega 32 Board und kenne mich mit der C Prog. nur teilweise aus.Ich möchte gerne, dass erst nach einer bestimmten Zeit mein Controller anfängt zu arbeiten, vieleicht so nach 5 Sekunden, die Zeit muß nicht genau sein. Ich wollte dies mit dem Timer0 und Interrupt realisieren, nur leider funktioniert es mit meinem Code nicht und ich weiß nicht so recht warum.Wie kann ich denn überprüfen, ob das Interruptflag nach einem Timeroverflow gesetzt wurde, oder nicht. Bei meinem Programm gehen die LEDs die vom PORTC Lowaktiv angesteuert werden gar nicht an.
    Vielen Dank.
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Eher so was in der Richtung.

    Da war einiges nicht korrekt, ich überlass mal dir rauszufinden, was...

    Mal ins Blaue und nicht getestet, aber auf jeden Fall näher dran:

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    volatile int i; 
    
    ISR(TIMER0_OVF_vect)
    {
        i++;
    }
    
    
    int main (void)
    {
        TCCR0 |= (1<<CS00) | (1<<CS02);
        TIMSK |= (1<<TOIE0);
    
        sei();
    
        // main loop
        while (1)
        {
            do // loop while i <= 2000
            {
                int j;
                
                // atomic!
                cli();
                j = i;
                sei();
                
                if (j > 2000)
                    break;
            }
            
            DDRC=0xFF;         
            PORTC=0x00;                 //LEDS sollen jetzt nach Ablauf der Zeit  zugeschaltet werden
            
            // freeze
            cli();
            while (1);
        }
    }
    Disclaimer: none. Sue me.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2007
    Beiträge
    19
    Danke für die schnelle Hilfe, aber hätte doch mal noch ne Frage.
    Wozu die erste While Schleife vor der Do Schleife, wird denn nicht mit der letzten While Schleife eh immer wieder die Do Schleife aufgerufen?
    Und warum weißt du die Variable i noch mal der Variablen j zu, obwohl i doch schon existiert?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    02.10.2006
    Beiträge
    32

    Ich habe das gleiche Problem

    Hallo,
    ich habe diesen Code geschrieben:
    #include <avr/io.h>
    #include <avr/interrupt.h>

    volatile int i;
    int main (void)
    {
    TCCR0 |= (1<<CS00) | (1<<CS02);
    TIMSK |= (1<<TOIE0);
    sei();

    // schleife
    while (1)
    {
    if (i<=10){ //i<=10 sollte sofort erfüllt sein , also LED an
    PORTC |= (1<<PC1);
    }
    cli();

    }
    }

    ISR(TIMER0_OVF_vect)
    {
    i++;
    }

    bei mir funzt es aber nicht. Warum wird der Timer immer außerhalb von Sei(); aktiviert? Muss ich eventuell noch andere Einstellungen machen?

    Danke und Gruß
    Tötzel

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    @tobhu:

    Ja, die äussere while wird eigentlich nicht gebraucht hier. Ist aber üblicher Programmaufbau, wenn mehr gemacht wird als nichts (ab freeze).

    Die Hauptschleife wird dann immer wieder durchlaufen, weil immer die gleichen AKtionen gemacht werden zB "Eingabe abfragen -> darauf reagieren".

    Warum ich i kopiere:
    http://www.roboternetz.de/wissen/ind...-atomarer_Code

    @toetzel:
    Übliche Vorgehensweise:
    1) Hardware (Timer, IRQs, ...) initialisieren.
    2) IRQs zulassen (sei)
    3) Ewige Hauptschleife

    Di stellst die IRQs in der Hauptschleife wieder ab, dadurch bekommst du keine Timer-IRQs mehr.
    Disclaimer: none. Sue me.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    02.10.2006
    Beiträge
    32

    Danke nun Funzt es

    @Sprinter

    Danke für den Tipp,

    Gruß
    Tötzel

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2007
    Beiträge
    19
    Danke dir, funktioniert jetzt.

Berechtigungen

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