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.





Aucun commentaire: