Hallo,
Also wenn die 1,11 und 1,12 Hz nicht so genau stimmen müssen, würde ich es so in etwa machen:
Ist nur ein Gerüst. Die ISRs werden in etwa den Zeitabständen aufgerufen. Durch Setzen des Prescaler auf 2048 kann man die Frequenz verdoppeln wenn es für das Toggeln der LEDs nötig ist.
Code:
$regfile = "attiny85.dat"
$crystal = 1000000
$framesize = 24
$swstack = 32
$hwstack = 34
Config Portb.3 = Output
Config Portb.2 = Output
Config Portb.4 = Output
Config Portb.1 = Output
Ocr1a = 100 'Initialisieren, damit nicht sofort nach Starten des Timers ein Interrupt ansteht
Ocr1b = 200 'Initialisieren, damit nicht sofort nach Starten des Timers ein Interrupt ansteht
Config Timer1 = Timer , Prescale = 4096
'# Mit Prescaler 4096 wird Timer1 mit 1000000 / 4096 = 244,140625 Hz getaktet
'# Tcnt1 wird alle 1 /(1000000 / 4096) = 0,004096s erhöht
On Oc1a Timer1serv
On Oc1b Timer2serv
Enable Oc1a
Enable Oc1b
Enable Interrupts
Do
Loop
Timer1serv:
Ocr1a = Ocr1a + 220 'nächster Interrupt nach 220 * 0,004096s = 0,90112s (1,097Hz)
'.
'LEDs schalten
Return
Timer2serv:
Ocr1b = Ocr1b + 218 'nächster Interrupt nach 218 * 0,004096s = 0,892928s (1,1199Hz)
'.
'LEDs schalten
Return
OCR1A und B werden überlaufen, wenn die Addition über 255 hinausgeht. Das ist gewollt, da das TCNT zu den OCR1x Registern trotzdem immer die gleiche Zeit benötigt. Tritt bei 250 ein Compare-Interrupt auf, wird zu 250 eine zB 220 addiert. Im Register steht dann wg Überlauf 214. TCNT muß von 250 bis 255 über 0 nach 214 laufen - Zeitabstand gewahrt. Schön im Simulator zu betrachten.
Gruß
Searcher
PS Bitte gezielt fragen, da ich nicht weiß welche Voraussetzungen du hast.
Hier noch eine Seite in Deutsch, wenn Datenblatt Englisch ein Problem ist:
http://halvar.at/elektronik/kleiner_bascom_avr_kurs
Lesezeichen