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
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_ ...
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
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?
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?
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
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
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" :)
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.