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.
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 !
auf den 1.Blick sehe ich auch nichts, lass es dochmal durch den Simulator laufen.
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
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
oh, Einstein, du verstehst deine eigene Theorie nicht mehr. Naja, bist auch nicht mehr der Jüngste...
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 !
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.