Was treibst du da?
1 | unsigned int lowNumber = ADCL >> 6;
|
2 | unsigned int number = ADCH << 2;
|
3 |
|
4 | number += lowNumber;
|
wenn du sowieso Zahlen von 0 bis 1023 vom ADC willst, dann lass doch
ADLAR in Ruhe und lies den ADC Wert ganz einfach durch lesen von ADCW
aus.
fertig. (ADLAR wegnehmen nicht vergessen).
Bis jetzt hab ich noch keinen wirklich vernnftigen Fall gesehen, an dem
man einen ADC mittels Interrupt auslesen muss. OK, das mag es geben,
wenn man wirklich schnell operieren muss. Aber für alles, wo ein
Benutzer am Poti dreht, ist 10 oder 20 mal in der Sekunde schnell genug.
Aber dein Problem ist ein anderes.
Du stellst den CTC Modus am Timer ein.
Wenn du mal die Modus Tabelle im Datenblatt studierst, dann stellst du
fest, dass es da eine Spalte mit dem Titel 'Update of OCR1x' gibt. Beim
CTC Modus steht da Immediate.
Und genau da liegt dein Problem.
Denn wenn der Timer zb gerade einen Zählerstand von zb 800 hat (bei
einem OCR1A Wert von zb 1000) und du weist dem OCR1A Register einen
neuen Wert von 500 zu, dann bedeutet das, dass du in diesem
Timer-Durchlauf keinen Compare Match mehr haben wirst. Denn die
vorherigen 1000, auf die der Timer bei einem Stand von 800 gelaufen
wäre, die gibt es ja nicht mehr. Und die neu zugewiesenen 500, die
wurden bereits verpasst. Der Zählerstand ist ja bereits 800.
Das heißt aber auch, dass der Timer jetzt bis 65537 hoch zählen muss,
ehe dann der Überlauf auf 0 kommt, der Timer also wieder von vorne
anfängt und es dann irgendwann mal zum Compare Match mit den 500 kommt.
Und das dauert bei dir eben ein paar Sekunden.
In so einem Fall benutzt man einen der PWM-MOdi, auch wenn man nicht auf
die PWM an sich aus ist und daher den entsprechenden Pin nicht mit dem
Timer koppelt. PWM Modus einfach nur aus dem Grund, weil dann der Update
des OCR1A Registers von der Hardware mit der Timeroperation
synchronisiert wird. Weißt du dem OCR1A einen Wert von 500 zu, dann wird
der nicht sofort aktiv, sondern erst dann wenn der Timer seinen
Höchststand erreicht hat. Bis dorthin gilt noch der alte Wert.
Bei dir würde sich dann eben der Modus 15 anbieten. Schaltest du keinen
Pin für die PWM frei, dann funktioniert der genau wie der jetzt von die
benutzte CTC Modus. Nur mit dem einen kleinen, aber wichtigen,
Unterschied, dass die Zuweisung an OCR1A von der Hardware mit der
Zähloperation des Timers synchronisiert wird. Eine Zuweisung an OCR1A
wird erst wirksam, wenn der Zählerstand des Timers 0 ist.