Verwendeter MC: ATtiny2313
Das ganze soll eine sehr einfache SW PWM geben, ich weiß man könnte es
auch mit dem PWM mode machen und einfach die OCx Pins nehmen, aber ich
will es so und es müsste meiner Meinung nach auch so funktionieren?
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | #define F_CPU 8000000L // Systemtakt in Hz
|
5 |
|
6 | volatile uint16_t t0_ovf_cnt=0; // zähler der T0 Überläufe
|
7 |
|
8 |
|
9 | ISR(TIMER0_COMPA_vect)
|
10 | {
|
11 | PORTD|=(1<<PD5); //beim Vergleichswert LED einschalten
|
12 | }
|
13 |
|
14 | ISR(TIMER0_OVF_vect)
|
15 | {
|
16 | t0_ovf_cnt++; //zähler hochzählen
|
17 | PORTD=0x00; //beim Überlauf LED ausschalten
|
18 | }
|
19 |
|
20 |
|
21 | //Compare Wert Register : OCR0A u. B
|
22 | // Aktueller Zählerstand von T0: TCNT0
|
23 |
|
24 | //TCCR0B prescaler 0 ="1" 1024="5"
|
25 | //TIMSK "INterrupts" bits OCIE0A und OCIE0B
|
26 |
|
27 |
|
28 |
|
29 | int main()
|
30 | {
|
31 |
|
32 | TCCR0B|=3; //Prescaler
|
33 | TIMSK |= (1<<OCIE0A|1<<OCIE0B|1<<TOIE0); //OUtputcompare interrupts und ovf
|
34 |
|
35 | DDRD |= 0x7F; //Ports als Ausgänge schalten
|
36 | // =1111111 (nur 7 einser, da es nur bis PD6 geht)
|
37 |
|
38 | OCR0A=230;
|
39 |
|
40 | sei();
|
41 |
|
42 |
|
43 |
|
44 |
|
45 | while(1)
|
46 | {
|
47 | if (t0_ovf_cnt>=500) // Nach 500 PWM Durchläufen
|
48 | {
|
49 | PORTD^=(1<<PD5); // PIN D5 Toggeln
|
50 | }
|
51 | }
|
52 |
|
53 |
|
54 |
|
55 | return 0;
|
56 |
|
57 |
|
58 |
|
59 | }
|
Hab das ganze schon im Atmelstudio laufen lassen und festgestellt, dass
sobald der zähler auf 1 gesetzt wurde nach der 2. oder 3. If abfrage der
zähler einfach so wieder auf 0 gestellt wird. Ich verstehe aber einfach
nicht warum. Vielleicht könnt ihr mir ja helfen.
mfg Jo