Go Down

Topic: Nochmal Hilfe gesucht zum Speichern/Abrufen (Flash Memory) (Read 927 times) previous topic - next topic

stringwalker

Hallo,

vor einiger Zeit hatte ich (Anfänger) euch um Hilfe gebeten bei einem Projekt, bei dem zwei LEDs von einem Poti geregelt werden und Potistellungen abgespeichert werden sollen. Inzwischen funktioniert alles tasächlich einwandfrei, aber mein Code ist völlig aufgeblasen durch zu viele ifs u.ä. und
belegt unmäßig viel Speicher.

Jetzt habe ich ein bisschen dazu gelernt und will den Code neu schreiben auf Basis einer Idee von pylon. Es gibt dabei allerdings ein Problem, an dem ich festhänge. Vielleicht könnt ihr helfen.

Der Code hier ist abgespeckt (normalerweise sind die arrays größer, es sollen mehr Werte gespeichert werden, Anzeige etc.), aber der Kern steht da.

Also:
Die PWM Werte von LED 1 und 2 werden nach Tabelle von einem Poti geregelt, das funktioniert gut. Mit Taster 1 soll dann eine Potistellung im Flash gespeichert werden. Ich habe mal "range" eingetragen (s. Codezeile), der Wert wird auch gespeichert, aber wenn ich diese Stellung incl. LED Werten mit Taster 2 reproduzieren will, machen die LEDs irgendwas, nur nicht das, was sie sollen.

Es fehlt also eine richtige Verbindung zwischen gespeicherte Potistellung und LED Werten.
Habt ihr vielleicht eine Idee dazu?

Code: [Select]

#include <avr/pgmspace.h>

  const int potiMin = 0;       // Poti Min
  const int potiMax = 1023; // Poti Max
  uint8_t led_1 = 9;           //  LED 1 (rot)
  uint8_t led_2 = 10;          // LED 2 (grün)
  uint8_t led_3 = 12;          // LED 3 (gelb)
                             
  uint8_t taster_1 = 4;        // Taster 1 // Taster und Schalter
  uint8_t taster_2 = 2;        // Taster 2 // sind elektr. entprellt
  uint8_t taster_3 = 7;        // Taster 3   (Schalter)
 
  int val_1 = 0;               // Status Taster 1
  int val_2 = 0;               // Status Taster 2
  int val_3 = 0;               // Status Taster 3

  PROGMEM uint8_t pwm_1[] = { 0, 255, 100,50,};  // zum Testen hier
                                                                      // jeweils nur
  PROGMEM uint8_t pwm_2[] = {10, 0, 200, 20,};   // vier PWM Werte

void setup()
{
    Serial.begin(9600);
 
    pinMode(taster_1, INPUT);       
    pinMode(taster_2, INPUT);       
    pinMode(taster_3, INPUT);       // ist Schalter
   
    pinMode(led_1, OUTPUT);         
    pinMode(led_2, OUTPUT);         
    pinMode(led_3, OUTPUT);         
}

void loop()
{
       while (digitalRead(taster_3)== 1 )  // Schalter an
    {
        val_3 = digitalRead(taster_3);     // Status Taster 3
           if (val_3 == 1)
             {
               digitalWrite(led_3, HIGH);   // gelbe LED an
             }         
           else
             {
              digitalWrite(led_3, LOW);      //gelbe LED aus
             } 
               
         int poti = analogRead(A0);            // Poti auslesen
         int range = map(poti, 0, 1023, 0, 4); // Zum Testen nur 4 Bereiche
           
         analogWrite(led_1, pgm_read_byte(pwm_1+range)); // PWM Wert aus Flash an LED 1
         analogWrite(led_2, pgm_read_byte(pwm_2+range)); // PWM Wert aus Flash an LED 2

         val_1 = digitalRead(taster_1);     
           
            if (val_1 == 1)                              /////////////////////////////////////////
             {                                             // HIER IST DAS ERSTE PROBLEM:
              PROGMEM int range;                 //  range speichert zwar die Potistellung, die Verbindung zu den LED Werten
                                                           // besteht dadurch aber noch nicht! (s.u.)
             }
             delay (10);
      }
             
             
             
         while (digitalRead(taster_3)== 0 )      // Schalter aus
      {
            val_3 = digitalRead(taster_3);        // Status Taster 3
            if (val_3 == 1)
             {
                digitalWrite(led_3, HIGH);        // gelbe LED an
             }         
           else
             {
               digitalWrite(led_3, LOW);            //gelbe LED aus
             } 
               
             int poti = analogRead(A0);                // Poti auslesen
             int range = map(poti, 0, 1023, 0, 4); // Zum Testen auch nur 4 Bereiche
       
           
           
             val_2 = digitalRead(taster_2); 
             if (val_2 == 1)
             {
             analogWrite(led_1, pgm_read_byte(pwm_1+range));       //   Hier sollte dann die mit Taster 1
             analogWrite(led_2, pgm_read_byte(pwm_2+range));       //   gespeicherte Potistellung zusammen
                                                                                           //   mit den entsprechenden PWM Werten ausgegeben
                                                                                           //   werden. Funktioniert aber nicht.
             }           
               
             delay(10);
     }
}           
           



Vielen Dank im Voraus!

stringwalker

pylon

Du kannst von einem Sketch aus nichts im Flash speichern. Im Moment hast Du nur die 4 möglichen Helligkeiten der LEDs im Flash gespeichert. Das ist möglich, da dies Konstanten sind. Wenn Du veränderliche Werte fix speichern willst, musst Du das EEPROM nehmen.

stringwalker

Ach so, das wusste ich nicht, deshalb die Probleme! Danke für den Hinweis.

Ich habe es gleich ausprobiert, und so funktioniert es endlich einwandfrei. Ich schreibe jetzt die Potistellung als Variable "z" ins EEPROM und lese den Wert zusammen mit den Flash Werten aus.

analogWrite (led_1, pgm_read_byte(pwm_1+z));

Noch eine Frage zu dem Pluszeichen im Code:
Auch wenn es funktioniert, hätte ich gerne noch ein paar Infos zu seiner Anwendung gelesen. Bisher habe ich noch keine Erklärungen dazu finden können.

Grüße
stringwalker

pylon

Quote
Noch eine Frage zu dem Pluszeichen im Code:


Welches Pluszeichen? Das in Deiner analogWrite-Zeile? Das ist eine simple Adress-Addition. pwm_1 ist ein Array und die werden in C/C++ immer (auch) als Pointer behandelt. Ich habe also eine Adresse und kann dort somit etwas hinzuzählen und komme dann zu einer neuen Adresse, auf die ich zugreifen kann.

stringwalker

Ja, ich meinte das Pluszeichen in der analogWrite Zeile  - danke für deine Erklärung, habe sie verstanden.

stringwalker

Udo Klein

Die beiden Codestellen

Code: [Select]

while (digitalRead(taster_3)== 1 )  // Schalter an
    {
        val_3 = digitalRead(taster_3);     // Status Taster 3
           if (val_3 == 1)
             {
               digitalWrite(led_3, HIGH);   // gelbe LED an
             }         
           else
             {
              digitalWrite(led_3, LOW);      //gelbe LED aus
             }


Code: [Select]

         while (digitalRead(taster_3)== 0 )      // Schalter aus
      {
            val_3 = digitalRead(taster_3);        // Status Taster 3
            if (val_3 == 1)
             {
                digitalWrite(led_3, HIGH);        // gelbe LED an
             }         
           else
             {
               digitalWrite(led_3, LOW);            //gelbe LED aus
             }


sehen mehr als verdächtig aus. Das ist doch mit hoher Wahrscheinlichkeit eher so gemeint:


Code: [Select]

         while (digitalRead(taster_3)== 1 )      // Schalter aus
      {
            val_3 = digitalRead(taster_3);        // Status Taster 3
            digitalWrite(led_3, HIGH);   


bzw.
Code: [Select]

         while (digitalRead(taster_3)== 0 )      // Schalter aus
      {
            val_3 = digitalRead(taster_3);        // Status Taster 3
            digitalWrite(led_3, LOW);   
Check out my experiments http://blog.blinkenlight.net

stringwalker

Ja, danke für deinen Hinweis, da hatte ich wohl um die Ecke gedacht!
Inzwischen habe ich mein gesamtes Projekt neu gestaltet, und es läuft endlich wie gewünscht.

Grüße
stringwalker

Go Up