problem: flash pointer übergeben

Gast #3666165
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
Gast #3666192
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
Persönliche Seite #3666209
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren