PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerproblem LED + TIMER



Surado
06.11.2008, 22:56
guten abend, ich quäle mich seit stunden mit folgenden 2 Problemen:


problem 1:

folgende schaltung: https://www.roboternetz.de/wissen/index.php/AVR-Einstieg_leicht_gemacht#Eingangsport_fragt_Taster_ ab

wenn ich jetzt mit dieser zeile den PC0 port mit:
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:

PORTC |= (1<<PC0);
der ausgang verhält sich also genau umgekehrt.

problem 2:

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



#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ß

Ceos
07.11.2008, 08:00
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