PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer1 bei ATTiny45 Probleme



ScorpionXIII
08.09.2007, 15:19
Hallo,

ich programmiere in Bascom ein Projekt, dass nach einer definierten Zeit 2 Servos ansteuern soll.
Die Zeitspanne sollte recht genau sein, deshalb ist der waitbefehl eher ungünstig.
Da das System klein sein soll, kommt der ATTiny45 in Frage mit 2*PWM und 2* 8bit Timern.

Leider funtioniert der Timer1 nicht! :(

Benutzt man nur eines der beiden (also entweder Zeitmessung oder Servo) mit Timer0 geht es ohne Probleme

Bei Zeitmessung und Timer1 springt er nicht in die ISR.
Bei Servo und Timer1 kommt ein Compilerfehler .EQU nicht gefunden...

Wass soll ich machen?





'--Einstellungen für den uC--
$regfile = "ATTiny45.dat"
$crystal = 1000000
$hwstack = 32
$swstack = 10
$framesize = 40


'--Einstellungen für die angeschlossenen Dinge--
Config Portb.0 = Output
Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 5 , Timer = Timer1
Enable Timer1



Config Timer0 = Timer , Prescale = 1024
On Timer0 Readrctime:
Enable Timer0


Enable Interrupts


Config Portb.3 = Output 'LED
Led1 Alias Portb.3


Dim I As Byte
Dim Zeit As Byte
Dim Timercount As Integer
Dim Zeit5s As Byte


Waitms 10
Timercount = 0

Led1 = 0
Zeit5s = 0
Zeit = 1

Led1 = 0

Servo(1) = 13
Do
I = 5
Loop


'================================================= =============================
'Timer
Readrctime:
Led1 = 1
Return




End


Ich hoffe es findet sich hier jemand der helfen kann, ich bin mit meinem Latein am Ende ;) :(

Grüße
ScorpionXIII

Lunarman
08.09.2007, 16:56
wie genau soll das ganze denn sein? Eigentlich würde ich, wenns keine Uhr werden soll, durchaus waitms benutzen... bei wartezeiten > 1 Sekunde ist allerdings wait besser. ich habe Timer noch nie gebraucht, aber die Zeile

Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 5 , Timer = Timer1

kommt mir komisch vor... geht dass das du den Timer in der gleichen Zeile definierst wie die Servos? Selbst wenn es geht, würde ich das vielleicht in ne andere Zeile schreiben. hab allerdings grad ne Denksperre und konnte sonst keinen Fehler entdecken...

EDIT: laut wiki gehört das timer1 = timer und nicht andersrum... keine Ahnung ob das was ausmacht, versuchs mal.

ScorpionXIII
08.09.2007, 17:07
Hi,

in der Hilfe steht, dass man mit dem Zusatz ", Timer=Timer1" der Servoansteuerungsroutine sagt, dass sie den Timer1 für das PWM benutzen soll. Ohne das arbeitet sie mit Timer0

Wait hat den Nachteil, dass es nicht immer gleich ist. Also meines Wissens hängt es primär von der benutzten Speichergröße ab wie lange z.B. wait 1 ist. Ob es Temperatur stabil ist kA?
Außerdem möchte ich die Zeit einstellen können. Also mal 1s warten, dann einstellen auf 3s warten...
Eine Funktion, die mir x-Mal wait ausführt, geht nicht, da mehrer wait nicht gleich bleiben.
wait 1 ist ca. 1s

wait 1
wait 1
sind nicht zwangsläufig 2s

und eine Case-Kaskade mit ausprobierten Zeiten ist etwas unschön ;)

Edit:
Scheint nicht so zu gehen, da er jetzt wol doch den timer0 nimmt.
Compilerproblem: ISR already defined
In der Zeile ON Timer1 Readrctime:

Lunarman
08.09.2007, 17:13
Eh... mit welchem Timer willst du denn jetzt die Zeit messen? Wenn du mit Timer1 Pwm machst... oder versteh ich grad was falsch?
Wie gesagt, ich kenn mich mit Timern nicht so aus, da ich noch nie etwas derart genaues gebraucht habe, aber... sollte nicht irgendwo
on timer1 isrtimer1 stehen? Kann ich bei dir grad nicht finden! ich sehe nur ne ISR für Timer0, der ist meines Wissens aber der, der bei dir benutzt wird um die Servos anzusteuern...? So ganz werd ich aus deinem problem nicht schlau. Jedenfalls sehe ich keine ISR für Timer1 in die er springen könnte.

ScorpionXIII
08.09.2007, 17:27
Servo: Timer1
Die ISR und so weiter macht alles die Routine Servo alleine, da muss man eigentlich nix definieren.

Zeitmessung: Timer0
ISR ist definiert.

ScorpionXIII
10.09.2007, 18:20
Ist das ein Bug, dass man den Timer1 mit dem ATTiny45 nicht benutzen kann, oder hat das jemand geschafft mit der Bascom Routine Timer1=Timer...?

Gruß
ScorpionXIII

Lt. Tuvok
04.11.2007, 22:12
Hallo, hat es inzwischen vielleicht jemand hinbekommen den Timer1 des ATTiny45 unter Bascom zum laufen zu bekommen? Könnte man nicht direkt aufs Timer1-Register zugreifen um die Bascom-Routine zu umgehen? Oder kann man bei Bascom vielleicht sogar irgendwo einstellen das der Timer1 ein 8bit Timer und kein 16bit Timer ist?

thx
Lt. Tuvok

ScorpionXIII
07.11.2007, 14:19
Auf www.mikrocontroller.net wusste jemand eine Antwort auf das Problem :)



$regfile = "ATTiny45.dat"
$crystal = 1000000 '1MHz

$hwstack = 32
$swstack = 16
$framesize = 40

'''TCCR1=&H07 'This will replace Config Timer1 = Timer , Prescale = 64
TCCR1=&H0D 'This will replace Config Timer1 = Timer , Prescale = 4096
'''TCCR1=&H0F 'This will replace Config Timer1 = Timer , Prescale = 16384
''' See datasheet for more prescaler values

On Timer1 Readrctime
Enable Timer1

Config PINb.3 = Output 'LED
Led1 Alias Portb.3

Enable Interrupts

Do
!NOP
Loop

End

'ISR
Readrctime:
Toggle Led1
Return


Funktioniert!!! :D endlich eine Lösung.
Manchmal ist es ganz einfach und nur ein paar Zeilen ;)

Grüße
ScorpionXIII

Lt. Tuvok
08.11.2007, 15:53
Also das mit dem Code klappt 1A. Vielen Dank für die Info. Und man hat sogar viel mehr Prescaler zur Auswahl als wenn man über Bascom arbeitet . \:D/ Dadurch lässt sich auch mit dem 8bit Timer relativ Problemlos ein Sekundentakt generieren.

Achso die Timerwertvorgabe kann man mit der Variable Tcnt1 verändern(ein Beispiel für 1Hz Ausgangsfrequenz dazu im Codeanhang)



$regfile = "attiny45.dat"
$crystal = 8000000

Config Pinb.0 = Output

Tccr1 = &H0F 'This will replace Config Timer1 = Timer , Prescale = 16384

Tcnt1 = 11 'This will replace Timer1 = 11

On Timer1 Generator
Enable Timer1
Enable Interrupts


Do

nop

Loop
End


Generator:

Toggle Portb.0

Tcnt1 = 11 'This will replace Timer1 = 11

Return


Vielen Dank nochmal
Lt. Tuvok