Forum: Compiler & IDEs STM32 C was passiert da?


von Johannes M. (jojo20)


Lesenswert?

Hi,

ich möchte ein HUB75 Display mit STM32 ansteuern, die Bits für das 
display zu setzen klappt bereits indem ich in ein Array display[x][y] an 
die entsprechende Stelle die Farbe für den Pixel eintrage.

Jetzt habe ich mir eine Funktion geschrieben, die mir die Schrift auf 
dem Display anzeigen soll:


void display_write_char(unsigned char c,uint8_t color, uint8_t x, 
uint8_t y)
{
  c=c-32;

  uint8_t index=c*FONT6X8_WIDTH;
  uint8_t savex=x;
  uint8_t bla=0;

  for(uint8_t iy=y;iy<y+FONT6X8_WIDTH;iy++)

  {

  uint8_t zeichen=Font6x8[index+bla]; //Horizontal
  bla++;

  x=savex;
  for(uint8_t bit = 0x00000001; bit; bit <<= 1)//Vertikal
    {
      //set_pixel(x,iy,0x02);
      if(zeichen & bit){set_pixel(x,iy,color);}

      x++;
    }

  }
  ypos=ypos+FONT6X8_WIDTH;

}

Die Funktion funktioniert einwandfrei rufe ich sie mit dem Ascii Hex 
Code für das entsprechende Zeichen auf, rufe ich die Funktion mit dem 
Zeichen raus ist der Pointer im Schriftarray falsch gesetzt.

display_write_char(0x32,0x01,0,ypos);  //Geht zeigt 3 an
display_write_char("3",0x01,0,ypos); //Geht nicht

Was genau passiert da nun? Wird in STM32 Cube IDE nicht Standardmäßig 
der Ascii Wert genutzt? Werden dort irgendwelche Codepages genutzt etc?

von Johannes M. (jojo20)


Angehängte Dateien:

Lesenswert?

Als Font habe ich mir die Schrift "geklaut"

Natürlich dann ohne _attribute_ ((progmem))

und #include <avr/pgmspace.h>

: Bearbeitet durch User
von A. B. (Gast)


Lesenswert?

Johannes M. schrieb:
> display_write_char("3",0x01,0,ypos); //Geht nicht

Und der Compiler hat nicht gemeckert, dass ihm da ein pointer auf char 
statt eines char untergejubelt wird???

von Johannes M. (jojo20)


Lesenswert?

Nein hat er nicht.

Allerdings funktioniert die String Funktion auch nicht:

void display_putstring(char *string,uint8_t color, uint8_t x, uint8_t y) 
{
  uint8_t i=0;
  char c = string[0];

  while(c != 0) {
    if(c == '\n'){}
      //New Line no Support
    else
      display_write_char(c,color,xpos,ypos);
    c = string[++i];
  }
}

display_putstring("Hallo Welt",xpos,ypos,0x04);

Das müsste doch funktionieren?

von Johannes M. (jojo20)


Lesenswert?

Alternativ mal so probiert wie ich es vom AVR her kenne, funktionier 
leider auch nicht.

void display_putstring(char *string,uint8_t color, uint8_t x, uint8_t y)
  {
    while (*string)
    {
      display_write_char(*string,0xFF, xpos, ypos);
      string++;
    }
  }

Ich übergebe der Funktion:

char text[]="Hallo Welt";
display_putstring(text,xpos,ypos,0x04);

Damit übergebe ich doch der funktion die Adresse des Strings mit "Hallo 
Welt"
Die funktion ließt die erste Adresse des Strings und erkennt ein "H" und 
gibt die Adresse des Zeichens H an die Funktion display_write_char.

Die sollte dann den Wert der Speicherzelle in H übernehmen und dann ein 
H auf dem Display ausgeben.

Wo ist mein Denkfehler?

von Johannes M. (jojo20)


Lesenswert?

Hat sich erledigt.

Die Indexvariable für die Adresse der Schrift war mit uint8_t natürlich 
zu klein bemessen.

von Andras H. (kyrk)


Lesenswert?

play_write_char(0x32,0x01,0,ypos);  //Geht zeigt 3 an
display_write_char("3",0x01,0,ypos); //Geht nicht

play_write_char(0x32,0x01,0,ypos);  //Geht zeigt 3 an
display_write_char('3',0x01,0,ypos); //Wird gehen

'

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.