Hi Willa,
Du weißt ja, dass ich in Bascom ein absoluter Nobody bin. Aber gerade habe ich einen tiny85 auf dem Breadbord - der im Wesentlichen von seinem Timer "lebt". Du weißt sicher, dass der tiny85 ein Bruder vom t45 ist. Läuft mit 8 MHz+CKDIV8 - also mit 1 MHz vom internen Oszillator. Daraus mache ich mit dem Timer0 einen Takt von 1 ms => 1 kHz. WENN ich den Prescaler (CLK/ 8 ) nicht nehmen würde und WENN ich die fuse CKDIV8 nicht nehmen würde - könnte ich also ohne Änderung auf einen Takt von 64 kHz kommen - 15 µs/Takt bei 8 MHz. Und hätte keinerlei interne Taktprobleme zu erwarten. Mit einem schnelleren (Quarz-)Takt ist entsprechend mehr möglich.
Zitat von
Willa
... nach 250 overflows ... nach 500 overflows ... warte ich nochmal 5000 overflows ab (=20ms) ...
Dürfte also auch Deinen Ansprüchen genügen.
Obs Dir hilft weiß ich nun nicht, aber ich habe mal Initialisierung und ISR rausgeschippselt - hier ist der code. Wünsch Dir alles Gute:
Code:
/* >>
Sicherung 03Jan10 1630 ...C2..\PCR_80\PCR_80_tmr_x31.c
.............
================================================================================ */
// ================================================================================
// ================================================================================
// === Initialisierung fuer Timer0 tiny85 bei 1 MHz (IntOsz) =====================
void TC0TMR_init(void) // Init Tmr/Cntr0, ca. 1,00 kHz = 1000µs = 1ms
{ // COM0A1=COM0A0=0 => OC0A disconnected
TCCR0A |= (1<<WGM01); // Timer im CTC-Mode, Top=OCRA doc S 82
TCCR0B |= (1<<CS01); // Prescaler 1/8 / Clock = 1/8 CPU-Takt doc S 83
OCR0A = 122; // Preset/Preload 121 => ca. 1,00 ms @ 1,0Mhz
TIMSK |= (1<<OCIE0A); // Tmr/Cntr0 CompareA interrupt enabled
}
// ================================================================================
// ================================================================================
// === Nicht unterbrechbare ISR für timer0 =======================================
// zählt hoch mit 1 kHz/1,0 ms. Zählerwert (=Zeitwert) wird für Zeitmessung benutzt
ISR(TIM0_COMPA_vect) // Vektor 11 (0 ... 2 !!!) doc S 50
{
//### Izeit_0 = Zähler für Zeithorizont hochzählen. Izthrznt wird im main definiert
// durch die erforderliche Interruptzahl für EINE Sekunde
// Durch Izhrznt kann eine Feinjustage der "BoardUhr" erreicht werden
Izeit_0 ++; // Mit 1 kHz hochzählen
if (Izeit_0 >= Izthrznt) // Interrupt-Timer = "Zeithorizont" begrenzen auf
// Izthrznt = Zeit für EINE Sekunde
{ // Izeit_0 gleich oder größer als Izthrznt ==>
Izeit_0 = 0; // ...Sekundenzähler zurückstellen auf Null
// ..... Hier folgen noch weitere Zeitvariablen (sec, min, etc).
}
return;
}
// ================================================================================
// ================================================================================
// ===== ENDE Subroutinen ====================================================
// ================================================================================
Anmerkung:
volatile uint16_t Izthrznt; // Der zeitliche Horizont, z.B. 1000 für 1 sec
// Möglich wäre 60 000 <=> 1 min
volatile uint16_t Izeit_0; // Timertakt in timer0 <=> siehe dort
Izthrznt = 996; // Zeithorizont Timer0/1MHz / 1,00 ms => ergibt EINE Sekunde
// Abweichung im Test: 600 sec = 599,86 sec real
// bzw. 600,00 sec +/- 0,5 sec
Lesezeichen