jeudi 16 février 2023

Raspberry PI PICO EEPROM

 Essai d'une EEPROM, en fait c'est une partie de la mémoire flash, qui sert de mémoire.

Voici le programme :

#include "fct_str.h"
#include <EEPROM.h>

char buffer[100];
char valeur0;
char valeur1;

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  EEPROM.begin(512);
}
void setup1() {
}
void loop() {
  if (Serial.available() > 0) {
    int rlen = Serial.readBytesUntil('\n', buffer, 99);
    if(strcmp_auto_detection ( buffer, "e")==0){//efface
      Serial.println("EFFACE");
      for (int i = 0; i < 512; i++) {
        EEPROM.write(i, 0);
      }
      EEPROM.commit();
    }
    if(strcmp_auto_detection ( buffer, "w0")==0){//ecrit
      Serial.println("ECRIT 11 22");

      EEPROM.write(0, 11);
      EEPROM.write(1, 22);
      EEPROM.commit();

    }
    if(strcmp_auto_detection ( buffer, "w1")==0){//ecrit
      Serial.println("ECRIT 33 44");

      EEPROM.write(0, 33);
      EEPROM.write(1, 44);
      EEPROM.commit();

    }
    if(strcmp_auto_detection ( buffer, "r")==0){//lit
      Serial.println("LIT");

      valeur0 = EEPROM.read(0);
      valeur1 = EEPROM.read(1);
      sprintf(buffer, "%d;%d", valeur0,valeur1);
      Serial.println(buffer);

    }
  }
}
void loop1() {
  delay(100);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
}

Du coup, 4 commandes :
-"e" pour effacer la zone.
-"w0" pour écrire 11 et 22.
-"w1" pour écrire 33 et 44.
-"r" pour lire.


J'ai fait le test, cela me semble normal, j'ai une sauvegarde même si on coupe le courant.


vendredi 3 février 2023

Raspberry PI PICO I2C avec TMP275 et SAA1064

 Le SAA1064 est le premier circuit que j'ai utilisé, dans la fin des années 90, à la SACEP, on a eu un retour de matériel déjà utilisé, de cartes contenant une grande quantité de ce circuit, qui était utilisé pour de l'affichage sur LED.
A l'époque j'utilisai des composant du type SX18, SX28 et SX52 de chez Scenix/Ubicom.
Ceux-là n'avaient pas la sortie I2C, elle était émulée en assembleur.
A l'époque c'était déjà une grande évolution d'avoir des développements directs. La norme était avec émulateur, puis écriture sur une UVPROM.
Le circuit utilisé est un reste de cette époque.
Le défaut de cette carte, est qu'il est compatible 5V, et non pas au 3.3V, cela ne semble pas empêché son fonctionnent, ici il est branché sur le 5V mais les résistances de pull up sont au 3.3V.

Voici le code utilisé, il permet de retranscrire la température sur le SAA1064.
Il ne permet que l'affichage de la température entre -9.99°C et 99.99°C, ce n'est qu'un exemple.

#include <Wire.h>//équivalent I2C

int data1;
int data2;
char buffer[100];
float temperature;
static const char ASII_digit[10]{
  0b11110101,//0
  0b00000101,//1
  0b10110011,//2
  0b10010111,//3
  0b01000111,//4
  0b11010110,//5
  0b11110110,//6
  0b10000101,//7
  0b11110111,//8
  0b11010111,//9
};

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  Wire.begin();

  //test TMP275
  //configuration 12 bits au lieux de 9 bits
  Wire.beginTransmission(0x4F);
  Wire.write(0b00000001);
  Wire.write(0b01100000);    
  Wire.endTransmission();
  //mise sur la liste de lecture
  Wire.beginTransmission(0x4F);
  Wire.write(0b00000000);    
  Wire.endTransmission();
}
void setup1(){}
void loop() {
  //test TMP275
  Wire.requestFrom(0x4F, 2);
  data1 = Wire.read();
  data2 = Wire.read();
  temperature = ((data1 << 4) + (data2 >> 4)) * 0.0625;
  sprintf(buffer, "data1=%02X data2=%02X valeur=%03X temperature=%f°C",data1,data2,(data1 << 4) + (data2 >> 4) , temperature);
  Serial.println(buffer);

  //test SAA1064
  sprintf(buffer, "%02.2f", temperature);
  Wire.beginTransmission(0x38);
  Wire.write(0b00000000);
  Wire.write(0b01110111);
  Wire.write(ASII_digit[buffer[4]-'0']);//1
  Wire.write(ASII_digit[buffer[3]-'0']);//2
  Wire.write((ASII_digit[buffer[1]-'0']) | (0b00001000));//3
  Wire.write(ASII_digit[buffer[0]-'0']);//4
  Wire.endTransmission();

  delay(400);  
}
void loop1() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(100);
  digitalWrite(LED_BUILTIN, LOW);
  delay(100);
}
Le tableau "ASII_digit", permet de faire la conversion ASCII vers les LEDS piloté par le SAA1064.
Le texte en imprimé avec la directive "%02.2f" cela oblige 2 chiffres devant et derrière la virgule.
La commande "Wire.write((ASII_digit[buffer[1]-'0']) | (0b00001000));//3", fait mettre une virgule.





jeudi 2 février 2023

Raspberry PI PICO I2C

Voici l'essai de la communication en I2C.

Pour cela j'utilise une sonde de température TMP275, que j'utilise déjà pour ma domotique.

Montage électrique :


Programme :

Essai avec les doigts dessus la sonde.



Pas de problèmes.