-
        

Ergebnis 1 bis 2 von 2

Thema: Anfängerproblem LED + TIMER

  1. #1

    Anfängerproblem LED + TIMER

    Anzeige

    guten abend, ich quäle mich seit stunden mit folgenden 2 Problemen:


    problem 1:

    folgende schaltung: http://www.roboternetz.de/wissen/ind...ragt_Taster_ab

    wenn ich jetzt mit dieser zeile den PC0 port mit:
    Code:
    DDRC |= (1<<PC0);  //PC0 auf OUT setzen
    auf output setze dann hab ich sofort an diesem pin 4,7V und die led leuchtet.
    müsste nicht der pin erst auf LOW sein?

    das schaltet die led wieder aus:
    Code:
    PORTC |= (1<<PC0);
    der ausgang verhält sich also genau umgekehrt.

    problem 2:

    ich wollte mir mit hilfe von timern eine sleep() funktion basteln:


    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    volatile uint16_t countTimer2;
    
    inline void sleep (uint16_t t)
    {
    	countTimer2 = 0;
    	while (countTimer2 < t);
    }
    
    ISR(TIMER2_OVF_vect)
    {
    	countTimer2++;	
    	TCNT2  = 5;			// Vorladen
    }
    
    int main()
    {
    	
    	DDRC |= (1<<PC0);  //PC0 auf OUT setzen
    
    	// Initialisierung:
    	TCCR2 = (1<<CS22);		// Prescaler von 1 
    	TCNT2  = 5;			// Vorladen
    	TIMSK |= (1<<TOIE2);	// Interrupts aktivieren und damit Timer starten
    	sei();
    
    	while (1)
    	{
    		PORTC |= (1<<PC0); //LED Einschalten	
    		sleep(4000);	
    		PORTC &= ~(1<<PC0); //LED Ausschalten
    		sleep(4000);	
     	}
    
    }
    der atmega32 läuft noch mit dem intern 1mhz takt. jetzt hab ich das so verstanden: 1000000 / (256-(5+1)) = 4000 also 4000 mal in der sekunde wird ein interrupt erzeugt und somit 4000 mal in der sekunde countTimer2 erhöht. heißt sleep(4000) müsste eine sekunde dauern. aber das ganze dauert um ein vielfaches länger. was ist falsch?

    hab mich echt lange damit rumgeprügelt und komm nicht weiter. dass ich nen neuling bin brauch ich wohl nicht zu sagen also nicht meckern.

    gruß

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.383
    zu problem 1: die diode ist auf "low active" angeschlossen, der strom fliest von Vcc in den controller, der port des controler ändert seine polarität, im gegensatz zu nem einfachen transistor der nur(vereinfacht ausgedrückt) auf und zu macht!

    zu problem 2: geh nochmal ins datenblatt, du musst CS20 und nicht 22 vorgeben, 22 ist PS 64

    PS: wenn du den timer in der konfiguration und das OCR2 register nicht unbedingt brauchst, aknnst du den timer ja auch im CTC modus betreiben und mittels ocr2 register einen topwert = max - 5 definieren, so sparst du die paar rechenzyklen fürs vorladen!

    PPS: überleg dir besser einen anderen namen für dein sleep (sleep4k() z.B. damit du weist wie hoch der timer auflöst), bin mir nicht ganz sicher ob du da nicht eventuell mit der AVR lib irgendwo probleme bekommen könntest

Berechtigungen

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