Hallo, ich arbeite an einem kleinen LED Dimmer Projekt. Naja, mittlerweile ist es nicht mehr so klein. Bis heute hat alles einwandfrei funktioniert, bis ich die Funktion für das Faden eines Wertes auf einen beliebigen anderen in einer beliebigen Zeit von nur einer LED auf alle verfügbaren ausgebaut habe. Zuerst hat sich der µC nach der Initialisierung der USB Schnittstelle resetet, bzw. ist zum Start zurück gesprungen und hat von vorne begonnen. Dann habe ich alle USB Teile auskommentiert. Jetzt arbeitet der µC fast richtig. Es wird regelmaeßig durch eine Timer Overflow die Variabe next von false auf true gesetzt. Dann soll Hauptprogramm in der Endlosschleife durch das Freigabesignal, also next=true, durch eine if-Bedingung der Helligkeitswert einer LED veraendert werden. Aber die Zeile wird ignoriert, und der µC faengt am anfang der endlosschleife wieder an. Der Compiler arbeitet mit der optimierungsstufe s, aber auch ohne optimierung tritt der fehler noch auf. wodurch kann so ein Fehler hervorgerufen werden und wie kann man das vermeiden? ich freue mich über jede hilfreiche antwort. delicious_cake
je nach USB Implementierung ist es eine Software USB geschichte wird vlt die ISR irgendwo blockiert da der AVR keine ISR Prioritäten kennt kann das auch mal in die hose gehen .. deine next variable ist aber hoffentlich eine
1 | volatile unsigned char next; |
und häng deinen quellcode mal an ...
mein µC ist ein AT90USB162 und arbeitet mit dem LUFA USB Stack als USB HID. die Variable next ist global als bool definiert. so hat es jetzt ja schon die ganze zeit funktioniert.
Hier ist ausschnittsweise mein code. nicht alles ist zur veröffentlichung gedacht
1 | bool next = false; |
2 | |
3 | ISR(TIMER0_COMPA_vect) |
4 | {
|
5 | next = true; |
6 | }
|
7 | |
8 | //PWM nach mikrocontroller.net
|
9 | ISR(TIMER1_COMPA_vect) |
10 | {
|
11 | /*PWM ROUTINE*/
|
12 | }
|
13 | |
14 | void init_led_hw(void) |
15 | {
|
16 | //Init Clock
|
17 | CLKPR = 0x80; //Freischalten des CLKPR Clock Prescaler Registers |
18 | CLKPR = 0x00; //Ausschalten der Clockteilung |
19 | |
20 | |
21 | SET_BIT(LATCHDDR, 2);// DDRC = 0x04; /* Pin 2 von Port C auf Output schalten */ |
22 | SET_BIT(LATCH, 2); //PORTC = 0x04; /* Pint 2 von Port C auf high schalten um das Latch durchzuschalten */ |
23 | |
24 | LEDS1_OFF; //turn off the LEDs on PORT1 |
25 | LEDS2_OFF; //turn off the LEDs on PORT2 |
26 | |
27 | LED_PORT1_DDR |= 0xFF; //set led port 1 as output |
28 | LED_PORT2_DDR |= 0xFF; //set led port 2 as output |
29 | |
30 | |
31 | //Timer0 in Normal Mode (count from 0 to 255, reset, count from 0 to 255, ...)
|
32 | TCCR0A = TIMER0_CTC_INIT; |
33 | TCCR0B = TIMER_CLOCKSPEED_1024; |
34 | OCR0A = 249; |
35 | TIMSK0 |= (1 << OCIE0A); |
36 | |
37 | //Timer1 in Normal Mode (count from 0 to 65535, reset, count from 0 to 65535, ...)
|
38 | TCCR1A = TIMER1_NORMAL_16_INIT; |
39 | TCCR1B = TIMER_CLOCKSPEED_FULL; |
40 | |
41 | TIMSK1 |= (1 << OCIE1A); |
42 | }
|
43 | |
44 | |
45 | |
46 | int main(void) |
47 | {
|
48 | //lokale Variablen für das LED-Fading FADE_LED
|
49 | int t[PWM_CHANNELS], i=0; |
50 | unsigned char ticker[PWM_CHANNELS], sekundentimer[PWM_CHANNELS], steps_done[PWM_CHANNELS]; |
51 | |
52 | //LUFA initialization
|
53 | //SetupHardware();
|
54 | //LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
|
55 | |
56 | //LED Dimmer initialization
|
57 | init_led_hw(); |
58 | sei(); |
59 | |
60 | fade_init(0, 255, 3); //led0, zielhelligkeit 255, dauer des fades: 3 sek |
61 | fade_init(1, 255, 5); //led1, zielhelligkeit 255, dauer des fades: 5 sek |
62 | fade_init(2, 255, 10);//led2, zielhelligkeit 255, dauer des fades: 10 sek |
63 | |
64 | pwm_update(); |
65 | |
66 | |
67 | //MAIN PROGRAMM
|
68 | for (;;) |
69 | {
|
70 | //HID_Device_USBTask(&Generic_HID_Interface);
|
71 | //USB_USBTask();
|
72 | |
73 | if(next == true) |
74 | {
|
75 | next=false; |
76 | |
77 | for (i=0;i<PWM_CHANNELS;i++) |
78 | {} //end for |
79 | pwm_update(); |
80 | } //end if |
81 | } //end endless for |
82 | } //end void |
delicious_cake schrieb: > Hier ist ausschnittsweise mein code. nicht alles ist zur > veröffentlichung gedacht Ein LED-Fader? Ja, ist schon klar. Ist Hi-Tech
1 | volatile bool next = false; |
weiter schau ich nicht
gut danke. das löst die haelfte meines problems. das andere, bei aktivierter usb schnittstelle besteht weiterhin. ist irgendwie auch klar.
gut danke. das löst die haelfte meines problems. das andere, bei aktivierter usb schnittstelle besteht weiterhin. ist irgendwie auch klar. Karl heinz Buchegger schrieb: > Ein LED-Fader? > Ja, ist schon klar. Ist Hi-Tech immerhin können mehrere über bluetooth kommunizieren und über usb kann mann alle bedienen. (die bluetooth pc programmierung hab ich nohc nicht ganz raus.)
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.