LCD user char schreiben mit Funktion aus tutorial?

OP #2274526
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?
Persönliche Seite #2274569
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
}
#2274592
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.
#2274631
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.
Gast #2274653
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!
OP #2274685
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!)
Gast #2274695
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);
OP #2274768
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?

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