Forum: Mikrocontroller und Digitale Elektronik LCD user char schreiben mit Funktion aus tutorial?


von Olli R. (downunderthunder42)


Lesenswert?

Hallo,

ich wollte ein Benutzer definiertes Zeichen über die im Tutorial 
vorhandenen Funktionen erstellen!

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

Das soll mit dieser Funktion gehen!
1
void lcd_generatechar( uint8_t code, const uint8_t *data )
2
{
3
    // Startposition des Zeichens einstellen
4
    lcd_command( LCD_SET_CGADR | (code<<3) );
5
 
6
    // Bitmuster übertragen
7
    for ( uint8_t i=0; i<8; i++ )
8
    {
9
        lcd_data( data[i] );
10
    }
11
}

Ich dachte nun, dass der Parameter "code" sagt welche der user defined 
char ich beschreiben will (0-7) und *data ist ein pointer auf Daten mit 
den Zeichen informationen 8*5Pixel!)

ich wollte also das folgende Zeichen senden:
1
uint8_t * zeichen1[8]= {0x0A, 0x00, 0x0E, 0x01, 
2
                     0x0F, 0x11, 0x0F, 0x00};

Hier bei handelt es sich um ein "ä"!
Der Funktionsaufruf sähe dann so aus?
1
lcd_generatechar(0, zeichen1);

und das Zeichen kann dann so ausgeben werden?

  lcd_data(0);

zu meinem Pointer "zeichen" bekomme ich immer folgende Warnung:

warning: initialization makes pointer from integer without a cast

und das Zeichen wird augenscheinlich auch nicht in den Speicher geladen?


Rufe ich die Funktion "lcd_generatechar()" überhaupt so korrekt auf?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Olli R. schrieb:
> Ich dachte nun, dass der Parameter "code" sagt welche der user defined
> char ich beschreiben will (0-7)

Würde ich auch so sehen.

Olli R. schrieb:
> und das Zeichen kann dann so ausgeben werden?

Wenn die Benutzerdefinierten Zeichen bei 0 beginnen, ja (ist meistens 
der Fall ein Blick ins Datenblatt kann nicht schaden).

Olli R. schrieb:
> zu meinem Pointer "zeichen" bekomme ich immer folgende Warnung:

Versuchs mal so (ohne Gewääähr hab schon länger nicht mehr mit C was 
gemacht)
1
int main() {
2
  uint8_t zeichen1[]= {0x0A, 0x00, 0x0E, 0x01, 0x0F, 0x11, 0x0F, 0x00};
3
  lcd_generatechar(0, &zeichen1);
4
}

von Olli R. (downunderthunder42)


Lesenswert?

Läubi .. schrieb:
> lcd_generatechar(0, &zeichen1);

Das Ändern dahingehend, dass ich die Adresse von zeichen übergebe. führt 
zu folgender Fehlermeldung/Warnung:

warning: passing argument 2 of 'lcd_generatechar' from incompatible 
pointer type
???

von Karl H. (kbuchegg)


Lesenswert?

1
uint8_t * zeichen1[8]= {0x0A, 0x00, 0x0E, 0x01, 
2
                     0x0F, 0x11, 0x0F, 0x00};
Warum einen uint8_t * ?

In deinem Array werden Zahlen gespeichert, keine Pointer
1
uint8_t zeichen1[8]= {0x0A, 0x00, 0x0E, 0x01, 
2
                     0x0F, 0x11, 0x0F, 0x00};

Das
1
   lcd_generatechar(0, zeichen1);
war schon richtig so. Arrays werden in C immer automatisch so übergeben, 
dass ein Pointer auf das erste Element übergeben wird. Daher ist ein & 
nicht notwendig.

von Olli R. (downunderthunder42)


Lesenswert?

Ok ich macht das jetzt ohne dem * für einen Pointer.
Es funktioniert allerdings noch immer nicht?
Es steht noch immer der Buchstabe µ an der Stelle 0 im char-speicher?

von Karl H. (kbuchegg)


Lesenswert?

Olli R. schrieb:
> Ok ich macht das jetzt ohne dem * für einen Pointer.
> Es funktioniert allerdings noch immer nicht?
> Es steht noch immer der Buchstabe µ an der Stelle 0 im char-speicher?

Das halte ich für eher unwahrscheinlich, dass ausgerechnet an der Stelle 
0 ein 'µ' codiert ist. Irgendein wildes 'Sonderzeichen' aus zufälligen 
Pixel, ja das wäre ok. Aber ein schönes 'µ'?


Code muss her.

von Olli R. (downunderthunder42)


Angehängte Dateien:

Lesenswert?

Ok ich hab jetzt mal den Code angefügt.
Da ist noch ein bisschen mehr drin. (Alles zum Test). Ich hoffe, man 
findet sich trotzdem schnell zurecht!

von holger (Gast)


Lesenswert?

Mach das mal so:

void lcd_generatechar( uint8_t code, const uint8_t *data )
{
    // Startposition des Zeichens einstellen
    lcd_command( LCD_SET_CGADR | (code<<3) );

    // Bitmuster übertragen
    for ( uint8_t i=0; i<8; i++ )
    {
        lcd_data( data[i] );
    }

    lcd_command( LCD_SET_DDADR );
}

Und nimm die LCD Routinen aus dem Interrupt raus!

von Olli R. (downunderthunder42)


Lesenswert?

holger schrieb:
> lcd_command( LCD_SET_DDADR );

Ok das hat gefehlt, jetzt wird zumindest das Zeichen übertragen.

Aber:


Jetzt versuche ich dieses Sonderzeichen in das Wort März reinzubekommen?

char maerz[4]= {'M',0,'r','z'};

char * msg[12]= {"Januar", "Februar", maerz, "April",
                 "Mai", "Juni", "Juli", "August",
         "September", "Oktober", "November",
         "Dezember"};

So geht es schon mal nicht?

Ok klar die LCD-Funktion kommen natürlich nicht in eine ISR (ist ja nur 
zum testen erst mal gewesen!)

von holger (Gast)


Lesenswert?

>Jetzt versuche ich dieses Sonderzeichen in das Wort März reinzubekommen?

char maerz[4]= {'M',0,'r','z'};

Da fehlt eine abschliessende 0. Sonst ist das kein String.
char maerz[5]= {'M',0,'r','z',0};

Und da 0 das Ende eines Strings darstellt wird wohl nur
ein M ausgegeben. Setz dein Zeichen also an Position 1.

char maerz[5]= {'M',1,'r','z',0};

lcd_generatechar(1, zeichen1);

von Olli R. (downunderthunder42)


Lesenswert?

holger schrieb:
> Da fehlt eine abschliessende 0. Sonst ist das kein String.
Stimmt so war das ja mit den Strings.


Also Danke jetzt geht alles und ich kann das LCD endlich in dem Umfang 
nutzen, in dem ich es benötige.

Beste Grüße

Olli

von Olli R. (downunderthunder42)


Lesenswert?

Hmmh jetzt hab ich doch noch ein kleines Problem
und zwar wollte ich in der ISR nur ein Flag setzen, statt die 
lcd-funktion aufzurufen.

mit
#define FALSE 0
#define TRUE !FALSE

   while(1)
   {
      while(lcd_active)
      {
   k++;
   lcd_active = FALSE;
   lcd_clear();
         lcd_string(msg[k]);
         if (k ==12)
            k = 0;
      }
   }
}

ISR(TIMER1_COMPA_vect)
{
   lcd_active = TRUE;
}

das klappt aber irgendwie nicht?

von Olli R. (downunderthunder42)


Lesenswert?

OK die Frage hat sich auch geklärt:

solche Kommunikationsvariable müssen "volatile" sein. Natürlich wusste 
ich eigentlich auch ok dann geht's morgen weiter!

Schönen Abend noch!!!

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.