Suite au programme écrit en RapidQ ICI sur l'algorithme de Bresenham, j'ai décidé de le réécrire pour microcontrôleur Pic
Je vous joins également un document expliquant son fonctionnement que vous pouvez télécharger ICI
J'ai traité actuellement 2 sujets, la lignes d'un point à un autre, et le cercle
J'ai utilisé un écran Oled 128x64 en mode de communication SPI pour vous montrer le résultat obtenu, voici son datasheet
Le microcontrôleur utilisé est un Pic18F26K22, voici son datasheet
Pour le rendre compatible pour les Pic16Fxxxx et Pic18Fxxxx je n'ai pas utilisé les instructions des microcontrôleurs Pic18Fxxxx
j'ai opté pour le mode SPI bit bang, ce qui permets de choisir les pattes quand veut sur le microcontrôleur, de plus ça le rends compatible
pour les microcontrôleurs ne possèdent pas du SPI
Voici mon branchement pour mode SPI
Code : Tout sélectionner
#DEFINE dc LATA,2 ; RA2 ==> sélection du mode : commande = 0 , donnée = 1
#DEFINE cs LATA,1 ; RA1 ==> activer ou désactiver la transmission
#DEFINE rst LATA,0 ; RA0 ==> reset de l'écran
#DEFINE sck LATC,3 ; RC3 ==> horloge de synchronisation
#DEFINE mosi LATC,5 ; RC5 ==> envoyer les données sur écran oled 128x64
Le code ASM a été écrit avec jens file Editor 3.95
Fichier code + fichier à mettre dans le Pic : Line.zip
Une petite vidéo
https://youtu.be/JvbgqLQi7EU
Suite à une demande, je me suis aussi intéressé à l'algorithme de Bresenham sur le cercle
Le code ASM a été écrit avec jens file Editor 3.95
Fichier code + fichier à mettre dans le Pic : Circle-3.zip
Voici ce que ça donne
https://www.youtube.com/watch?v=V9DdnYO1-YM
Je tiens à signaler que ce cercle n'est pas encore parfais, mais il se rapproche vraiment de la réalité, de plus actuellement c'est une version 8 bits,
ce qui limite la taille à un rayon de 85 pixels (suffisant pour un écran OLED 128x64)
Chose qui m'a était demandé c'est d'expliqué les différentes fonction des sous programmes
Je ne parlerais pas de l'initiation de l'écran, voir à ce sujet ce post #1 qui est suffisamment documenté.
La fonction ligne sert à tracer un trait d'une position à une autre
La fonction circle sert à créer un rond avec un rayon mini de 1 pixel à 85 pixel
La fonction cls sert à effacer l'écran et la mémoire sdram ou son stocké le dessin de l'écran
La fonction print sert à écrire un texte à l'écran
La fonction locate sert à positionner le texte sur la longueur et hauteur
la fonction delay_s sert à créer une pause d'un temps de 10 ms minimum à 2550 ms maximum
la fonction delay_ms sert à créer une pause d'un temps de 1 ms minimum à 255 ms maximum
la fonction delay_µs sert à créer une pause d'un temps de 1 µs minimum à 255 µs maximum
La fonction pset sert à afficher un pixel à un endroit que vous avez précisé, et de mémorisé le pixel en sdram
La fonction ecriture_eeprom pour écrit dans l'eeprom du Pic
La fonction lecture_eeprom pour lire dans l'eeprom du Pic
Voilà c'est tout, on verra par la suite pour en rajouter, suite au demande.
Certain mon demandé à quoi ça pouvait servir d'écrire un pixel en mémoire sdram, et ben tout simplement à ne pas effacer les autres pixels qui son à l'écran.
Quand vous écrivez un pixel avec cette écran, c'est huit pixel d'un coup que vous allez écrire, ce qui fait que vous risquez d'effacer les autres pixels de l'écran.
C'est pour cela quand stock les pixels en sdram avant d'écrire le prochain pixel, une fois mémorisé en mémoire sdram en regarde quelle son les pixels qui son allumé ou éteint, puis on affiche 8 pixels d'un coup sans effacer les autres pixels de l'écran.
Attention car il faut 1024 octets de mémoire sdram pour stocker tout l'écran, les bank3, bank4, bank5, bank6, bank7 serve à cela dans les codes écrit ci-dessus, ce qui nous fait 5 bank et comme une bank fait 255 octets ça nous fait 255 x 5 = 1275 octets.
La bank 0 sert au variable, avec ce pic on est tranquille avec c'est 3896 octets de sdram
A+