www.mikrocontroller.net

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


Autor: Fabian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
 ;Drehzahl.a51 ********April07*************************************************************
 ;*********Programm zum Auslesen der Lüftergeschwindigkeiten und ausgeben über LCD
 ;*********Hilfsprogramm LCDhilf.a51 wird verwendet
 ;*********Übergaberegister sin Akku und Datenpointer
 ;*****************************************************************************************
 
 include C51ED2.inc          ;Registeradressen einbinden
 
EXTERN CODE initLCD,loeschen,loeschzeile1,loeschzeile2,textzeile1,textzeile2,cursorpos
EXTERN CODE textaus,zifferaus,hexaus,dezaus
 
    code at 0
     LCALL initLCD
    MOV R0,#00h         ;Register R0 auf 0 setzen
     CLR A          ;Akku löschen
 
 Marke2:  MOV R7,#09h        ;1. SChlefe der verschachtelten SChlefe auf 09h setzen
 Marke3:  MOV R6,#0FFh        ;2. Schleife auf FFh setzen
 Marke4:   MOV R5,#0FFh        ;3. Schleife auf FFh setzen => ergibt zusammen 3 Sekunden
 Zeit:    JB p3.7,Marke        ;Sprung zur Marke "Marke" Wenn Port 3.7 = 1
 Hi:    DJNZ R5,Zeit        ;Register R5 Dekrementieren unds Sprung zur Marke Zeit
     DJNZ R6,Marke4        ;Register R6 Dekrementieren unds Sprung zur Marke Marke4
     DJNZ R7,Marke3        ;Register R7 Dekrementieren unds Sprung zur Marke Marke3
      
    LCALL loeschen        ;LCD löschen
      
    MOV R0,A        ;Akkuinhalt in Register R0 schreiben
    MOV A,#00h        ;Position 1 in Zeile eins mit 00h in Akku laden
    lcall cursorpos        ;Cursor verschieben
    MOV A,R0        ;Inhalt Register R0 zurück in Akku laden
    lcall dezaus        ;Inhalt Akku ausgeben (1/10 Drehzahl)
    MOV A,#03h        ;Position 4 in Zeile eins mit 03h in Akku laden
    lcall cursorpos        ;Cursor verschieben
    MOV A,#0        ;Konstante 0 in Akku laden
    lcall zifferaus        ;Akkuinhalt als Ziffer Ausgeben
    MOV R0,#00h        ;Register R0 auf 0 setzen
     CLR A          ;Akku löschen
      
    SJMP Marke2        ;Rücksprung zum Programmanfang

Marke:    ADD A,#01h        ;Akku um 1 erhöhen
    SJMP Hi          ;Sprung zurück in die Schleife    
      
    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

Autor: Hegy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.