- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Timer und Interrupt??

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2005
    Beiträge
    23

    Timer und Interrupt??

    Anzeige

    Powerstation Test
    Hallo,

    Kann mir jemand sagen wo der Fehler im Code liegt?Anstatt zu blinken leuchtet LED.

    Code:
    #include <avr/io.h> 
    
    
    
    
    int main() { 
    
    TCCR1B = (1<<CS11)|(1<<CS10);
    TIMSK = (1<<TOIE1); 
    
    
    while(1)
    
    {
    
    if (TIFR = (1<<TOV1) ) 
    
    { 
       
     DDRD |= (1<<PD6); /*Ausgang*/ 
    PORTD |= (1<<PD6);/*Pull up an*/
    PIND |= (1<<PD6); /*High*/
      
     } 
      else
     {
         DDRD &= ~(1<<PD6); /*Ausgang*/ 
    PORTD &= ~(1<<PD6);/*Pull up an*/
    PIND &= ~(1<<PD6); /*High*/
      } 
      
      
      
    }
    
    }

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2005
    Beiträge
    23
    Kann mir denn echt keiner helfen??Ich erwarte hier keinen ganzen code sondern nur das mir jemadns agen kann wo der fehler liegt!.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    57
    Beiträge
    247
    Hallo

    Das geht so nicht

    if (TIFR = (1<<TOV1) )

    Sollte so aussehen

    #include <avr/io.h>
    ...
    /* Fuehre Aktion aus, wenn Bit Nr. 1 (das "zweite" Bit) in PINC gesetzt (1) ist */
    if ( PINC & (1<<PINC1) ) {
    /* Aktion */
    }


    Siehe dazu auch

    http://www.mikrocontroller.net/artic...immten_Zustand

    und

    http://www.mikrocontroller.net/artic...immten_Zustand


    MFG
    Dieter

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2005
    Beiträge
    23
    Vielen dank für deine antwort funktioniert zwar noch immer nicht aber wenigstens schonmal ein fehler weniger!

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2004
    Ort
    Karlsruhe
    Beiträge
    223
    wieso schaltest du ständig zwischen Ausgang und Eingang um und machst den Pull-Up an und wieder aus? Das sollte 1x zu setzen sein und dann ist gut -- du brauchst doch nur noch den Pegel ändern durch an- und ausschalten vom PIN.
    Mach mal deine Initialisierung global und schraub nicht ständig an allen Parametern gleichzeitig rum.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802

    Re: Timer und innterrupt??

    Zitat Zitat von Crocodile
    Hallo,

    Kann mir jemand sagen wo der Fehler im Code liegt?Anstatt zu blinken leuchtet LED.
    Das liegt daran, daß du keine ISR (Interupt Serice Routine) für den Timer1Overflow implementiert hast. Wenn dann ein Interrupt (IRQ) auftaucht, landest du im Reset und fängt wieder alles von vorne an.

    Du musst dich entscheiden, ob du mit Timer1 Overflow Interrupt arbeiten willst oder nicht.

    Code mit Interrupt:
    Code:
    //Code mit Interrupt
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    int main() 
    { 
    	// PORTD.6 ist Ausgang
    	DDRD |= (1<<PD6); 
    	
    	// PORTD.6 ist HIGH
    	PORTD |= (1<<PD6);
    	
    	// Timer1 zurücksetzen
    	TCNT1 = 0;
    	
    	// TOV1-Flag löschen
    	TIFR = (1<<TOV1);
    	
    	// Timer1 starten in Mode ???
    	TCCR1B = (1<<CS11)|(1<<CS10);
    	
    	// Aktiviert Timer1 Overflow IRQ
    	TIMSK = (1<<TOIE1); 
    	
    	// Interrupts aktivieren
    	sei();
    
    	while (1)
    	{
    		// Interrupt macht den Rest
    	}
    }
    
    // Implementierung der ISR für Timer1 Overflow
    SIGNAL(SIG_OVERFLOW1)
    {
    	// PORTD.6 Toggeln
    	PORTD ^= (1<<PD6);
    	
    	// TOV1-Flag wird durch die IRQ automatisch gelöscht
    }
    Code ohne Interrupts:
    Code:
    // Code ohne Interrupts
    #include <avr/io.h>
    
    int main() 
    { 
    	// PORTD.6 ist Ausgang
    	DDRD |= (1<<PD6); 
    	
    	// PORTD.6 ist HIGH
    	PORTD |= (1<<PD6);
    	
    	// Timer1 zurücksetzen
    	TCNT1 = 0;
    	
    	// Timer1 starten in Mode ???
    	TCCR1B = (1<<CS11)|(1<<CS10);
    	
    	while (1)
    	{
    		// TOV1-Flag löschen
    		TIFR = (1<<TOV1);
    	
    		// Warten bis Flag auf 1
    		while (!(TIFR & (1<<TOV1))
    		{
    		}
    			
    		// PORTD.6 Toggeln
    		PORTD ^= (1<<PD6);
    	}
    }
    Disclaimer: none. Sue me.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Ich hab deinen Code grad ausprobiert und Fehler oder so, bekomm ich auch nciht, aber kann es sein, dass das blinken einfach immer noch viel zu schnell ist und auf uns wie ein durchgehenes an-sein wirkt? Weil meine 8Mhz durch 1024 sind doch so ungefähr 8khz und diese dann durch 256 sind auf jeden fall immer noch mehr als die fürs menschliche Auge sichtbaren 26 Herz.

    Also falls ich jetzt Mist erzählt habe, sagts mir, aber so verstehe ich das.
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Das mit der Frequenz stimmt natürlich.

    CS1:2-0 = 011 gibt einen prescale von 64, bei 8MHz macht das eone Overflow1-Frequenz von knapp 2Hz, also müsste die LED mit 1Hz blinken.

    Der Code, wie er oben steht, funktioniert definitv nicht, alleine schon
    if (TIFR = (1<<TOV1))
    Ist ein semantisches Leckerli, wo man ins schwitzen kommt (TIFR ist volatile!).
    Diese Bedingung ist immer erfüllt, denn (1<<TOV1) ist ungleich 0, abwohl man etwas anderes erwarten würde.
    Also passiert in der Schleife nicht wirklich was spannendes. Selbst wenn das Konstrukt funzen würde, lefert es nicht das angedachte.
    Disclaimer: none. Sue me.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    [quote="SprinterSB"]
    CS1:2-0 = 011 gibt einen prescale von 64, bei 8MHz macht das eone Overflow1-Frequenz von knapp 2Hz, also müsste die LED mit 1Hz blinken.
    [quote]

    Hä??? Sorry, aber könntest du das nochmal etwas genauer erklären? Weil ich les hier auch grad das AVR-GCC Tutorial und versuche nebenbei im Datenblatt vom meinem mega16 was zu verstehen.

    Also es blinkt bei mir schon, mit der von dir angegeben Frequenz aber ich versteh noch nciht ganz warum.

    Wenn ich 8Mhz hab und jetzt als Vorteiler 64. Dann komm ich doch auf *rechne* 125Khz. (oder hab cih da schon einen Fehler?). Und wenn da jetzt nur jedes 256. mal getoggelt wird, so ergibt dass nach meiner rechnung immer noch ne Frequenz von 488Hz.

    Sorry, aber das versteh ich ncoh nciht.

    Nachtrag:

    Achsoo . .. . es ist doch ein 16Bit Timer, ne? Also mit ~65000 Zähler . .. Dann passts ja ....
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    23.07.2005
    Beiträge
    23
    Ich danke euch allen für euer bemühen hab es gelöst bekommen.Ich sollte mir mal angewöhnen tutorialsbis zum ende zu lesen.Hier der Code.

    Code:
    /* Timer0 8-Bit Vorteil = 1024 mit 1Mhz */
      
    
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    #include <avr/signal.h>
    #include <avr/iom32.h> 
    #include <avr/delay.h> 
    
    volatile int counter;
    
    int main() { 
    
    DDRD |= (1<<PD6); /*Ausgang*/ 
    TCCR0 = (1<<CS00)|(1<<CS02);/*CPU-Takt / 1024*/
    TIMSK = (1<<TOIE0);  /* Timer0 Overflow Interrupt  enable*/
    TCNT0 = 0;  /*Timer auf o setzen*/
     sei();   /*  Global Enable Interrupt Flag  setzen  */
    
    
    while(1)
    {
    if (counter == 1) { 
    
    PORTD |= (1<<PD6);/*Pull up an*/
    PIND |= (1<<PD6); /*High*/
    _delay_ms(100);
    counter = 0;
    }
    if (counter == 0)   
    { 
    
    PORTD &= ~(1<<PD6);/*Pull up an*/
    PIND &= ~(1<<PD6); /*High*/
    
    }
    }
    
    
    }
    
    
    SIGNAL (SIG_OVERFLOW0) /*Interrupt-Routine*/
    {
    
    counter++; /*um eins inkrementieren*/
    
    
    
    }

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress