-
        

Ergebnis 1 bis 2 von 2

Thema: Problem mit Timer - Drehzahl erfassen

  1. #1

    Problem mit Timer - Drehzahl erfassen

    Anzeige

    Hallo,

    ich habe einen Drehzahlsensor (Gabellichtschranke, die vor einer, an der Motorwelle befestigten, Lochscheibe ist), dessen Signal an Port D6 meines ATMEGA16 führt. Ich habe auch schon eine LED entsprechend der Drehzahl mit dem Sensor schalten können. Die Schaltung sollte also funktionieren.

    Das einlesen und auswerten des Signals will mir jedoch einfach nicht gelingen. Mein Mikrocontroller sendet nur fantastische Werte an den Rechner (meine USART Ausgabe selbst ist eigentlich vollkommen in Ordnung). Selbst wenn überhaupt kein Signal an Port D6 liegt gibt er permanent einen Wert von über 600 aus! Der Fehler scheint am Timer zu liegen.

    Das Modul zaehler() soll 10 Sekunden lang die Flankenwechsel an Port D6 zählen. Nach 10 Sekunden wir dann der Overflow Interrupt ausgelöst, der das Modul beendet.
    Den (angeblich richtigen) Code für den 10 Sekunden Timer habe ich aus diesem Forum und es dauert auch immer ca. 10 Sekunden bis ein Wert ausgegeben wird. Aber trotzdem tritt die fehlerhafte Ausgabe nur dann auf, wenn ich versuche innerhalb dieses Moduls zählen zu lassen.

    Hier einmal mein Code zu zaehler():

    Code:
    volatile unsigned int dreh=0;
    
    void zaehler (void)
    {
      unsigned int s_zeit=1155;                        //1155 entspricht ca. 10 Sekunden
      unsigned int i;
     
      dreh=0;
    
      if(TIFR&(1<<OCF2))
      {
        TIFR |= (1<<OCF2);    
      }
    
      if(TIFR&(1<<TOV2))
      {
        TIFR |= (1<<TOV2);    
      }  
    
      TCCR2 |= (1<<CS22) | (1<<CS20);
      TIMSK |= (1<<TOIE2);
    
      for(i=1;i<s_zeit;i++)
      {
    	 zaehlen = 0;
    	 TCNT2 = 6;
    
    	while(zaehlen != 1)
    	{
    	  if(PIND&(1<<PIND6))
    	  {
    		 hilfe[i]=1;
    	  }
    	  else
    	  {
    	    hilfe[i]=0;
               }
    
    	  if(hilfe[i]!=hilfe[i-1])            
    	  {
    		 dreh=dreh+1;
    	  }
    	}
      }
    }
    
    SIGNAL (SIG_OVERFLOW2)
    {
      zaehlen = 1;
    }
    Weis jemand wo diese seltsamen Werte herkommen bzw. was mit meinem Timer nicht stimmt?

    Hier noch meine main Funktion:

    Code:
    void main(void)
    {
      unsigned char drehstring[16];
     
      start_init();
      motor();
      usart_init(USART_Speed);
      
      sei(); 
       
      while(1)
      {
    	dreh=0;
    	zaehler();
    	dreh=(dreh*6)/4;
    	itoa(dreh, drehstring, 10);
    	usart_puts(drehstring);	
      }
    }
    mfg

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    1) Es muss heissen TIFR = (1<<OCF2); keinesfalls TIFR |= (1<<OCF2);
    2) TCNT=6 muss vor zaehlen=0
    3) dreh braucht so wie du es verwendest nicht volatile sein
    4) Die while-Schleife tut wohl auch nicht, was sie woll, weil zig-mal dreh erhöht wird
    5) und, und, und...

    Das ist zwar ein paar Fehler, aber ich glaub nicht, daß es nur daran hängt.
    Die Timer werden jedenfalls recht seltsam benutzt, bzw das Programm schaut etwas verworren aus. Kommentare würden helfen, den Fehler zu finden bzw zu erahnen, was gemacht werden soll.


    Und äh ... du willst nicht wirklich ein Array mit weit über 1000 Werten füllen (hilf), die du nie brauchst?!?!

    Wenn du das von wo kopiert hast: Klopp es in die Tonne und überleg dir was. Da lernst du mehr und schonst deine Nerven
    Disclaimer: none. Sue me.

Berechtigungen

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