Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer1 bei ATTiny45 Probleme
ScorpionXIII
08.09.2007, 16: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, 17: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, 18: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, 18: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, 18: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, 19: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, 23: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, 15: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, 16: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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.