Genau, nichts für ungut dass ich nachfragte. War ja eigentlich schon sicher, dass Du es so machst.... 8Mhz und den Teiler 8 reinnehme muß ich ja auch $crystal = 1000000 schreiben ... Timer am neuen Systemtakt anpassen. ...
Genau, nichts für ungut dass ich nachfragte. War ja eigentlich schon sicher, dass Du es so machst.... 8Mhz und den Teiler 8 reinnehme muß ich ja auch $crystal = 1000000 schreiben ... Timer am neuen Systemtakt anpassen. ...
Ciao sagt der JoeamBerg
Den Timer sollte die Crystal-Angabe nicht interessieren. Der arbeitet stur nach seinen Registern.
Wenn das Herz involviert ist, steht die Logik außen vor! \/
So, mir hat es keine Ruhe gelassen...
Der Fehler liegt an "Timer0 = Timervorgabe". Timer0 (TCNT0) ist für Bascom ein 8Bit Timer. Nachdem ich diesen aber als 16Bit schalte kann ich aber nicht mehr auf Timer0-Wert zugreifen/setzen.
Für Timer1 funktioniert das, da Bascom die 2 8Bit Register (TCNT1H und TCNT1L) als ein pseudoregister Timer1 (TCNT0) bereit stellt. Das ist aber für Timer0 nicht vorgesehen.
Eine schöne Beschreibung die mir auf die Sprünge geholfen hat: http://halvar.at/elektronik/kleiner_...timer_counter/
Und das gleiche Thema schonmal diskutiert: http://www.avr-praxis.de/forum/showt...e-f%FCr-Timer0
Da die Timervorgabe ignoriert wurde hatte ich eine Frequenz von 0,47684Hz also 2Sekunden Blinkfrequenz.
Da das Pseudoregister nicht mehr angesprochen werden kann (evtl. gibts eine neuere "attiny861.dat"), muß der Vorgabewert direkt in die beiden 8Bit-Register TCNT1H und TCNT1L (beim attiny861:TCNT0H und TCNT0L) geschrieben werden.
Ich bin mir nur noch nicht ganz sicher wie ich die 16Bit-Timervorgabe auf die beiden 8Bit-Register aufteilen muss, um auf 1Hz Timerfrequenz zu kommen.
Evtl. kann mir das noch jemand erklären? (Mit Timervorgabe*4 sieht es zumindest Augenscheinlich wie 1Hz aus)
Danke für Eure HilfeCode:$regfile = "attiny861.dat" $crystal = 8000000 $hwstack = 32 $swstack = 32 $framesize = 32 'Config Timer0 = Timer , Prescale = 256 Tccr0a = &B1000_0000 '16Bit Mode einschalten Tccr0b = &B0000_0100 'Prescale=256 Config Pinb.4 = Output Led3 Alias Portb.4 Led3 = 0 Enable Timer0 On Timer0 Timer_irq Const Timervorgabe = 34286 Enable Interrupts Do Loop Timer_irq: 'Timer0 = Timervorgabe 'Bascom kennt Timer0 nicht als 16Bit Timer Tcnt0h = Timervorgabe * 4 ' Tcnt0l = Timervorgabe * 4 Toggle Led3 'Wait 1 Return
mfG
Mario
Versuchs mal so:
Tcnt0h = &b0111_1010
Tcnt0l = &b0001_0010
Anstelle von Timervorgabe.
31250 = 0111101000010010 als 16bit. Das sollte als Erklärung für dich reichen! So weit wie du schon gekommen bist
Ich weiss ja nicht wie du auf 34286 gekommen bist aber wenn du genau 1 sec willst musst du 31250 nehmen.
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Guten Morgen,
ja, spitze so klappt es.
tausend Dank
zum Thema Timervorgabe:
Ich habe den Timer mit dem rnAVR von Roboternetz gerechnet. (siehe Bild)
Es kommt da exakt 1-Sekunden-Takt raus.
nachgerechnet:
Von meinen 8Mhz wird nur jeder 256 Takt gezählt also 31250 Takte/sek. Um aber einen Überlauf bei 65535 zu erreichen, muß ich schon ab 34286 anfangen zu zählen.
Oder habe ich einen Denkfehler?
mfG
Mario
Ups der Denkfehler liegt bei mir! So wie du es geschrieben hast ist es richtig sry!
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Kann man in Bascom eigentlich nicht den CTC-Mode benutzen?
Dann braucht man nicht jedesmal in der ISR den Timer neu zu setzen...
Gruß,
askazo
Doch müsste gehen indem man die Register passend setzt. Wie das geht steht hier ja schon mehr oder weniger.
Unser Sommer ist ein grün angestrichener Winter. Das einzige reife Obst, das wir haben, sind gebratene Äpfel. [Heinrich Heine]
Lesezeichen