-
        

Ergebnis 1 bis 9 von 9

Thema: Frequenzerzeugung mit AT90S8515 haut total daneben Hilfe!!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91

    Frequenzerzeugung mit AT90S8515 haut total daneben Hilfe!!

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo!

    Ich habe den folgenden Code nach dem hier vorgestellten Tool zur Frequenzeinstellung versucht. Nur liegt die Frequenz immer daneben, bei geforderten 10kHz ergeben sich 4,3kHz, bei 20 ergeben sich 7,5 und bei 30 ergeben sich 10 kHz. Was kann das sein??? Kann mir das nicht erklären.

    Hier der Code:

    'Timer0_2.bas
    '8-bit Timer als Rechteckgenerator
    'mit Voreinstellung
    'Achtung: bei kleinen Zeiten ist die Zeit zur Rettung der Register nicht zu vernachlässigen
    'Nosave bringt, wenn möglich eine starke Verbesserung
    '$sim
    $regfile = "8515DEF.DAT"
    $crystal = 4000000

    'Hier wird der Timer und der Teiler festgelegt
    Config Timer1 = Timer, Prescale = 1

    'Der Port mit der dritten LED auf RN-Control wird als Ausgang programmiert
    Config Pinc.0 = Output
    'Hier geben wir der Definition einen schöneren Namen
    Led3 Alias Portc.0

    'Hier wird das Unterprogramm festgelegt, das
    'in dem von ihnen eingestellten Intervall aufgerufen wird
    On Timer1 Timer_irq

    'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
    Const Timervorgabe = 65403


    'Hier werden die Timer aktiviert
    Enable Timer1
    Enable Interrupts

    'Hier ist die Programmhauptschleife
    Do
    'Hier könnte Ihr Hauptprogramm stehen
    Loop



    'Dies ist der Programmteil, der in dem von ihnen gewählten
    'Intervall aufgerufen wird
    Timer_irq:
    Timer1 = Timervorgabe

    'Hier könnte nun ihre beliebige IRQ-Routine stehen
    'Dabei sollte man darauf achten das diese nicht mehr Zeit
    'benötigt, als das Intervall zuläßt

    'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben Frequenz ergibt
    'Hohe Frequenzen sind natürlich nicht mehr sichtbar
    Toggle Led3

    Return
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    Stimmt dein takt bzw hast du fuses umgestellt auf external?

  3. #3
    Gast
    Den Quarzoszillator konnte ich noch nicht nachmessen. Das werde ich Montag dann erledigen. Also der AT90S8515 läuft nur mit externem Quarz laut Datenblatt. Wenn kein Quarz dran ist geht nix, kein Programmieren und kein Programm läuft. Also läuft er definitiv mit dem 4 MHz Quarz. Der Code ist soweit ok, oder? Hast du selber schon einen AT90S8515 eingesetzt? Gab es da keine Probleme? Na dann hoffe ich mal dass der Oszillator schul ist, wenn es sonst nix sein kann.
    Bin aber für jjeden weiteren Tipp dankbar.

    Gruß

    Sven

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    06.02.2005
    Ort
    Bonn
    Alter
    60
    Beiträge
    17
    Hallo Sven,

    ich glaube du hast Dich verrechnet.

    65136 sollte der richtige Wert für die Konstante Timervorgabe sein.

    f=fosc/Prescale/(65536-Timervorgabe)

    vieleicht hift es ja.

    Grüsse
    Klaus

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    29.01.2004
    Beiträge
    2.441
    Das Programm errechnet dir die Interrupts pro Sekunde und bei jedem Interrupt wird der Ausgang umgeschaltet. D.H. für eine Periode einer Rechteckfrequent benötigst du 2 Interrupts.

    D.h. bei deinen errechneten 10 kHz handelt es sich tatsächlich nur um 5 kHz und gemessen sind es 4,3 kHz.
    Bei deinen 30 kHz handelt es sich um 15 kHz und du misst 10 kHz.

    Fast 20% bzw. 50% Fehler ist natürlich immer noch zu viel.
    Könnte es sein, dass dem Controller bei den relativ hohen Frequenzen zu wenig Zeit bleiibt sich um andere Dinge zu kümmern? Bei 30kHz bleiben schliesslich nur knapp 130 Takte zwischen den Interrupt und hier ist der Fehler erheblich grösser als bei 10 kHz, wo ihm knapp 400 Takte zwischen den Interrupts bleiben.
    Dass Bascom den Code nicht ganz so effektiv gestaltet wie man ihn per Hand in Assmbler schreiben kann wurde ja in einem anderen Thread schon mal ausprobiert. Wer weiss was Bascm den Cotroller zwischen den Interrupts alles anstellen lässt.

  6. #6
    Gast
    Hallo!

    Danke für die Tipps. Zu den Abweichungsfehlern; da das Programm eigentlich nur zum Testen des Timers mit korrekter Frequenz dienen sollte macht der Controller sonst nichts ausser den Takt zu erzeugen.
    Deshalb ist die große Abweichung doch etwas seltsam. Werde dem ganzen morgen mal mit nem Oszi auf den Grund gehen.

    Gruß

    Sven

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91
    Hallo!

    so ich habe die Lösung des Problems. Verrechnet hatte ich mich nicht. Die Quarzoszillatorfrequenz stimmt auch genau! Allerdings kann man höhere Frequenzen nicht genau erzeugen, liegt vermutlich am Code von Bascom, bzw der µC braucht einfach noch ein paar Zyklen für andere Operationen. Wo genau die Grenzfrequenz liegt kann ich nicht sagen. Jedenfalls lassen sich 0-50Hz sehr genau erzeugen

    Danke für eure zahlreichen Tipps

    P.s. Sebastian beim AT90S8515 gibt es keine Fuses um auf external umzustellen!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo ACsenf,

    so ich habe die Lösung des Problems. Verrechnet hatte ich mich nicht. Die Quarzoszillatorfrequenz stimmt auch genau! Allerdings kann man höhere Frequenzen nicht genau erzeugen, liegt vermutlich am Code von Bascom, bzw der µC braucht einfach noch ein paar Zyklen für andere Operationen.
    ich darf einfach mal 'nen teil aus Deinem Beispiel-Code zittieren

    "...
    'Achtung: bei kleinen Zeiten ist die Zeit zur Rettung der Register nicht zu vernachlässigen
    'Nosave bringt, wenn möglich eine starke Verbesserung
    ..."

    Bei geforderten 5 kHz (10kHz zwischen zwei Interrupts) hast Du 200 Takte zwischen den Interrupts. Bascom sichert ohne NOSAVE aber erstmal die 32 Register auf den Stak, ehe es die Interrupt-Routine abarbeitet. Der Interrupt wird also nicht alle 200 Takte ausgeführt sondern nur alle 232 Takte.

    5kHz *200/232 = 4.31kHz

    Ciao,
    Werner

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    22.03.2005
    Beiträge
    91
    Vielen Dank Werner!

    Man lernt halt nie aus.

    Gruß
    Sven

Berechtigungen

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