- 3D-Druck Einstieg und Tipps         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 25 von 25

Thema: Programm zum Frequenzmessen

  1. #21
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Anzeige

    E-Bike
    Bei den meisten 16 Bit registern stellt GCC auch schon den direkten zugriff als 16 Bit wert zu verfügung.
    Also geht entweder TCNT1 oder TCNT1L und TCNT1H seperat. Wobei der direkte 16 Bit-wert praktischer ist.


    Wenn man es richtig machen will sollte man erst den Timer 1 Stoppen, und dann duch SEI/CLI eventuell noch ausstehenden Interrupt einfügen. Sonst hat man kaum einen wirklich definierten Stopzeitpunkt und kann trotzdem noch einen Überlauf genau auf der Grenze kriegen.

    Was definitiv noch fehlt, ist es overflow0 zurückzusetzen. Auch verstehe ich das "TCNT0 = 192" nicht. So viel Unterschied sollte in der initialisierung nicht zustandekommen.

  2. #22
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.06.2004
    Ort
    Ulm
    Alter
    37
    Beiträge
    248
    Danke, dann hab nicht nur ich das nicht verstanden.

    Jetzt hab ich mal eine fast brauchbare Anzeige. Ist nur nicht stabiel, weiß auch noch nicht warum...

    overflow0 müsste ich doch dann nullsetzen wenn der Wert ausgegeben ist, oder?

  3. #23
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    11.06.2004
    Ort
    Ulm
    Alter
    37
    Beiträge
    248
    Das war ein sehr guter Tipp danke Besserwessi.
    Wenn ich jetzt overflow0 Null setzte bekomme ich eine schöne Ausgabe zwischen den messzyklen. Ob sie stimmt muss ich morgen mal prüfen.

    Mit dem "TCNT0 = 192" wird die Messung genauer, weiß aber noch nicht warum, bitte um Erklärung.

    Hier nochmal der Quelltext so wie es geht:
    Code:
    volatile uint8_t count ;
    volatile uint16_t overflow1 ;
    volatile uint16_t overflow0 ;
    volatile uint16_t low ;
    volatile uint16_t high ;
    volatile uint8_t newflag ;
    uint32_t frequenz ;
    
    
    /*-- Hauptprogramm ---------------------------------------------------------------------*/
    int main(void)
    { 
    	char buffer[20] ;
        
    
    	count = 0 ;
    	overflow1 = 0 ; overflow0 = 0 ; // Variable für Overflow  
    
        lcd_init() ;      // LCD aktivieren
    
    	//Timer0 auf Prescaler 8 stellen  --> S.86
        TCCR0 |= (1<<CS01) ; 
    
    	// Overflow Interrupt Enable --> S.87 
    	TIMSK |= (1<<TOIE0) ;
    
    	// Timer1 auf Externen Clock Source T1 mit Rising Edge setzen --> S.115
        TCCR1B |= (1<<CS12) | (1<<CS11) | (1<<CS10) ;
    
        // Overflow Interrupt Enable --> S.117
        TIMSK |= (1<<TOIE1) ;
    
    	sei() ;
    	
    	while(1)
    	{
    	   if(newflag > 0)
    	   {
    	   set_cursor(0,1) ;
    	   frequenz = (high*65536) + low;
           snprintf(buffer, 20, "%u Hz", frequenz) ;
    	   lcd_string(buffer) ;
           newflag=0; 
    	   high = 0 ;
    	   low = 0 ;
    	   }  
    	}                      
    
    }
    
    /*-- Timer0 Overflow Interrupt ---------------------------------------------------------*/
    SIGNAL (SIG_OVERFLOW0) 
    {
      overflow0 ++ ;
      if(overflow0 > 3906)
        {
        sei() ;
    	low = TCNT1 ;
    	cli() ;
    	TCNT0 = 192 ;
    	TCNT1 = 0 ;
    	high = overflow1 ;
    	overflow1 = 0 ;
    	newflag = 1 ;   
    	overflow0 = 0 ;
    	}    
    } 
    
    
    /*-- Timer1 Overflow Interrupt ---------------------------------------------------------*/
    SIGNAL (SIG_OVERFLOW1) 
    {
      overflow1 ++ ;
    }

  4. #24
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Das mit dem TCNT0 = 192 verkürzt die Zeit der Späternen Messungen etwas. Solange man das für alle Messungen gleich hat stört es nicht weiter.


    Man sollte den Timer1 vor dem SEi() in der ISR stopen, sonst hat man dadurch nicht viel gewollen. Den Timer solle man erst wieder Starten nachdem man den Wert wieder auf Null gesetzt hat.
    Wenn man den Prescaler von timer0 nicht zurücksetzt sollte man sicher sein, das der Code zwischen stop der einen Messung und Start der nächsten immer genau gleich lange braucht. Duch die eventuell nachgehohlte ISR sollte das aber fast unmöglich sein. Also sollte man wenigstens für volle genauigkeit den Prescaler zurücksetzen Wie das geht müßte man im Datenbraltt nachlesen.

    Bleibt noch der eher seltene Fall, das man kurz vor dem entscheidenen Aufruf von overflow0 gerade einen overflow1 oder anderen Interrupt hat. Dies läßt sich aber vermeiden, wenn auch nicht ganz elegant:

    In der ISR(overflow0) (Nr. 3905) wird erstmal der overflow1 abgeschaltet und dann ein eventuell noch ausstehender overflow1 erlaubt.
    Danach bleiben interrupts erlaubt und es wird per Sleep in den Idel Mode gegangen. Aus dem Idel mode wacht der Controller auf, um den overflow0 (Nr. 3906) abzuarbeiten und man ist dabei sicher eine genau definierte Verzögerung vom Timer zu haben. Erst hier wird das Ergebins ausgelesen und die Timer wider gestartet, etwa so wie in jetzingen Version.

    Das ganze ist dann aber schon einen ziehmlich verschalchtelte version. Das wäre einer der ganz wenigen Fälle wo man in einer ISR den Sleep- befehl nutzen darf und dann auch noch die gleiche ISR noch einmal auftreten kann. Normalerweise sollte man ja vermeiden das eine ISR druch eine von gleichen Typ unterbrochen wird.

    Man solle auf alle Fälle sehen das man genug Stack hat, denn da wird einiges gebraucht.

  5. #25
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.232
    Auch verstehe ich das "TCNT0 = 192" nicht. So viel Unterschied sollte in der initialisierung nicht zustandekommen
    1 sek bei 1Mhz ( 8MHz /8 ) braucht 1 Mio Zählerstand.
    1Mio / 256 = 3906,25 Überläufe.
    ,25 Überläufe kriegt man, wenn man den Timer noch 256*0,25=64 Zählerstände hochzählen lässt.
    256-64=192 Also muss der Timer für den ersten Durchlauf mit 192 vorgeladen werden - so kommt das zustande.

Seite 3 von 3 ErsteErste 123

Berechtigungen

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

12V Akku bauen