Archiv verlassen und diese Seite im Standarddesign anzeigen : Tiny26, Timer1 Bascom oder ASM
Bascom hat bis zu der Version .8.1 ein Problem mit dem Tiny26 und den Hochbefehlen für den Timer1.
Ich möchte den Timer ganz normal nutzen um nach einer eingestellten Zeit eine Aktion auszuführen. Das Problem bei Bascom ist die Initalisierung des Timers. Zumindest habe ich das so durch viel Suchen im Forum und im Internet rausgelesen.
Aber die Beispiele die ich da gefunden haben waren alle für PWM oder Fast-PWM.
Hier erstmal der Codeausschnitt:
$regfile = "at26def.dat"
$crystal = 16000000
Led Alias Porta.4
Tccr1b = 11 'Prescale=1024 (mit 1a ändert sich auch nix)
Config Int0 = Change 'bei jeder Halbwelle reagieren
Enable Int0
On Int0 Int0_isr
On Timer1 Timer_irq
Enable Timer1
Enable Interrupts
Int0_isr:
Start Timer1
Return
Timer_irq:
Tcnt1 = Timervorgabe 'der Wert wird im Programm geändert
Set Led
Return
Die Zeile Config Timer1 = Timer als Zusatz bringt auch kein Erfolg.
Auch Pllcsr auf irgend einen Wert setzen ändert nichts.
Wenn alles auf Timer0 gestellt ist funktioniert es. Es liegt also am Timer1.
Ich weiss aber nicht, ob er nicht anläuft oder die ISR falsch aufgerufen wird. Zumindest springt er nicht in die ISR des Timers. In die des INT0 aber schon.
Wer hat denn eine Idee, was ich machen kann, damit die ISR zum richtigen Zeitpunkt aufgerufen wird?
Stacks habe ich schon weiter erhöht.
Über einen Assemblercode den ich einfügen kann wäre ich auch dankbar.
PLLCSR.2 = 0
versuch das mal, das soll wohl die 64MHz clock vom timer1 wechholen
Martin
Geht nicht. Das hatte ich auch schon probiert. Ich habe auch schon verschiedene Einstellungen für die ersten drei Bits von Pllcsr gehabt.
Aber wenn das das Problem gewesen wäre, hätte das Programm doch in die ISR springen müssen. Nur vier mal eher als gewollt.
Oder seh ich das verkehrt?
haste das start timer1 mal außerhalb des anderen ints reingesetzt? nimm den doch erstma raus...
Martin
Das hab ich noch nicht probiert.
Ich hatte das ganze Programm erst für Timer0 geschrieben. Getrc5 akzeptiert aber den Timer1 nicht. Also alles so wie es war gelassen und auf Timer1 geändert.
Ging aber nicht. Was tun? Erste Anlaufstelle die Suchfunktion hier. Ergebnis: Der Tiny26, Bascom und Timer1 können mit den Hochbefehlen (noch) nicht umgehen. Es müssen die Register gesetzt werden. Zumindest für den Prescaler wenn es um PWM geht.
Das gemacht, aber bringt auch nichts. Analog dazu die ganze Zeit das Datenblatt gelesen und überlegt welche Einstellungen noch sinnvoll sind.
Enable Timer1 mit Register setzen probiert, ...
Der INT0 wird aber so im Programm aufgerufen, hab ich mit der Debug-LED schon festgestellt. Ich werd's morgen abend aber trotzdem mal probieren den Timer1 im Programm schon zu starten.
Ich habe bis jetzt keine Lösung gefunden. Ich werde erstmal auf einen Mega8 ausweichen und hoffen, das es beim Tiny25/45 mit der Hochsprache klappt.
Sollte dennoch jemand die Lösung kennen, wäre ich über diese immer noch erfreut. Und ich denke, das es da nicht nur mir so geht.
Hmm, die Frage ist generell erst einmal, willst du einen syncronen oder einen asynchronen Timer ?
Hier einmal die relevanten Bits um diesen überhaupt erst einmal zum laufen zu bekommen:
PLLCSR:
- PCKE -> 0
- PLLE -> 0
TCCR1A:
- alle Bits gelöscht
TCCR1B:
- CS10, CS11, CS 13 gesetzt, rest gelöscht
Damit sollte der Timer theoretisch erst einmal laufen.
Für den Overflow Interupt muss man übrigens das Bit TOIE1 im Register TIMSK setzen.
Anbei mal ein kleines Assemblerprogramm, das eigentlich nur diesen Timer mit einem Prescaler von 1024 initialisert (µC Clock als Bezug).
Getestet hab ich es nur im AVR Studio, da mir hier wederein Tiny26, noch ein passendes Devboard oder gar ein Oszi zur Verfügung steht.
.nolist
.include "tn26def.inc"
.list
clr r16
out PLLCSR, r16
out TCCR1A, r16
ldi r16, (1<<CS10) | (1<<CS11) | (1<<CS13)
out TCCR1B, r16
loop:
rjmp loop
Grüße,
da Hanni.
Ich wollte den asynchronen Timer verwenden. Glaube ich zumindest. Ich müsste nochmal ins Datenblatt schauen, welcher wer ist. Aber zumindest den, der zum MCU-Takt läuft und nicht mit 64MHz.
So schlecht finde ich das Datenblatt zum Tiny26 aber nicht. Es kommt mir bis jetzt alle Fragen beantworten. Außer die zum Timer1. Weil die Einstellungen umfangreicher sind als die des Timer0.
Der Timer1 soll nach einem ausgerechneten Vorteiler und Voraufladung des Zählers und damit nach einer bestimmten Zeit einen OverflowINT auslösen.
In der ISR soll dann weiteres passieren.
Ich habe wie schon gesagt jetzt noch nicht ins Datenblatt geschaut welches Bit der Register was kann. Dazu komme ich erst heute Abend/Nacht.
Aber in Bascom ist es so (und das sind ja auch nur die Befehle um die betroffenen Register des AVR zu setzen oder zu löschen) das INTs allgemein und der Timer1 erstmal aktiviert werden müssen. Selbst das habe ich schon durch direktes setzen der Register probiert.
Aber das setzen des Registers und die ISR vermisse ich in deinem Listing.
Meine ASM-Zeit ist nun schon über 10 Jahre her.
Ich verstehe deinen Code so:
- "Variable" R16 auf 00000000 setzen
- PLLCSR und TCCR1A mit den Nullen beschreiben
- Die Bits CS10, 11 und 13 für TCCR1B auf 1 setzen.
- Und dann eine Endlosschleife.
Im Bascomcode habe ich ja das Problem, das ich ersten nicht 100%ig genau weiss, ob die Einstellungen so wie ich sie vorgenommen habe richtig sind, und ob der Timer1 überhaupt anläuft und warum die ISR nicht aufgerufen wird.
Es ist ja noch nicht einmal so, das die ISR zur falschen Zeit aufgerufen wird.
Also könnte der Timer
1. falsch eingestellt sein.
2. nicht gestarten sein.
3. der Sprung in die ISR falsch konfiguriert sein.
Ich werd das heute Abend nochmal genauer nachlesen und ausprobieren und berichten.
Danke schomal für deine Mühe!!!
Also kurz ein paar Grundlagen:
1. r16 ist eines der 32 Register die der Tiny besitzt (genauer: das erste auf das ich direkt zugreifenb kann)
2. Wenn die Bits CS... gesetzt sind rennt der Timer schon, du brauchst ihn also nicht mehr starten
3. Die Timer Interupts werden wie folgt aktiviert:
für einen Überlauf (also 255 -> 0) Interupt:
ldi r16, (1<<TOIE1)
out TIMSK, r16
für einen Vergleichsinterupt (TCNT = OCR1A oder OCR1B) - in dem Fall für beide:
ldi r16, (1<<OCIE1A) | (1<<OCIE1B)
out TIMSK, r16
Tja, wie schon gesagt, das Datenblatt dieses Tinys ist wirklich nicht das beste ... das vom Mega8 beispielsweise ist in Bezug auf Timer wesentlich ausführlicher :D
Grüße,
da Hanni.
@Marko
Dann schreib doch die nötigen Werte direkt in die Register rein. Das klappt nach meiner Erfahrung sogar etwas besser als mit der Hochsprache. Bascom weigert sich ja momentan auch noch die PWM-Funktionen von Timer0 zu aktivieren. Da gehts gar nicht anders und die zwei Zeilen sind schnell geschrieben. ;)
könnte wenn möglich das mal jemand für die absoluten timer neulinge erläutern
der tiny26 ist ein toller chip intern 8mhz
nur dieser timer1 der tut einfach nicht so richtig
dieser code funzt mit timer1 und portb.3 pulse
'/////////////////////////////////////////////////////////
'/// BASCOM ISP PROGRAMMER TEST timer1 ///
'/// toggle portb.3
'/////////////////////////////////////////////////////////
$regfile = "AT26def.dat" ' used device
$crystal = 8000000
$hwstack = 32 ' default use 32
$swstack = 10 'default use 10 for
$framesize = 40 'default use 40 for
Config Portb = Output
Led Alias Portb.0
Tccr1a = 17 'toggle ocr1b in pwm mode
Tccr1b = 135 'clock PRESCALE 64 ctc1 an relod nach compare b/c
Ocr1b = 125 'vorlasen servo mitte
Ocr1c = 255 'compare zahl
Enable Interrupts
Do
Wait 2 '' ' ' ' ' ' ' ' ' '
Toggle Led
Ocr1b = 192 '0,5ms servo links
Wait 2
Toggle Led
Ocr1b = 63 '1,5ms servo rechts
Loop
End 'pulsbreite 2ms
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.