Forum: Compiler & IDEs XMega128 Bootloader mit LCD


von Mike R. (thesealion)


Lesenswert?

Moin,

ich versuche mich gerade an einem Bootloader für den XMega128.
Bisher läuft auch alles und ich kann den Chip via AVROS flashen. Jetzt 
würde ich gerne (ich habe ja 8k Bootflash) noch eine einfache 
unterstützung für mein LCD mit einbauen.

Initialisieren klappt ohne Probleme und auch einzelne Pixel kann ich 
setzen, sobald ich aber Buchstaben schreiben will klappt nichts mehr.
Die Buchstaben sind in einer Tablle nach dem Muster
1
const unsigned char TABLE5[240] PROGMEM =
2
                 {0x00,0x00,0x00,0x00,0x00,  // 20 space       ASCII table
3
                  0x00,0x00,0x5f,0x00,0x00,  // 21 !
4
                  ...
abgelegt. eine entsprechende Routine liest die 5 Werte zu jedem Zeichen 
aus und soll sie an das LCD schicken.

Das Problem ist, denke ich mal, der Speicherort der Tabelle. Denn auf 
dem Display kommt immer nur 0xFF an. Ich weiß nur leider nicht wie ich 
das ganze für den Bootloader richtig konfigurieren muß.
In der normalen Application funktioniert das ohne Probleme.

Gruß Mike

von Werner B. (werner-b)


Lesenswert?

Da der Text jenseits der 64KB Marke liegt musst du das RAMPZ Register 
erst auf 1 setzen und mit ELPM lesen, dann sollte etwas mehr passieren. 
Aber so komplett ohne MAP File bzw. Listing ist das von meiner Seite ein 
Stöbern im Nebel.

von Mike R. (thesealion)


Angehängte Dateien:

Lesenswert?

Hi,

danke schon mal für die Antwort.

Meine Schreibroutine sieht so aus:
1
// **************************************************************************
2
/*! \brief Writes a singel character to the LCD
3
 *
4
 *  This function takes the BCD code for the character and writes the corresponding 
5
 *  pixels to the LCD
6
 *
7
 *  \param character  BCD code for the character to display
8
 */ 
9
// **************************************************************************
10
void LCD_table_to_lcd(unsigned char character)   // extract ascii from tables & write to LCD
11
   {
12
   unsigned char position, row, data;
13
14
   if (character<0x20)
15
      return;
16
17
   if (character == '°')
18
      {
19
      LCD_write_Data(0x00);
20
      LCD_write_Data(0x02);
21
      LCD_write_Data(0x05);
22
      LCD_write_Data(0x02);
23
      LCD_write_Data(0x00);
24
      LCD_write_Data(0x00);
25
      return;
26
      }
27
28
   if (character>0x7f)
29
      return;
30
31
   for (row=0; row<5; row++) 
32
      {    // 5 bytes
33
  
34
      if (character<0x50)                          // use TABLE5
35
         {
36
         position=(((character&0xff)-0x20)*5);
37
         //data=pgm_read_byte(&TABLE5[(position+row)]);
38
         data=pgm_read_byte_far((uint32_t)(&TABLE5[(position+row)]));
39
         }
40
      else if (character>0x4f)                     // use TABLE6
41
         {
42
         position=(((character&0xff)-0x50)*5);
43
         //data=pgm_read_byte(&TABLE6[(position+row)]);
44
         data=pgm_read_byte_far((uint32_t)(&TABLE6[(position+row)]));
45
         }
46
    
47
     LCD_write_Data(data);                    // send data to Display
48
49
      }
50
51
   LCD_write_Data(0x00);                      //  1 byte (always blank)
52
53
   }

Wie gesagt, wenn ich die Funktionen in der normalen Application nutze 
funktionieren sie.
Ich habe scheinbar ein Problem den richtigen Pointer zu ermitteln oder 
beim auslesen der Daten aus dem Flash lese ich nicht die Stelle, die ich 
erwarte.

Gruß Mike

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.