Hallo zusammen
Ich habe eine kleine Applikation welche ein sich ständig änderndes
PWM-Signal zur Generierung einer Melodie mit einem Buzzer generiert.
Doch bei ersten Tests mit meinem PWM-Generierungs-Ablauf habe ich einen
Effekt welchen ich mir nicht erklären kann.
Ich arbeite mit einem Attiny85, welcher mit 8MHz läuft.
Den Timer0 habe ich mit einem Prescaler von 1024 intialisiert und werde
den Overflow-Interrupt aus, welchen ich bei jeweils 30 Überläufen zum
setzen einer LED verwende.
Wenn ich das ganze nun durchrechne müsste dies bei 30 Overflows eine
Frequenz von 1Hz geben.
T = 1s/8000000Hz ) = 0.0000000125 s
T mit Prescaler = 0.0000000125s * 1024 = 0.000128s
T Überlauf = 0.000128s*256 = 0.032768
Dies gibt pro Sekunde 30 Überläufe.
Wenn ich dies so lade, ist es so dass die LED etwa 1 mal alle 8 Sekunden
blinkt.
Die Fuses sind folgendermassen eingestellt:
low = D2
high = DF
ext = FF
Der interne Teiler ist also nicht aktiviert.
Hier der entsprechende Code
1 | #include <avr/io.h>
|
2 | #include <stdio.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | volatile char iPwm_value = 0;
|
6 | volatile int bOn = 0;
|
7 |
|
8 | // --- main routine ---
|
9 |
|
10 | int main(){
|
11 |
|
12 | // --- define IO's ---
|
13 | // Out
|
14 | DDRB = (1<<PB4);
|
15 |
|
16 | // Timer settigs
|
17 | TCCR0B |= ((1<<CS00)|(1<<CS02));
|
18 | TIMSK |= (1<<TOIE0);
|
19 | sei();
|
20 |
|
21 | PORTB |= (1<<PB4); // active low LED aus
|
22 |
|
23 | // main-loop
|
24 | while( 1 ) {
|
25 |
|
26 | }
|
27 |
|
28 | return 1;
|
29 | }
|
30 |
|
31 | ISR (TIMER0_OVF_vect)
|
32 | {
|
33 |
|
34 | if (iPwm_value==30){
|
35 | if (bOn ==0){
|
36 | PORTB &= ~(1<<PB4); // active low LED an
|
37 | bOn = 1;
|
38 | }else{
|
39 | PORTB |= (1<<PB4); // active low LED aus
|
40 | bOn = 0;
|
41 | }
|
42 | }
|
43 | iPwm_value++;
|
44 |
|
45 | }
|
An was kann das noch liegen? Hat jemand eine Idee?
Danke für die Hilfe und Gruss
Hafisch