www.mikrocontroller.net

Forum: Compiler & IDEs Fonts aus FLASH ins EEPROM legen


Autor: Denny D. (denny)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

nach Stundenlangen und vielen Recherchen im Netz komme ich an einer 
Stelle einfach nicht weiter.
Ich bin noch ziemlich in den Kinderstuben was WinAVR und AVR
Programmierung in C angeht, und hoffe mir kann hier jemand im Forum 
weiter helfen.

Der unten angefügte Quelltext nutzt den FLASH des Atmel(mega128) um
Fonts für ein LCD Display dort abzulegen.

Ich würde gern die Funktion umschreiben und die Fonts ins EEPROM legen 
um sie dann daraus lesen zu können.

#include <avr/pgmspace.h>
wurde durch
#include <avr/eeprom.h>
ersetzt

Ich habe versucht:
prog_char ascii_7x11[95][14] = {

entsprechend umzuschreiben in:
__attribute__((section(".eeprom"))) unsigned char ascii_7x11[95][14] = {

und die Zeile:
tx = pgm_read_byte(&ascii_7x11[row][m])   ;  //Read data Ascii

in:
tx = eeprom_read_block(&ascii_7x11[row][m])   ;  //Read data Ascii



Der Quelltext ist auf das wesentliche gekürzt:
/******************************************************
 *       Font 7x11(English)                  *
 *                                *
 * -ASCII fonts from 0x20 ~ 0x7F(DEC 32 ~ 126)         *
 *  composed of following characters             *
 *                                                    * 
 * -XSize : 7  pixcels                    *
 * -YSize : 11 pixcels                       *
 *                                 *
 *   ....... <- b0, Blank, Not used              *
 *   ....... <- b1, Blank, Not used              *
 *   ....... <- b2, Blank, Not used              *
 *   ....... <- b3, Blank, Not used              *
 *   ....... <- b4, Blank, Not used              *
 *   ..End.. <- b5(2nd byte)                *
 *   ..OO... <- b6(2nd byte)                *
 *   ..OO... <- b7(2nd byte)                *
 *   ..OO... <- b0(1st byte)                *
 *   ..OO... <- b1(1st byte)                *
 *   ..OO... <- b2(1st byte)                *
 *   ..OO... <- b3(1st byte)                *
 *   ..OO... <- b4(1st byte)                 *
 *   ..OO... <- b5(1st byte)                *
 *   ..OO... <- b6(1st byte)                *
 *   .Start..<- b7(1st byte)                *
 *                              *
 ******************************************************/

//7x11 ascii font, each character takes 14 bytes, total 1330 bytes, draw from left bottom to left top
prog_char ascii_7x11[95][14] = {                                                       
  {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f}, //0x20 space
  {0x00, 0x00, 0x07, 0xc0, 0xdf, 0xe0, 0xdf, 0xe0, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x1f}, //0x21 !
.
.
.
  {0x00, 0x00, 0x80, 0x20, 0xe0, 0xe0, 0x7f, 0xc0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x5f}, //0x7d }
  {0x00, 0x60, 0x00, 0x20, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x5f}  //0x7e ~
};

//********************************************************************************
//**                Function Print Text 1 Charecter size 7x11                   **
//********************************************************************************
//**    Parameter :                                **
//**               row      = Ascii Code (Position buffer keep text)        **
//**               adx,ady  = Position X,Y for begin plot text by will       **
//**                          begin plot from bottom left to top left       **
//**               fg_clr   = Color of text                    **
//**               bg_clr   = Color background of text(if bg_clr = no_bg or 1=  **
//**                          non color background)                **
//********************************************************************************


 void text_7x11(unsigned char row,int adx,int ady,unsigned int fg_clr,unsigned int bg_clr)
  {
   int ax,ay                   ;
   unsigned char m,n,tx        ;
     
   ax = adx         ;
   ay = ady         ; 

   row = row-0x20   ;

  //------- Print Text 1 Charecter(data 14 Byte) -------------
    
    for(m=0;m<14;m++)
     {
      //---Sent data byte1=8 bit----

        tx = pgm_read_byte(&ascii_7x11[row][m])   ;  //Read data Ascii
  
    for(n=0;n<8;n++)           //Loop Sent data  1 byte(8bit)
     {
        if(tx & 0x80)           //if data bit7 = 1 ,Plot Color area Charecter
      {              
        gp_wr_cmm(0x20)       ;  //Command Set Adddress Hor(X)
              gp_wr_data(ay)        ;  //Sent X_Address CGRAM       
              gp_wr_cmm(0x21)       ;  //Command Set Address Ver(Y)
              gp_wr_data(ax)        ;  //Sent Y_Address CGRAM
        gp_wr_cmm(0x22)       ;  //Command Write data 
              gp_wr_data(fg_clr)    ;
 
      }
      else               //if data bit7 = 0 ,Plot Color area back ground Charecter
      {
        if(bg_clr != 1)     
              {
         gp_wr_cmm(0x20)       ;  //Command Set Adddress Hor(X)
               gp_wr_data(ay)        ;  //Sent X_Address CGRAM  
               gp_wr_cmm(0x21)       ;  //Command Set Adddress Ver(Y)
               gp_wr_data(ax)        ;  //Sent Y_Address CGRAM
         gp_wr_cmm(0x22)       ;  //Command Write data
               gp_wr_data(bg_clr)    ;  //Sent Data
        }
      }

       tx <<= 1                 ;  //Shift Right data 1 bit
       ay   = ay+1              ;  //Increment Y-address
     } 

     m++                        ;  //Increment Next pointter byte Data 


      //------- Sent data byte2=3 bit -----

     tx = pgm_read_byte(&ascii_7x11[row][m])    ;  //Read data byte2
  
    for(n=0;n<3;n++)         //Loop sent data byte2 = 3 bit
     {                ;
        if(tx & 0x80)           //if data bit7 = 1 ,Plot Color area Charecter
      {              
        gp_wr_cmm(0x20)       ;  //Command Set Adddress Hor(X)
              gp_wr_data(ay)        ;  //Sent X_Address CGRAM    
              gp_wr_cmm(0x21)       ;  //Command Set Adddress Ver(Y)
              gp_wr_data(ax)        ;  //Sent Y_Address CGRAM
        gp_wr_cmm(0x22)       ;  //Command Write data
              gp_wr_data(fg_clr)    ;
 
      }
      else               //if data bit7 = 0 ,Plot Color area back ground Charecter
      {
        if(bg_clr != 1)     
              {
         gp_wr_cmm(0x20)       ;  //Command Set Adddress Hor(X)
               gp_wr_data(ay)        ;  //Sent X_Address CGRAM       
               gp_wr_cmm(0x21)       ;  //Command Set Adddress Ver(Y)
               gp_wr_data(ax)        ;  //Sent Y_Address CGRAM
         gp_wr_cmm(0x22)       ;  //Command Write data
               gp_wr_data(bg_clr)    ;
        }
      }

       tx <<= 1                 ;  //Shift Right data 1 bit
       ay = ay+1                ;  //Increment Y-address
     } 

    ax = ax+1                   ; //Complet sent data 2 byte(11bit) Increment X-Address
    ay = ady                    ; //Set Position Y-address old
 
    }  


   //----Fill Back ground Color Position space between Charecter 1 Colum -------
 
     if(bg_clr != 1)     
     {
    for(n=0;n<11;n++)
    {
      gp_wr_cmm(0x20)            ;  //Command Set Adddress Hor(X)
        gp_wr_data(ay)             ;  //Sent X_Address CGRAM       
        gp_wr_cmm(0x21)            ;  //Command Set Adddress Ver(Y)
        gp_wr_data(ax)             ;  //Sent Y_Address CGRAM
      gp_wr_cmm(0x22)            ;  //Command Write data
        gp_wr_data(bg_clr)         ;
    ay = ay+1                  ;  //Increment Y-Address
    }
     }
  }


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Denny D. schrieb:
> Hallo allerseits,
>
> nach Stundenlangen und vielen Recherchen im Netz komme ich an einer
> Stelle einfach nicht weiter.

Und das heißt jetzt konkret was?

> Ich würde gern die Funktion umschreiben und die Fonts ins EEPROM legen
> um sie dann daraus lesen zu können.

oooo kay

> #include <avr/pgmspace.h>
> wurde durch
> #include <avr/eeprom.h>
> ersetzt

klingt gut

> Ich habe versucht:
> prog_char ascii_7x11[95][14] = {
>
> entsprechend umzuschreiben in:
> __attribute__((section(".eeprom"))) unsigned char ascii_7x11[95][14] = {


ist auch nicht schlecht. Mit dem vordefinierten Makro EEMEM kann man das 
noch kürzer schreiben, aber prinzipiell ist es ok.

>
> und die Zeile:
> tx = pgm_read_byte(&ascii_7x11[row][m])   ;  //Read data Ascii
>
> in:
> tx = eeprom_read_block(&ascii_7x11[row][m])   ;  //Read data Ascii
>

eeprom_read_byte

Aber abgesehen davon ... ja, klingt gut

> Der Quelltext ist auf das wesentliche gekürzt:

Und deine Frage ist jetzt genau was?

(Hast du vielleicht vergessen das entstehende EEP File auch ins EEPROM 
zu brennen? Irgendwie müssen die Werte da ja auch reinkommen.)

http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Denny D. (denny)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl-Heinz,

vielen dank für deine Hilfe.

eeprom_read_byte war des Rätsels Lösung!!

Ich habe die ganze Zeit versucht mittels eeprom_read_block die Fonts zu 
lesen, was natürlich falsch war...
...aber wie das manchmal so ist, "Man sieht den Wald vor lauter Bäumen 
nicht"

WinAVR meckerte beim kompilieren über "too few arguments to function 
'__eerd_block_m128'.

Nachdem ich nun eeprom_read_byte anstatt eeprom_read_block verwendet 
hatte,
kompilierte WinAVR ohne Fehler das HEX und EEP File.

Vielen Dank nochmal
Gruß Denny

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.