Scrittura su Celle diverse FRAM e migliorie al codice

Salve a tutti!
Questo è il mio primo post, e avrei bisogno di un aiutino in quanto mi ritrovo bloccato su alcune cose… premetto che sono un principiante, ho iniziato da pochissimo e tutto ciò che so sulla programmazione viene proprio dal forum!! grazie a tutti quelli che contribuiscono.
Questo è lo sketch, fa tutto quello che deve fare eccetto variare ogni volta le celle dove vengono scritte le variabili in modo da utilizzare la FRAM completamente… non riesco a capire cosa devo fare…

inoltre, visto che sono alle basi, esistono funzioni o comandi per semplificare o migliorare il mio schizzo? Apprezzerei molto qualsiasi aiuto così da poter migliorare, grazie a chiunque mi aiuti!

#include <Wire.h>                   
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"

uint8_t FRAM_CS = 10;                                  //utilizzo di hardware SPI
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);  

#define I2C_ADDR 0X27                // defininizioni necessarie per problematiche relative all'utilizzo
#define BACKLIGHT_PIN 3              // di uno schermo con interfaccia I2C economico che presenta diverse limitazioni
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

#define PULSANTI 2                // definizione di input e output
#define MOTORE 8
#define MICROSTOP 3
#define JOG 4
#define salva 5
#define su 7
#define giu 6

int val = LOW;                    // variabili per usare i pulsanti come interruttore ed evitare doppie letture
int vecchio_val = LOW;          

int val2= LOW;
int vecchio_val2 = LOW;

int val3 = LOW;
int vecchio_val3 = LOW; 
        
int stato=0;                      // variabile necessaria per la creazione dell'evento allarme

int statosu = 0;
int statogiu = 0;                 // variabili per settare il delay per il motore
int statosalva = 0;

byte pos_et;                      // variabile salvata nella FRAM per regolare il delay del motore

unsigned long prevMillis = 0;     // funzione millis() per far si che il motore dopo un po che và entri in errore
unsigned long interval = 2000; 

unsigned int datofram;            // variabili utilizzate per shiftare i bit e ricomporre il numero superiore a 255
byte a1 = 0;
byte a2 = 0;
byte intPt0 = 0;
byte intPt1 = 0;

LiquidCrystal_I2C LCD(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

void setup(){
  fram.begin();
  
  pinMode(PULSANTI, INPUT);       
  pinMode(MICROSTOP, INPUT); 
  pinMode(MOTORE,OUTPUT);
  pinMode(JOG,INPUT);
  pinMode(salva, INPUT);
  pinMode(su, INPUT);
  pinMode(giu, INPUT);

  intPt0 = fram.read8(5);                           //lettura celle 5 e 6 della FRAM
  intPt1 = fram.read8(6);
 
  datofram = ((intPt1 << 8) | intPt0);;             //ricostruzione del numero nelle celle 5 e 6
  
  LCD.begin(16,2);                                  //accensione dello schermo difettoso
  LCD.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  LCD.setBacklight(HIGH);
  LCD.home();
  LCD.setCursor(3,0);
  LCD.print("AREADERMA");
  delay(2000);
  LCD.clear();

  if (fram.begin()) {                              // verifica della presenza o meno della FRAM
    LCD.setCursor(1,0);
    LCD.print("Ricerca dati..");
    delay(500);
    } 
    else {
    LCD.setCursor(0,0);
    LCD.print("Nessun dato");
    while (1);
    }
    pos_et = fram.read8(1);
    LCD.clear();
}

void loop(){
    datofram>=0;
    
    LCD.setCursor(0,0);                       //schermata LCD
    LCD.print("Etichette ");
    LCD.print(datofram);
    LCD.setCursor(0,1);
    LCD.print("Posizione: ");
    LCD.print(pos_et);

     
  statosu = digitalRead (su);
  if( statosu == HIGH)
  { delay(100);
    LCD.clear();
    pos_et++;}             //incrementa il valore alla pressione del pulsante "su"

  statogiu = digitalRead (giu);
  if( statogiu == HIGH)
  {delay(100);
  LCD.clear();
  pos_et--;}               //decrementa il valore alla pressione del pulsante "giu"


statosalva = digitalRead (salva);

if (statosalva == HIGH)
{fram.writeEnable(true);      //salvataggio variabile nella cella 1
 fram.write8(1,pos_et);
 fram.writeEnable(false);

LCD.setCursor(15,1);
LCD.print("S");
}
  
  
  val = digitalRead(PULSANTI);   
    if ((val == HIGH) && (vecchio_val == LOW)){   //input motore con funzione millis()
    prevMillis = millis();
    digitalWrite(MOTORE,HIGH);
    stato = 1;
    }   
    vecchio_val = val;  
    
   
   if  (( stato==1) && (millis()-prevMillis>=interval)){
   digitalWrite(MOTORE,LOW);
   LCD.clear();
   LCD.setCursor(0,0);
   LCD.print("ERRORE ETICHETTE");                  //errore se il motore reata attivo oltre 3 secondi
   LCD.setCursor(1,1);
   LCD.print("...attendere...");
   stato=0;
   delay(3000);
   LCD.clear();
   }   

 
           
   val2=digitalRead(MICROSTOP);
   if ((val2 == HIGH) && (vecchio_val2 == LOW)){  
    delay(pos_et*10);
    stato=0;
  datofram++;
  a1 = byte(datofram);        // si scompone l'intero in 2 byte
  a2 = byte( datofram >> 8);
  fram.writeEnable(true);
  fram.write8(5, a1);
  fram.writeEnable(false);
  fram.writeEnable(true);
  fram.write8(6, a2);
  fram.writeEnable(false);
    digitalWrite(MOTORE, LOW);       
  }   
   vecchio_val2 = val2;  
   
   val3 = digitalRead(JOG);
   if ((val3 == HIGH) && (vecchio_val3 == LOW)){        //input secondario usato per fare avanzamenti manuali
    stato=0;
    delay(10);
    digitalWrite (MOTORE,HIGH);
 }
  vecchio_val3 = val3;
 }



  
  

Ma… a dire il vero io mi ero presentato, anche perchè ho visto centinaia di post come il tuo…aspetta che cerco.

Si, è vero, è stata una svista di nid69ita … la tua presentazione, fatta circa 10 giorni fa, si trova correttamente QUI. Grazie :slight_smile:

Guglielmo

1 Like

Questa cosa con le FRAM è del tutto inutile e complica, senza necessità, il codice. La cosa è necessaria con EEPROM, che hanno un numero limitato di scritture possibili per singola cella (attorno alle 105 ), ma con le FRAM che hanno spesso oltre 1014 numeri di scrittura per singola cella … difficile che ci arriverai :smiley:

Guglielmo

Si probabilmente hai ragione :sweat_smile: però ero interessato a capire il metodo alla base, così a pancia mi viene da pensare che occorra tenere una cella dove viene memorizzato il numero di allocazione ove viene salvato il dato, è così?
Per quanto riguarda il codice come ti sembra? Consigli?

In tal caso ti fornisco la documentazione (ed il relativo codice) di Atmel per le EEPROM … buono studio :wink:

AVR101 - High Endurance EEPROM Storage.pdf (47.3 KB)

Atmel - High Endurance EEPROM Storage.c.zip (1.5 KB)

Guglielmo

1 Like

Cavolo purtroppo mi si è presentato un altro problema, il display i2c funziona subito all'inizio, poi dopo un po inizia a fare simboli strani statici.... cosa potrebbe essere?

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.