-         

Ergebnis 1 bis 10 von 10

Thema: ATmega48 Timer0 Problem, zählt zu langsam

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562

    ATmega48 Timer0 Problem, zählt zu langsam

    Anzeige

    Hallo allerseits,

    ich habe wieder einmal ein Problem und weiß nicht mehr weiter:
    Ich möchte auf einem Atmega48 den Timer0 so konfiguriern, sodass ich an einem Ausgang eine Rechteckfrequenz von 40 kHz erhalte.
    Ich würde gerne den Internen Oszillator benutzen (ist das bei solchen frequenzen noch möglich?), mein Code schaut so aus:

    Code:
    $regfile "M48def.dat"
    $crystal = 1000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    $baud = 1200
    
    Dim Uart_in as String * 10 
    'Uart brauche ich später noch, das ist jetzt noch nicht in verwendung
    Print "ATmega online!"
    
    Config PORTD.4 = Output 
    
    'Timer0 Konfigurieren---------------------------------
    Config Timer0 = Timer , Prescale = 1
    Enable Timer0
    On timer0 Isrtimer0
    Timer0 = 230                 'Timer ist auf 230 => muss bis 25 Zählen bis überlauf 
    '-----------------------------------------------------
    Enable interrupts
    
    Do 
    Loop
    
    Isrtimer0:            'die Isr des Timers 
    Toggle PORTD.4
    Timer0 = 230
    Return
    So, nun wenn ich mit dem Oszi an Portd.4 messe, erhalte ich ein wunderbares Rechtecksignal, nur die Frequenz ist mit ca. 4,1 kHz zehn mal zu klein. ;-(
    Es ist möglich, kleinere Frequenzen zu erzeugen, mehr geht aber nicht.
    Ich bräuchte die Frequenz, um einen Piezo - Ultraschall Lautsprecher in Schwingung zu versetzen, das Gesamtziel (von dem ich noch weit entfernt bin) wäre ein Ultraschall - entfernungsmesser.

    Stimmt etwas mit dem Code nicht oder schafft villeicht der interne Oszillator doch keinen Megaherz? Oder ist irgentwo ein denkfehler?
    Ich wäre dankbar, würde jemand meinen Fehler finden!

    Mfg Thegon

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Sorry für den Doppelpost, aber ich habe weitergesucht und muss mich verbessern:
    Es war noch der CKDIV8 Fuse aktiviert und somit der interne Oszillator zu langsam. Ich habe das Fuse deaktiviert, und mich schon gefreut, aber leider noch etwas zu früh:
    Die Frequenz beträgt jetzt genau 4,1 * 8 also 32,8 kHz, für meine anwendung noch immer zu langsam. Es ist wieder so wie oben, kleinere Frequenzen kann ich erzeugen, größere leider nicht.
    Gibt es eine Möglichkeit, dass ich doch noch 40 kHz erzeugen kann, oder ist das mit diesen Mitteln nicht möglich?
    Mfg Thegon

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.01.2011
    Ort
    Baden Württemberg
    Beiträge
    18
    Hallo Thegon,

    kann es sein, das du das CLKDIV-Fuse programmiert hast? Dies teilt den Takt für den gesamten AVR nochmal durch acht!
    Du kannst ja auch erstmal nur probieren eine LED im Sekundentakt blinken zu lassen, dann weißt du schon mal ob der Prozessor mit dem richtigen Takt läuft.

    EDIT: Mist, da war ich etwas zu spät, aber freut mich, dass du den Fehler selbst gefunden hast!
    Gruß
    pc-fan

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    32
    Beiträge
    647
    Hi.

    hast du denn
    Code:
    $crystal = 1000000
    in
    Code:
    $crystal = 8000000
    geändert?

    Gruß Daniel
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Oh, danke, das habe ich wirklich nicht, werde es gleich ändern.

    Jetzt habe ich es geändert, aber es hat sich die Ausgangsfrequenz leider nicht verändert, sie beträgt immer noch ca. 33 kHz.
    Mfg Thegon

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    32
    Beiträge
    647
    Nimm mal Timer1

    Evtl. geht das mit nem 8Bit Timer nicht!?

    EDIT: Wenn du den Prescaler auf 1 hast musst du ihn doch eigentlich bis 200 Zählen lassen, bei 8Mhz. Also Timer0 = 55 bzw. 56 da bin ich mir grad nicht sicher.
    Ich glaub mittlerweile das die Idee mit dem Timer1 nicht helfen wird.

    Edit2: Nächste Idee, durch dein Toggle hast du nur die halbe Frequenz. Dein Timer schlägt zwar ca.62500 mal pro sekunde an, aber durch das Toggle ist der Port nur 62,5k/2 mal high und low. Um 40khz zu erreichen, müsstest du 80k mal in die Isr springen.
    Wenn mich jetzt nicht alles täuscht.
    Geändert von DanielSan (29.07.2011 um 22:00 Uhr)
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Also, ich habe jetzt überall anstatt timer0 timer1 geschrieben und timer 1 wird in der isr auf 65510 gesetzt, so dass er wieder bis 25 Zählen muss, um auf 65535 zu kommen, das Resultat: leider wieder 33 kHz. Ob geringere Frequenzen möglich sind, habe ich nicht getestet, aber ich nehme an, schon.
    Das Problem scheint wohl etwas tiefer zu sitzen.
    Gibt es eigentlich sonst villeicht noch irgenteine Möglichkeit, mit einem uC 40 kHz zu erzeugen, ausgenommen der Warteschleife natürlich?

    Du hast recht, bei 8 MHz müsste der Timer bis 200 zählen, aber ist nicht die Maximalfrequenz des internen Oszillators1 MHz, bei aktiviertem 1/8 ist sie dann 125 kHz? Das habe ich einmal bei einer Dauerschleife mit dem Inhalt Toggle Portx festgestellt, glaube ich zumindest.
    Mfg Thegon
    Geändert von Thegon (29.07.2011 um 22:02 Uhr)

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.09.2004
    Alter
    32
    Beiträge
    647
    Hardware PWM!?

    Wäre jetzt noch ne Idee.
    Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]

  9. #9
    Erfahrener Benutzer Roboter-Spezialist Avatar von Thegon
    Registriert seit
    21.01.2011
    Beiträge
    562
    Also ich lasse den Timer jetzt bis 15 Zählen, setze ihn also auf 65520 aber egal was ich mache, ich komme nicht über die 33 khz marke.
    Hardware PWM: Kenne ich mich jetzt nicht aus, ich werde mal nachschauen ob ich mich damit anfreunden kann
    Mfg Thegon

    EDIT: Ach so, das ist Hardware PWM: einen Timer so zu Konfigurieren, dass er PWM Funktion übernimmt. So kenne ich das und mache das auch immer. Aber glaubst du, dass damit die Frequenz höher wird, denn eigentlich mache ich doch mit meinem Toggle doch auch nichts anderes als eine 50 % PWM, oder?
    Geändert von Thegon (29.07.2011 um 22:12 Uhr)

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Beim Mega48 kann auch Timer 0 den CTC Modus. Der Timer sorgt so in Hardware für die richtige Frequenz. Das laden des Timers in der ISR geht bei einem Prescaler von weniger als etwa 32 nicht mehr zuverlässig, da kommt die Verzögerung bis zum setzen des Timers dazu und fällt nicht mehr duch die Rundung im Prescaler weg. Ob man jetzt den Toogle Mode oder PWM nutz ist vermutlich egal. Wenn es um das Senden eines IR Signals geht, ist vermutlich der PWM Mode besser, denn für eine IR Signal kann man auch ganz gut mit ca. 25% Tastverhältnis auskommen (die Erklärung dazu führt hier zu weit).

    Um bei 1 MHz Takt alle 25 µs einen Interrupt auszulösen ist Bascom zu lagsam, da braicht schon das sichern der Register mehr Zeit. So um die 100 Zyklen muss man wohl für einen Interrupt in Bascom mindestens einrechnen. Selbst ganz in ASM ist das mit 25 Zyklen reichlich kurz, ginge aber noch. Vor allem müßte man ja dann auch gleich eine ganze Periode in der ISR erzeugen. Wenn man den passenden Ausgang und PWM nutzt geht es dann auch mit 1 MHz Takt. Mit den Toogle Mode geht es gerade nicht so gut, weil man 25 Zyklen nicht durch 2 Teilen kann - da müßte man den Takt dann schon etwas verstellen auf z.B. 980 kHz.

Ähnliche Themen

  1. Problem: Kommunikation über RN-PC->I2C langsam
    Von hspecht74 im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 8
    Letzter Beitrag: 08.04.2010, 13:50
  2. Timer0 des ATmega32 tickt zu langsam
    Von Djon im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 11.09.2008, 16:27
  3. Problem mit Timer0
    Von Mr Bean im Forum C - Programmierung (GCC u.a.)
    Antworten: 36
    Letzter Beitrag: 18.01.2008, 23:50
  4. timer0 problem
    Von Julian im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 24.07.2006, 19:10
  5. Problem mit Timer0
    Von luma im Forum C - Programmierung (GCC u.a.)
    Antworten: 13
    Letzter Beitrag: 09.12.2005, 19:30

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •