- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 4 von 4

Thema: Probleme über Variabel-Addressierung auf Flash-Char

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Beiträge
    5

    Probleme über Variabel-Addressierung auf Flash-Char

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen!

    Beim programmieren einer Anwendung für mein S65-Display bin ich auf einen seltsamen Fehler gestoßen.

    Ich habe dazu ein neues kleines Programm geschrieben, um die Fehler einzuschränken.

    Es geht die Globale Variabel "uint8wochentag". Hier der Code:
    Code:
    uint8_t uint8wochentag = 0;
    
    const char arytext1[] PROGMEM = "M"; 
    const char arytext2[] PROGMEM = "D"; 
    PGM_P verweis[8] PROGMEM = { arytext1, arytext2 };
    
    uint8_t textausgabe(PGM_P string) {
    	uint8_t charZeichen = pgm_read_byte((string));
    	return charZeichen;
    }
    
    int main(void) {
    	
    	DDRD |= LED1; // Als Ausgang
    	if(textausgabe(verweis[uint8wochentag]) == 77)
    	{
    		PORTD |= LED1; // Led aktivieren
    	}	
    }
    Der Prototyp textausgabe, greift auf den Inhalt der angegebene Flashaddresse zu und gibt diesen Wert zurück. Sprich bei:

    Code:
    textausgabe(verweis[0])
    gibt er "M" zurück. (da verweis auf arytext1[])

    Und bei:

    Code:
    textausgabe(verweis[1])
    gibt er "D" zurück. (da verweis auf arytext2[])

    Beides funktioniert soweit.

    Über die globale Variabel uint8wochentag möchte ich nun festlegen, welcher Text ausgelesen wird. Sprich so:

    Code:
    textausgabe(verweis[uint8wochentag])
    Wenn die uint8wochentag == 0 ist, dann soll der Inhalt von arytext1 zurückgegeben (also der Buchstabe "M" bzw. "77" als ASCII). Wenn dies der Fall ist, dann wird die Led im oberen Code aktiviert.

    Obwohl ich global schon den Wert der Variabel zugewiesen habe:

    Code:
    uint8_t uint8wochentag = 0;
    Funktioniert es nicht. Ich muss in im Main-Proto der Variabel nochmal den Wert zuweisen (sprich: uint8wochentag = 0 und diese Wertzuweisung muss unmittelbar vor:

    Code:
    if(textausgabe(verweis[uint8wochentag]) == 77)
    stehen. Befindet sich was dazwischen, dann geht es wieder nicht! Total komisch.

    Aber führe ich dieses aus, dann scheint es mit dem Zugriff auf die globale Variabel problemlos zu gehen:

    Code:
    	if(uint8wochentag == 0)
    	{
    		PORTD |= LED1;
    	}
    Woran kann es liegen? Vielen Dank!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    38
    Beiträge
    4.255
    Findet der Zugriff in einer ISR statt? Dann mach die Variable mal volatile.

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Das nicht funktionieren ist bei dem Code der Normalzustand.
    Das eigentlich erstaunliche ist, dass du ein Variante generieren kannst, bei dem es zufällig doch geht.

    Das Array verweis liegt auch im Flash, also kannst du gar nicht direkt per verweis[] darauf zugreifen. Du musst auch hier den Wert selber aus dem Flash lesen.

    Code:
    if(textausgabe((PGM_P)pgm_read_word(&verweis[uint8wochentag])) == 77)
    MfG
    Stefan

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    19.11.2006
    Beiträge
    5
    Tatsächlich. Funktioniert. vielen vielen Dank!
    Aber trotzdem interessant etwas zufinden, was manchmal funktioniert, obwohl es eigentlich nicht soll/kann:-D

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress