Forum: Mikrocontroller und Digitale Elektronik AT89C51ED2 (8051) ->Lüfterdrehzahl ermitteln


von Fabian (Gast)


Lesenswert?

Hy Leute,

ich bin so langsam am verzweifeln. Ich muss für die Schule ein Projekt 
machen und dazu will ich die Drehzahl des Lüfters 3 Sekunden lang 
ermitteln und auf einem LC-Display ausgeben. Dahinter wird einfach noch 
eine "0" gehängt. Der Lüfter liefert zwei HIGH-Signale pro Umdrehung und 
ist ein Lüfter von Arctic-Cooling.

Der bisherige Quellcode schaut so aus:
1
 ;Drehzahl.a51 ********April07*************************************************************
2
 ;*********Programm zum Auslesen der Lüftergeschwindigkeiten und ausgeben über LCD
3
 ;*********Hilfsprogramm LCDhilf.a51 wird verwendet
4
 ;*********Übergaberegister sin Akku und Datenpointer
5
 ;*****************************************************************************************
6
 
7
 include C51ED2.inc          ;Registeradressen einbinden
8
 
9
EXTERN CODE initLCD,loeschen,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorpos
10
EXTERN CODE textaus,zifferaus,hexaus,dezaus
11
 
12
    code at 0
13
     LCALL initLCD
14
    MOV R0,#00h         ;Register R0 auf 0 setzen
15
     CLR A          ;Akku löschen
16
 
17
 Marke2:  MOV R7,#09h        ;1. SChlefe der verschachtelten SChlefe auf 09h setzen
18
 Marke3:  MOV R6,#0FFh        ;2. Schleife auf FFh setzen
19
 Marke4:   MOV R5,#0FFh        ;3. Schleife auf FFh setzen => ergibt zusammen 3 Sekunden
20
 Zeit:    JB p3.7,Marke        ;Sprung zur Marke "Marke" Wenn Port 3.7 = 1
21
 Hi:    DJNZ R5,Zeit        ;Register R5 Dekrementieren unds Sprung zur Marke Zeit
22
     DJNZ R6,Marke4        ;Register R6 Dekrementieren unds Sprung zur Marke Marke4
23
     DJNZ R7,Marke3        ;Register R7 Dekrementieren unds Sprung zur Marke Marke3
24
      
25
    LCALL loeschen        ;LCD löschen
26
      
27
    MOV R0,A        ;Akkuinhalt in Register R0 schreiben
28
    MOV A,#00h        ;Position 1 in Zeile eins mit 00h in Akku laden
29
    lcall cursorpos        ;Cursor verschieben
30
    MOV A,R0        ;Inhalt Register R0 zurück in Akku laden
31
    lcall dezaus        ;Inhalt Akku ausgeben (1/10 Drehzahl)
32
    MOV A,#03h        ;Position 4 in Zeile eins mit 03h in Akku laden
33
    lcall cursorpos        ;Cursor verschieben
34
    MOV A,#0        ;Konstante 0 in Akku laden
35
    lcall zifferaus        ;Akkuinhalt als Ziffer Ausgeben
36
    MOV R0,#00h        ;Register R0 auf 0 setzen
37
     CLR A          ;Akku löschen
38
      
39
    SJMP Marke2        ;Rücksprung zum Programmanfang
40
41
Marke:    ADD A,#01h        ;Akku um 1 erhöhen
42
    SJMP Hi          ;Sprung zurück in die Schleife    
43
      
44
    END

Die LCD Ansteuerung darf euch nicht verwundern, da die Befehle in einem 
anderen, bereits vorhandenen Programm aufgeführt sind, welches von der 
Schule ist.
Das Signal hängt mit einem 10k-Ohm Pull-Up widerstand an +5V, ergibt auf 
dem Oszi eine Flanke wie aus dem Bilderbuch.

Das Problem:
Die Werte die auf dem Display ausgeben werden springen von 00 bis 2500 
U/min, wobei die Lüfter Laut Hersteller nur max. 1500U/min laufen. 
Außerdem wurde der Lüfter mit 5V betrieben.


Interrupts kommen nicht in Frage, da ich damit nur 2 Ports ansteuern 
kann aber 4 Lüfter betreiben möchte.

Hoffe ihr könnt mir helfen und bin für jede Anregung dankbar.

greetz fluk3

von Hegy (Gast)


Lesenswert?

2 sachen, die mir eingefallen sind.

ersma, aus Schleifen raus und wieder reinspringen ist suboptimal 
(neudeutsch für Scheiße, sorry, aber bleib geschmeidig)

zweitma, ich weiß nicht, wielange der Konatakt/Impuls stehen bleibt, 
aber es kann sein, daß ein Impuls nicht nur einmal sondern in der 
innersten der inneren Schleifen mehrfach abgefragt wird (JB 
irgendwohin). Besser wäre es, anstatt der Impulse die Flanken zu zählen, 
also vergleichen, ob Eingangspin vorher 0 war und jetzt 1 ist, dann ADD 
A,#01h ausführen. Somit zählst du die steigenden oder fallenden Flanken 
und das ist sicherer als als die Impulsbreite mitzumessen.

Hope it helps.

 - Hegy

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.