Hallo Ich bin ein Quereinsteiger beim PIC allgemein. Ich muss unter anderem eine Stoppuhr programmierunden die mit erstdruck auf taster am RA3 startet und zweitdruck (selber) taster stoppuhr anhält , mit assembler, habe probleme mit dem quarz. ich benutze einen externen quarz von 4MHz. Die Anzeige sind 7_segemtanzeige, zwei für stunde und zwei für minuten. ich muss es irgendwie schafften dass die zeitbasis sekunden sind, damit ich dann die minuten und stunden verädnern kann. Leider weiss ich nicht wie ich das schaffen soll. habt ihr da eine idee? das ist die erste frage :-)
Hallo Faruk Vielleicht so: fcpu / 4 = 1000000Hz // ist beim PIC so 1000000 / 16 = 62500 Hz (Prescaler) Initialisiere einen der 16bit Timer mit 65535-62500 bei jedem Üb==> 1 Hz Lege eine Interrupt-Routine an, die mit einem 16-bit imer gekoppelt ist. Die Interrupt-Service Routine wird bei jedem Überlauf des Timers aufgerufen. Darin stehet void ISR_TIMERXY(void) { Seconds++ // increment time base TMRXY = 3035; // division by 62500 (65535-62500) TMRXYIF= 0; // clear timer overflow flag } Beste Grüsse Geri
Stopuhr im Minutentakt ? Die haben doch üblicher Weise 1/100s Anzeige. Du must zuerst einen Plan machen und dann die Aufgabe aufteilen, z.B. in der Reihenfolge: - Multiplexinterrupt für Anzeige - 7-segment dekodieren - Binär nach dezimal wandeln - Zählen - Tastenentprellung - Zeitbasis Mit Assembler aufm PIC hast Du es Dir aber nicht gerade einfach gemacht. Peter
"Mit Assembler aufm PIC hast Du es Dir aber nicht gerade einfach gemacht." Nervt irgendwie langsam aber sicher! @Faruk F. Schau mal in der Codesammlung, dort findest du ein Beispiel für eine Belichtungsuhr für den 16F876(A). Auf der Grundlage sollte es kein Problem sein eine Stoppuhr zu programmieren. Dort habe ich zwar ein LCD-Display verwendet aber Beispiele für die Ansteuerung der 7-Segmentanzeige gibt es genügend. Z.B. www.sprut.de.
Hallo Wenn es sich nicht gerade um eine Schul- oder Studienarbeit handelt oder ausdrücklich Assembler gefordert ist, dann würde ich jedenfalls auch den Einsatz eines C-Compilers vorschlagen. Wichtige Gründe sind z.B.: 1.) Entwicklung der Software vielfach zuerst als Windows-Anwendung möglich 2.) Bedeutend geringerer Entwicklungszeit herein 3.) bessere Lesbarkeit des Code 4.) Meiner Meinung absolut wichtig: Bedeutend weniger Aufwand beim Wechsel auf einen anderen Controller oder Compiler. Nach ein paar Jahren, ist man vielleicht auch froh darüer 5.) Ein Programm ist nur so gut wie des der Entwickler erstellt hat. Für den PIC16 gibt es sehr günstige und leistungsfähige Controller. Die Aufgabe von Faruk kann man m.E. gut mit einem C-Compiler realisieren. Assembler mach meiner Meinung dann Sinn, wenn sehr hohe Anforderungen an das Timing gestellt werden. Es gibt evtl. auch Bibliotheksroutinen, die aus Performancegründen durch ASM etwas effizienter gestaltet werden können. Freundliche Grüsse Geri
Hallo Danke euch für die Zahreichen Antworten Das Projekt ist sehr umfangreich, ich muss noch eine uhr + umstellen von UTC auf GTM per tasten druck, einstelln der uhr, speichern der uhrzeit beim auslösen eines tasters, wieder speichern beim auslösen eines tasters. Die daten in eeprom speichern.. einfach gesagt das teil ist ein Flugdatenloggbuch. und ich muss es LEIDER in assembler und mit 7 segement anzeige machen, weil das bei der Dipl. arbeit gefordert ist. das projekt hab ich mal als anhang getan. @ Geri: danke für deine anregung, aber wie soll ich das in assembler machen, in C wäre das einfacher, da stimm ich dir zu. aber wie gesagt ich muss es in assembler machen
"und ich muss es LEIDER in assembler und mit 7 segement anzeige machen, weil das bei der Dipl. arbeit gefordert ist." ??? Ne Diplomarbeit sollte ja eigentlich praxisbezogen sein, d.h. das Ergebnis ist entscheidend, nicht der Weg dorthin. Den Weg muß man nur erklären können. 7-Segment nehme ich auch immer gerne, ist viel besser ablesbar. LCD nehme ich nur, wenn es auf den Strombedarf ankommt oder viel Text zu lesen ist. Peter
Hallo Faruk Schau mal hier: http://www.sprut.de/electronic/pic/programm/sequenc/sequenc.htm Sprut zeigt hier u.a. wie das Gerüst einer Interrupt Service Routine aufgebaut ist. Nach dieser Vorlage kannst du den oben aufgeführten Code umsetzen. Beste Grüss Geri
Hi Danke für eure raschen Antworten. @peter dannegger Du hast recht, aber in unseren team ist einer ausgefallen und er hat im Projekthandbuch bereits erwähnt dass er sich für assembler entschieden hat. der doddle hatte all seine unterlagen auf laptop und extere festplatte, beides wurde ihm gestohlen, (wohnung ausgeraubt). möchte nicht weiter drauf eingehen. fakt ist ich muss es machen. aber danke trotzdem werde mich drauf stürzen , und hoffe bei fragen euch konsultieren zu können. mfg Faruk
Hi, Den Timer: Mit Timer1 und CCP1 (Compare) kannst Du eine "Zeitbasis" schaffen, die alle 1/100tel (oder weniger hektisch) einen INT auslöst, der dann die Zeit zählt. Das Hauptprogramm darf man aber doch auch in PicBASIC schreiben und den daraus generierten Assemblercode abgeben ??? ;-)
Hallo Bernd Wenn du dich mit "weniger hektisch" auf den oben dargestellten Lösungsansatz beziehst, dann siehst du, dass der Interrupt nur jede Sekunde einmal aufgerufen wird. f=fosc/4/16/62500 = 1Hz ==> 1s Ich denke, die Verwendung des CCP-Registers bringt hier keine Vorteile Freundliche Grüsse Geri
Die Verwendung des CCP-Modules bringt schon Vorteile. z.B. könnte man bei ungenauem Quarz per Compare-Wert die Abweichung korrigieren. Der Lösungsansatz oben berücksichtigt übrigens nicht die Zeit zum Einsprung in die ISR bzw. bis zum Neuladen des Timers. Die Uhr würde also zu langsam laufen.
Hallo Steffen Du hast schon recht, eine bestimmte Ungenauigkeit (z.B. durch Nichtberücksichtigung der Dauer für den Einstprung bis zur zum Neustart u.a.) hat die Uhr, diese liesse sich bei der oben geforderten Genauigkeit aber auch per Software korrigieren. Das machen viele noch genauere Uhre auch so:) Was mich aber interessieren würde: Wie würdest du die Uhr mit Hilffe des CCP-Modules die die Abweichun des Quartzes korrigieren? Freundliche Grüsse Geri
Der CCP-Interrupt (Compare-Mode) wird ausgelöst, wenn der Timer mit dem Wert von CCPRx übereinstimmt. Also alle x*Vorteiler Takte. Läuft der Quarz etwas zu schnell, müsste man den x vergrößern. An sonste wird x verringert. Das Stichwort Belichtungsuhr führt zu keinem gescheiten Ergebnis in der Suche. Hier --> http://www.mikrocontroller.net/forum/read-4-29195.html#29195 findet ihr das Beispiel, was ich oben angesprochen habe.
Hallo Steffen Besten Dank für die Info. Werde mir die Seite mal anschauen. Freundliche Grüsse Geri
Du brauchst ja eh einen schnellen Interrupt zum Multiplexen der Anzeige (~1ms) und zum Tasten entprellen. In dem kannst Du dann eine Variable runterzählen, bis eine Sekunde um ist. Wie man einen genauen beliebigen Teilerfaktor erhält, ist vom Prinzip her hier erklärt: http://www.mikrocontroller.net/forum/read-4-57760.html#new Wenn das CPP so funktioniert, wie das "Clear on Compare" beim AVR ist das unbedingt zu verwenden. Mit einem Reload im Interrupt, das von der Interrupteinsprungzeit abhängig ist, kriegst Du sonst nie eine vernünftige Zeitbasis hin. Peter P.S.: Häufig sieht man leider das Multiplexen durch die rein zufällige Laufzeit der Mainloop. Davon würde ich dringen abraten, denn solche Programme sind nur schwer wartbar und erweiterbar. Oft flackern sie oder die Digits haben unterschiedliche Helligkeit.
Hallo wiedermal Hab nun mich tage und nächte mit dem ding rumgeschlagen hoff es passt mal die stoouhr, was meint ihr zu ihr , ist als anhang da. stimmt das auch mit der pin abfrage?, wenn ich ein mal drücke dann starte ich die uhr, beim zweiten mal halt ich sie an, was noch fehlt ist , dass er den werd in den eeprom speichert, aber erstmal schaun ob das eh passt was ich da verzappft hab. war schon gespannt auf eure antworten gute nacht
hallo ich bins wieder tut leid, hab falsche datei hochgeladen..... HIER DIE RICHTIGE der schlaf ruft bye
Hi das letzt was ich hochgeladen hatte fehler, jetzt sollte es aber richtig sein. bitte die zwei vorigen datein von mir nicht beachten, am besten bitte admin löschen :-) lg
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.