PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Source für Stoppuhr (Sekundenzähler)



Björn
06.08.2005, 19:04
Guten Abend!

Könnte mir bitte jemand einen kurzen Code posten, der jede Sekunde eine Aktion (z.B. Zählen :D ) ausführt? Das ganze soll für einen ATmega8 - 8Mhz sein.
Sinn und Zweck des Ganzen ist eine Art Stoppuhr.

Gruß, Björn

Marco78
06.08.2005, 20:05
Genau, zu fragen ist eine gute Idee, bevor man sich selbst gedanken machen muss :P

Willst du den kompletten Code für die Stopuhr haben oder nur den Teil der zählt?
Wenn alles, musst du auch sagen ob du doch eine 7-Segment-Anzeige nimmst oder was anderes. Und ob eine mit gemeinsammer Anode oder Kathode. Und was für einen AVR du verwendest, usw...

Sollen nur die Sekunden oder auch 1/100 Sek gezählt werden?
Du musst doch nur eine Timer einstellen und in der ISR eine Variable hochzählen lassen.
Für den Timer gibt es im Downloadbereich ein gutes Programm, was alles nötige ausrechnet und auch gleich einen Code für BASCOM erzeugt.

Da ich nicht weiss wie fit du in Sachen AVR bist ist es schwer dir zu helfen. Was genau willst du denn wissen?
Hast du dir schon gedanken drüber gemacht das die Zeit auch mal wieder auf 0 gesetzt werden muss usw...?

Björn
06.08.2005, 20:08
Also... erstens habe ich mir Gedanken gemacht und auch an Timer gedacht, habe aber noch nie mit ihnen gearbeitet (nur ein gescheiterter Versuch).

Ich brauche nur den Code der hochzählt. Es sollen nur Sekunden gezählt werden. ATmega8 - steht oben schon. Achja, in Bascom.

Gruß, Björn

Marco78
06.08.2005, 20:35
Aber die Hilfe hätte zum Thema Timer viele Lösungen gebracht. Besonders wenn es um Sekunden zählen geht ;)
Hier der Link zum Programm: https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169
In der ISR musst du dann ja nur eine Variable hochzählen.

Der Code könnte so aussehen.



'################################################# #############
' Timer Beispiel für das universelle Controllerboard
' rn-control mit mega 16 oder mega 32
' Ausführliche Infos zum Controller Board findet man
' unter www.robotikhardware.de als auch im
' www.roboternetz.de
'
' Dieses Demo läßtz eine LED in dem von ihnen gewählten
' Timer-Rhytmus blinken
' Der generierte Code kann direkt in den Bascom-Compiler kopiert
' und kompiliert werden. Natürlich läßt sich der Code auch in
' bestehende Programme integrieren

' Autor: Frank
' Weitere Beispiele und Beschreibung der Hardware
' unter http://www.Roboternetz.de oder robotikhardware.de
' Eigene Programmbeispiele sind im Roboternetz gerne willkommen!
'################################################# #############



'wenn mega 32, dann ändern in $regfile = "m32def.dat"
$regfile = "m16def.dat"

'Quarzfrequenz, entsprechend ihren Angaben
'der passende Quarz muss in die Fassung gesteckt werden
$crystal = 8000000

'nur notwendig wenn rs232 benutzt werden soll
$baud = 9600

'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer, Prescale = 256

'Der Port mit der dritten LED auf RN-Control wird als Ausgang programmiert
Config Pinc.2 = Output
'Hier geben wir der Definition einen schöneren Namen
Led3 Alias Portc.2

'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timer_irq

'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 34286


'Hier werden die Timer aktiviert
Enable Timer1
Enable Interrupts

'Hier ist die Programmhauptschleife
Do
'Hier könnte Ihr Hauptprogramm stehen
Loop



'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = Timervorgabe

'Hier könnte nun ihre beliebige IRQ-Routine stehen
'Dabei sollte man darauf achten das diese nicht mehr Zeit
'benötigt, als das Intervall zuläßt

'Der Zustand der LED wir umgekehrt, wodurch sich blinken ergibt
'Hohe Frequenzen sind natürlich nicht mehr sichtbar
Toggle Led3

Return

An Stelle von Toggle Led3 kannst du einfach

INCR Sekunden
eingeben. Dann wird die Variable Sekunden jeweils um 1 erhöht.
Zum starten der Uhr Enable Timer1 benutzen und zum stoppen Disable Timer1

Das starten und stoppen muss du dann mit deinem Taster oder wie auch immer du das realisieren willst verknüpfen.
Wenn das als Hilfe nochnicht reicht muss du mehr Infos Preis geben. Z.B. wie wann angefangen werden soll zu zählen, wie gestoppt werden soll, wie auf 0 gesetzt und und und...

Björn
06.08.2005, 21:02
So...

ich habe mal diesen Code getestet, es kamen jedoch nur irgendwelche Buchstaben an.



$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer, Prescale = 256

'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timer_irq

'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 34286

Dim Sekunden As Integer

'Hier werden die Timer aktiviert
Enable Timer1
Enable Interrupts

'Hier ist die Programmhauptschleife
Do
'Hier könnte Ihr Hauptprogramm stehen
Loop


'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = Timervorgabe

Incr Sekunden
Print Sekunden
Return


Ist der Code fehlerhaft oder muss der Fehler woanders liegen?

Gruß, Björn

Björn
06.08.2005, 21:08
Hey es geht...

Mit externem Quarz funktioniert es jetzt.

Vielen Dank!

Gruß, Björn

Marco78
06.08.2005, 21:11
Dim die Sekunden mal als Byte oder Word. Der Code sieht richtig aus. Und Printe mal einen Text mit.
PRINT "Sekunden" ; Sekunden
Dann weisst du ja genau was ankommen muss.
Ist der Mega8 auch auf einen Quarz eingestellt (Fusebits)?

Marco78
06.08.2005, 21:12
Dann hat sich mein letzter Beitrag ja auch erledigt ;)

Björn
12.08.2005, 17:33
Mist! Ich verwende jetzt das interne 1Mhz Quarz - doch leider ist der Controller auf 5 min gesehen 2 Sekunden zu langsam. Woran könnte das liegen?

Gruß, Björn

Marco78
12.08.2005, 21:14
Dadran, das der interne Oszi nicht so genau ist. Ich glaube er ist auch empfindlicher was Temperaturänderung angeht.
Laut Datenblatt Seite 28 hat der interne Takt eine Toleranz von +-3% bei 5V und 25 Grad Celsius. Er kann bei gleichen Bedinungen aber bis auf 1% korrigiert werden. Wie das gehen soll ist laut Seite 28 auf Seite 222 beschrieben. Und dort wird auf Seite 29 verwiesen ;)
Entweder machst du dir die Mühe den Takt zu kalibrieren oder du änderst dein Timerpreload.
Da dir Uhr z.Zt. zu langsam geht muss der Timer also schneller ausgeführt werden. Das bedeutet, das der Preloadwert kleiner werden müsste.
Ist zwar auch etwas arbeit. Aer genauer geht es nunmal nur wenn du einen Quarzoszilator verwendest (PS: Das ist kein Quarz mit 2 Anschlüssen sondern die mit 4).