-         

Ergebnis 1 bis 3 von 3

Thema: Frequenzmessen mit Timer0 klappt nicht.

  1. #1

    Frequenzmessen mit Timer0 klappt nicht.

    Anzeige

    Hallo,
    ich bin hier mit einem Kollegen seit Stunden am überlegen wieso unser
    kleiner Frequenzmesser nicht das anzeigt was er soll.

    Wir wollen 100Hz messen, haben dafür ein AtMega168 mit internen 8MHz
    genommen, der per Timer0 die Zeit messen soll.

    Wir prüfen das Signal einfach in der Main-Schleifen, wollten kein
    INT0-Interrupt, sollte eig. auch so gehen.

    Mit einem Prescaler von 1024 kommen wir dann auf 7812,5Hz, mit der sich
    der TCNT0 um eins erhöht. Ein Overflow sollte es nicht geben, da erst ab
    einer gemessenen Frequenz von ca 30Hz der TCNT0 bei 256 ist.

    Jetzt sollte uns unser LCD irgendwas um die 70 ausgeben (1/100Hz /
    1/7812.5Hz = 78,125)

    Nur unser Display zeigt jetzt dauerhaft "24" an. Das können wir uns
    nicht erklären. Jemand eine Idee?

    MfG

    Code:
    #include <avr/io.h>
    #include "lcd.h"
    #include <avr/delay.h>
    #include <avr/interrupt.h>
     
    void convRPM(int intRPM)
    {
      int first = intRPM/10000;
      lcd_data(first + 48);
      //lcd_setcursor(1,2);
      int second = (intRPM - (first*10000)) / 1000;
      lcd_data(second + 48);
      int third = (intRPM - (first*10000) - (second*1000)) / 100;
      lcd_data(third + 48);
      int fourth = (intRPM - (first*10000) - (second*1000) - (third*100)) / 10;
      lcd_data(fourth + 48);
      int fifth = (intRPM - (first*10000) - (second*1000) - (third*100) - (fourth*10)) / 1;
      lcd_data(fifth + 48);
    } 
    
    int main(void)
    {
      
      lcd_init();
      int up = 0;
      // Timer 0 konfigurieren
      TCCR0B |= _BV(CS02) | _BV(CS00); //Prescaler 1024 -> bei 8 MHz -> 7812,5Hz
      // Overflow Interrupt erlauben 
      TIMSK0 |= _BV(TOIE0);   //Bei 256 und 7812,5Hz -> 30,5 Hz
      // Global Interrupts aktivieren
      sei();
      lcd_setcursor( 0, 1 );
      DDRC = 0x00;
      PORTC = 0x00;
      lcd_string("RPM");
     
      while(1)
      {
        if (!(PINC & (1 << 5))) // Taster gedrückt
        {
          if( up == 0) //steigende Flanke
          {
           up = 1; 
           //content
           lcd_setcursor(0,2);
           convRPM(TCNT0);
           TCNT0 = 0;
          }      
        }else{ //fallende Flanke
          up = 0;
        }
      }
     
      return 0;
    }
    
    ISR (TIMER0_OVF_vect)
    {
      lcd_setcursor( 0, 1 );
      lcd_string("--- OVERFLOW");
    }

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    So vielleicht?

    temp = TCNT0;
    TCNT0 = 0;
    up = 1;
    //content
    lcd_setcursor(0,2);
    convRPM(temp);

    oder so:
    Code:
    	...
    	lcd_string("RPM");
    	
    	while((PINC & (1 << 5))) // warten falls Signal high ist
    	while(1)
    	{
    		while(!(PINC & (1 << 5))) // warten solange Signal low ist
    		TCNT0 = 0; // Timer zurücksetzen
    		while(PINC & (1 << 5)) // warten solange Signal high ist
    		int temp = TCNT0; // Timerstand merken...
    		lcd_setcursor(0,2); // ... und ausgeben
    		convRPM(temp);
    	}
    	return 0;
    }
    Geändert von radbruch (12.07.2011 um 18:17 Uhr)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Ah, natürlich. Meine LCD-Routine "frisst" die Hälfte der Zeit.

    Danke vielmals

Ähnliche Themen

  1. [M128] PE5 klappt nicht
    Von Fabian E. im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 13.06.2010, 17:19
  2. frequenzmessen über 100khz nicht möglich
    Von kleinstar im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 15.05.2007, 18:45
  3. SPI klappt nicht
    Von p_mork im Forum Assembler-Programmierung
    Antworten: 0
    Letzter Beitrag: 22.04.2007, 14:10
  4. I2C klappt bei mir nicht
    Von Matthias Mikysek im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 16.02.2005, 07:27
  5. LCD Steuerung Klappt nicht
    Von khazad im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 10.01.2005, 15:29

Berechtigungen

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