Themistokles
27.03.2006, 17:07
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():
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:
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
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():
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:
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