- Labornetzteil AliExpress         
Ergebnis 1 bis 7 von 7

Thema: erste Versuche mit Timer

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    25.05.2007
    Ort
    Hamburg
    Beiträge
    47

    erste Versuche mit Timer

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich habe jetzt mal angefangen mit dem Timer1 von einem mega32 zu spielen.

    ich möchte für den Anfang erstmal ohne Interrupt oder sonstiges messen wie lange eine Taste gedrückt ist.

    Code:
    		if ( PIND&(0x04) )
    		{
    			PORTD |= 0x40;	//signal LED ein
    
    			TCCR1A = 0x00;
    			TCCR1B |= (1<<CS12)|(1<<CS10);	//timer starten
    			_delay_ms(20); //entprellen
    			while (PIND&(0x04)); //warten bis Taste losgelassen
    			TCCR1B &= ( (~(1<<CS12)) | (~(1<<CS10)) );	//timer stoppen
                           //Wert speichern
    			temp1= TCNT1L;
    			temp2 = TCNT1H;
    			counter = (temp2<<8)+temp1;
    
    			//zählregister auf 0 zurück setzen			
    			TCNT1H = 0x00;
    			TCNT1L = 0x00;
    			
    			//Ausgang abschalten
    			PORTD &= 0xdf;		
    		}
    die Variable counter gebe cih danach auf einem LCD aus, die Werte die ich da bekomme sind nur leider bedingt richtig denke ich, weil ich teilweise negative Zahlen ausgegeben bekomme oder auch gerade bei kurzen Tastimpulsen schon recht große Werte.

    Der Controller ist auf intern 1MHz eingestellt und mit dem Prescaler hab ich jetzt quasi doch eine Erhöhung des Timerregisters alle 1,024ms oder nicht?

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    21.05.2008
    Ort
    Oststeinbek
    Alter
    34
    Beiträge
    607
    Poste mal deinen ganzen Code rein, vor allem den, in dem du deine Variablen deklarierst.

    Gruß, Yaro

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    25.05.2007
    Ort
    Hamburg
    Beiträge
    47
    die lcd-routinen lasse ich mal weg:

    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include "lcd-routines.h"
    #include <util/delay.h>      
    
     
    
    int main(void)
    {
    	
    	int counter=0;
    	int temp1, temp2;
    	DDRD = 0xf0;	
    	
        lcd_init();
    
        while(1)
        {
    	
    		if ( PIND&(0x04) )
    		{
    			PORTD |= 0x40;	//signal LED ein
    
    			TCCR1A = 0x00;
    			TCCR1B |= (1<<CS12)|(1<<CS10);	//timer starten
    			_delay_ms(20);
    			while (PIND&(0x04));
    			TCCR1B &= ( (~(1<<CS12)) | (~(1<<CS10)) );	//timer stoppen
    
    			temp1= TCNT1L;
    			temp2 = TCNT1H;
    			counter = (temp2<<8)+temp1;
    
    			//zählregister auf 0 zurück setzen
    			TCNT1H = 0x00;
    			TCNT1L = 0x00;
    			
    			//Ausgang abschalten
    			PORTD &= 0xdf;		
    		}
    
    		{
    			char Buffer[16]; // in diesem {} lokal
    			lcd_clear();		
    
    			set_cursor(0,2);
    			itoa( counter, Buffer, 10 ); 
    	 
    		   // ... ausgeben  
    		   lcd_string( Buffer );
    			_delay_ms(200);
    		
    		}
    
        }
     
        return 0;
    }

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.05.2006
    Ort
    Pfalz
    Beiträge
    154
    Sieht jetzt mal nicht so falsch aus. counter kann zwar negativ werden aber erst bei Werten über 32767.
    Das entspräche 30s Tastendruck.

    Ist der Timer1 sonst unbenutzt, mit was für einem Timer läuft dann _delay_ms ? Oder braucht evtl die LCD Ansteuerung einen Timer?

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    Das Problem wird wohl die Zeile
    Code:
     TCCR1B &= ( (~(1<<CS12)) | (~(1<<CS10)) );   //timer stoppen
    sein.

    ( (~(1<<CS12)) | (~(1<<CS10)) ) ist nämlich konstant 0b11111111, sprich der gesamte Ausdruck hat keinerlei Wirkung und Timer1 läuft weiter. Mir scheint es, dass Du dich mit binären Verknüpfungen noch nicht besonders gut auskennst. Auf www.mikrocontroller.net/articles/Bitmanipulation ist das genau beschrieben.

    MfG Mark

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    30.05.2006
    Ort
    Pfalz
    Beiträge
    154
    lol, total übersehen

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    25.05.2007
    Ort
    Hamburg
    Beiträge
    47
    danke
    Code:
    TCCR1B &= ~( (1<<CS12) | (1<<CS10) );
    hat jetzt das Problem gelöst

Berechtigungen

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

12V Akku bauen