www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stoppuhr (PIC16F876A)


Autor: Faruk F. (r91cky)
Datum:

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

Autor: Geri (Gast)
Datum:

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

Autor: peter dannegger (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Geri (Gast)
Datum:

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

Autor: Faruk F. (r91cky)
Datum:
Angehängte Dateien:

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

Autor: peter dannegger (Gast)
Datum:

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

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Faruk

Schau mal hier:

http://www.sprut.de/electronic/pic/programm/sequen...

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

Autor: Faruk F. (r91cky)
Datum:

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

Autor: Bernd (Gast)
Datum:

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

Autor: Geri (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Geri (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Steffen

Besten Dank für die Info. Werde mir die Seite mal anschauen.

Freundliche Grüsse
Geri

Autor: peter dannegger (Gast)
Datum:

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

Autor: Faruk F. (r91cky)
Datum:
Angehängte Dateien:

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

Autor: Faruk F. (r91cky)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo ich bins wieder

tut leid, hab falsche datei hochgeladen.....  HIER DIE RICHTIGE



der schlaf ruft
bye

Autor: Faruk F. (r91cky)
Datum:
Angehängte Dateien:

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

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.