Forum: Compiler & IDEs wie compiliere ich richtig - altes Projekt anpassen - PowerLED Tiny85


von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

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ß

von Falk B. (falk)


Lesenswert?

@ 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.

von Christian S. (roehrenvorheizer)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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

von Christian S. (roehrenvorheizer)


Lesenswert?

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
Noch kein Account? Hier anmelden.