Hallo,
ich hab ein Led-Pattern
const uint8_t pattern PROGMEM = {0, 255, 255, 0, 255, 255, 0, 0};
welches ich an einer Funktion übergeben möchte. Angesteuert werden damit
2 Leds. Bekomme das irgendwie nicht hin.
>Bekomme das irgendwie nicht hin.
Das ist höchst bedauerlich.
Wenn Du allerdings Hilfe erwartest, solltest Du das Ist- und
Sollverhalten genauer beschreiben.
Wolltest Du vielleicht statt
>step++;
nicht eher
step += 2;
schreiben?
So, hab noch ein bisschen getüfftelt.
Jedoch habe ich noch ein paar Probleme. Zum einen meckert der Compiler
'__progmem__' attribute ignored
Des weiteren kann ich mit sizeof(pattern) nicht die Größe auslesen.
Ergebnis ist immer 1.
Bei der Übergabe an die Funktion wird ein Array zu einem ordinären
Pointer. Du musst also die Größe in main berechnen und mit übergeben.
http://c-faq.com/aryptr/index.html
Heribert B schrieb:> Des weiteren kann ich mit sizeof(pattern) nicht die Größe auslesen.> Ergebnis ist immer 1.
Das sind absolute C-Grundlagen. Wenn das in deinem Tutorial/Buch nicht
drin steht, dann entsorge dies und bedenke, dass da noch mehr
Fehlinformationen drin sind.
Heribert B schrieb:> func(pattern);>> void func(const uint8_t *pattern)
Bei der Deklaration sollte der Rückgabetyp mit angegeben werden, da
sonst implizit int angenommen wird.
Desweiteren ist der Paramtername egal. Der Typ ist wichtig.
(Der Name hilft aber etwas als Dokumentation (wenn er gut gewählt ist)
void func(const uint8_t *pattern);
Heribert B schrieb:> So, hab noch ein bisschen getüfftelt.
Verwende bitte in Zukunft die passenden Tokens um den C-Code (wie knapp
über der Edit-Box beschrieben):
Da Du Deiner Funktion nun einen Pointer auf ein Element bekannter Größe
übergeben kannst, kann innerhalb der Funktion auch der Compiler selbst
die korrekte Schrittweite der Pointer bestimmen:
1
voidblubb(consttPATTERN*pattern){
2
staticnpat=0;
3
4
ledvalue1=pgm_read_byte(&pattern[step]->pattern);
5
ledvalue2=pgm_read_byte(&pattern[step]->value);
6
7
step++;
8
if(step==PATTERNS)step=0;
9
}
Ich persönlich finde, dass man gerade als Anfänger erst einmal
ausführliche structe ausdenken und diese dann konsequent verwenden
sollte, bevor man Assembler-artigen Code schreibt, den man selbst nach
ein paar Tagen Pause nicht mehr versteht.
Außerdem bitte hier im Wiki noch mal nachlesen, einige dieser
pgm_read_byte sind eventuell nicht mehr nötig, weil moderne AVRGCC
Versionen das im Hintergrund erledigen können.
Das grundlegendste Problem an diesem Stück Code ist, daß dem Array die
[] fehlen.
> Des weiteren kann ich mit sizeof(pattern) nicht die Größe auslesen.> Ergebnis ist immer 1.
Siehe oben.
@ Heribert B (Gast)
>const uint8_t pattern PROGMEM = {0, 255, 255, 0, 255, 255, 0, 0};>welches ich an einer Funktion übergeben möchte. Angesteuert werden damit>2 Leds. Bekomme das irgendwie nicht hin.
Wenn man schon einen aktuellen Compiler hat (Atmelstudio mit avr gcc?),
dann kann man es auch ein wenig komfortabler machen.
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_flash_und_Embedded-C