Forum: Mikrocontroller und Digitale Elektronik PIC 16F690 Capture / Timer1


von Martin (Gast)


Lesenswert?

Hallo ich hab für meine Diplomarbeit folgendes Problem.. Wir haben ganze 
zeit C# programmiert und jetzt haben wir ein kleines Nebenprojekt wo wir 
über einen PIC (16F690) eine geschwindigkeit messen müssen...

Folgendes Problem ich habe am RC5 (CCP1) einen Button geschlossen (der 
soll fürn anfang einen Lichtschranken simulieren) d.h wenn ich den 
Button drücke soll der Timer 1 anfangen zu zählen und wenn ich ihn 
nochmal drücke soll er aufhören zum zählen. Jetzt versteh ich nicht 
wirklich wie ich das lösen soll und was das auf sich hat mit den Capture 
Mode usw... Ich habe versucht die Datenblätter zu verstehen aber keine 
Ahnung wie. Ich hoffe ihr könnt mir vlt ein bisschen weiter helfen

danke im vorraus

von Gast (Gast)


Lesenswert?

Vielleicht fängst du mal damit an die Aufgabenstellung so genau wie 
möglich zu beschreiben.

Der PIC kann das Starten und Stoppen von Timer1 auf Tastendruck ganz 
sicher - auch ohne die Capture-Compare Funktion an RC5, wobei die es 
natürlich einfach macht.
Schau Dir im Datenblatt zunm CCP-Modul die Beschreibung des 
Capture-Modes an. Da stehen die notwendigen Einstellungen und Register. 
Eventl. nochmals bei Timer1-Modul schauen was dort für den Capture-Mode 
gesetzt sein muss.

Ach ja - C# hilft nicht viel beim PIC. Schau mal ob eine 
Studentenversion des HiTech - C-Compilers bereits bei Microchip 
verfügbar ist. Die haben HiTECH gekauft und stellen ihre eigenen Compler 
immer kostenlos zur Verfügung.
MPLAB downloaden, Compiler installieren und los geht's!
Viel Spass
Karsten

von Martin (Gast)


Lesenswert?

Danke für die schnelle Antwort. Hab mir gerade das durch gelesen was ich 
geschrieben habe und ich muss zu geben es ist echt etwas unverständlich 
=)

also nochmal zur Aufgabenstellung.

Meine erste Aufgabe war es einen LC-Display dazu zuschließen und diesen 
zu initialisieren. Das war ja relativ einfach für einen Laien wie mich.

Im Endeffekt soll dieses Projekt folgendes können: Wir haben eine 2m 
lange Plexiglasröhre mit 4 Lichtschranken. Wenn ein Gegenstand durch 
diese Röhre durchfliegt soll der PIC mittels des Timers die Zeiten 
messen und Werte wie Beschleunigung, Geschwindigkeit und Zeit ausgeben.

Ich hänge jetzt daran, dass ich überhaupt nicht weiss wie ich vorgehen 
soll. Inwiefern hängt dieser Capture Mode mit dem Timer1 zusammen ? Mein 
Professor meint ich brauche diesen Capture Mode unbedingt dazu.

Und mit C# habe ich nur gemeint, dass ich ganze zeit nur auf c# ebene 
programmiert habe und deshalb es für mich etwas schwieriger ist einen 
pic zu programmieren obwohl es ja eh C ist aber ja ...

den PIC programmiere ich eh auf Hi-Tide und MPLAB

mfg martin

von Gast (Gast)


Lesenswert?

Deine Beschreibung bringt etwas mehr Licht ins Dunkle...also der Capture 
mode funktioniert so, dass bei jeder fallenden  steigenden  jeder 4ten 
oder 16ten steigenden Flanke die Timerwerte aus Timer1 in die 
Capture-Register übernommen werden.

Damit ist die Umsetzung klar:
mit der 1ten Lichtschranke startes Du den Timer1 und aktivierts den 
Capture mode, bei der fallenden oder steigenden Flanke (abhängig von der 
Logik der Lichtschranke) der Lichtschranke 2 findet das erste 
Capture-Event statt.
Netterweise generiert das Capture Event einen Interrupt in dem man 
schnell die Werte der Capture-register sichern kann.
Sobald fertig auf den nächsten Capture-Interrupt von Lichtschranke 2 
warten, Werte sichern usw...

Nun hast Du 3 Timerwerte (Differenzen bilden :-)) ), kennst Deine 
Zeitbasis (Taktfrequenz) und den Abstand der Lichtschranken. Daraus 
sollte sich Geschwindigkeit und Beschleunigung errechnen lassen.

Alternativ kannst du auch den Timer frei laufen lassen und auf das 
Capture-event bei der ersten Lichtschranke warten - dann hast Du 4 
Timerwerte aber du must den Timerüberlauf abfangen für alle 4 Werte bei 
der Differenzbildung.

Das Einzige was etwas dauert ist die richtige Software zu schreiben... 
Initialisierung der Register für den Capture mode (immer ins Datenblatt 
schauen und auch das Error-Sheet zu dem Controller aknn hilfreich sein) 
und den Timer.

MfG
Karsten

P.S.: ich hab mich auf die CCP1 vom 16F88x bezogen - Dein PIC sollte 
aber auch so funktionieren.
Bi Problemen helf ich gern weiter..

von Martin (Gast)


Lesenswert?

Soo ich bin jetzt mal so weit das wenn ich den Button auf RC5 (CCP1) 
drücke ... das sich da was tut wenn ich die register auslesen will...

nur wie zähl ich jetzt mit wieoft ich den Button schon gedrückt habe bzw 
z.b nach den 4. Knopfdruck will ich den Timer abdrehen..
wie mach ich das jetzt gibts da ein eigenes Bit im Timer register oder 
sowas ???

lg

von Gast (Gast)


Lesenswert?

eine Möglichkeit ist Zählen, aber recht fehlerträchtig....

Vlt. kannst du ja auch die Lichtschranke 1 an den externen Interrupt INT 
(Port RB0) anschliessen und somit den ganzen Messvorgang starten.
Hat einfach den Vorteil, dass Du Dich nie verzählen kansst und immer 
saubere Startbedingungen hast.

Zählen der Tastendrücke geht natürlich auch, aber du musst es selbst 
erledigen - es gibt keinen HW-Zähler der das erledigt. Du musst nur 
sicher sein, dass Du nie einen Wert verlierst damit die Sache dauerhaft 
funktioniert. Eventl. kannst du "verlorene" Werte auch über einen 
Timeout abfangen damit kein totaler Unsinn rauskommt.

Ok - bei der Lösung mt dem Start-Interrupt musst du auch mitzählen um 
den Messvorgang zu beenden, aber das ist deutlich einfacher.

MfG
Karsten

von Martin (Gast)


Lesenswert?

hmm ich würd es gerne zählen, da es nicht so genau sein muss ...

Ich habe echt wenig ahnung von PIC Programmierung ...

ich will ja nicht das du mir jetzt den ganzen code oder so sagst nur 
könntest du mir vielleicht ein paar tipps geben wie ich anfangen soll 
dieses problem zu lösen ??

soll ich da den TMR1ON beim ersten druck einschalten und beim 4. 
abschalten ?? nur wie ich kann ich das machen bzw in welches register 
werden die werte dann gespeichert ??

sorry dass ich dich so nerve vielleicht wegen dem =) aber es scheint das 
du ziemlich viel ahnung davon hast.. danke

mfg
Martin

von Gast (Gast)


Lesenswert?

Also...
Du sollst bei ersten Tastendruck den Timer1 starten und das CCP1 auch 
starten. Dann bei ersten CCP1-Event (nächster Tastendruck) hast Du die 
Timerwerte im CCP-Register stehen und ein Interrupt wird ausgelöst 
(vorher aktivieren). In dem Interrupt speicherst Du das CCP-Register 
(16bit!)
und wartest auch den nächsten Event.
Am Ende der 4 Ereignisse hast Du 3 Werte gespeichert. Aus Deiner 
Zeitbasis (Takt) und den Werten kannst Du Geschwindigkeit und 
Beschleunigung errechnen.
Ach ja beim Tastendrücken solltest du ans Prellen denken. Das wird 
bestimmt etwas ungenau mit enem Taster..

MfG
Karsten

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.