Hallo, folgenden Code habe ich für den Attiny2313 geschrieben. a ist die Laufvariable, die bei jedem Timerinterrupt inkrementiert wird. Solange sie kleiner als b ist, sollen die LEDs an PORTB leuchten. Immer, wenn sich a überschlägt, wird b hochgezählt. Wenn b am Ende (0xFF) ist, soll es wieder bis 0 runterzählen. Das Ganze soll die LEDs an Port B pulsieren lassen. Leider regt sich da an Port B aber gar nichts....Hat wer eine Idee? (Ich möchte nur perifer wissen, was man besser machen könnte; mich interessiert wirklich, wo der Fehler hier stecken mag) Danke! #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <stdint.h> uint8_t a, b,c; int main () { DDRB =0xFF; PORTB= 0x00; TCCR0A = 0x00; TCCR0B = 0x03; TIMSK = 0x2; b = 0; a = 0; c = 0; while (1) { sleep_enable(); sei(); sleep_cpu(); sleep_disable(); } } ISR(TIMER0_OVF_vect) { a++; if (a < b) { PORTB = 0xFF; } else { PORTB = 0x00; } if (a == 0xFF) { if (c == 0) { b++; } else { b--; } if (b==0) { c = 0; } if (b==0xFF) { c = 1; } } reti(); }
Den Sleep-Code habe ich mal weggelassen. Ich sehe noch nicht, wie du aus dem Tiefschlaf überhaupt hochkommen willst. Die ISR Logik habe ich nach deinen Kommentaren umgeschrieben, um es zu verstehen. Bei 1 Mhz Taktquelle werden die LED zum ersten Mal nach 4,2s angeschaltet. Dann bleiben sie 16,4 ms an und gehen wieder aus. Nach 4,2s gehen sie wieder an... die folgenden Zeiten habe ich nicht überprüft. Praktisch habe ich den Blinkcode für zwei active-high LEDs an PD5 und PD6, so wie auf dem Pollin Funk AVR Evaluationsboard, umgeschrieben. Bei 8 MHz blinken die LEDs recht munter und mit unterschiedlichen, variierenden Leuchtzeiten.
1 | /*
|
2 | MCU: Attiny2313
|
3 | F_CPU: ?
|
4 | */
|
5 | |
6 | #include <avr/io.h> |
7 | #include <avr/interrupt.h> |
8 | #include <avr/sleep.h> |
9 | #include <stdint.h> |
10 | |
11 | uint8_t a; |
12 | uint8_t b; |
13 | |
14 | int main (void) |
15 | {
|
16 | #if 1
|
17 | DDRD |= (1<<PD5) | (1<<PD6); |
18 | PORTD &= ~(1<<PD5); |
19 | PORTD |= (1<<PD6); |
20 | #else
|
21 | DDRB = 0xFF; |
22 | PORTB = 0x00; // LEDs AUS |
23 | #endif
|
24 | |
25 | TCCR0A = 0x00; |
26 | TCCR0B = 0x03; |
27 | TIMSK = 0x2; |
28 | sei(); |
29 | |
30 | while (1) |
31 | {
|
32 | #if 0
|
33 | /*
|
34 | Soweit sind wir noch nicht.
|
35 | Zuerst muss der Timer anständig laufen
|
36 | dann kann man sich Gedanken ums Schlafen
|
37 | und Aufwecken (!) machen.
|
38 | */
|
39 | sleep_enable();
|
40 | sei();
|
41 | sleep_cpu();
|
42 | sleep_disable();
|
43 | #endif
|
44 | }
|
45 | }
|
46 | |
47 | ISR(TIMER0_OVF_vect) |
48 | {
|
49 | static int8_t c; |
50 | |
51 | // a ist die Laufvariable, die bei jedem
|
52 | // Timerinterrupt inkrementiert wird.
|
53 | a++; |
54 | |
55 | // Solange a kleiner als b ist,
|
56 | // sollen die LEDs an PORTB leuchten.
|
57 | if (a < b) |
58 | {
|
59 | #if 1
|
60 | PORTD |= (1<<PD5); |
61 | PORTD &= ~(1<<PD6); |
62 | #else
|
63 | PORTB = 0xFF; // alle LEDs AN |
64 | #endif
|
65 | }
|
66 | else
|
67 | {
|
68 | #if 1
|
69 | PORTD &= ~(1<<PD5); |
70 | PORTD |= (1<<PD6); |
71 | #else
|
72 | PORTB = 0x00; // alle LEDs AUS |
73 | #endif
|
74 | }
|
75 | |
76 | // Immer, wenn sich a überschlägt,
|
77 | // wird b hoch- bzw. runtergezählt.
|
78 | if (a == 0xFF) |
79 | {
|
80 | // Wenn b am Ende (0xFF) ist,
|
81 | // soll es wieder bis 0 runterzählen.
|
82 | if (b == 0x00) |
83 | c = 1; |
84 | else if (b == 0xFF) |
85 | c = -1; |
86 | b += c; |
87 | }
|
88 | }
|
Blinker wrote: > > Leider regt sich da an Port B aber gar nichts....Hat wer eine Idee? > a, b, c musst du schon volatile machen...
Justus Skorps wrote:
> a, b, c musst du schon volatile machen...
Nö, da gibt es (zumindest in Blinkers originalem Programm) keinen Anlass
für. Die Variablen werden da nur in der ISR verwendet (mal abgesehen von
der überflüssigen Initialisierung auf Null in main).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.