31 jan 2011
31/12/2017 rev 6.1

12F683 PIC en DIP8 seulement, Petit mais COSTAUD

Commande Guirlande de 20 leds avec PIC 12F683 , reglage rampe via BlueTooth ( Interrupt sur RX ) MC
Connection Pickit2 sur le PIC 12F683
Test#1 Mesures Analogiques et UART RS232 (MC)
Test#2 4 voies Analogiques 17 bits en I2C (MC)
Test#3 Pilotage sortie PWM via consigne Analogique (MC)
Test#4 8E & 8S via I2C + liaison Ethernet via XPORT sur UART + appli VB6
Test#5 cde Afficheur LCD via 76164 en mode simili SPI 2 fils (ASM)
Test#6 Cde Afficheur 7 seg via 76164 en mode simili SPI 2 fils (ASM)

Non testé : PIC10F220 Cde Afficheur 7 seg via 76164 en mode simili SPI 2 fils (ASM)


Connection Pickit2 sur le 12F683

Le chargeur 12F683_2Ana
L'eeprom du
12F683_2em.ihex et 12F683_2em.eed

images/t_12F683_pinout.jpg

12F683 designation des Pins
images/t_ICSP_Connection_12F683.jpg


raccordement au PIC12F683
images/t_12F683_1er_PickKit2.jpg PicKit2_ICSP_adapter

(1) "ERASE"
(2) "BLANK CHECK"
(3) File Load " 12F683_2em.hex"
(4) verifier que "MCLR" est cochée VDD=5,0V et "EEprom Data" cochée
(5) "WRITE"
(6) "VERIFY" ..doit passer en fond Vert si OK
(7)
relier la RS232 sur le PC .. lancer le terminal VBray 9600,N,8,1 sur le bon port comx "connecter"
(8) decocher "MCLR"
(9) cocher "On" pour alimenter le montage via le Pickit2 (Attention pas d'autre ALIM exterieure! sinon debrancher le pickit2)

PicKit2 est integré dans l'environnment MickroC via
"outils".
EEprom Editor est utilisé pour initialiser le contenu de celle-ci, stockage dans un fichier .ihex ou .eed
ne pas oublier de cocher la case "Use Eeprom in project".


images/t_Mikroc_Tools_b.jpg
12F683_Config_projet
outils MickroC configuration du 12F683


Attention il est preferable d'installer l'ensemble des programmes "Pickit2" dans le meme directory que MikroC.
Le programmateur Pickit2 peut rester en place et alimenter le montage, sans autre source exterieure
que la connection USB du Pickit2.
Avec un autre type de programmateur, il conviendra d'alimenter le montage en 5V
et d'isoler le VDD+5V du pickit2 !





Evaluation du PIC12F683 ..appli en C
L
a docu Microchip Pic12F683_41211d.pdf

Commande Guirlande Led

version 1:
Schema:


La Led verte represente la commande de la Guirlande de 20 leds blanches dia 5mm


Problematique UART : Reception Traitée par Interruption :


Comme il n'y a pas d'UART Hardware sur ce PIC12F683
je propose une solution (parmi tant d'autres!), pour gerer un UART Software à 9600 bauds
en émission , mais surtout en réception sur Interruption..
Pin GP0 est affecté en Reception , GP1 en Emission

Il n'y a pas de bit specific (RCIF) Interrupt RX dans ce PIC ,
c'est donc l'interrupt GPIO (pin RX) qui servira de point d'entrée dans l'interruption traitant le signal sur UART reception.





La principale difficulté est de bien caler le bit de START
J'ai utilisé mon analyser SQ50 pour celà, qui apporte une aide non negligeable.
En mettant un bit de synchro pour visualiser le front de lecture de chaque bit.
Bit de synchro Enlévé par la suite.
Le point de depart etant 9600 bds => 1 bit dure 104,1µS
la FOSC interne 8MHz du MCU est utilisée.
=> MCU à 8MHZ => 1 cycle en 4/8= 0,5µS

Fabrication d'une tempo en ASM : Bit_Delay de 102µS + appel et retour => ~104µS
La duree de cette tempo est aisement mesurable , en se mettant en mode debugger , pas à pas,
et utilisant la fenetre WATCH CLOCK, pour mesurer le nombre de cycle et duree en µS.

Des l'apparition du front descendant arrivant sur RX UART => Interruption GPIO
Introduction d'une duree de 1/2 Bit (52µS) pour etre sur de tester
tous les autres bits suivant , sur l'etat stable du bit .

rapel : la trame UART (format 8,N,1) comporte 10 moments
demarre avec un bit de start =0
puis les 8 bits de donnees avec LSB en tete ,
(sans Parité) et se termine avec un bit de STOP à 1

Le bit de stop est tronqué, car il faut tenir compte du temps que met l'interruption
pour remettre le contexte original des registres MCU ,
sinon on ne pourrait pas suivre une reception contigue de bytes (sans delai intercaractere).


Ce PIC a peu de RAM et ROM
et ici le buffer de reception nommé TEXTE n'a que 32 bytes de profondeur
en prevision de l'usage de ADC posterieurement
(avec partie analogique ADC et affichage mesure ADC MCU plein à 99%)

Un HC06 BlueTooth connecté sur l'UART , au lieu d'un PC via un cordon Prolic,
permet l'usage d'un terminal BlueTooth .
ex: BlueTerm sur Android
La transmission pouvant etre simultanée , sur PC et Via BlueTooth
Pour la reception, on dot choisir , Of course..

La connectique ICSP est conservé via les Pins Males

la variable des tempo "Rs_tmp" est declaré absolue , pour etre sur de la trouver
sans interference avec le travail du compilateur .

Le detail de l'interruption UART :



Le boitier Guirlande original:

Boitier original de comande des 20 leds (2,75€ LIDL) schema probable ... MCU sans marque

Cette guirlande ne clignote pas. Le CIRCUIT (MCU ?) original embarqué ne sert que pour la fonction timer
Un interrupteur à glissiere à 3 Positions : ON .. TIMER ..OFF
En position TIMER , la guirlande doit s'Allumer pendant 6/24H
Position ON : alluméee en permanence... et OFF : Eteinte !

N'etant pas satisfait de ce fonctionnement, j'ai fait sauté le circuit intégré , et avec un montage externe
utilise à la place un MCU PIC12F683 pour piloter le Transistor de commande ,inclu sur le circuit imprimé original.
Je recupere aussi l'alim 4,5V .. apres le Switch , pour profiter du Marche/arret
La sortie GP4 ( ou GP5) pilote le transistor de sortie, en fonction du deroulement du programme inclus dans ce MCU.
Au depart , j'avais prevu un potar et une entree analogique pour commander le fadding ON et Fadding OFF des 20 leds
Temps ajusté par la valeur ADC , position curseur du potar.
Pour des raisons d'encombrement, je suis passé à une commande via l' UART, via un terminal BlueTooth Android
pour regler autrement le timming d'allumage et d'extinction des leds ..de plus un mot de 32 bits, envoie une sequence (Pattern)
de 1 et de 0, assocciés à une table de differentes tempos pour avoir des effets Lumineux ( genre SOS)

La Modif du Boitier , et le module externe PIC12F683

images/Guirlande_20_leds_Circuit_Avant_Apres.gif images/t_Guirlande_20_leds_avec_12F683.gif
Modif circuit imprimé Montage PIC en externe
images/t_Guirlande_20_leds_Boitier_et_12F683_pigback.gif images/t_Guirlande_20_leds_Boitier_avec_12F683.gif
Montage PigBack sur le boitier original Le module relié


La commande de rampe de montée ou descente (niveau de luminosité)
du simili PWM à 50HZ ( periode=20mS) ,



Le pas temporel de la rampe, peut etre modifié via la laison UART (0 à 255 mS)

images/t_Guirlande_20_led_12F683_HC06_linked.gif

L'evolution Leds ON ou OFF suivant une Pattern definie dans le programme.
(Ce PIC n'a pas assez de ressources pour pouvoir modifier celle ci via la liaison UART)
Pattern=
0b01010101110111011101010100010101 ;


Au final, je suis un peu deçu par le choix de ce PIC, trop limité en RAM
un 12F1840 aurait été parfait.. avec un PWM Hardware et un UART Hardware
mais comme il trainait depuis longtemps inutilisé...

images/t_Coeur_decoupe.gif images/t_Coeur_20_leds.gif
Decoupe du coeur En action


L'application MikroC (version 1)
simili PWM
Projet complet : _
12F683_Guirlande_Led_171218.zip
Source:
_12F683_Guirlande_20_leds_PWM_UART1_171217.c


Version 2 : PWM Hardware

Mobilise GPIO2 (RA2) comme sortie CCP1 PWM_Out , donc remplace entree Ana RA2
La rampe d'eclairage et d'extinction se fait maintenant en PWM en 256 pas (0 à 255) , qui est beaucoup plus SMOOTH .
Projet complet : _
12F683_Guirlande_2018.zip
Source:
12F683_Guirlande_PWM_UART_TX_GP1_RX_GP0_via_Interrupt_2018.c
Schema MAJ dans le Zip..


 


TEST #1
Mesures de 2 voies Analogiques 10 bits et affichge sur terminal PC, via la RS232
Affichage message en EEPROM Pic
Pas de quartz, usage horloge interne du Pic.

schéma :


Rappel: GP0 et GP1 sont reliés au PC
via l'interface RS232 2T
Programme source :

Le projet defini dans MickroC, permet de definir la config du PIC12F683 (ici : 0x00C4)
En particulier l'usage de l'oscillateur interne à 8MHz , ce qui libere GP4 et GP5.
Master Clear internal permet de recupérer aussi la pin GP3 ( MCLR) comme entree .
GP1 et GP2 sont mobilisés pour gerer la RS232 via
l'interface RS232 ,
mais aussi pour la liaison au Pickit2 pour la programmation ICSP

Le programme source (en mikroC) de ce test: 12F683_2Ana

Sous MikroC, l'usage des bibliotheques : SoftwUart, ADC, Cstring, Convertions, EEprom rend tres facile
la programmation de ces fonctionalites... meme si cette appli ne sert pas à grand chose ,
hormis de prendre en main et evaluer quelques possibilites du PIC12F683.



on doit voir apparaitre sur le terminal le msg stocké en eeprom :
Version 09 janv 2011 PaulFjujo 12F683_2em.C
suivi des 2 mesures analogiques AN2 et AN3
VOLT AN2 GP1= 1023 VOLT AN3 GP4= 510
VOLT AN2 GP1= 1023 VOLT AN3 GP4= 510
VOLT AN2 GP1= 1023 VOLT AN3 GP4= 510
VOLT AN2 GP1= 1023 VOLT AN3 GP4= 510



si GP3=1 la led clignote toute les 500mS
si GP3=0 la led clignote au rithme de la tension delivree par le potar sur l'entree analogique AN2
avec 0V sur AN2 delai = 75 à 100mS
avec 1023 points delai > 1100mS
sur le terminal Vbray on peut cocher la fonction "Time" pour evaluer le timing d'acquisition variable si GP5=0



14:36:30.844> VOLT AN2 GP1= 1023 VOLT AN3 GP4= 510
14:36:31.945> VOLT AN2 GP1= 1023 VOLT AN3 GP4= 510

14:36:44.213> VOLT AN2 GP1= 430 VOLT AN3 GP4= 212
14:36:44.714> VOLT AN2 GP1= 426 VOLT AN3 GP4= 212

14:36:48.419> VOLT AN2 GP1= 0 VOLT AN3 GP4= 0
14:36:48.519> VOLT AN2 GP1= 0 VOLT AN3 GP4= 0




TEST #2

Affichage message en EEPROM Pic
Pas de quartz, usage horloge interne du Pic.
Mesures de 4 voies Analogiques 17 bits utiles et affichge sur terminal PC, via la RS232
Usage de la liaison I2C ET Uart.
Nota: I2C softwareutilisé , car pas de module I2C Hardware dans ce PIC
On atteint ici les limites de taille programme memoire Flash.

Le Schema


Le Prototype 

12F683_in_Situ_Pickit2


Le programme source (en mikroC) de ce test: 12F683_ADC18b
Usage des bibliotheques : SoftwUart, soft_I2C, Cstring, Convertions, EEprom 
Le Chargeur : 12F683_ADC18b
Le Fichier Eeprom Pic 12F683_3em.ihex
doc du convertisseur 18 bits , voir ICI

Resultats obtenus:
sur PC terminal Vbray
nota: les entrees CH1,2,3 sont en l'air !





TEST #3
Mesure de la consigne sur voie ANA 3 pour sortie sur GP2 en PWM et affichage sur terminal PC, via la RS232


Programme source :
Version Soft_PWM
Source :
CtrlPWMFan M05.c
Hardware: Entree ana2 sur pin5
Sortie PWM sur GP5
programme initialement prevu pour un 12F675 (
sans fonction CCP)


Le Schema

images/12F683_675_PWM_sch.jpg
Le Chargeur : CtrlPWMFan M05.hex

La version adaptée au 12F683 (avec fonction CCP) :
Le source :
Fan_PWM_control_12F683.c
Le chargeur :
12F683_Fan_Ctrl.hex

images/12F683_PWM_sch.jpg


TEST #4
Liaison 12F683 <-> XPORT CLIENT en VB6
Test 12F683 pilotant 8E et 8S d'un MCP23017 via un XPORT-03 et interface en VB6

Le proto 12F683:
12F683_4em_Proto.jpg


schema de test:

Le programme coté 12F683:
Le source : 12F683_MCP23017_Xport.c
Le chargeur : 12F683_MCP23017_Xport.hex
Le chargeur eeprom :12F683_MCP23017_Xport.ihex

Dans tous les cas, le PIC12F683 est autonome, mais dans ce cas precis,il ne fait pas grand chose
ormis la gestion I2C et la transmission en RS232, vu qu'on atteint les limites taille software 
dommage, pas assez de place pour gerer le MCP2304 4CH analog 17bits en I2C..!
Used ROM (program words): 1952 (95%)  
Je pense qu'en asm 100% cela devrait rentrer!  votre avis ?

dans cet exmple , il n'y a pas de traitement specifique lié au x possibilités du MCP23017
tel que la gestion d'interruption sur changement d'etat.

Astuce employée pour la reception :
La fonction Soft_Uart_Read est bloquante !
Apparament (sauf erreur ou incomprehension de ma part), je ne peux pas utiliser le Timer0
peut etre à cause de la gestion Soft I2C , pour pouvoir utiliser Soft_Uart_Break
J'ai donc relié la PIn RX à la broche GP3 pour generer une interruption sur changement d'etat
et armer un drapeau pour signaler l'arrivée d'un octet sur le port serie
Ce qui me permet de le capturer dans la foulée quand je suis dans 
une boucle de 32000 iterations servant de fenetre temporelle de capture.
La reception Soft_uart_Read ne peut pas etre dans le traitement d'interruption: fonction non re-entrante
Une tempo de ~500ms est rajouter pour avoir un envoi de trame toutes les secondes.
à 9600 bauds

 A SUIVRE .... avec un 18F252 !

 Le programme coté PC:

Commande des E/S par liaison ethernet directe (ou WIFI ou via le WEB)
La trame emise par le PIC est envoyée sur le XPORT en niveau TTL 
le XPORT encapsule cette trame  en Ethernet , le cable ethernet est relié à ma Freebox
qui sert de serveur / routeur WEB.
Le PC dispose d'une socket Client permettant de recuperer la trame emise par le PIC
le programme d'aplication VB6, sert d'interface Homme Machine , recupere et affiche individuellement les infos
et permet de renvoyer une commande pour les sorties.
Il n'y a pas de controle CRC etc.. la trame IP ethernet le fait deja !
Toute commande emise pour activer les sorties est verifiée en retour par l'etat des latch du MCP23017
 qui est comparé à la commande. Si le retour correspond la led verte est OK, sinon led rouge = discordance
Il peut y avoir jusqu'à 10 essai d'envoi de commande (automatique !)
Un gros pavé (ovale) rouge s'affiche en cas de probleme de communication:
probleme detecté par la non progression du numero de trame (codé sur 8 bits , evoluant de 0 à 255
à chaque envi de trame (~toutes les secondes)
Xport_Client_VB6_run.jpg 12F683_terminal.jpg
Recuperation sur Socket Ethernet sur PC distant en WIFI flux RS232 issu du PIC12F683

Client Xport executable seul 
Xport Client Installation
Piege: attention le flux RS232 doit etre regulié pour ne pas etre decoupé !

Nota: la finalité est d'utiliser un interface en Java (applet) dans une page WEB.
là je ne maitrise pas bien..
en cours..voir aussi ici XPORT_16F_18F/Pic_Xport.htm



A SUIVRE .....


TEST #5 
PIC 12F683 et Afficheur LCD 2x16 cars 
Cde en 2 fils via circuit 74xx164 
MPlab 8.92 ASM 100%

le schema :

images/12F683_2W_LCD_74LS164_sch.gif
Le prototype :


images/Pic12F683_LCD_76164_2w_asm_Proto.gif


Le Programme:
usage d'un PIC12F683 + LCD+ 74164 .. montage 2 fils
Tous les delays sont geres via le timer0.
La Pin GP4 est utilisée pour ressortir FOSC/4 .. pour bien verifier la config FOSC interne .
Mesure :1MHz à l'oscillo ( FOSC interne = 4MHz => 4/4= 1 Mhz)

Affichage sur la 1ere ligne de "0123456789"
Affiche sur la2em ligne :
un compteur incrementé à chaque tour de boucle (0 à255)
puis la valeur 8bits de la voie analogique RA0 ( 0 a 255)
une etoile = separateur
et la valeur en Beaufort , en divisant la valeur brute par 28 .. soit maxi 255/28=9
Une Led sur GP5 voit son etat inversé à chaque tour de boucle.
Tempo de boucle 1 sec

Le projet MPLAB ASM:
12F683_LCD_2w_74164.zip

La meme application avec un PIC12F1840 (asm)




TEST #6
PIC 12F683 et Pilotage afficheur 7 segment
Cde en 2 fils afficheur 7 segments, via circuit 74xx164
MPlab 8.92 ASM 100%

le schema :


Projet parti uniquement du schema utilisant un MCU 8051
Simulation avec CMS60 du comportement 74LS164 + Afficheur Anode commune

images/74LS164_7Segm_CMS60.jpg

74LS164_test.ckt
puis definition codage 7 segment en EEPROM
avec une particularité, detail à decouvrir !


Le prototype :

images/t_Pic12F683_7segm_76164_2w_asm_Proto.gif


Le Programme:
usage d'un PIC12F683 + 74LS164 + Afficheur .. Commande via 2 fils !
Tous les delays sont geres via le timer0. (Tempo 5mS, 200mS et 1 sec
La Pin GP4 est utilisée pour ressortir FOSC/4 .. pour bien verifier la config FOSC interne .
Compilation conditionnelle dans le source pour activer ou non un test de défilement valeur 0 à 9 sur afficheur
La valeur ADC 8bits de la voie analogique RA0 ( 0 a 255) est cumuléé 8 fois pour ensuite en faire la moyenne
Cette moyenne est divisée par 27 pour retomber sur une echelle de 0 à 9 (valeur en Beaufort)
Le point decimal de l'afficheur est relié à GP5 , pour signaler chaque tour de boucle.
Des resistances de 300 ohms ont été rajoutées sur chaque segment pour limiter le courant maxi.
Attention: Du fait que l'afficheur soit avec ANODE COMMUNE, il faut un zero logique pour allumer un segment
Bien verifier aussi avec la datasheet de l'afficheur, la correspondance : Pin afficheur et repere du segment
pour definir l'association necessaire Numero de digit -> nb de segments allumés,
ce qui se traduit par la table de codage (situee en EEPROM) :




Le projet MPLAB ASM:
12F683_LCD_2w_74164.zip
testé OK en réel !



La meme application avec un PIC12F1840 (asm)



PIC 10F220
La Meme Appli prévue
pour un PIC 10F220 .. mais non testée
Mini PIC , en format
DIP6 ou DIP8 ..
16 bytes de RAM seulement !ADC sur 8 bits, Pas d'interruption...et 33 instructions

Pas d'EPROM, donc
avec recup codage 7 segments en FLASH program..




images/t_hardware_10F220_1x7segment_serial_sch.gi
Compilé OK...mais non testé en réel

Questions ?

retour à l'index général