16-Bit Mode für Timer0

HolgerBri

Neues Mitglied
08. Mai 2009
17
0
0
Sprachen
Hallo,

der Tiny861 kostet mich noch meine letzten Nerven. Nachdem die Lösung für den PWM geklappt hat, muss ich nun noch den Timer0 im 16-Mode ans Laufen bekommen. Nachdem die Verwendung von CONFIG TIMER0 mit folgendem Setzen von TCW0 nichts brachte habe ich versucht den Timer durch TCCR0 direkt zu starten. Leider wird aber zumindest der Timer0 Interrupt in Bascom nicht generiert. Mein letzter Testcode ist:

Code:
$regfile = "ATtiny861.dat"
$crystal = 8000000

Ddra = &B0000_1111                                          'Ports für BCD-Ausgabe
Porta = &B0000_1111

   ' Timer konfigurieren
Tccr0 = 5
Set Tcw0

Dim Wert As Byte

Porta = 3

On Timer0 Isr_timer

Enable Interrupts

Timer0 = 0
Wert = 0

Do

Loop

End                                                         'end program

Isr_timer:
  If Wert = 0 Then
    Porta = 0
    Wert = 1
  Else
    Porta = 15
    Wert = 0
  End If
Return

Habe ich wieder vergessen etwas zu setzen oder muss ich den Interrupt in diesem Fall anders abfragen?

Viele Grüße
Holger
 
Hallo Holger,

ich bin nun kein Bascom-Experte, aber vielleicht hilft dir folgendes weiter.

Das Register TCCR0 gibt es bei dem Mikrocontroller nicht, du schreibst dort 5d rein, ich vermute mal, das soll für CS02..01 = 101 sein.

In den 16Bit Mode bringst du den Timer0, indem du TCW0 (Timer/Counter Width) in TCCR0A setzt. Prescaler-Einstellung erfolgt in TCCR0B.

TCCR0A: TCW0 ICEN0 ICNC0 ICES0 ACIC0 – – WGM00
TCCR0B: - - - TSM PSR0 CS02 CS01 CS01

Probiere vielleicht erst mal wie oben beschrieben die Einstellung von den beiden Konfigurationsregistern.

Gruß,
Dirk
 
Hallo Holger!

Ich kenne zwar den Tiny861 nicht genau und habe auch kein Datenblatt zur Hand, aber...
Der Tiny861 hat 2 x 8bit Timer und 1 x 16bit Timer!
Im allgemeinen ist der 16bit-Timer immer der Timer1.
Timer0 und Timer2 sind meist immer die 8bit Timer!

Ich gehe einfach mal davon aus, dass der Timer0 beim Tiny861 auch ein 8bit-Timer ist und du ihn deshalb auch nicht als 16bit-Timer konfigurieren kannst. ;)


Sollte es beim Tiny861 allerdings anders sein, lerne ich auch gern dazu! :)

Gruß,
Cassio
 
TCCR0A: TCW0 ICEN0 ICNC0 ICES0 ACIC0 – – WGM00
TCCR0B: - - - TSM PSR0 CS02 CS01 CS01




Hi Dirk!

Ups... da bist du schneller gewesen. :)


Und scheinbar habe ich noch etwas dazu gelernt! ;)


Unter BASCOM wird aber der Timer0 immer als 8bit-Timer angenommen..... da kommt er dann wirklich nur mit den manuellen Befehlen weiter.

Gruß,
Cassio
 
Hi Cassio,

es ist auch ungewöhnlich, Timer0 ist normal immer 8Bit breit. Ich kann mir auch vorstellen, dass hier Bascom nicht mitspielt.

@Holger: Falls du auch manuell in den 16Bit Timer/Counter schreiben musst, dann zuerst TCNT0H und dann TCNT0L beschreiben.

Grüße,
Dirk
 
Sodele,

dank Deiner Hilfe Dirk habe ich es nun zum Fliegen bekommen :adore:

So läuft es nun:
Code:
$regfile = "ATtiny861.dat"
$crystal = 8000000

Ddra = &B0000_1111                                          'Ports für BCD-Ausgabe
Porta = &B0000_1111

   ' Timer0 konfigurieren
Tccr0a = &B1000_0000
Tccr0b = &B0000_0101

Dim Wert As Byte

Porta = 3

Enable Timer0
On Timer0 Isr_timer

Enable Interrupts

Wert = 0

Do

Loop

End                                                         'end program

Isr_timer:
  If Wert = 0 Then
    Porta = 0
    Wert = 1
  Else
    Porta = 15
    Wert = 0
  End If
Return

Viele Grüße
Holger
 
Hallo Dirk!

Habe mir mal das Datenblatt zum Tiny861 geladen und durchgeschaut.

Ist wirklich ein interessantes Teil..... z.B. Timer0 = 8/16 bit Modus einstellbar. :eek:

Den Tiny-Typ muss ich mir mal merken. ;)


Gruß,
Cassio
 
Hi Cassio,

Ist wirklich ein interessantes Teil..... z.B. Timer0 = 8/16 bit Modus einstellbar. :eek:

Den Tiny-Typ muss ich mir mal merken. ;)
und Timer 1 = 8/10Bit Modus ... ;)

Also wenn ich mich nicht verlesen habe kann man maximal nen 16Bit und
einen 10Bit Timer drin haben.

Gruß
Dino
 
Hi Dino!

Nee nee, du hast dich nicht verlesen.....

Der Timer1 ist tatsächlich ein 8 oder 10 bit Timer.


Der Tiny861 scheint wirklich ein Sonderfall zu sein. ;)

Gruß,
Cassio
 
Dadurch habe ich mich auch mal vernünftig mit den Registern beschäftigen müssen. Nach über 20 Jahren Elektronikabstinenz muss ich ja mal wieder richtig reinkommen.

Ich möchte Euch auch mal ein dickes Lob aussprechen: Hier wird einem wirklich geholfen und dies in einem vernünftigen Ton. Zuerst war ich in einem Forum, wo auch viele Spezis rumlaufen, aber es einem (Wieder)einsteiger alles andere als leicht machen...

Viele Grüße
Holger
 
Trotzdem Bug in BascomAVR

Hallo zusammen,

ich habe das Beispiel mal mit der aktuellen BascomAVR 1.11.9.5 ausprobiert.
Das Original-Programm lief tatsächlich nicht.

Einer der Gründe ist ein Bug in der IDE.

Im Simulator sind schon die Registernamen teilseise falsch. Bei der Fehlersuche ist mir aufgefallen, wenn nach der Zeile "Wert=0" noch die Zeile "Timer0=0" eingefügt ist, wird das TCCR0B ebenfalls überschrieben.

In der Konfigurationsdatei "ATtiny861.DAT" habe ich in der Sektion [IO] mehrere falsche Einträge gesichtet. Da stand z.B. folgendes:

TCCR0B = $33
TCCR0 = $33
Ich nehme an TCCR0 soll Register A sein, das andere Register B. Und das mit gleicher Adresse?

Ein Blick ins Datenblatt offenbart, dass es kein TCCR0 gibt. Sondern die beiden Register TCCR0A und TCCR0B.

Richtig müssen die Einträge so lauten:

Code:
Auszug aus Datei: "ATtiny861.DAT"
Sektion: [IO]

TCCR0B	= $33 ; OK
;TCCR0	= $33
TCCR0A	= $15 ; Adresse geändert und Name (siehe Zeile davor)
TCNT0L	= $32 ; OK
Im Datenblatt gibt es ebenfalls kein Register mit Namen TCNT0, sondern TCNT0L und TCNT0H.

Wenn man die Adressen von TCNT0L und TCCR0B man anschaut, sieht man, dass sie genau um eine Adresse nebeneinander liegen.

Wenn Bascom nun Timer0=0 setzt, erkennt es vermutlich, dass der 16-Bit-Mode aktiv ist und schreibt ein Word an Adresse TCNT0L. Damit überschreibt es die Eintragung im Register TCCR0B ebenfalls.

Hier liegt also noch ein Bug vor.

Wie man den Timer0 trotzdem rücksetzen kann hier:
Code:
Timer0 auf 0 setzen:

TCNT0L = 0
TCNT0H = 0

Da die Controller ATtiny 261 / 461 und 861 in Registersatz gleich aufgebaut sind, liegt die Vermutung nahe, dass bei diesen Controllern die Daten in der Registrierungsdatei ATtinyx61.dat ebenfals falsch sind. Geprüft habe ich das nicht, da ich ausschließlich mit Atmega's arbeite.


In diesem Zusammenhang habe ich mal eine Frage an euch:

Die Support-Adresse vom Hersteller der BASCOM-IDE ist nicht erreichbar. Kennt jemand den Grund?

Die mir bekannten Daten:

www.mcselec.com und
support@mcselec.com

Mails werden nicht angenommen. Auch Mails an shop@mcselec.com kommen prompt zurück.


Würde mich freuen, wenn mir das jemand sagen kann.



Gruß Mitch.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)