Hallo allerseits, angeregt durch diesen Beitrag "PowerLED PWM mit RC5 Fernbedienung" Beitrag "PowerLED PWM mit RC5 Fernbedienung" habe ich die Schaltung nachgebaut mit einem ATTiny85 und erfreue mich an dessen Funktion sofern ich die beigefügte hex-Datei direkt ins Flash lade. Inzwischen wollte ich das Programm etwas abändern und noch eine serielle Ausgabe an dem freien Pin hinzufügen, um einzelne Register-Inhalte anzeigen zu lassen. Mir gelingt es jedoch nicht, auch nur die ORIGINALEN Dateien in eine hex-Datei zu verwandeln, die korrekt läuft. Die LED bleibt in der niedrigsten Dimmstufe, dimmt nicht automatisch hoch und reagiert auch nicht auf RC5-Signale. Am PWM-Ausgang sieht man eine PWM, die der niedrigen LED-Leuchtstärke entspricht, also kommen dort 125 kHz heraus. die in der Hauptschleife hinzugefügte serielle Ausgabe lief auch nicht. Es scheint als ob die Hauptschleife nicht laufen würde. Einige zitate aus dem Beitrag: "Da fehlt ein volatile bei rc5_data. Mit (ganz) früheren gcc-Versionen funktionierte das auch so mit eingeschalteter Optimierung, die neueren optimieren gnadenlos alles weg." "Mit den defines habe ich so meine Schwierigkeiten, was wo wie definieren, damit der Compiler nicht meckert. Peter hat rc5_data als external in der RC5.h definiert. Das müsste dann wohl raus und die volatile def in der RC5.c definiert werden." rc5.c: [c]volatile uint rc5_data;[c] rc5.h: [c]extern volatile uint rc5_data;[c] Ich benutze AVR-Studio 4.18 mit AVRGCC 20100110. Build-Ausgabe (-Os): rm -rf P_LED.o rc5.o LED2.elf dep/* LED2.hex LED2.eep LED2.lss LED2.map Build succeeded with 0 Warnings... avr-gcc -mmcu=attiny85 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT P_LED.o -MF dep/P_LED.o.d -c ../P_LED.c avr-gcc -mmcu=attiny85 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT rc5.o -MF dep/rc5.o.d -c ../rc5.c avr-gcc -mmcu=attiny85 -Wl,-Map=LED2.map P_LED.o rc5.o -o LED2.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature LED2.elf LED2.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex LED2.elf LED2.eep || exit 0 avr-objdump -h -S LED2.elf > LED2.lss AVR Memory Usage ---------------- Device: attiny85 Program: 854 bytes (10.4% Full) (.text + .data + .bootloader) Data: 37 bytes (7.2% Full) (.data + .bss + .noinit) Build succeeded with 0 Warnings... _____________________________ Habe mal die Tipps berücksichtigt und die Optimierung abgeschaltet (-O0): rm -rf P_LED.o rc5.o LED2.elf dep/* LED2.hex LED2.eep LED2.lss LED2.map Build succeeded with 0 Warnings... avr-gcc -mmcu=attiny85 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT P_LED.o -MF dep/P_LED.o.d -c ../P_LED.c avr-gcc -mmcu=attiny85 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -O0 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT rc5.o -MF dep/rc5.o.d -c ../rc5.c avr-gcc -mmcu=attiny85 -Wl,-Map=LED2.map P_LED.o rc5.o -o LED2.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature LED2.elf LED2.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex LED2.elf LED2.eep || exit 0 avr-objdump -h -S LED2.elf > LED2.lss AVR Memory Usage ---------------- Device: attiny85 Program: 1326 bytes (16.2% Full) (.text + .data + .bootloader) Data: 37 bytes (7.2% Full) (.data + .bss + .noinit) Build succeeded with 0 Warnings... Das Programm ist wesentlich größer, jedoch wird die PWM durchlaufen. Die Hauptschleife scheint zu gehen. Ohne Optimierung bringt aber das delay für die serielle Ausgabe Fehlermeldungen: #ifndef _OPTIMIZE_ # warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" #endif ____________________ Kann mir da bitte jemand weiter helfen? Im Anhang die Quelldateien. mit freundlichem Gruß
@ Christian S. (roehrenvorheizer) >"Da fehlt ein volatile bei rc5_data. Mit (ganz) früheren gcc-Versionen >funktionierte das auch so mit eingeschalteter Optimierung, die neueren >optimieren gnadenlos alles weg." Sieht so aus. Es fehlen auch noch mehr volatiles. JEDE Variable, auf welche sowohl in der ISR als auch im Hauptprogramm zugegriffen wird, MUSS volatile sein. Siehe Interrupt. Ramp muss auch volatile sein. >"Mit den defines habe ich so meine Schwierigkeiten, was wo wie >definieren, damit der Compiler nicht meckert. Peter hat rc5_data als >external in der RC5.h definiert. Das müsste dann wohl raus und die >volatile def in der RC5.c definiert werden." Mit defines hat das nix zu tun. Das ist ein define
1 | #define MY_DEFINE PORTA=0;
|
Du meinst Definitionen, klingt sehr ähnlich, ist aber anders. >rc5.c: >[c]volatile uint rc5_data;[c] >rc5.h: >[c]extern volatile uint rc5_data;[c] Genau so. >Ich benutze AVR-Studio 4.18 mit AVRGCC 20100110. Me too! >Device: attiny85 >Program: 854 bytes (10.4% Full) >(.text + .data + .bootloader) >Data: 37 bytes (7.2% Full) >(.data + .bss + .noinit) Ich komme auf 1158 Bytes Flash >Das Programm ist wesentlich größer, jedoch wird die PWM durchlaufen. Die >Hauptschleife scheint zu gehen. Weil ALLE Zugriffe ohne Optimierung laufen.
Hallo Falk, vielen Dank für's Helfen! Die Variable "ramp" brauchte noch ein "volatile" in RC5.c. Nun geht das Programm mit anschwellender PWM und RC5-Steuerung wieder. Nur bleibt von meiner seriellen Ausgabe keine Spur zu sehen am Ausgang. Die serielle Ausgabe habe ich zuvor erfolgreich separat getestet ohne PWM und ohne RC5. Bin noch am Suchen nach dem Fehler. mit freundlichem Gruß
Dann schau dir insbesonder mal die Pinzuordnungen deiner seriellen AUsgabe an. Wenn ich mich an deinen define orientiere, dann liegen RC5 und Serielle am gleichen Pin. Und das das nichts wird, dürfte klar sein.
1 | #define xRC5_IN PINB
|
2 | #define xRC5_OUT PORTB
|
3 | #define xRC5_DDR DDRB
|
4 | #define xRC5 PB0 // IR input low active
|
1 | #define Ausgang_DDR DDRB
|
2 | #define Ausgang_PORT PORTB
|
3 | #define Ausgang_PORTPIN PB0
|
Oooooops, hatte den falschen Portpin eingestellt. Jetzt geht alles!
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.