Forum: Mikrocontroller und Digitale Elektronik Prescaler zeigt keine Wirkung


von Axel K. (axel)


Lesenswert?

Hallo!

Ich habe einen atmega8 mit 3686400 Hz Taktfrequenz und komme einfach
nicht mehr weiter :(

Und zwar möchte ich eine Pulslänge messen. Soweit auch kein Problem mit
dem Timer nur ich kann den prescaler verändern wie ich will, der Timer
zählt immer in der gleichen Geschwindigkeit, und zwar in fast genau 580
ms von 0 bis 65000.  Das ist viel zu lange weil ich die zeit zwischen
den „zündfunken“ ermitteln möchte. (will ein dzm bauen)

Theoretisch müsste der Timer 1 x durchlaufen in ca. 36 ms bei einem
prescaler von 8, macht er aber eben nicht.

Hier mal der Quelltext (bascom):

$regfile = "m8def.dat"
'Prozessortyp
$crystal = 3686400
'Taktfrequenz
$baud = 19200


Declare Function Lopulse() As Byte

Dim Value As Byte

Config Pinb.0 = Input
Set Portb.0.0
Inputpin Alias Pinb.0

Config Timer1 = Timer , Prescale = 8



Enable Timer1
Enable Inerrupts

Do
   Print "Waiting for Pulse..."
   Value = Lopulse()
   Print ; Value
Loop

End

Function Lopulse() As Byte

 While Inputpin <> 0 : Wend
 Tcnt0 = 0
 Start Timer1

 While Inputpin = 0 : Wend
 Stop Timer1
 Lopulse = Tcnt0

End Function Lopulse()



Ich hoffe ihr könnt mir weiterhelfen

MfG Axel

von Danny P. (Gast)


Lesenswert?

also ich bin nich der bascom-spezi, aber mir kommt komisch vor das du
zwar den Timer1 initialisierst aber weiter unten von "TCNT_0_"
schreibst.... das Register gehört aber leider zum Timer_0_  ...

von Axel K. (axel)


Lesenswert?

ja stimmt das fällt mir jetzt auch auf.  Vorher hatt ich jedoch timer0
initialisiert und da war genau das gleiche problem nur es hat mich
unglaublich verwundert das er trotzdem bis 65xxx gezählt hat obwohl
timer 0 ja nur ein 8 Bit timer ist

Und kann mir das einer erklären warum er trotzem den wert von tcnt0
übernimmt obwohl ich timer1 initialisiert habe ?

thx

von Danny P. (Gast)


Lesenswert?

naja.. das is ja nich schwer... du kannst die register ja beschreiben
wie du lustig bist... TCNT0 ist ja in Hardwareform im Controller
vorhanden von daher kannst du den immer und an jeder Stelle
beschreiben...

den µC interessiert es nicht, der Timer0 kann ja nicht wissen das du
ihn eigentlich nicht willst

hast an den Stellen denn mal durch Timer1 ersetzt?

von Danny P. (Gast)


Lesenswert?

also ich hab mal versucht dein programm zu verstehn....

was soll es machen?
wenn der Eingangspin high ist: Timer nullen und loszählen
wenn der Eingangspin low ist: Timer stoppen und Zählregister in
Loppulse schreiben

is das so richtig?

von Axel K. (axel)


Lesenswert?

ja wenn eine high/low flanke kommt timer auf null setzen und loszählen
bis wieder ein highflanke kommt dann timer stoppen und den wert lopulse
zuweisen und diesen dann über seriell mit dem print befehl an den pc
senden

von Danny P. (Gast)


Lesenswert?

also... an Hand deines Bascom-Codes fällt mir nix auf was auf eine
falsche Initialisierung schliessen lässt...

ABER: Hast du deine FuseBits mal bearbeitet? Der Mega8 läuft
jungfräulich mit einem 1MHz internen Taktgeber

von Axel K. (axel)


Lesenswert?

oooh stimmt das muss man ja noch machen. Aber trotzdem müsste doch der
prescaler einfluss auf die geschwindigkeit des timers haben!?

Naja egal. notfalls nehm ich dann ein 16 Mhz Quarz und dann hab ich
auch meinen "optimierten zähler" :)

von Danny P. (Gast)


Lesenswert?

hm also bei 3,686400MHz und nem Teiler von 8 würde der Timer bis zum
Überlauf bei 65535 etwa 142,22ms benötigen...

wenn aber der Mega8 auf ein MHz lief -> 524ms... das kommt doch deiner
angegebenen Zeit schon sehr nah :-)

von Axel K. (axel)


Lesenswert?

hmm das problem an der sache das ich den prescaler auch schon im obigen
quelltext auf 1024 hatte und das hat nix ausgemacht

aber erstmal danke für dein tip mit dem fuse bits ich werde das in den
nächsten tagen nochmal versuchen und bericht dann :)

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.