SH1106 et SSD1327

Pour votre seconde question , il n'a pas de problème de dépassement de pile pour un picaxe de la série x2.
Pour un 20M2 par contre , il y a des chances que oui car pour mon 20x2 , je suis limite. Je conseil donc de mètre le jeu de caractère dans une eeprom pour résoudre le problème efficacement.
Non, je parlais de la pile générée par le gosub.
Chaque appel de sub génère la mise en mémoire d'une adresse de retour dans une " pile d'adresses", chaque adresse est effacée par le return correspondant. Il y a une limite de gosub imbricables, si on dépasse cette limite pendant une simulation, on a un message d'erreur "dépassement de pile" et blocage du programme. Hors simulation, le programme bug sans explication et on ne sait pas pourquoi...
Cette limite peut ne jamais être dépassée, mais il y a un risque.
Donc, je me posais la question.
Essaie ce programme en simulation:
debut:
gosub suite
suite:
goto debut

MM
 
Last edited:
Ok , je ne le savais pas. Je viens de tester ton programme. Effectivement ça déborde pendant la simulation Je vais faire la motif sur mon programme .
 
Je viens de vérifier le nombre max d'adresses mémorisées avec ce programme
b0=0
debut:
gosub suite
suite:
inc b0
goto debut

Ce nombre est donné par b0, c'est 8 , donc, le nombre max de gosub imbriqués est 8...
MM
 
Je viens de faire une petite expérience sympa que vous pouvez également faire avec votre SH1106 ci vous posséder une sonde de température DS18B20.

voici le code :

b41 = b40
readtemp c.1, b40
if b41 = b40 then

x1 = 58'x_LongeurDeLaLigneEnPixel
'AngleX1 = 175'AngleDeLaLigneEndegres ( mini0 maxi 360)
AngleX1 = b40 *2 + 180
x0 = 63'x_CordonnerDepartEnPixel
y0 = 63'y_CordonnerDepartEnPixel
stipple = 0
ClearPixel = 0
gosub DrawsLine 'dessine une ligne
else
x1 = 58'x_LongeurDeLaLigneEnPixel
'AngleX1 = 175'AngleDeLaLigneEndegres ( mini0 maxi 360)
AngleX1 = b41 *2 + 180
x0 = 64'x_CordonnerDepartEnPixel
y0 = 63'y_CordonnerDepartEnPixel
stipple = 0
ClearPixel = 1
gosub DrawsLine 'dessine une ligne
endif

Vous verrez l'aiguille s'effacer et ce redessiner avec sa nouvelle position quand la température a augmenté ou l'inverse quand la température diminue. Je viens de le testé avec mon 20x2, et mon SH1107 ça fonctionne.
 
Last edited:
Ok , merci pour l'info .Voici les codes modifier.
Est ce que la modif vous semble correct ?
Ben presque.
Main est maintenant un sous programme appelé par "gosub main" et finissant par son "return". L'adresse générée par ce gosub est effacée par le return ...ok
Mais il y a aussi un "goto main", le return de fin va renvoyer où si il n'y a pas d'adresse ??
En résumé: il DOIT y avoir autant de return que de gosub. Le return renvoie à l'adresse qui suit le gosub appelant pour continuer le programme là où il a été détourné, les deux sont complémentaires.
Après un goto, il ne doit pas y avoir de return à la fin, mais un autre goto.
Cela dit, merci pour ce sympathique thermomètre. Oui, j'ai des DS18B20 et il va falloir que je trouve le moyen de tester tous ces programmes.
PS: Sur les forums, il est coutumier de se tutoyer, mais ce n'est pas une obligation...
MM
 
Bonjour,
Ah! Oui, c'est Ok.
Une remarque toutefois, les boucles du genre:
Starcode:
code
goto Starcode

Peuvent avantageusement être remplacées par:
do
code
loop
De plus, ces boucles peuvent être conditionnées en entrée et sortie par : while, if, etc
Encore bravo pour ce travail pas simple du tout..
Je ferai des essais beaucoup plus simples
MM
 
Ok. Merci pour l'info. Je pence que ce programme peut être un point de départ intéressant pour tous projet picaxe nécessitant un SH1106 ou un SH1107.
Du coup peut tu remplacer le programme du SH1107 actuellement visible sur ton site par ce programme a (Lib_SH1107_PICAXE_20X2_V2)
qui est maintenant a jour et a la fois plus complet ?
Merci d'avance.
 
Last edited:
Ok. Merci pour l'info. Je pence que ce programme peut être un point de départ intéressant pour tous projet picaxe nécessitant un SH1106 ou un SH1107.
Du coup peut tu remplacer le programme du SH1107 actuellement visible sur ton site par ce programme a (Lib_SH1107_PICAXE_20X2_V2)
qui est maintenant a jour et a la fois plus complet ?
Merci d'avance.
Oui, je vais faire une mise à jour.
MM
 
Je te remercie . Cela me gênais un peut de laisser un programme qui contient des bugs et encore merci pour l'aide apporté a la correction du programme.
 
Bonjour,
Je viens de relire le programme sur ton site.
Il y a une petite erreur sur ces 2 lignes:
AngleXY:
AngleX = sin y1 * Print / 100
AngleY = cos y1 * Print / 100
return

qui se trouve dessous cette ligne:

AngleYX:
AngleY = sin AngleX1 * Print / 100
AngleX = cos AngleX1 * Print / 100
return

il faudrait la remplacer par :
AngleXY:
AngleX = sin AngleX1 * Print / 100
AngleY = cos AngleX1 * Print / 100
return

Désoler pour la gêne occasionner
Il s'agi d'un copié coller qui est mal passer.

Il y a aussi la même erreur dans le fichier (Lib_SH1106_PICAXE_20X2_V2) , je viens de vérifier.
Merci par avance.
 
Last edited:
Y a un truc...
Je me retrouve maintenant avec deux sub AngleXY: différentes
AngleXY:
AngleX = sin y1 * Print / 100
AngleY = cos y1 * Print / 100
return

AngleXY:
AngleX = sin AngleX1 * Print / 100
AngleY = cos AngleX1 * Print / 100
return

Donc, le mieux serait que tu repostes le total rectifié.
MM
 
Y a un truc...
Je me retrouve maintenant avec deux sub AngleXY: différentes
Bonjour,
Je pense avoir rectifié dans le bon sens, à vérifier sur le site.
Pour illustrer ce qui est dit #48:
le code :
Teste:
lookup LongeurNumASCII,(2,"SH1106"), NumASCII
gosub Numero
inc LongeurNumASCII
if LongeurNumASCII < 7 then : gosub Teste endif

Devient:
do
lookup LongeurNumASCII,(2,"SH1106"), NumASCII
gosub Numero
inc LongeurNumASCII
loop while LongeurNumASCII < 7

Mais les deux donnent le même résultat
J'espère arriver à faire un lecteur de capteur T° et humidité avec un 08M2, sans fonctions circulaires évidemment.
MM
 
Last edited:
Bonjour,
Voici les fichiers corriger.
Je te confirme que la rectification sur ton site est correcte.

Peut tu me donner la référence de ton capteur d'humidité. Ça m' intéresse pour l'un de mes projet en court.

Si tu souchette afficher des valeurs: voici un exemple avec la sonde ds18b20 :

readtemp c.1, b40
bintoascii b40, b42, b43, b44
x = 50 : gosub SetPosition
LongeurNumASCII = 0
do
lookup LongeurNumASCII,(7,b42,b43,b44," °C "), NumASCII
gosub Numero
inc LongeurNumASCII
loop while LongeurNumASCII < 8
 

Attachments

Last edited:
Bonjour,
Dans ton avent dernier message tu a mis:
(
Pour illustrer ce qui est dit #48:
le code :
Teste:
lookup LongeurNumASCII,(2,"SH1106"), NumASCII
gosub Numero
inc LongeurNumASCII
if LongeurNumASCII < 7 then : gosub Teste endif

Devient:
do
lookup LongeurNumASCII,(2,"SH1106"), NumASCII
gosub Numero
inc LongeurNumASCII
loop while LongeurNumASCII < 7
(
ensuite tu a mis cette phrase:
(Mais les deux donnent le même résultat)

Je me suis demander ci la différence entre les 2 c'étais la rapidité d'exécution du code.
Peu tu vérifier en baissant la fréquence d'horloge du picaxe ci tu vois une différence l'orque le texte se forme ?
Ci c'est oui , le programme pourrait être grandement améliorer niveau rapidité .
 
Bonjour,
Dans ton avent dernier message tu a mis:
(
Pour illustrer ce qui est dit #48:
le code :
Teste:
lookup LongeurNumASCII,(2,"SH1106"), NumASCII
gosub Numero
inc LongeurNumASCII
if LongeurNumASCII < 7 then : gosub Teste endif

Devient:
do
lookup LongeurNumASCII,(2,"SH1106"), NumASCII
gosub Numero
inc LongeurNumASCII
loop while LongeurNumASCII < 7
(
ensuite tu a mis cette phrase:
(Mais les deux donnent le même résultat)

Je me suis demander ci la différence entre les 2 c'étais la rapidité d'exécution du code.
Peu tu vérifier en baissant la fréquence d'horloge du picaxe ci tu vois une différence l'orque le texte se forme ?
Ci c'est oui , le programme pourrait être grandement améliorer niveau rapidité .
Hello,
Je n'ai encore rien essayé. Mais je pense que le compilateur donnera le même résultat niveau code machine. C'est plus une question de présentation et d'esthétique, mais je n'ai pas vérifié et même si il y a une différence, elle ne doit ps être mesurable à l’œil à 64MHz .
MM
 
Hello,
Je n'ai encore rien essayé. Mais je pense que le compilateur donnera le même résultat niveau code machine. C'est plus une question de présentation et d'esthétique, mais je n'ai pas vérifié et même si il y a une différence, elle ne doit ps être mesurable à l’œil à 64MHz .
MM
Bonjour,
J'ai fait mes premiers essais avec le code #55, sans rien changer, juste mis la fréquence à 64MHz, en accord avec l'I2Csetup.
J'obtiens quelques pixels éclairés dans un coin.
Peux tu me dire ce tu obtiens avec ce même code sur un SH1106. J'ai eu précédemment un écran complet couvert de caractères non identifiables.
Pour info, le potar allume les leds en fin de course des deux côtés, sans effet sur l'affichage ...normal?

MM
SH1106.jpg
 
Last edited:
Bonjour,
Peut tu prendre le dos de l'afficheur en photo , j'ai un doute que se sois un SH1106 car sur ta photo, je vois 2 ligne petite ligne de pixel jaune et 2 petite ligne de pixel bleu 'ors le SH1106 est un afficheur monochrome. Celui que je possède, je les eu chez Gotronic ( Afficheur OLD 1.3''TF051) code: 36041 . Je pence que celui que tu a est un afficheur SSD1315.

 
Last edited:
Bonjour,
Oui, il doit y avoir un pb de ce genre. Voici le lien du vendeur:
L'adresse I2C est $3C . Marqué GME12864
Je vais voir...
MM
 
Précédemment tu ma mis (J'ai eu précédemment un écran complet couvert de caractères non identifiables) . Peut tu le refaire est me mètre la photo.
 
J'ai repris les essais. Avec setfeqM64, j'ai la vue précédente, avec qque pixels dans un coin.
Mais avec setfreqM32, j'ai un arc de cercle + des pixels

SH1106_2.jpg
C'est encourageant, mais je ne comprends pas pourquoi il fonctionne avec une adresse I2C différente de celle marquée dessus
L'écran couvert de pixels ne s'est jamais reproduit:
20251127_185309 (Copier).jpg

On progresse... J'ai acheté (enfin j'espère) un vrai SH1106.
MM
 
Ok . Ton ssd1306 ne dois pas être compatible pour fonctionner a une fréquence de 400 Khz en I2C ci tu a la vue précédente avec le picaxe a 64 Mhz.
Ci tu reçois bien un SH1106 , ce sera plus facile pour mois de t'aider car je ne possède pas de ssd1306.
Tu verra quand tu fera tes premier essais avec ton SH1106 . Le programme fonctionne très bien quand le picaxe est paramétrer a 64 Mhz.
 
Au fait, Je viens de recevoir une horloge ds1307 que j'avais commander , du coup , je vais pouvoir animer les 2 aiguilles de l'horloge dessiner sur le sh1107 du fichier (Lib_SH1107_PICAXE_20X2_V2). Je ferais mes essais demain. Ensuite je le métrais a télécharger pour ceux a qui ça intéresse quand ce sera au point.
 
Last edited:
Bonjour,
Voici l'horloge dessiner sur le SH1107 qui est maintenant animer par l'horloge ds1307 . La photo montre ce que fais le code.
L'horloge indique 15h47 minute au moment ou la photo a été prise. L'aiguille en pointiller indique le 12 h sur une horloge standard.
Se code a été tester sur un picaxe 20x2. Attention , on est limite en mémoire.
Pour information l'aiguille des minute de déplace de 6 degré pour une minute et l'aiguille des heurs se déplace de 30 degré pour une heur.
 

Attachments

Last edited:
Il y a une amélioration a faire dans ContrasteADJ pour pouvoir faire varier le contraste sens devoir attendre que tous le programme s'exécute quand on change la valeur du contraste.
Je les testé sa fonctionne.
Je viens de faire la modifs dans le fichier : (Lib_SH1107_PICAXE_20X2_DS1307) mis précéda-ment a disposition
La voici:

ContrasteADJ:
RetourContraste:
NewContraste = Contraste
readadc 8, Contraste
if Contraste < 10 then : Contraste = 10 : high LedJauneA else : low LedJauneA endif
if Contraste > 250 then : Contraste = 250 : high LedJauneB else : low LedJauneB endif
if NewContraste <> Contraste then : gosub ContrasteMode : pause 500 : goto RetourContraste endif
return
 
Last edited:
Attention , on est limite en mémoire.
Bonjour,
En fait, la majorité de la mémoire est occupée par la liste de caractères. J'utilise un bout de code pour le texte "SH1106" avec un 08M2 à 32MHz et j'ai beaucoup moins de 1000 octets occupés, en plaçant tous les caractères inutilisés en rem, un ";" au début de chaque ligne, sauf pour le case 0 et les caractères utilisés pour le texte. Comme ça, beaucoup moins de pb de mémoire.
Cette petite horloge est très sympa, mais je n'en suis pas là, je reste sur des choses simples et facile,
A suivre...
MM
 
Bonjour,
Et moi, j'attends un SH1106.
En attendant, je bricole avec mon afficheur et un GY-21
Je suis arrivé a ceci
SH-1106 GY-21.jpg

Et je ne sais pas d'où viennent ces pixels parasites. Ils ont parfois disparus et sont revenus
Le code:
Avec le for/next, on gagne 5 octets par rapport à l'autre version
 

Attachments

Bonjour,
Je sais d'ou vienne ces pixel. Sur ta plaque d'essais au plus prés de ton afficheur, il faut que tu rajoute un condensateur de 10uf/50v chimique car le
champ magnétique provoquer par l'envois de donner remonte dans l'alimentation de l'écrant perturbent ainsi son fonctionnement.
Je te conseille aussi dans mètre un au plus prés de ton GY-21 .
On ne le vois pas sur les photo, mais j'en ais un ainsi placer au plus prés de mon afficheur.
Je regarderais ton fichier demain soir car ce soir je n'est pas le temps.
 
Bonjour,
Je sais d'ou vienne ces pixel.
Bonne nouvelle, je vais vérifier ça

PS: J'ai mis des condos partout, mais c'est idem. Le caractère affiché est variable.
On verra avec le SH1106
Pour info, la T° affichée est la même que sur mon thermomètre étalon, à 1 ou 2 dizièmes près et l'hygromètre st très réactif
Un truc encore, à quoi correspond le 176 dans le calcul de la page?
MM
 
Last edited:
Bonjour,
Si tu prend la datasheets du SH1106 dans la page 31 (12 .Set Page Adress) . Dans fonction, il est écrit (Specifies page adress to load display RAM data to page adress register. (POR=B0H) , ce qui signifie ( Spécifie l'adresse de la page dans laquelle charger les données de la RAM d'affichage.(POR=B0H) ) . Dans ton compilateur , tu tape la valeur 0xB0 et quand tu lasse la sourie dessus, Le compilateur te mais 0xB0 = 176.
Voila d'ou ça viens.
Le 176 est la première page sur l' aquel tu écrit.
 

Attachments

Bonjour
Ok, merci.
Je pense avoir trouvé la cause des caractères parasites en réduisant la longueur des lignes à 127 dans ClearPage:
ClearPage:
for LongeurRF = 0 to 127
hi2cout (SETSTARTLINE,0x00)
next
LongeurRF = 0
return
Peut être paramètre spécifique à mon type d'afficheur ?


SH-1106 mod - 1K JPEG.jpg
MM
 
Je viens de mètre ton programme sur mon SH1107. Voici la photo. Comme tu le verra , il n'y a pas de pixel dans la zone d'affichage comme sur ta photo avec ton SSD1306. Je pence que ça viens de ton afficheur. Cependant, J'ai des valeurs afficher et il n'y a pas de GY-21 raccorder.
T=28.8 °C HR=18.9 %.
 

Attachments

  • SH1107 Teste.png
    SH1107 Teste.png
    751.5 KB · Views: 3
Last edited:
Effectivement, je n'est pas lu la doc du ssd1306. Il faut ajuster la taille de l' écran au donner fournit dans sa datasheets.
 
Cependant, J'ai des valeurs afficher et il n'y a pas de GY-21 raccorder.
T=28.8 °C HR=18.9 %.
C'est le résultat d'un calcul avec des valeurs inconnues, on ne peut rien en dire.
Mais le programme fonctionnera avec un GY-21, sans problème.
MM
 
Bonjour,
Du coup, est il possible de rajouté au programme une détection de nom présence du GY-21 et d'afficher a la place des valeurs ceci (--).
Jute au cas ou un file du GY-21 serais mal connecté par exemple sur ma plaque d'essais. C'est juste pour évité d'étre induit en erreur ci cela est possible.
Merci.
 
Back
Top