Hallo zusammen,
ich habe folgendes Problem:
Und zwar möchte ich mit einem 16-Bit Timer einen Impulszähler
realisieren.
Solange die Impulse nicht gleich der Zahl, die im OCR1A-Register steht
sind, soll der Ausgang OC1A (an dem derzeit eine LED hängt) HIGH-Level
haben. Sobald der Timer den Compare Match registriert soll OC1A auf
LOW-Level gehen.
Als uC verwende ich einen ATmega16 mit 16MHz externen Oszilator.
Als Impulsgeber nutze ich derzeit einen entprellten Taster.
Hierzu der Code:
1 | int main()
|
2 | {
|
3 | DDRD |= (1 << PD5); // PORT PD5 (LED) als Ausgang
|
4 | PORTD |= (1 << PD5); // LED an
|
5 |
|
6 | OCR1A = 9; // Ereignis nach 10 Impulsen auslösen
|
7 | TCCR1A |= (1 << COM1A1); // OC1A aus bei Vergleichwert
|
8 | TCCR1B |= (1 << CS10) | (1 << CS11) | (1 << CS12); // External Clock an T1, steigende Flanke (PB1)
|
9 |
|
10 |
|
11 |
|
12 | while (1); // endlos
|
13 | return 0;
|
14 | }
|
Leider bleibt die LED aber immer aus.
Ich habe die Logik einmal umgekehrt, so das erst keine LED leuchtet und
nach 10 Impulen die LED leuchtet. Dies funktioniert einwandfrei.
Hierzu noch der Code mit umgekehrter Logik.
1 | int main()
|
2 | {
|
3 | DDRD |= (1 << PD5); // PORT PD5 (LED) als Ausgang
|
4 | PORTD &= ~(1 << PD5); // LED aus
|
5 |
|
6 | OCR1A = 9; // Ereignis nach 10 Impulsen auslösen
|
7 | TCCR1A |= (1 << COM1A1) | (1 << COM1A0); // OC1A ein bei Vergleichwert
|
8 | TCCR1B |= (1 << CS10) | (1 << CS11) | (1 << CS12); // External Clock an T1, steigende Flanke (PB1)
|
9 |
|
10 |
|
11 |
|
12 | while (1); // endlos
|
13 | return 0;
|
14 | }
|
Ich komme nicht drauf woran es liegen könnte.
Vllt hatte ja jemand von euch schon einmal das selbe Problem oder sieht
meinen Fehler, den ich wohl übersehe.
Schon mal Danke im Vorraus
MFG
Julian