mikrocontroller.net

Forum: Compiler & IDEs PROGMEM Array


Autor: Stephan P. (s-p)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <stdlib.h>
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "lcd.h"

#define MAX_SENSORS    3

const char sensornames[MAX_SENSORS][10] PROGMEM = {"Temp.:","Tank:","Licht:"};

int main(void) {
    uint8_t sensor = 0; //wird im endgueltigen Programm von Zeit zu Zeit inkrementiert
    lcd_init(LCD_DISP_ON);
    sei();
    
    lcd_clrscr();
    lcd_puts_P(sensornames[sensor]);
    
    for(;;){
    }
}

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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan P. (s-p)
Datum:

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

Funktion lcd_puts_P:
/*************************************************************************
Display string from program memory without auto linefeed 
Input:     string from program memory be be displayed                                        
Returns:   none
*************************************************************************/
void lcd_puts_p(const char *progmem_s)
/* print string from program memory on lcd (no auto linefeed) */
{
    register char c;

    while ( (c = pgm_read_byte(progmem_s++)) ) {
        lcd_putc(c);
    }

}/* lcd_puts_p */

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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich denk das liegt am "2dimensionalen" Feld.

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

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht 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

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.