Surado
06.11.2008, 23: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ß
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ß