Hallo,
ich brauche einen 500kHz Tackt um damit ein Display anzusteuern.
Nachdem das ganze nicht funktioniert hat, hab ich das Programm mal
zerpflückt (restliche Programmteile entfernt) und etwas komisches beim
Timer festgestellt.
Ich hab nen At90CAN128 mit 16MHz
1 | #ifndef __AVR_AT90CAN128__
|
2 | #define __AVR_AT90CAN128__
|
3 | #endif
|
4 |
|
5 | #include <avr/interrupt.h>
|
6 | #include <avr/io.h>
|
7 | #include <stdio.h>
|
8 |
|
9 | unsigned long test = 0;
|
10 | int test2= 0;
|
11 |
|
12 | int main( void )
|
13 | {
|
14 | sei();
|
15 |
|
16 | DDRB = 0x07;
|
17 | PORTB = 0x02;
|
18 |
|
19 | //125Hz
|
20 | // OCR0A = 0x7D; // 0x7D = 124 & Prescaler 1024 => 125Hz
|
21 | // TCCR0A = (1<<CS02) | (1<<CS00) | (1<<WGM01);
|
22 | // TIMSK0 |= (1<<OCIE0A);
|
23 |
|
24 | //500kHz
|
25 | OCR0A = 0x1F; // 0x1F = 31 bei Prescaler 1 => 500kHz
|
26 | TCCR0A = (1<<CS00) | (1<<WGM01);
|
27 | TIMSK0 |= (1<<OCIE0A);
|
28 |
|
29 | //500kHz
|
30 | // OCR0A = 0x03; // 0x03 = 03 bei Prescaler 8 => 500kHz
|
31 | // TCCR0A = (1<<CS01) | (1<<WGM01);
|
32 | // TIMSK0 |= (1<<OCIE0A);
|
33 |
|
34 | while(1)
|
35 | {
|
36 | }
|
37 |
|
38 | }
|
39 |
|
40 | ISR(TIMER0_COMP_vect){
|
41 |
|
42 | if (test == 500000){
|
43 | if(test2){
|
44 | test2 = 0;
|
45 | PORTB |= (1<<PIN2); //Led an
|
46 | }else{
|
47 | test2 = 1;
|
48 | PORTB &= ~(1<<PIN2);
|
49 | }
|
50 | test = 0;
|
51 | }
|
52 | test++;
|
53 |
|
54 | }
|
verwende ich ihn mit 125Hz und lasse test nur bis 125 zählen, dann
leuchted die LED, für eine Sekunde - so weit so gut.
stelle ich aber wie im Code auf 500kHz dann leuchted sie fast 3 sek.
kann mir das jemand erklären?
ach ja welche der beiden 500kHz varianten würdet ihr bevorzugen (ändert
nichts an meinem Problem)?
Danke,
Michi