- LiFePO4 Speicher Test         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: Interrupt + Timer

  1. #11
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Und der Timer würde parallel zum Hauptprogramm, nein , im Hauptprogramm ablaufen, und die ISR unterbricht dann alles,
    setzt den Timer zurück und zählt wo 1 dazu??

  2. #12
    Erfahrener Benutzer Begeisterter Techniker Avatar von avrrobot
    Registriert seit
    12.01.2011
    Beiträge
    210
    Blog-Einträge
    9
    zu der variable zahl, die du noch definieren musst

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Ich habe es nun erstmals geschafft, den Timer zu verwenden...

    Aber ein Problem blieb:

    Code:
    //----------------------------------------------------------------------
    // Titel     : Töne
    //----------------------------------------------------------------------
    // Funktion  : ...
    // Schaltung : ...
    //----------------------------------------------------------------------
    // Prozessor : ...
    // Takt		 : 1 MHz
    // Sprache   : C
    // Datum     : ...
    // Version   : ...
    // Autor     : ...
    //----------------------------------------------------------------------
    #define 	F_CPU 1000000	// Taktfrequenz des myAVR-Boards
    #include	<avr\io.h>		// AVR Register und Konstantendefinitionen
    //----------------------------------------------------------------------
    main ()						// Hauptprogramm, startet bei Power ON und Reset
    {
    
    int i,j = 0;
    DDRB=0b00001111;
    TCCR0B=TCCR0B|(1<<CS00); //Timer0 einstellen + starten: prescaler=1 -> 1Mhz
    // Timer läuft synchron zu allem ab!
    
    while (true)
    {	
    	 for(i=0;i<10000;i++)   // ungefähr 1 sek Ton halten
    	 {
    	 
    	 if (j>=10)
    	 { PORTB^=(1<<PB2); 
    	                    }
    	 
    	  if (TCNT0 >= 113)   // TCNT0 = Speichervariable für Timer0, geht nur bis 255 weil 8bit          
    	    {
    	          TCNT0=0; // Reset Timer -> fängt wieder bei 0 an	
    	          j++;
    	 	
    	 	}		
    	 
    	 }
    	 
    	 waitMs(500);
    	 j,i=0;
    	 TCNT0=0;
    	  
    	  
    	  for(i=0;i<10000;i++)   // ungefähr 1 sek Ton halten
    	 {
    	 
    	 if (j>=10)
    	 { PORTB^=(1<<PB2); 
    	                    }
    	 
    	  if (TCNT0 >= 85)   // TCNT0 = Speichervariable für Timer0, geht nur bis 255 weil 8bit          
    	    {
    	          TCNT0=0; // Reset Timer -> fängt wieder bei 0 an	
    	          j++;
    	 	
    	 	}		
    	 
    	 }
    	 
    	 waitMs(500);
    	 
    	 j,i=0;
    	 TCNT0=0;
    	 
    	 
    	  for(i=0;i<10000;i++)   // ungefähr 1 sek Ton halten
    	 {
    	 
    	 if (j>=10)
    	 { PORTB^=(1<<PB2); 
    	                    }
    	 
    	  if (TCNT0 >= 64)   // TCNT0 = Speichervariable für Timer0, geht nur bis 255 weil 8bit          
    	    {
    	          TCNT0=0; // Reset Timer -> fängt wieder bei 0 an	
    	          j++;
    	 	
    	 	}		
    	 
    	 }
    	 
    	 waitMs(500);
    	 
    	 
    	 j,i=0;
    	  TCNT0=0;
    	  
    	 
    	  for(i=0;i<10000;i++)   // ungefähr 1 sek Ton halten
    	 {
    	 
    	 if (j>=10)
    	 { PORTB^=(1<<PB2); 
    	                    }
    	 
    	  if (TCNT0 >= 95)   // TCNT0 = Speichervariable für Timer0, geht nur bis 255 weil 8bit          
    	    {
    	          TCNT0=0; // Reset Timer -> fängt wieder bei 0 an	
    	          j++;
    	 	
    	 	}		
    	 
    	 }
    	 
    	 waitMs(500);
    	 
      }
      }
    //----------------------------------------------------------------------

    Die Töne, die gespielt werden sollen, sind A (440 Hz), D (170 Hz), G (128 Hz) und C (191 Hz)


    Der erste Ton kling tief, der zweite höher.
    Das passt also noch.

    Aber der dritte und vierte sind genau gleich wie der zweite!!!

    selbst mit erneutem setzen der Zählvariablen i und j....


  4. #14
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Hallo Leute, mein Beitrag hier ist wohl während dem Umbau der Site ins Nirvana verloren gegangen...

    Hier nochmal:
    Ich will einen möglichst einfachen (und daher leicht zu verstehenden) Interrupt programmieren können.

    Mein Ansatz war der:

    Code:
    ISR (INT0_vect) 
    
     { 
        
       i++; 
        
       } 
    
    
    
    main () 
    { 
    
         int i=0;              // Zählervariable 
         sei();                // Interrupts global einschalten 
         GIMSK=(1<<6) // bzw. (1<<INT0) ??  Enable INT0 
         MCUCR=MCUCR|(1<<ISC01)|(1<<ISC001) // rising edge -> wenn 
                                                                          //PORTBx 5v wird 
    
                  while(true) 
                         { 
                            if (i==100) 
                                    { 
                                          LED EIN, WARTREN UND LED AUS 
                                          i=0; 
                                                 } 
                        } 
                 }
    Dann kam die Antwort


    Du kannst im Interrupt nicht die lokale Variable einer Funktion verändern. i muss global sein (und das "volatile" nicht vergessen).
    Worauf meine Vermutung war, dass ich also unter # define F_CPU und #include<...>
    noch int voltaile i=0 hinzufügen muss. Soweit korrekt??


    Mfg

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress