Hallo miteinander, Tools: LINUX, AVR-GCC , Atmega8, kann mir jemand sagen wo in folgendem Code (Fragment) der Wurm drin ist. #define HumTabEntries 11 typedef struct { uint8_t perc; uint16_t sfreq; uint8_t ppl; } sHumTabEntry; static const PROGMEM sHumTabEntry HumTab[11] = { {0,7351,13}, {10,7224,13}, {20,7100,12}, {30,6976,12}, {40,6853,12}, {50,6728,12}, {60,6600,13}, {70,6468,13}, {80,6330,14}, {90,6186,14}, {100,6033,15} }; .... int main(){ for (muxCount = 0; muxCount < HumTabEntries; muxCount++){ lcd_clrscr(); lcd_puts("c: "); itoa(muxCount,sstring,10); lcd_puts(sstring); lcd_putc(' ' ); lcd_putc(' ' ); lcd_puts("%: "); itoa(HumTab[muxCount].perc,sstring,10); lcd_puts(sstring); lcd_putc(' ' ); lcd_putc(' ' ); lcd_putc('\n'); lcd_gotoxy(0,1); lcd_puts("frq: "); ltoa(HumTab[muxCount].sfreq,sstring,10); lcd_puts(sstring); lcd_putc(' ' ); lcd_putc(' ' ); lcd_puts("ppl: "); itoa(HumTab[muxCount].ppl,sstring,10); lcd_puts(sstring); lcd_putc(' ' ); lcd_putc(' ' ); } } Danke
Ach ja, was auf dem Display ausgegeben wird, sind wunderschoene Zahlen, jedoch nicht die die ich erwarte.
Um auf Werte im Flash (PROGMEM) zugreifen zu können, musst Du schon die entsprechenden Funktionen aus der pgmspace.h verwenden. Das geht nicht direkt. Was Du da angezeigt bekommst, sind vermutlich irgendwelche Werte, die zufällig an Adressen im SRAM stehen, die den Flash-Adressen Deiner Flash-Variablen entsprechen.
Sorry, das komplette Programm ist etwas umfangreich, um den Fehler zu finden habe ich aber alles ausgeklammert was nicht benoetigt wird. hier der Teil der uebrig geblieben ist. #include <stdlib.h> #include <stdint.h> #include <avr/io.h> #include <avr/pgmspace.h> #include <avr/interrupt.h> #include <util/delay.h> #include "lcd.h" #define FALSE 0 #define TRUE 1 #define ADC_ref 4980 // 5V on Aref => 5000 mV for Int arithmetic #define ADC_maxval 1024 #define HumTabEntries 11 typedef struct { uint8_t perc; uint16_t sfreq; uint8_t ppl; } sHumTabEntry; static const PROGMEM sHumTabEntry HumTab[11] = { {0,7351,13}, {10,7224,13}, {20,7100,12}, {30,6976,12}, {40,6853,12}, {50,6728,12}, {60,6600,13}, {70,6468,13}, {80,6330,14}, {90,6186,14}, {100,6033,15} }; int main(void) { uint8_t muxCount = 0; uint8_t dspCount = 0; char sstring[20]; initPorts(); /* initialize display, cursor off */ lcd_init(LCD_DISP_ON); /* clear display and home cursor */ lcd_clrscr(); /* put string to display (line 1) with linefeed */ lcd_puts("Hello\n"); _delay_ms(100); /* adc_init(); initTimer0(); initExtInt0(); */ PORTD |= (1<<PD0); PORTD |= (1<<PD1); // sei(); for (;;) { for (muxCount = 0; muxCount < HumTabEntries; muxCount++){ lcd_clrscr(); lcd_puts("c: "); itoa(muxCount,sstring,10); lcd_puts(sstring); lcd_putc(' ' ); lcd_putc(' ' ); lcd_puts("%: "); itoa(HumTab[muxCount].perc,sstring,10); lcd_puts(sstring); lcd_putc(' ' ); lcd_putc(' ' ); lcd_putc('\n'); lcd_gotoxy(0,1); lcd_puts("frq: "); ltoa(HumTab[muxCount].sfreq,sstring,10); lcd_puts(sstring); lcd_putc(' ' ); lcd_putc(' ' ); lcd_puts("ppl: "); itoa(HumTab[muxCount].ppl,sstring,10); lcd_puts(sstring); lcd_putc(' ' ); lcd_putc(' ' ); _delay_ms(1000); _delay_ms(1000); _delay_ms(1000); } lcd_clrscr(); lcd_puts("ready"); _delay_ms(1000); _delay_ms(1000); _delay_ms(1000); } }
@Johannes M. (johnny-m) @Jörg Wunsch Klar doch, huuu bin ich bloed. danke euch beiden Ju
Jörg Wunsch wrote:
> Du liest aus dem SRAM statt aus dem Progmem.
Huuuch, stimmt. Das hätte auch mir auffallen können :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.