Forum: Mikrocontroller und Digitale Elektronik problem: flash pointer übergeben


von Harald (Gast)


Lesenswert?

1
 Codeausschnitt:
2
const uint8_t alpha_table[]PROGMEM={"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?"};
3
const uint8_t hallo[]PROGMEM=  {"HALLO"};
4
const uint8_t welt[]PROGMEM=  {"WELT!"};
5
6
const uint16_t zeichensatz[40][5]PROGMEM=
7
{    
8
{127, 392, 520, 392, 127}, {1023, 529, 529, 297, 198}, ... und noch viele mehr
9
};
10
11
void plott_short_word(uint8_t *field)
12
{
13
  uint8_t found = 0, j = 0;
14
  
15
  for(uint8_t i = 0; i<5;i++)
16
  {
17
    j = 0;
18
    do
19
    {
20
      if((field)==((uint8_t)pgm_read_byte(&alpha_table[j])) || (j==39))
21
      found = 1;
22
      else
23
      j++;
24
    } while (!found);
25
    
26
    field++;
27
    found = 0;
28
    
29
    for(uint8_t m = 0; m<5;m++)
30
    {
31
      output[m+6*i]=(uint16_t)pgm_read_word (&zeichensatz[j][m]);
32
    }
33
  }
34
}
35
36
int main (void)
37
{
38
...
39
plott_short_word(pgm_read_byte(hallo));
40
}
41
42
ausgabe an display über interrupt (funktioniert tadellos)

folgendes: aufgrund von platzproblemen im sram muss ich einige dinge in 
den flash auslagern

nun versuche ich einen pointer auf die zeichenfolge hallo an eine 
funktion zu übergeben, aber irgendwie will das nicht so ganz ...

wenn ich wie im code stehend
1
if((field)==((uint8_t)pgm_read_byte(&alpha_table[j])) || (j==39))
anwende, wird nur das erste zeichen des übergebenen worts ausgeben, die 
anderen zeichen sind einfach die darauf folgenden
z.B. Aufruf
1
plott_short_word(pgm_read_byte(hallo));
Ausgabe: HIJKL

versucht "welt!" auszugeben hat ähnliches ergebnis nur das es mit w 
anfängt

wenn ich aber die if abfrage auf dieses hier ändere
1
if(((uint8_t)pgm_read_byte(&hallo[i]))==((uint8_t)pgm_read_byte(&alpha_table[j])) || (j==39))
funktioniert es aber (was aus meiner ursprünglichen version kam ohne 
eigene funktion)

wo ist mein fehler ich suche schon ne weile (kann gut sein das ich 
gerade ein brett vor dem kopf habe, da ich den halben tag daran 
rumgebastelt habe)
muss aber auch gestehen das ist das erste mal das ich mit pgm arbeite, 
bitte um nachsicht wenn ich grobe fehler gemacht habe

von Detlef K. (adenin)


Lesenswert?

plott_short_word(hallo);

von Harald (Gast)


Lesenswert?

@Detlef Kunz:

stimmt, war ne verzwifelungstat geb ich zu, hatte das aber auch vorher 
schon so gemacht

nur führt das dazu das er keines der zeichen erkennt und die 39 
zuschlägt was ein ? ausgibt

nachtrag zum eigendlichen post
1
if(*(field)==((uint8_t)pgm_read_byte(&alpha_table[j])) || (j==39))
hatte ein * vergessen ...^^

aber weiterhin selbes problem

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
const __flash char alpha_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,!?";
2
const __flash char hallo[] = "HALLO";
3
const __flash char welt[] = "WELT!";
4
5
const __flash uint16_t zeichensatz[40][5] =
6
{    
7
{127, 392, 520, 392, 127}, {1023, 529, 529, 297, 198}, ... und noch viele mehr
8
};
9
10
void plott_short_word (const __flash char *field)
11
{
12
  uint8_t found = 0, j = 0;
13
  
14
  for (uint8_t i = 0; i<5;i++)
15
  {
16
    j = 0;
17
    do
18
    {
19
      if (*field == alpha_table[j] ||  j == 39)
20
         found = 1;
21
      else
22
         j++;
23
    } while (!found);
24
    
25
    field++;
26
    found = 0;
27
    
28
    for (uint8_t m = 0; m<5; m++)
29
    {
30
      output[m+6*i] = zeichensatz[j][m];
31
    }
32
  }
33
}
34
35
int main (void)
36
{
37
...
38
plott_short_word (hallo);
39
}

von Harald (Gast)


Lesenswert?

vielen dank Johann hat wunderbar geklappt :)

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.