PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Timer - Drehzahl erfassen



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

SprinterSB
28.03.2006, 14:28
1) Es muss heissen TIFR = (1<<OCF2); keinesfalls TIFR |= (1<<OCF2);
2) TCNT=6 muss vor zaehlen=0
3) dreh braucht so wie du es verwendest nicht volatile sein
4) Die while-Schleife tut wohl auch nicht, was sie woll, weil zig-mal dreh erhöht wird
5) und, und, und...

Das ist zwar ein paar Fehler, aber ich glaub nicht, daß es nur daran hängt.
Die Timer werden jedenfalls recht seltsam benutzt, bzw das Programm schaut etwas verworren aus. Kommentare würden helfen, den Fehler zu finden bzw zu erahnen, was gemacht werden soll.


Und äh ... du willst nicht wirklich ein Array mit weit über 1000 Werten füllen (hilf), die du nie brauchst?!?!

Wenn du das von wo kopiert hast: Klopp es in die Tonne und überleg dir was. Da lernst du mehr und schonst deine Nerven ;-)