Zählerprogramm am Inkrementalgeber

Gast #3316196
Lesenswert?

Hallo Zusammen,
ich habe hier einen Inkrementalgeber des Typs HEDS 9100. Dieser hat eine 
Scheibe eingebaut mit 500 streifen. Jetzt dachte ich mir könnte ich die 
Drehzahl des Motors anhand dieses Inkrementalgebers anzeigen lassen.
Um zu testen ob der microcontroller die vielen tausend Impulse des 
Inkrementalgebers verarbeitet hate ich diesen kurzerhand an den 
Microcontroller angeschlossen. VCC liegt auf +5V, Ground auf Ground und 
die beiden Kanäle an 2 Ports welche als Eingänge definiert wurden. Jetzt 
sollte mein Programm zählen (bis 5000 ca) und eine LED zum leuchten 
bringen wenn diese Zahl erreicht wird. Mein Programm sieht so aus:
1
#include <avr/io.h>      
2

3

4

5
int main(void){    
6
  
7
  uint8_t counter = 0;  //Zaehlvariable
8

9
  DDRD = 0x00;    //Alle PINs als Eingang definieren
10
  DDRA = 0xff;    //Alle Pins als Ausgang definieren
11
  
12
    while(1)      //Endlosschleife
13
    {
14
    if( PIND & (1<<PD2))  //Falls ein Signal an PortD 1 
15
    {
16
    counter++;    //counter um 1 inkrementieren
17
                }
18
    if(counter >= 5000)
19
    {
20
      PORTA |= 1<<PA2;
21
    }
22
        }
Ich probiere schon mit beiden Kanälen herum , komme aber leider zu 
keiner funtkionstüchtigen Lösung. Vielleicht sieht ja einer von euch was 
für Fehler hier vorhanden sind.

Gruß
(Firma: fritzler-avr.de) #3316206
Lesenswert?

Vllt braucht der Komaparator noch nen Pullup?
Wird im Datenblatt nicht explizit erwähnt, aber in einer Tabelle steht 
was von einem 3,3k Pullup.

Außerdem geht das schief:
  if( PIND & (1<<PD2))  //Falls ein Signal an PortD 1
    {
    counter++;    //counter um 1 inkrementieren

Der Pin wird sicherlich länger als ein Mainschleifendurchlauf high sein.
-> Nutz den INT Eingang (Low zu High Fanke).
Oder Merke dir den vorherigen Zustand mit nur die Flanke zählt.
Gast #3316235
Lesenswert?

@ Martin
Danke für den Hinweis, ich werde mir den Teil noch einmal anschauen

@ Falk
Danke für den Link, hier ist eine wesentlich bessere Funktionsweise 
beschrieben

@  Syliosha und Uwe
Das liegt nur an uint8_t oder? wenn ich den Datenbereich erhöhe sollte 
des uC das doch erfassen oder?

Vielen Dank für eure schnellen Antworten :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren