-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Tiny26, Timer1 Bascom oder ASM

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693

    Tiny26, Timer1 Bascom oder ASM

    Anzeige

    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:
    Code:
    $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.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    29
    Beiträge
    1.614
    PLLCSR.2 = 0

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

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    29
    Beiträge
    1.614
    haste das start timer1 mal außerhalb des anderen ints reingesetzt? nimm den doch erstma raus...

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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.

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    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.

    Code:
    	.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.

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    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!!!

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.07.2005
    Beiträge
    569
    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:
    Code:
    ldi r16, (1<<TOIE1)
    out TIMSK, r16
    für einen Vergleichsinterupt (TCNT = OCR1A oder OCR1B) - in dem Fall für beide:
    Code:
    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

    Grüße,

    da Hanni.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    @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.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •