Forum: Compiler & IDEs eeprom funktion aus quelltext entfernen - data im flash speicher


von Denny (Gast)


Lesenswert?

Hallo allerseits,

ich hoffe mir kann jemand bei meinem kleinen Problem weiterhelfen...
Ich bin noch ziemlich in den Kinderstuben was WinAVR und AVR 
Programmierung in C angeht.

Der unten angefügte Quelltext nutzt den EEPROM vom Atmel(mega32) um 
Fonts für ein LCD Display dort abzuspeichern.

Ich möchte gern das anlegen der EEPROM Daten und eeprom_read_block 
entfernen und anstattdessen den Data Code direkt mit im Flash einbinden.

Also kurz gesagt das EEPROM nicht benutzen in die Data Zeilen direkt mit 
in den FLASH einbinden.

Ich weiss das die Zeile:

" eeprom_read_block(cbuff+1,font + (value-32)*5,5);  //read character 
from eeprom to buffer "

die Fontdaten vom EEPROM ausliest und diese in ein Buffer schreibt und

" __attribute__((section(".eeprom"))) unsigned char font[] = { "

die Data Sektion für das EEPROM ist.


Folgender Quelltext ist auf das wesentliche gekürzt:


grafik.c
------------------------------------------------------------------------ 
---
//output a character at position x,y with size 0,1 or 2,forground color 
fc and background color bc
// size =   0 -> character size 6x8
//      1 -> character size 6x15
//      2 -> character size 11x15
void lcd_putchar(int x,int y,int value,int size,unsigned char 
fc,unsigned char bc)  {
  unsigned char cbuff[6];
  register int x1,y1,bit;
  if(value>122)  {
     switch(value)  {
            case 228 :     value = 127;
              break;
            case 246 :     value = 128;
              break;
            case 252 :     value = 129;
              break;
            case 196 :     value = 130;
              break;
            case 214 :     value = 131;
              break;
            case 220 :     value = 132;
              break;
            case 223 :     value = 133;
              break;
      default :    break;

  }
  }
  cbuff[0] = 0;        //first row always 0
  eeprom_read_block(cbuff+1,font + (value-32)*5,5);  //read character 
from eeprom to buffer
  int xsize = 6;
  int ysize = 8;
  if(size==1)
    ysize = 15;
  if(size==2)  {
    xsize = 11;
  ysize = 15;
  }
  lcd_window(x,y,x+xsize-1,y+ysize-1);
  for(y1=0;y1<ysize;y1++)  {
    for(x1=0;x1<xsize;x1++)  {
    switch(size)  {
      case 0:        bit = cbuff[x1]&(1<<y1);
            break;
      case 1:        bit = cbuff[x1]&(1<<(y1/2));
            break;
      case 2:        bit = cbuff[(x1+1)/2]&(1<<(y1/2));
            break;
    default:    bit = 0;
            break;
    }
    if(bit)            //forground pixel
      lcd_data(fc);
    else              //background pixel
      lcd_data(bc);
  }
  }
}

__attribute__((section(".eeprom"))) unsigned char font[] = {
 0x00 , 0x00 , 0x00 , 0x00 , 0x00,    //Begins at  0x20
 0x00 , 0x06 , 0x5F , 0x06 , 0x00,    //0x21
 0x07 , 0x03 , 0x00 , 0x07 , 0x03,    //0x22
 0x24 , 0x7E , 0x24 , 0x7E , 0x24,    //0x23
 0x24 , 0x2B , 0x6A , 0x12 , 0x00,    //0x24
 0x63 , 0x13 , 0x08 , 0x64 , 0x63,    //0x25
 0x36 , 0x49 , 0x56 , 0x20 , 0x50,    //0x26
 0x00 , 0x07 , 0x03 , 0x00 , 0x00,    //0x27
 0x00 , 0x3E , 0x41 , 0x00 , 0x00,    //0x28
 0x00 , 0x41 , 0x3E , 0x00 , 0x00,    //0x29
 0x08 , 0x3E , 0x1C , 0x3E , 0x08,    //0x2a
 0x08 , 0x08 , 0x3E , 0x08 , 0x08,    //0x2b
 0x00 , 0xE0 , 0x60 , 0x00 , 0x00,    //0x2c
 0x08 , 0x08 , 0x08 , 0x08 , 0x08,    //0x2d
 0x00 , 0x60 , 0x60 , 0x00 , 0x00,    //0x2e
 0x20 , 0x10 , 0x08 , 0x04 , 0x02,    //0x2f
 0x3E , 0x51 , 0x49 , 0x45 , 0x3E,    //0x30
 0x00 , 0x42 , 0x7F , 0x40 , 0x00,    //0x31
 0x62 , 0x51 , 0x49 , 0x49 , 0x46,    //0x32
 0x22 , 0x49 , 0x49 , 0x49 , 0x36,    //0x33
 0x18 , 0x14 , 0x12 , 0x7F , 0x10,    //0x34
 0x2F , 0x49 , 0x49 , 0x49 , 0x31,    //0x35
 0x3C , 0x4A , 0x49 , 0x49 , 0x30,    //0x36
 0x01 , 0x71 , 0x09 , 0x05 , 0x03,    //0x37
 0x36 , 0x49 , 0x49 , 0x49 , 0x36,     //0x38
 0x06 , 0x49 , 0x49 , 0x29 , 0x1E,    //0x39
 0x00 , 0x6C , 0x6C , 0x00 , 0x00,    //0x3a
 0x00 , 0xEC , 0x6C , 0x00 , 0x00,    //0x3b
 0x08 , 0x14 , 0x22 , 0x41 , 0x00,    //0x3c
 0x24 , 0x24 , 0x24 , 0x24 , 0x24,    //0x3d
 0x00 , 0x41 , 0x22 , 0x14 , 0x08,    //0x3e
 0x02 , 0x01 , 0x59 , 0x09 , 0x06,    //0x3f
 0x3E , 0x41 , 0x5D , 0x55 , 0x1E,    //0x40  ->  @
 0x7E , 0x09 , 0x09 , 0x09 , 0x7E,    //0x41  ->  A
 0x7F , 0x49 , 0x49 , 0x49 , 0x36,    //0x42  ->  B
 0x3E , 0x41 , 0x41 , 0x41 , 0x22,    //0x43  ->  C
 0x7F , 0x41 , 0x41 , 0x41 , 0x3E,    //0x44  ->  E
 0x7F , 0x49 , 0x49 , 0x49 , 0x41,    //0x45  ->  F
 0x7F , 0x09 , 0x09 , 0x09 , 0x01,
 0x3E , 0x41 , 0x49 , 0x49 , 0x7A,
 0x7F , 0x08 , 0x08 , 0x08 , 0x7F,
 0x00 , 0x41 , 0x7F , 0x41 , 0x00,
 0x30 , 0x40 , 0x40 , 0x40 , 0x3F,
 0x7F , 0x08 , 0x14 , 0x22 , 0x41,
 0x7F , 0x40 , 0x40 , 0x40 , 0x40,
 0x7F , 0x02 , 0x04 , 0x02 , 0x7F,
 0x7F , 0x02 , 0x04 , 0x08 , 0x7F,
 0x3E , 0x41 , 0x41 , 0x41 , 0x3E,
 0x7F , 0x09 , 0x09 , 0x09 , 0x06,
 0x3E , 0x41 , 0x51 , 0x21 , 0x5E,
 0x7F , 0x09 , 0x09 , 0x19 , 0x66,
 0x26 , 0x49 , 0x49 , 0x49 , 0x32,
 0x01 , 0x01 , 0x7F , 0x01 , 0x01,
 0x3F , 0x40 , 0x40 , 0x40 , 0x3F,
 0x1F , 0x20 , 0x40 , 0x20 , 0x1F,
 0x3F , 0x40 , 0x3C , 0x40 , 0x3F,
 0x63 , 0x14 , 0x08 , 0x14 , 0x63,
 0x07 , 0x08 , 0x70 , 0x08 , 0x07,
 0x71 , 0x49 , 0x45 , 0x43 , 0x00,
 0x00 , 0x7F , 0x41 , 0x41 , 0x00,
 0x02 , 0x04 , 0x08 , 0x10 , 0x20,
 0x00 , 0x41 , 0x41 , 0x7F , 0x00,
 0x04 , 0x02 , 0x01 , 0x02 , 0x04,
 0x80 , 0x80 , 0x80 , 0x80 , 0x80,
 0x00 , 0x03 , 0x07 , 0x00 , 0x00,
 0x20 , 0x54 , 0x54 , 0x54 , 0x78,
 0x7F , 0x44 , 0x44 , 0x44 , 0x38,
 0x38 , 0x44 , 0x44 , 0x44 , 0x28,
 0x38 , 0x44 , 0x44 , 0x44 , 0x7F,
 0x38 , 0x54 , 0x54 , 0x54 , 0x18,
 0x08 , 0x7E , 0x09 , 0x09 , 0x00,
 0x18 , 0xA4 , 0xA4 , 0xA4 , 0x7C,
 0x7F , 0x04 , 0x04 , 0x78 , 0x00,
 0x00 , 0x00 , 0x7D , 0x00 , 0x00,
 0x40 , 0x80 , 0x84 , 0x7D , 0x00,
 0x7F , 0x10 , 0x28 , 0x44 , 0x00,
 0x00 , 0x00 , 0x7F , 0x40 , 0x00,
 0x7C , 0x04 , 0x18 , 0x04 , 0x78,
 0x7C , 0x04 , 0x04 , 0x78 , 0x00,
 0x38 , 0x44 , 0x44 , 0x44 , 0x38,
 0xFC , 0x44 , 0x44 , 0x44 , 0x38,
 0x38 , 0x44 , 0x44 , 0x44 , 0xFC,
 0x44 , 0x78 , 0x44 , 0x04 , 0x08,
 0x08 , 0x54 , 0x54 , 0x54 , 0x20,
 0x04 , 0x3E , 0x44 , 0x24 , 0x00,
 0x3C , 0x40 , 0x20 , 0x7C , 0x00,
 0x1C , 0x20 , 0x40 , 0x20 , 0x1C,
 0x3C , 0x60 , 0x30 , 0x60 , 0x3C,
 0x6C , 0x10 , 0x10 , 0x6C , 0x00,
 0x9C , 0xA0 , 0x60 , 0x3C , 0x00,
 0x64 , 0x54 , 0x54 , 0x4C , 0x00,
 0x08 , 0x3E , 0x41 , 0x41 , 0x00,
 0x00 , 0x00 , 0x7F , 0x00 , 0x00,
 0x00 , 0x41 , 0x41 , 0x3E , 0x08,
 0x02 , 0x01 , 0x02 , 0x01 , 0x00,
 0x20 , 0x55 , 0x54 , 0x55 , 0x78,
 0x38 , 0x45 , 0x44 , 0x45 , 0x38,
 0x3C , 0x41 , 0x20 , 0x7D , 0x00,
 0x7C , 0x0B , 0x0A , 0x0B , 0x7C,
 0x3C , 0x43 , 0x42 , 0x43 , 0x3C,
 0x3E , 0x41 , 0x40 , 0x41 , 0x3E,
 0x7E , 0x2A , 0x2A , 0x2A , 0x14
};


grafik.h
------------------------------------------------------------------------ 
---

#ifndef  __GRAFIK__H
#define  __GRAFIK__H

#include <ctype.h>
#include <stdint.h>
#include <stdio.h>

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>

void lcd_init(void);
void lcd_cmd(unsigned char value);
void lcd_data(unsigned char value);
void lcd_cls(unsigned char color);
void lcd_window(int x1,int y1,int x2,int y2);
void lcd_box(int x1,int y1,int x2,int y2,unsigned char color);
void lcd_putimage(int x1,int y1,prog_uchar *image);

void lcd_print(char *text,int x,int y,int size,unsigned char fc,unsigned 
char bc);
void lcd_putchar(int x,int y,int value,int size,unsigned char 
fc,unsigned char bc);
void lcd_msgdlg(char *title,char *text);

extern unsigned char font[];

#define GLUE(a, b)     a##b
#define PORT(x)        GLUE(PORT, x)
#define PIN(x)         GLUE(PIN, x)
#define DDR(x)         GLUE(DDR, x)

#define  LCD_PORT  D
#define  LCD_RS    3
#define  LCD_SD    4
#define  LCD_SC    5
#define  LCD_CS    6

#define Blau      0x03
#define Gelb      0xfc
#define Rot     0xe0
#define Gruen     0x1C
#define Schwarz   0
#define Weiss     0xff
#define Hellgruen   0x3e
#define Dunkelgruen 0x14
#define Dunkelrot   0xa0
#define Dunkelblau   0x02
#define Hellblau   0x1f
#define Orange     0xf8

#endif
------------------------------------------------------------------------ 
---

Ich bin wirklich für jede Hilfe sehr dankbar, da ich mit meinen 
Kenntnissen und Stundenlangen lesen und suchen im Internet bisher nicht 
weitergekommen bin um dieses umzusetzen.

Freundliche Grüße
Denny

von ... .. (docean) Benutzerseite


Lesenswert?

Ich weiss das die Zeile:

" eeprom_read_block(cbuff+1,font + (value-32)*5,5);  //read character
from eeprom to buffer "

die Fontdaten vom EEPROM ausliest und diese in ein Buffer schreibt und

" __attribute__((section(".eeprom"))) unsigned char font[] = { "

die Data Sektion für das EEPROM ist.


------------------------------
Dann tausch dort doch einfach eeprom gegen flash aus...

Dann könnte es schon funktionieren....

von Denny (Gast)


Lesenswert?

Hi Jan-h. B.,

den Befehl " flash_read_block " gibt es leider nicht.
Es wäre denkbar das ganze mit einer constante die man ausliest zu lösen,
aber das übersteigt meine Kenntnisse dann doch.

Habe mit der Programmierung in C für AVR´s erst angefangen.
Hatte Jahrelang meine AVR´s mit Basic (bascom) programmiert,
und wollte mich jetzt in C einarbeiten.

Gruß
Denny

von R. M. (rmax)


Lesenswert?

Schau' Dir mal den Abschnitt hier im AVR-GCC-Tutorial an:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

Wenn ich das richtig verstehe, legst Du den Font einfach so an:
1
#include <avr/pgmspace.h>
2
3
const unsigned char PROGMEM font[] = {
4
/* hier die Werte einfügen */
5
};

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Denny wrote:

> den Befehl " flash_read_block " gibt es leider nicht.

Weil er memcpy_P() heißt:

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#g53ee9e2dec1d5f685d78aa8dc444dccb

AVR-GCC-Tutorial

von Werner B. (werner-b)


Lesenswert?

Früher gab es einmal ein pgm_read_block; Heute nimmt man memcpy_P.

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

von Denny (Gast)


Lesenswert?

Danke für die Ansätze !!

Ich habe den Font entsprechend der Info von Rainhard Max angelegt.
1
#include <avr/pgmspace.h>
2
3
const unsigned char PROGMEM font[] = {
4
/* hier die Werte einfügen */
5
};

Doch wie ändere ich den "eeprom_read_block".
Ich habe versucht dort einfach memcpy_P einzutragen
1
memcpy_P(cbuff+1,font + (value-32)*5,5);  //read character

und bekomme beim kompilieren folgende fehler:

grafik.c:238: error: conflicting types for 'font'
grafik.h:41: error: previous declaration of 'font' was here

Das hat sicherlich hiermit zutun:
1
extern unsigned char font[];


Da ich wirklich noch ganz am anfang von C Programmierung stehe,
bitte ich um nachsicht.. :)

von R. M. (rmax)


Lesenswert?

Wenn Du die Variable im Header deklarierst, muß sie dort vom gleichen 
Typ sein, wie in der C-Datei:
1
extern const unsigned char PROGMEM font[];

Wenn auf den Font aber nur aus dieser einzigen C-Datei zugegriffen wird 
und dort die Deklaration vor der ersten Verwendung kommt, brauchst Du 
sie gar nicht nochmal im Header aufzuführen.

von Falk B. (falk)


Lesenswert?

@ Denny (Gast)

>Ich habe versucht dort einfach memcpy_P einzutragen

Etwa so.

1
memcpy_P(cbuff+1,&font[(value-32)*5],5);  //read character

MFg
Falk

von Denny (Gast)


Lesenswert?

Vielen Dank für eure Hilfe :-)

Mein Code funktioniert jetzt Dank eurer Unterstützung !!!

Die Fonts werden jetzt so wie ich mir das vorgestellt hatte,
nicht mehr in das EEPROM geschrieben und ausgelesen.

Sondern direkt mit im Flash integriert und kann dank (memcpy_P) 
abgerufen werden.

vielen dank nochmal
gruß denny

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.