-         

Ergebnis 1 bis 3 von 3

Thema: Frequenzerzeugung mit Timer0

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.03.2005
    Beiträge
    25

    Frequenzerzeugung mit Timer0

    Anzeige

    Hallo,

    ich habe mir mal das Timerberechnungstool installiert. Erzeugen möchte ich eine Frequenz von 40kHz.
    Es wurde folgender Quellcode generiert:

    Code:
    $regfile = "m8def.dat"
    $crystal = 4000000
    
    Config Timer0 = Timer , Prescale = 1
    
    Config Pinc.2 = Output
    Led3 Alias Portc.2
    
    On Timer0 Timer_irq
    
    Const Timervorgabe = 156
    
    Enable Timer0
    Enable Interrupts
    
    Timer_irq:
      Timer0 = Timervorgabe
       Toggle Led3
      Return
    Mit dem Scope messe ich 12,14kHz. Selbst wenn ich den Vorgabewert des Timers auf 250 erhöhe steigert
    das die Frequenz nur auf 14kHz. Ich steige einfach nicht dahinter wo das problem liegt. Der Quellcode ist
    vom Prinzip okay, aber warum kommen die 40kHz nicht?
    [/code]

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    sind deine fuses auf externen quarz gestellt?

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    64
    Beiträge
    277
    Hallo,

    zum Einen hast Du zur Berchnung 40000 benutzt, das entspricht 20000 Hertz bei Toggle, zum Anderen berücksichtigst Du nicht, daß für das Sprigen in die ISR, das Pushen der Register und bis zum Abschluss des Beschreibens des Timers insgesamt über 40 Prozessortakte vergehen.

    Bei 4 MHz Prozessortakt und Timer0 wirst Du auf diese Art keine genauen 40kHz erreichen können. Timer1 und ein höherer Prozessortakt wären notwendig.

    Grüße
    Henrik

    Edit und PS:

    Zur Vervollständigung:
    Unter diesen Voraussetzungen komme ich z.B. auf recht genaue 50kHz.
    Die 50kHz deshalb um Dir etwas Reserven nach oben zu lassen.
    (siehe Oszilloskopschnappschuss im Anhang)

    Code:
    $regfile = "m32def.dat"
    $crystal = 7372800
    ...
    Config Timer1 = Timer , Prescale = 8
    On Timer1 Timer_irq Nosave
    ...
    ...
    Config Timer1 = Timer , Prescale = 1
    Timervorgabe = 65462 + 32          'für 100kHz bzw. 50kHz  bei Toggle
    
    '------------ händisches Registerretten --------
    Timer_irq:
    $asm
    push R24
    push R25
    push R26
    push R27
    push XH
    push XL
    in R24, SREG
    push R24
    $end Asm
    Timer1 = Timervorgabe
    Toggle Portb.0
    $asm
    pop R24
    Out Sreg , R24
    pop XL
    pop XH
    pop R27
    pop R26
    pop R25
    pop R24
    $end Asm
    Return
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken frequenzgen.gif  

Berechtigungen

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