Autor |
PIC 16F84A Suche nach: pic (2056) |
|
|
|
|
BID = 92794
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
|
Hi Leute,
ich bin neu auf diesem Forum und habe schon jetzt eine Frage.
In meinem Praktikum muss ich ein Signal Dekodieren.
Meine Infos die ich erhalten habe das die Signale über Zeit kodiert sind.
Also meine Frage lautet:
"Wie mach ich das, das ich meinen Timer abfrage, wie lang eine Bit-Reihenfolge ist?"
Ich habe bisher nur den Timer0 programmiert und der läuft recht gut.
Ich denkemal das Ihr mehr Ahnung habt davon als ich also DANKE ICH EUCH für die Hilfe.
Mit freundlichen Grüßen
U37 |
|
BID = 92799
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
Sorry !
Die Sperrung wegen Doppelpostings war ein Fehler von mir.
[ Diese Nachricht wurde geändert von: perl am 19 Aug 2004 11:07 ] |
|
BID = 92991
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
@Perl
das macht nichts kann immer wieder passieren solche verwechlungen
@ALL
hi also wie ich gehört habe kann der RA4 taktgeber nur bis max 0,5 ms zählen gibt es ne möglichkeit dies zu erweitern?
|
BID = 93719
baggerfan Gerade angekommen
Beiträge: 12 Wohnort: bei Ulm
|
hi u37,
nun der RA4 des PIC's stellt keinenfalls einen Zähler dar, sondern ist lediglich die Möglichkeit den Timer0 von extern zu takten. Beim 16F84 hast Du nur den Timer0 zur Verfügung, dieser ist 8 Bit breit, also kann er 256 Zählungen machen bis ein Überlauf stattfindet. Welche Zeitspanne das ist, ist abhängig von der Taktung der CPU, bzw. des externen Takteingangs.
Aber prinzipiell mal gefragt. Welche Zeitspanne mußt Du mit der Messung denn abdecken? Bist Du auf den 16F84 fixiert oder wäre auch ein anderer PIC denkbar. z.B. 16F818 (verwende ich als Standardtype). Der hat 3 Timer, einen davon als 16-Bit-Timer. Eine Beschreibung des 16F84 hast Du? http://ww1.microchip.com/downloads/en/DeviceDoc/35007b.pdf
[ Diese Nachricht wurde geändert von: baggerfan am 22 Aug 2004 8:50 ]
|
BID = 94324
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
sorry für die späte antwort
ich muss diese zeiten rausfischen können
einmal 2ms, dann 1ms und 0,5ms.
ich habe versucht nen vorverteiler zu benutzen aber ich glaube den kann man nich richtig testen in mblab, deswegen setz ich mal den quelltext hier rein
; Takt
BSF OPTION_REG&0x7f, T0SE ; hier wird für RA4 die Low Flake gewählt
MOVF T0SE, F ; hier wird es unter der Speicherzelle gesichert
; Vorverteiler Aktivieren
BSF OPTION_REG&0x7f, T0CS ; T0SC wird auf 1 gesetzt damit der Vorverteiler mit benutzt werden kann
BSF OPTION_REG&0x7f, PSA ; hier mit wird der Vorverteiler auf 1 gesetzt und aktiviert
BCF OPTION_REG&0x7f, PS2 ; damit man den vorverteiler auf 16/1 einstellt
BSF OPTION_REG&0x7f, PS1 ; hier wird PS1 auf 1 gesetzt
BSF OPTION_REG&0x7f, PS0 ; hier wird PS0 auf 1 gesetzt
ich hoffe ihr könnt mir sagen ob das soweit richtig ist
den unter sprut stand nich ob ich ps2-0 zusammen oder alleine machen soll
danke im vorraus
|
BID = 94332
baggerfan Gerade angekommen
Beiträge: 12 Wohnort: bei Ulm
|
hi u37,
um Dir eine fachlich richtige Antwort geben zu können solltest Du mir mal sagen mit Hintergrund was Du eigentlich machen willst. Du hast was erzählt mit Zeit messen für eine Bitreihe, aber kommt die von extern, denn du verwendest Deinen TMR0 als extern getriggerten Timer. Also mir fehlt da noch was um den Sinn und vor allem das was rauskommen soll zu verstehen.
als erstes setzt Du ein Bit im option_reg für die Triggerung des TMR0 auf negative Flanke. (hat überhaupt nichts mit RA4 zu tun!!!!)
als zweites versuchst Du ein einzelnes Bit mit einem movf-befehl in sich selbst zu kopieren. a)wozu machst du das? und b) wird wohl so nicht funktionieren. Wenn Du mit dem BSF-Befehl in einem Register ein Bit setzt dann brauchst Du es nicht abzuspeichern oder sowas.
Als nächstes setzt Du das Bit mit dem Du die Triggerquelle des TMR0 auswählst (hier setzt Du auf externen Trigger ,Pin RA4), hat nichts mit dem Vorteiler zu tun!
Um den Vorteiler deinem TMR0 zuzuweisen wird das Bit PSA mit einer 0 belegt.
Die Auswahl des Vorteilers auf 16 ist so korrekt.
Du mußt nicht jedes Bit einzeln setzen, sondern Du kannst auch den kompletten Wert für das Register übertragen.
Welchen Quarz verwendest Du? Also erzähl mir mal was genaueres dann kann ich Dir besser helfen.
bis die tage
|
BID = 94474
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
hi
ich verwende einen 4mhz quarz
also bei mir muss ich ein funksignal entschlüssel und es analog machen damit dann ein kasten mit einem analogen messwerk dieses signal zeigen kann.
und dazu muss ich eine bitreihenfolge, des signals, rausfischen, damit ich dem prog sagen kann, wann der anfangen darf. er soll immer bei 2 ms anfangen und das was ich da geschrieben habe ist mit nem vorverteiler, wollte nur wissen ob das so richtig ist.
ich hoffe das bringt dich weiter
den ich will eigentlich nur wissen wie ich z.b. mit if abfragen kann ob nun der timer 2ms gezählt hat bei dem signal (bit).
mfg
u37
|
BID = 94644
baggerfan Gerade angekommen
Beiträge: 12 Wohnort: bei Ulm
|
hi,
also wenn du wissen willst, ob dein Zähler auf 2ms ist, dann gibt es zwei Möglchkeiten:
A) du polls das TMR0-Register ständig an und vergleichst dessen Inhalt mit einer vorgegebenen Zahl ( in diesem Fall die 2ms --> als Hexzahl bei Vorteiler=16 gibt das 7D)
Wenn Deine Software dem µC genügend Zeit spendiert daß er sich kontinuierlich diesem pollen widmen kann, und wenn ein kleiner Zeitverzug von ein paar µs keine Rolle spielt, ist das eine durchaus brauchbare und einfache Methode.
b) Du lädst den Timer beim Starten der Zeitmessung mit dem "Restwert" bis er überlaufen würde. (FF - 7D = 82), und gibst den TMR0-Interrupt frei. Wenn die 2ms abgelaufen sind, läuft TMR0 über und löst einen Interrupt aus. Deine Interrupt-Service-Routine kann nun sehr schnell auf dieses Ereignis reagieren. Diese Möglichkeit ist schon etwas anspruchsvoller, da Du die ganze Interrupt-Geschichte programmieren mußt. Ist aber auch die genauere Lösung, und dein µC kann sich anderen Aufgaben widmen, als 2ms "herum zu stehen".
Ich hoffe ich konnt Dir das sagen was Dir noch gefehlt hat. Wenn nicht, dann melde Dich einfach nochmal.
mfg
andy
|
BID = 94776
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
ja das bringt mich weiter
ich werde die zweite version versuchen zu programmieren
da ich nich will das der microcontroller 2ms nur zeit misst
er soll schließlich nich nur das machen
danke :)
^_^
wenn ich weitere fragen habe poste ich die hier rein
danke nochmals
[ Diese Nachricht wurde geändert von: U37 am 25 Aug 2004 9:24 ]
|
BID = 101620
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
hi
da ich das mit den interrupt nich hinbekomme versuche ich nun die erste version
dazu hab ich nur eine frage
movwf OPTION_REG&0x7f
movlw D'131'
kann ich so den wert reinsetzten?
da ich durch ein programm von fernando heitor die werte bekommen hab:
Prescaller Ratio: 16
TMR0 Offset: 131
bei dem Oscillator 4MHz
denn da kommt der genau auf die 2ms und da dachte ich das ich den Vorteiler brauche.
und noch ne frage, normaler weisse kann der timer 0 nur bis 255 zählen und das ist bisschen zu kurz, kann ich das nich mit dem vorteiler, den ich da reingeschrieben hab, verwenden?
also ich freu mich schon auf eure antworten und wenn ich wieder zu ungenau geschrieben habe sagt es mir bitte!!
ich werde dann so schnell wie es mir möglich ist alles verbessern!!!
mit freundlichen grüßen
U37
[ Diese Nachricht wurde geändert von: U37 am 14 Sep 2004 9:44 ]
|
BID = 104673
baggerfan Gerade angekommen
Beiträge: 12 Wohnort: bei Ulm
|
hi u37,
zu frage1: zuerst muß natürlich der zu übergebende wert in das w-register geschrieben werden, um danach ins file-register geschrieben zu werden -->> also 1. movlw d'131', 2. movwf OPTION... (ps. was stellt der wert 131 dar?)
zu frage2 und 3 (sehe da keinen unterschied): natürlich brauchst du den vorteiler für den TMR0. wie du bereits angiebst stellt du ihn auf 16 ein, lädst dein TMR0-register mit d'131' vor und bekommst nun nach 2000 us den überlauf. soweit müßte das funzen.
also noch weiter viel spaß
|
BID = 107021
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
die 131 ist das TMR0 Offset
damit bekomm ich 2ms hin die ich brauche um es leichter zu haben die eine signatur zu erkennen
den wie oben geschrieben muss er bei 2ms starten und dann muss ich nur machen das er schaut
|
BID = 121709
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
Hi alle zusammen,
habe da mal wieder eine Frage und die wäre:
Wie kann ich an einem PIN den wechsel zwischen den einzelnen Bits herausfinden??
Danke im Vorraus!!
Gruß
U37
|
BID = 122218
Goetz Schreibmaschine
Beiträge: 1947 Wohnort: Dresden
|
Hi, selbst habe ich keine Ahnung von PIC un Assembler und so, habe aber hier eine Anwendung, in der auch Signale zwischen 1,2 und 2 ms unterschieden werden müssen. Vielleicht kannst Du aus diesem Programm von Markus Beyer ja Teile verwenden .... http://home.arcor.de/goetzbirkner/e.....m#16- Kanal Erweiterung zur Fernsteuerung
im zip-Archiv ist auch der Programmcode zu finden ....
|
BID = 123825
U37 Gerade angekommen
Beiträge: 13 Wohnort: Delmenhorst
|
danke das werde ich bestimmt nutzen können
|