Forum: Mikrocontroller und Digitale Elektronik u8glib ohne blockierung?


von Sascha (Gast)


Lesenswert?

Hallo,

gibt es eine Möglichkeit, die u8glib so nutzen, dass diese nicht den 
Ablauf blockiert? Problem ist, ich rufe alle 5ms eine Funktion auf, die 
wird durch das Display sehr start ausgebremmst. Schön wäre es, wenn ich 
einmalig den Speicher beschreibe, und das ganze dann dargestellt wird, 
ohne das ich da selber erneut die Funktion aufrufen muss. Sowas wie eine 
ISR, die alle x ms den nächsten Befehl schickt.
1
void draw(uint8_t *data)
2
{
3
  u8g_FirstPage(&u8g);
4
  do
5
  {
6
    u8g_SetFont(&u8g, u8g_font_6x10);
7
    u8g_DrawStr(&u8g, 4, 63, "0");
8
    u8g_DrawStr(&u8g, 20, 63, "1");
9
    u8g_DrawStr(&u8g, 36, 63, "2");
10
    u8g_DrawStr(&u8g, 52, 63, "3");
11
    u8g_DrawStr(&u8g, 68, 63, "4");
12
    u8g_DrawStr(&u8g, 84, 63, "5");
13
    u8g_DrawStr(&u8g, 100, 63, "6");
14
    u8g_DrawStr(&u8g, 116, 63, "7");
15
    
16
    for(uint8_t i = 0; i < 8; i++)
17
    {
18
      uint8_t y = ((data[i])/8)+1;
19
      for(uint8_t j = 63; j > 63 - y ; j--)
20
      u8g_DrawHLine(&u8g, 2+(i*16)-1, j-12, 12);
21
    }
22
  }
23
}

von Falk B. (falk)


Lesenswert?

@ Sascha (Gast)

>gibt es eine Möglichkeit, die u8glib so nutzen, dass diese nicht den
>Ablauf blockiert?

Welche Funktion der Lib blockiert denn deinen Ablauf?

> Problem ist, ich rufe alle 5ms eine Funktion auf, die
>wird durch das Display sehr start ausgebremmst.

Wieso? Wenn dein 5ms Funktion in einer Timer-ISR steckt, kann deine Lib 
gar nicht bremsen.

> Schön wäre es, wenn ich
>einmalig den Speicher beschreibe, und das ganze dann dargestellt wird,
>ohne das ich da selber erneut die Funktion aufrufen muss.

Muss du bei der Lib sicher auch nicht.

> Sowas wie eine
>ISR, die alle x ms den nächsten Befehl schickt.

>void draw(uint8_t *data)

Was ist mit dieser Funktion?

von Sascha (Gast)


Lesenswert?

arg, oben der Code war nicht vollständig
1
void draw(uint8_t *data)
2
{
3
  u8g_FirstPage(&u8g);
4
  do
5
  {
6
    u8g_SetFont(&u8g, u8g_font_6x10);
7
    u8g_DrawStr(&u8g, 4, 63, "0");
8
    u8g_DrawStr(&u8g, 20, 63, "1");
9
    u8g_DrawStr(&u8g, 36, 63, "2");
10
    u8g_DrawStr(&u8g, 52, 63, "3");
11
    u8g_DrawStr(&u8g, 68, 63, "4");
12
    u8g_DrawStr(&u8g, 84, 63, "5");
13
    u8g_DrawStr(&u8g, 100, 63, "6");
14
    u8g_DrawStr(&u8g, 116, 63, "7");
15
    
16
    for(uint8_t i = 0; i < 8; i++)
17
    {
18
      uint8_t y = ((data[i])/8)+1;
19
      for(uint8_t j = 63; j > 63 - y ; j--)
20
      u8g_DrawHLine(&u8g, 2+(i*16)-1, j-12, 12);
21
    }
22
  }while(u8g_NextPage(&u8g));
23
}
Problem ist, dass die Schleife solange abgearbeitet wird, biw 
u8g_Nextpage erkannt wird. Das rausschicken dauert scheinbar seine Zeit. 
Zeitmessung kann ich gleich raussuchen.

von Falk B. (falk)


Lesenswert?

@Sascha (Gast)

>arg, oben der Code war nicht vollständig

Warum? Hast du ihn abgetippt? NEIN!

https://www.mikrocontroller.net/articles/Netiquette#.C3.84u.C3.9Fere_Form

"Quelltext nie abtippen, sonder immer das direkt kopierte Original 
posten, anderenfalls schleichen sich neue Fehler ein oder die 
existierenden werden nicht abgeschrieben."

>Problem ist, dass die Schleife solange abgearbeitet wird, biw
>u8g_Nextpage erkannt wird.

Logisch.

> Das rausschicken dauert scheinbar seine Zeit.

Auch klar.

>Zeitmessung kann ich gleich raussuchen.

Nebensächlich. Wo ist denn deine 5ms Funktion? Wo wird die aufgerufen?

Netiquette!

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.