Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehzahlmessung mit Pic16f84A in C für Schaltblitz
Hallo
Ich weiß nicht ob das hier der richtige Bereich ist für meinen Post, habe aber nichts entsprechenderes gefunden.
Also mein Problem ist, ich möchte einen Schaltblitz für meine Aprilia bauen.
Dafür muss ich an einem Pin die Frequenz von der Lichtmaschine für eine gewisse Zeit abgreifen, mit einem Wert vergleichen und jenach Ergebnis einen anderen Pin auf High setzen.
Nun weiß ich jedoch nicht wie ich eine Frequenz mit dem PIC16F84A einlesen kann. Kann mir vielleicht jemand Tipps oder nochbesser Code fetzen geben damit ich weiter komme?
Freue mich auf Antwort
Gruß Marius
Servus,
also ich habe keine Ahnung was ein Schaltblitz genau machen bzw. bringen soll. Aber ich habe einen ganz guten Link für dich: http://www.sprut.de/electronic/pic/projekte/frequenz/freq.htm
Schau dir dieses Beispiel für die Frequenzmessung einfach mal an.
Gruß
Hallo
Jau habe ich auch schon gesehen nur leider alles in Assembler.
Habe mich jetzt mal daran gesetzt und einen Code geschrieben.
Ich denke der müsste theoretisch funktionieren.
#include <C:\cc5\16F84a.h>
#pragma config |= 0b.1111.1111.0010 // Prozessor-Typ definieren
void warten(void) //Timer auf eine ms einstellen
{
OPTION = 2;
TMR0 = 131;
while (TMR0);
}
void main(void) // Start des Hauptprogramms
{
TRISB = 0b.0000.0001; //Pin 0 ist Eingang , Pin 1 bis 7 ist Ausgang
PORTB = 0b.0000.0000;
char puls; //Frequenz Impulse Variable setzen
char lauf; // Durchläufe festhalten
bit Rein @ PORTB.0; //Namen zuweisen
bit Raus @ PORTB.1;
Sprungmarke:
//Abfrage an Port B
lauf=250;
while (lauf)
{
if (Rein) ;
{
puls++ ;
}
warten();
lauf-- ;
}
puls=puls*4;
if (puls>150)
{
Raus=1 ;
}
puls=0
goto Sprungmarke;
}
@Enrock
ein Schaltblitz ist ein Gerät, dass bei Fahrzeugen ein Warsignal ausgibt, sobald eine vorher bestimmte maximal Drehzahl erreicht ist.
Vielleicht kann sich den Code ja mal jemand anschauen.
Noch eins: Irgendwie will mein Compiler (CC5X) das nicht compilieren.
Er meint ich müsse hinter goto eine ; setzten was quatsch is und wenn ich es mache will er es trotzdem nicht compilieren.
Gruß Marius
Servus,
vor "puls=0" fehlt das ";".
Ich programmiere die Pics gerade die kleineren nur in Assembler, von daher kann ich dir mit dem Code nur wenig helfen.
Gruß
Hallo
danke aber wieso vor? sicher das das nicht dahinter stehen muss?
Edit: jau toll jetzt compiliert er wenigstens jetzt muss nurnoch jemand den code überprüfen dann kann den brennen wenn der so funktionieren müsste.
Hallo,
jap ich meinte danach bzw. vor goto.
Den Pic 16F kannst du auch öfter brennen ;-) Mich würde noch die Schaltung interessieren. Die Lichtmaschine wird ja wohl kaum 5 Volt Pegel generieren, oder?
Gruß
oh F**k stimmt jetzt wo du es sagst die gibt 12 V.
ja wie mache is das dann? Ich würde sagen mit Widerständen oder?
Oder wie kann man das noch machen ich werde mal einen Schaltplan erstellen so wie ich mir das vorstelle.
Edit: so habe jetzt mal einen Schaltplan gemacht.
Plan ist im Anhang
Edit2: So habe jetzt alle nötiegen Teile bestellt. Wenn sie ankommen werde ich mich dran machen und den Gedöns aufbauen.
Guten Morgen,
also die Spannung der Frequenz würde ich mit einem Spannungsteiler reduzieren.
Von welcher Frequenz sprechen wir denn hier überhaupt? Weißt du das?
Ich würde zusätzlich für den Reset MCLR einen Taster einbauen (entprellt), dass du den µC auch gewollt zurück setzen kannst, ohne ihn von der Spannung zu trennen. Zumindest gehört noch eine Kapazität vor den MCLR um ein Delay zu erzeugen.
Dann ergeben zwei LEDs an Port RB1 für mich keinen Sinn(doppelte Anzeige?). Ich dachte du wolltest dir da eine richtige Anzeige bauen.
Also quasi so:
1. LED -> Schaltpunkt zu früh/Drehzahl zu niedrig
2. LED -> Schaltpunkt zu richtig/Drehzahl passt
3. LED -> Schaltpunkt zu spät/Drehzahl zu hoch
Also das man auch Zeit hat sich beispielsweise auf den Schaltpunkt vorzubereiten.
Oder soll das Gerät zu eine bestimmte Drehzahl anzeigen?!
Gruß
Ja stimmt ich werde jetzt 3 LEDS verbauen.
nun habe ich ein Problem ich will die Freuqenz mit einer Select case anweisung auswerten. klappt auch soweit nur ich kann keine bereiche von zahlen also zum beispiel 150 bis 200 sondern nur eine zahl also 150 eintragen. wie muss ich das schreiben?
habe es mit mit größer als und mit 150 to 200 versucht aber das geht beides nicht
die erste led geht jetzt bei 8000 an, die zweite bei 9000 und die dritte bei 10000. code kommt noch aber erst wenn er compiliert werden kann.
gruß marius
Edit: So der neue Schaltplan und der neue Code sind fertig:
#include <C:\cc5\16F84a.h>
#pragma config |= 0b.1111.1111.0010 // Prozessor-Typ definieren
void warten(void) //Timer auf eine ms einstellen
{
OPTION = 2;
TMR0 = 131;
while (TMR0);
}
void main(void) // Start des Hauptprogramms
{
TRISB = 0b.0000.0001; //Pin 0 ist Eingang , Pin 1 bis 7 ist Ausgang
PORTB = 0b.0000.0000;
char puls; //Frequenz Impulse Variable setzen
char lauf; // Durchläufe festhalten
bit rein @ PORTB.0; //Pin für Frequenz Input
bit unter @ PORTB.1; //Pin für erste LED
bit fast @ PORTB.2; //Pin für zweite LED
bit drauf @ PORTB.3; //Pin für die maximale Drehzahl
Sprungmarke:
//Abfrage an Port B
lauf=250;
while (lauf)
{
if (rein) ;
{
puls++ ;
}
warten();
lauf-- ;
}
puls=puls*4;
if (puls>133) ;
{
unter=1;
}
if (puls>150) ;
{
fast=1;
}
if (puls>167) ;
{
drauf=1;
}
puls=0;
goto Sprungmarke;
}
Huhu endlich mal wieder ein erfolgserlebnis.
habe mir heute eine testplatine gebaut, die auch tadellos (wenn auch sehr langsam da ohne quarz) funktioniert. Habe erstmal ein test prog geschrieben um alle ausgänge zu testen. so jetzt kann es wieder mit voller begeisterung weitergehen.
hier ein video vom test:
http://www.youtube.com/watch?v=K7J3RqGHLuQ
Servus,
na das sieht doch gut aus. Weiter so!
Gruß
Hi
als nächstes denke ich mal sollte dann die Pulsweitenmodulation dran kommen. Nur jetzt weiß ich nicht wie man das Programmiert ich habe mir im RN Wiki zwar den Part angeguckt kann es aber nicht umsetzten.
Gruß Marius
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.