Forum: Mikrocontroller und Digitale Elektronik Sekunde doppelt so lang ??


von Christoph Wagner (Gast)


Angehängte Dateien:

Lesenswert?

Hi.

Der Timer0 ist auf 8000 Zyklen pro Interrupt eingestellt (64 Prescale
und 125 Counter = 8000). bei jedem Interrupt wird Bit 0 im MODE
register gelöscht. Um eine Sekunde zu messen, wollte ich dieses Bit
setzen, und warten bis es rückgesetzt wurde und das ganze 125 mal. Der
ATMEGA16 ist auf 1MHz interner Oszillator eingestellt. Problem ist,
dass diese Sekunde effektiv als zwei Sekunden im Endeffekt rauskommen.
(Timergenauigkeit mit Oszi an PORTC.2 [stellenwahl für LED-Display]
nachgemessen)

gleich nebenbei :
in der Hauptroutine lasse ich RANDOM von 0-39 durchzählen, und bei 40
erfolgreich auf 0 setzen. In der Funktion ROULETTE_PRINT_OUT lasse ich
erst überprüfen, ob RANDOM zwischen 1 und 36 liegt. Wenn es außerhalb
liegen sollte, sollte die eigentliche Routine "übersprungen werden.
Dies funktioniert aus einem mir unersichtlichen Grund auch nicht. Der
Rest der Routine funktioniert ebenfalls einwandfrei.

Die FUnktion WAIT_TIMER liegt zusammen mit allen anderen
Wartefunktionen in nachfolgender LCD-Library.

von Christoph Wagner (Gast)


Angehängte Dateien:

Lesenswert?

hier die Library ...

von Christoph Wagner (Gast)


Angehängte Dateien:

Lesenswert?

Hi.
Gesetze dürfen nicht gebrochen werden ! Dazu zählen anscheinend auch
Murphy's ... Nach Stunden der grübelei (okay, es lief noch ein TV-Film
nebenbei ;-) ) hab ich verzweifelt obigen Beitrag geschrieben. Keine
halbe Stunde nachdem mein Problem das Internet befiel hab ich die
Lösung gefunden ! ... wenigstens zu einem Problem. Die Rouletteanzeige
funktioniert nun prima, der Timer allerdings noch nicht. Im Anhang
befindet sich die geänderte Datei. Ich suche nachwievor nach einer
Lösung für die Zeitdehnung in der Software.
Tja... bin wohl übermüdet ! Gute nacht !

von crazy horse (Gast)


Lesenswert?

auf den 1.Blick sehe ich auch nichts, lass es dochmal durch den
Simulator laufen.

von Sebastian (Gast)


Lesenswert?

also im simulator braucht deine loop 2048 ms
ich muß zugeben, daß ich durch deinen loop nicht ganz durch steige.
warum machst du deinen overflow int nicht alle 10 oder 100 ms. das wäre
doch sicherlich etwas einfacher 1 sekunde so zu "berechnen", weil du
ja den timer für nichts anders benutzt

von Einstein (Gast)


Lesenswert?

Hallo,

wenn bei Dir die Zeit langsammer vergeht, dann überprüfe mal die
Geschwindigkeit, mit der sich Dein Aufbau bewegt, oder vielleicht
befindest Du Dich in der nähe eines Schwarzen Loches?

Viele Grüße,
Einstein

von crazy horse (Gast)


Lesenswert?

oh, Einstein, du verstehst deine eigene Theorie nicht mehr. Naja, bist
auch nicht mehr der Jüngste...

von Christoph Wagner (Gast)


Lesenswert?

Hi.

Schwarzes Loch isses nich. Wollte mir mal eins holen, aber dann wars
bei ALDI ausverkauft ;-)
Ich fürchte außerdem, dass die Bewegung meines Versuchsaufbaus nicht
hauptsächlich in den ersten 3 Dimensionen stattfindet. Dann müsste sich
ja mein Versuchsaufbau mit 259627,8845 km/s durchs All bewegen. Seltsame
Vorstellung, da er eben unbewegt vor ir auf dem Tisch steht. ;-)
So richtig testen kann ichs im Simulator relativ schlecht. Ich
programmiere mit einem selbstgebastelten ISP-Programmer via Parallel,
und da mein Rechenknecht (2GHz) leider KEINEN LPT anschluss hat und
sich das AVRStudio 4 beim Installieren verabschiedet hat, muss ich auf
einen etwas trägeren Rechenknecht zurückgreifen (233 MHz) und da
braucht ne Sekunde schon mal ne Minute.

Aaaaalso : Timer Prescale 64 * TImer Counter 125 = 8000 (nach Adam
Riese)
Prozessortakt 1000000 / Timerdelay 8000 = 125, also müssen 125 Zyklen
gewartet werden, nichaa ?
Übrigens ist der Timer nicht unnütz. Er steuert zum Bleistift relativ
erfolgreich das Multiplexen der LED-Anzeige !

von Christoph Wagner (Gast)


Lesenswert?

MOMEEEENNT :
wenn im Simulator ein Zyklus 2048 ms braucht, dann : 2048000 / 8000 =
256 !!! Da wird nicht LOOP bis 0 dekrementiert, da wird anscheinend
LOOP zu beginn auf 0 gesetzt (erster subi-Aufruf 0-1 = FF, nicht null,
daher noch 255 mal aufrufen). Doch wo wird Loop 0 ???
(Danke Sebastian)

von Sebastian (Gast)


Lesenswert?

hab deinen fehler gefunden.... denke ich mal

ENDLESS:
    ldi  TEMP1,125  --> dein timer erwartet den wert in loop und nicht 
in
temp1. also dein dec geht auf r18 und nicht r22
    call  WAIT_TIMER
    inc  RANDOM
    cpi  RANDOM,40
    brlo  ENDLESS_OK
    ldi  RANDOM,0
  ENDLESS_OK:
    call  ROULETTE_PRINT_OUT

    rjmp  ENDLESS

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.