www.mikrocontroller.net

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


Autor: Christoph Wagner (Gast)
Datum:
Angehängte Dateien:

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

Autor: Christoph Wagner (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier die Library ...

Autor: Christoph Wagner (Gast)
Datum:
Angehängte Dateien:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: Einstein (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Christoph Wagner (Gast)
Datum:

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

Autor: Christoph Wagner (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

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.