PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tiny26, Timer1 Bascom oder ASM



Marco78
18.06.2006, 13:54
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.

x-ryder
19.06.2006, 14:00
PLLCSR.2 = 0

versuch das mal, das soll wohl die 64MHz clock vom timer1 wechholen

Martin

Marco78
19.06.2006, 23:00
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?

x-ryder
19.06.2006, 23:09
haste das start timer1 mal außerhalb des anderen ints reingesetzt? nimm den doch erstma raus...

Martin

Marco78
19.06.2006, 23:52
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.

Marco78
28.06.2006, 21:32
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.

Hanni
07.07.2006, 18:49
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.

Marco78
08.07.2006, 13:14
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!!!

Hanni
08.07.2006, 13:29
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.

E-Fan
10.07.2006, 12:27
@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. ;)

magic33
24.02.2007, 21:00
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