Hallo, ich habe ein Problem mit meiner Schaltung/Programm und finde einfach den Fehler nicht ;-( Eine kleine mit 4,5V batteriebetriebene Schaltung soll bei Tastendruck LED hochdimmem, bei erneutem Tastendruck runterdimmen oder nach ca. maximal 60s von allein wieder runterdimmen falls keine Taste gedrückt wurde. Stromsparend solls auch sein. Anwendung ist eine Beleuchtung für ein Plastikmodell. Jetzt zum Problem: Die Schaltung funktioniert einwandfrei wenn ich den Dragon Programmierer dranhängen habe aber spielt verrückt wenn ich sie vom Dragon trenne. Und das verstehe ich nicht so ganz... Das Programm überspringt nach Tastendruck z.B. manchmal direkt die Abdimmphase oder geht sofort nach dem Aufdimmen aus oder noch verrückter: die LED fängt an zu blinken obwohl in meinem Code nirgendwo ein Blinken programmiert ist... Ich vermute ein Übersprechen des Tastenprellens auf die SPI Schnittstelle oder das evtl. der Interrupt des Aufwachens mehrfach ausgeführt wird und was anstellt, was ich nicht ergründen kann. Vielleicht kann mir jemand Tips geben was an meinem Code verbessert werden kann damit ich das evtl. Softwaremäßig in den Griff bekommen kann. Ansonsten werde ich gleich mal versuchen das Prellen hardwaremäßig zu unterdrücken, vielleicht bringt das ja einen Erfolg. Oder sollten die SPI Kanäle zusätzlich hochohmig geerdet werden? #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/sleep.h>//NEU #include <avr/interrupt.h>//NEU int main (void) { DDRB |= (1 << PB2);//auf 1 setzen => als Ausgang PORTB &= ~((1 << PB2));//auf 0 setzen => LED aus DDRB &= ~((1 << PB1));//als Eingang PORTB |= (1 << PB1);//mit Pullup TCCR0A = (1 << COM0A1)|(1 << WGM00);//phase correct PWM GIMSK |= (1 << PCIE); PCMSK |= (1 << PCINT1); set_sleep_mode(SLEEP_MODE_PWR_DOWN); for(;;) { //in den Power-Down Modus gehen sleep_enable(); sei(); sleep_cpu();//ab hier schlafen und aufwachen sleep_disable(); OCR0A = 0x00; TCCR0B = (1 << CS01);//Clock = CLK/8, Starte PWM //Langsames Hochfahren for(int i=0;i<=40;i+=1) { OCR0A = i; _delay_ms(25); } //Beleuchtungsdauer des Modells = i*_delay_ms for(int i=0;i<=6000;i+=1) { if((PINB&(1 << PB1))==0)break;//bei Tastendruck Ende der Beleuchtungszeit & langsames Abdimmen _delay_ms(10); } //Langsames Runterfahren for(int i=40;i>=0;i-=1) { OCR0A = i; _delay_ms(25); } TCCR0B &= ~((1 << CS02)|(1 << CS01)|(1 << CS00));//Timer aus } } ISR (PCINT_vect) { cli(); }
Ok, das Problem ist gelöst. Die Batterien konnten wohl die PWM Strompulse nicht bieten(waren 17 weiße LEDs parallel an einem FET) und haben den AVR abgewürgt. Habe leider nur ein Multimeter und das sagte alles ok. Ein Stützkondensator von + nach - und die Schaltung tut. Ich nehme an das der Dragon auf der Platine bzw. der PC dahinter genug Kondensatoren verbaut hatte und an der SPI ist ja auch Gnd und Vcc bzw. VTG dran. Darum ging es vorher. Viele Grüße, Lars
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.