Hallo!
Erstmal vielen Dank fuer die Antworten!!!
Ja, meine Schreibweise ist etwas unueblich. Ich bin mir mit den
Bitoperationen in C (noch) nicht so sicher... bin gerade nach sehr sehr
viel Assembler auf C umgestiegen mit AVR GCC...
Also: Ich habe folgendes Anliegen:
Der ATmega168 laeuft mit 8 MHz. Ich benoetige den 16bit Timer allerdings
fuer zwei verschiedene Aufgaben gleichzeitig. Einmal eine PWM mit 12 bit
Aufloesung und einmal muss ich einen definierten Takt mit ca. 4 kHz an
einem Portpin erzeugen. Die 8bit Timer haben eine zu schlechte
Aufloesung in meinem Falle. Ich mache also beides mit dem 16bit Timer1.
Ich habe den 16bit-Timer1 nun so konfiguriert, dass er im Fast-PWM-Mode
laeuft und dass TOP = ICR1 ist. Im Register ICR1 habe ich den Wert 4095
stehen, entsprechend 12bit PWM Aufloesung. Der Timer zehlt also immer
schoen brav bis 4095 und beginnt dann wieder bei 0. Die PWM erzeuge ich
mit dem OCR1A Compare Register. Funktioniert wunderbar. Kann ich mit dem
Oszilloskop am Pin sehen.
Nun habe ich noch den Interrupt fuer das Compare Register OCR1B
aktiviert.
Diese ISR wird auch aufgerufen. Und zwar mit einer Frequenz von 8 MHz /
4096 = 2000 mal pro Sekunde. Bis jetzt ist also noch alles in Ordnung.
Nun moechte ich aber diese ISR mit einer hoeheren Frequenz aufrufen als
2000 mal pro Sekunde, denn ich will mit Ihr den 4kHz Takt an einem
Portpin ausgeben. Dazu moechte Ich in der ISR das Register OCR1B
veraendern, so dass diese ISR noch ein weiteres mal aufgerufen wird
bevor der Timer wieder bei 0 beginnt.
Dazu habe ich folgende (eigentlich elegante) Idee:
volatile uint16_t variable;
volatile uint16_t definierter_wert;
ISR (TIMER0_COMPB_vect)
{
variable = OCR1B;
variable += definierter_wert;
if(variable > 4095) // auf Ueberlauf testen da timer auf 12bit begrenzt
{
variable = variable - 4095; // den Ueberlauf beruecksichtigen
}
OCR1B = variable;
}//ISR
Ich probiere das seit heute morgen zum laufen zu kriegen, aber es geht
einfach nicht. Ich weiss auch nicht so genau was der GCC Compiler alles
macht und was nicht, da ich wenig C Erfahrung habe. Die ISR wird
weiterhin mit nur einer Frequenz von 2000 mal pro Sekunde aufgerufen.
Trotz der Veraenderung der Register OCR1BH und OCR1BL.
Vielen Dank fuer Tips!!
Frederick.