Timer im AVR

J

Jürgen Schulz

Guest
Hallo Ihr,

Habe Probleme mit dem AT90S2313. Bei einer Quarzfrequenz von 7372800, möchte ich
eine Frequenz von 40 kHz an Portd.4 zur Verfügung stellen. Dazu bräuchte ich bei
Prescale von 1, ein Reload von 92. Aber erst ab Reload 150 erhalte ich eine
Frequenz von ca.25kHz am Ausgang. Sobald ich den Wert verkleinere, passiert nix
mehr am Ausgang. Was mache ich falsch, hat jemand ein Tipp?

Mit besten Dank Jürgen

Hier mal der Code (Bascom)
------------------------
Dim X As Byte
Config Portd = Output
Const Reload = 150
Config Timer1 = Timer , Prescale = 1
Ocr1ah = High(reload)
Ocr1al = Low(reload)
Tccr1a = 0
Set Tccr1b.3
On Compare1a Timer1_isr
Enable Compare1a
Enable Interrupts

Do
If X = 1 Then Set Portd.4
If X = 2 Then
Reset Portd.4
X = 0
End If
Loop

End

Timer1_isr:
X = X + 1
Return
 
Jürgen Schulz wrote:
Hier mal der Code (Bascom)
Bascom erzeugt offensichtlich dafür einen zu langsamen Code.
Selbst ein C-Compiler hat da schon nicht mehr viel Spielraum
(ich hatte mal mit dem AVR-GCC bei 10 MHz einen 65kHz-Interrupt
generiert).

Statt die 40 kHz "von Hand" zu erzeugen, dürfte es in Deinem Fall
besser sein, Du benutzt einen der Timer, um damit den OC1-Pin (Port
B3) zu toggeln (schaue Dir mal das Register TCCR1A genauer an).
So würdest Du ausschließlich Hardware für die Generierung Deines
Rechtecks benutzen und nicht noch unnötig Rechenperformance verbraten.

Thomas.
 
Thomas Rehm schrieb:
Jürgen Schulz wrote:

Hier mal der Code (Bascom)
Bascom erzeugt offensichtlich dafür einen zu langsamen Code.
Selbst ein C-Compiler hat da schon nicht mehr viel Spielraum
(ich hatte mal mit dem AVR-GCC bei 10 MHz einen 65kHz-Interrupt
generiert).
So etwas aehnliches dachte ich mir auch.

Vor allem die Abfrage auf X=1 bzw X=2 ist ungut, wenn X schon
groesser als 2 ist (weil isr X moeglicherweise schneller raufzaehlt,
als abgefragt wird). Ich haette diese Abfrage in die isr verschoben.

Statt die 40 kHz "von Hand" zu erzeugen, dürfte es in Deinem Fall
besser sein, Du benutzt einen der Timer, um damit den OC1-Pin (Port
B3) zu toggeln (schaue Dir mal das Register TCCR1A genauer an).
So würdest Du ausschließlich Hardware für die Generierung Deines
Rechtecks benutzen und nicht noch unnötig Rechenperformance verbraten.
Das ist die eleganteste Loesung.

servus thomas
 
Hallo,

Thomas Rehm schrieb:

Bascom erzeugt offensichtlich dafür einen zu langsamen Code.
Selbst ein C-Compiler hat da schon nicht mehr viel Spielraum
(ich hatte mal mit dem AVR-GCC bei 10 MHz einen 65kHz-Interrupt
generiert).

Mit ON <Interrupt> werden bei jedem Interrupt die Register 0.11, 16..31
und SREG gesichert, und wieder zurückgeholt. Das dauert entsprechend,
frißt Programmspeicher und RAM. Du kannst die NOSAVE - Option benutzen,
die das umgeht, siehe dazu die Hilfedatei bzw. die BASCOM-Mailliste.
Leider muß man dabei selbst herausfinden, welche Register gesichert
werden müssen.


Gruß,
Bernhard
 
Mit ON <Interrupt> werden bei jedem Interrupt die Register 0.11, 16..31
und SREG gesichert, und wieder zurückgeholt. Das dauert entsprechend,
frißt Programmspeicher und RAM. Du kannst die NOSAVE - Option benutzen,
die das umgeht, siehe dazu die Hilfedatei bzw. die BASCOM-Mailliste.
Leider muß man dabei selbst herausfinden, welche Register gesichert
werden müssen.

Dank Dir, das hört sich gut an, werde ich morgen gleich mal machen.

Jürgen
 
Mit ON <Interrupt> werden bei jedem Interrupt die Register 0.11, 16..31
und SREG gesichert, und wieder zurückgeholt. Das dauert entsprechend,
frißt Programmspeicher und RAM. Du kannst die NOSAVE - Option benutzen,
die das umgeht, siehe dazu die Hilfedatei bzw. die BASCOM-Mailliste.
Leider muß man dabei selbst herausfinden, welche Register gesichert
werden müssen.
Es geht, juchhu. Die 40kHz sind kein Problem ...

Danke

Jürgen
 

Welcome to EDABoard.com

Sponsor

Back
Top