PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenzerzeugung mit AT90S8515 haut total daneben Hilfe!!



ACsenf
02.04.2005, 13:05
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

sebastian.heyn
02.04.2005, 14:56
Stimmt dein takt bzw hast du fuses umgestellt auf external?

02.04.2005, 16:40
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

macrofoto
02.04.2005, 19:48
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

recycle
02.04.2005, 23:47
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.

03.04.2005, 12:31
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

ACsenf
04.04.2005, 09:01
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!

Werner_Just
04.04.2005, 09:50
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

ACsenf
04.04.2005, 10:13
Vielen Dank Werner!

Man lernt halt nie aus.

Gruß
Sven