Prescaler zeigt keine Wirkung

OP #211781
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
Gast #211782
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_  ...
OP #211783
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
Gast #211784
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?
Gast #211785
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?
Gast #211787
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
Gast #211789
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 :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.