Forum: Compiler & IDEs PROGMEM Array


von Stephan P. (s-p)


Lesenswert?

Hallo!

In meinem derzeitigen Projekt möchte ich gerne einen LCD benutzen. Um 
den SRAM meines ATTinys nicht allzu sehr zu belasten, möchte ich die 
mehrere Strings als Array im Flash speichern.
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <stdint.h>
4
#include <avr/interrupt.h>
5
#include <avr/pgmspace.h>
6
7
#include "lcd.h"
8
9
#define MAX_SENSORS    3
10
11
const char sensornames[MAX_SENSORS][10] PROGMEM = {"Temp.:","Tank:","Licht:"};
12
13
int main(void) {
14
    uint8_t sensor = 0; //wird im endgueltigen Programm von Zeit zu Zeit inkrementiert
15
    lcd_init(LCD_DISP_ON);
16
    sei();
17
    
18
    lcd_clrscr();
19
    lcd_puts_P(sensornames[sensor]);
20
    
21
    for(;;){
22
    }
23
}

Jedoch gibt der gcc den Fehler (Linie mit lcd_puts_P) "ungültige 
Initialisierung" zurück.
Wie ist das zu verstehen?

Gruss
Stephan

PS: Nutze die LCD-Lib von Peter Fleury

von Floh (Gast)


Lesenswert?

Stephan P. schrieb:
> Jedoch gibt der gcc den Fehler (Linie mit lcd_puts_P) "ungültige
> Initialisierung" zurück.
> Wie ist das zu verstehen?

Genaue Fehlermeldung und Code von lcd_puts_P bitte.

von Stephan P. (s-p)


Lesenswert?

Floh schrieb:
> Genaue Fehlermeldung und Code von lcd_puts_P bitte.
1
avr-gcc  -mmcu=attiny2313 -DF_CPU=16000000UL -Os -Wall -o forum-example forum-example.c lcd.c
2
forum-example.c: In Funktion »main«:
3
forum-example.c:20: Fehler: ungültige Initialisierung

Funktion lcd_puts_P:
1
/*************************************************************************
2
Display string from program memory without auto linefeed 
3
Input:     string from program memory be be displayed                                        
4
Returns:   none
5
*************************************************************************/
6
void lcd_puts_p(const char *progmem_s)
7
/* print string from program memory on lcd (no auto linefeed) */
8
{
9
    register char c;
10
11
    while ( (c = pgm_read_byte(progmem_s++)) ) {
12
        lcd_putc(c);
13
    }
14
15
}/* lcd_puts_p */

lcd_putc sollte nicht das Problem sein, da ich die Funktion bereits 
fehlerfrei benutzen kann.

von Floh (Gast)


Lesenswert?

ich denk das liegt am "2dimensionalen" Feld.

probier mal
lcd_puts_P( &sensornames[sensor][0]);
aus.

von Andreas F. (aferber)


Lesenswert?

Stephan P. schrieb:
> Funktion lcd_puts_P:
[...]
> void lcd_puts_p(const char *progmem_s)

Nein. Gross-/Kleinschreibung beachten. Vermutlich wird in lcd.h ein 
Makro definiert sein. Das bitte posten. Wenn lcd_puts_P() (mit grossem 
"P") so deklariert wäre, wie du schreibst, dann gibt zumindest mein 
AVR-GCC keinen Fehler.

Andreas

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.