V.O. ... Dec. 2022
Rev 29/12/2024
Applications avec PIC12F1840 (en dip 8
avec MPLAB XC8
Générateur de signal DTMF avec PWM CCP1 Timer2 29/12/2022
Guirlande Sapin de Noel 2022 Pwm
Test Etats des Entrees Non
Connectées 2022 31/12/2022
lien
vers d'autres applis 18F1240 (MikroC)
PIC12F1840 , sortie signal
DTMF sur RA2 en PWM
Hardware :
Pas de quartz, usage horloge interne du Pic. : 8MHz * PLL soit ->
32Mhz
Config du Timer 2 pour F=62500Hz
Config UART pour 19200,8,N,1
RA0 pour TX UART et ICSP Data
RA1 seulement sur ICSP Clock
RA2 sortie PWM
RA3 : pin ICPS MCLR
RA4 : Sortie Led , tirée au +Vcc via 2,7K
RA5 Pour RX UART , (deroutage via APFCON)
La sortie PWM passe par un filtre passe-bas 4.7k + 47NF , puis un
etage transistor collecteur commun , avec Re=2,2K , pour abisser
l'impedance de sortie signal
Ce signal attaque l'entrée d'un decodeur DTMF HT9170B pour
verifier si le code est Bon (visualisé par 4 leds)
En parralele , envoi du signal sur l'entree carte Son PC +
Logiciel Two Tone Tester,
pour visualiser le spectre en frequence (analyse de fourier)
amplitude du signal ,apres filtre et etage suiveur : 0,8V cr cr
Schémas :
KiCad: Proto_12F1840_2022-12.sch
voir aussi , schema appli Audiophone :
partie decodeur
Déboires rencontres
:
* PB: pas de reception (via interruption) UART1! sur RA1 RX =>perturbation
avec PWM output
- allea de fonctionnement UART avec PWM en service
...allant jusqu'au plantage MCU
car
problemo, si usage de RA1 RX, trop près de RA2 output PWM
perturbation via la capa parasite de la breadbord (1,2pF),
surtout avec Fpwm=62,5KHz !.
=>basculement
RX UART sur pin RA5
..OK
* Difficulté à configurer en 32MHz ...donc Timer2 en 62500Hz
* Oubli de RAZ Drapeaux.Timer1_Elapsed => temps alloué au
DTMF quasi null !
=>donc pas de detection de code
Software
Usage de l'algo de Roman Black , utilisant 2
tables de sinus (64 valeurs), une table pour chaque frequence
le signal DTMF combinant les 2 frequences ensembles.
pour les details génération signal DTMF , voir coté appli 18F27K42
Verification des timming FOSC ,via clignotement led rouge
......Se vérifie aussi via le comportement OK de l'UART sur
terminal YAT
Verification Timer1 à 50mS
Commande via keyboard PWM=xxxx
PWM Maxima =512
Poursuite des test si PWM=0 ou touche 'R'
Commande DTMF pendant 1 seconde ( Timer1)
* Modif du code DTMF généré , via le clavier terminal YAT ,
directement ou via touches de fonctions terminal
YAT
* Possibilité d'ajuster la frequence FOSC (32MHz) du PIC, via la
commande clavier OSC=xx
ex : OSC=0 ..... Timer2 61,5KHz
ex : OSC=31 ... Timer2 63.5KHz
possibilité +- 3% !
La touche Note=1 envoie R0C0<CR> correspondant à la touche
Rangée 0 et Colonne 0 d'un clavier matriciel DTMF.
ce PIC
n'a pas assez d'entrees sorties pour gerer un clavier matriciel => usage de l'UART + terminal.
![]() |
![]() |
Fichier de config des touches de fonctions
du terminal YAT
Projet MPLABX :
Generateur DTMF avec 12F1840 DIP8
Compile : Dec 30 2022 16:33:32, XC8 version : 2360
Oscillateur state= 0 96
Hardware :PIC12F1840 Dip8 FOSC interne = 8MHz x4
UART1 Hardware 19200 RA5 Pin 2=RX , RA0 pin 7=TX
PWM sortie P1A sur pin 5 RA2
Program space used EA5h ( 3749) of
1000h words ( 91.5%)
Data space used DDh ( 221) of 100h bytes ( 86.3%)
config FOSC à 32MHz
bool state;
// OSCCON =0b 1 1110 0 00; // FOSC: SPLLEN Ensabled; IRCF 8MHz_HF
x 1110 SCS=00;
// OSCCON = 0xF0; // PLLEN Enabled; IRCF 8MHz_HF; SC=00 by config
word
OSCCONbits.SPLLEN=1 ;
OSCCONbits.IRCF3 =1; //8 Mhz
OSCCONbits.IRCF2 =1;
OSCCONbits.IRCF1 =1;
OSCCONbits.IRCF0 =0;
OSCCONbits.SCS1 =0;
OSCCONbits.SCS0 =0;
OSCTUNE = 0x00; // TUN 0
CLKRCONbits.CLKREN=0;
CLKRCONbits.CLKRDIV=0;
state=OSCSTATbits.HFIOFS;
cx=OSCSTAT;
Config Timer2 8 bits
T2CON =0;
T2CONbits.T2CKPS1=0; // Postscaler=1/1
T2CONbits.T2CKPS0;
T2CONbits.T2OUTPS=0x0F;// Prescaler=1/16 IT not used
T2CONbits.TMR2ON=0;
// TMR2 = 0x00; // TMR2 0;
PIR1bits.TMR2IF = 0;// Clearing IF flag.
PR2=129; // // 128 => 62500 Hz si 32Mhz
Config Timer1 16bits
void TMR1_Init_50ms(char
N)
{
T1CONbits.TMR1ON=0;
PIE1bits.TMR1IE=0 ;
PIE1bits.TMR1GIE=0;
T1CON=0;
T1CONbits.TMR1CS1=0;// Timer1 clock source FOSC/4 -> 32/4=8mHz
T1CONbits.TMR1CS0=0;
T1CONbits.T1CKPS1=1;//prescaler =3 => 1:8
T1CONbits.T1CKPS0=1;
T1CONbits.T1OSCEN=0; // Timer1 oscillator disabled
T1CONbits.nT1SYNC=0; // pas de synchro sur FOSC
T1CONbits.TMR1ON=0;
T1GCONbits.TMR1GE=0;
// at 32 MHz TMR1 Cycles 15 535 0x3CAF time_count 50 000µS =>50mS
TMR1H=0x3C;
TMR1L=0xAF;
Flag_Timer1=0;
Drapeaux.Tmr1_Elapsed=0;
if(N>0)
{
Cpt1=N;
PIE1bits.TMR1IE=1;
}
else
{
PIE1bits.TMR1IE=0 ;
Cpt1=0;
}
PIR1bits.TMR1IF=0;
T1CONbits.TMR1ON=1;
}
argument N
si N=0 , pas d'interruption , tempo uniquement de 50mS , test sur
Flag_Timer1.
si N>0 , via l'interruption Timer1, decompte de N fois 50mS
pour armer le flag Drapeaux.Timer1_Elapsed
exemple d'usage :
CPrint("
Init TMR1 pour 2sec=40x0.05sec
\r\n");
TMR1_Init_50ms(40);
while(Drapeaux.Tmr1_Elapsed==0)
{
UART_Write('.');
__delay_ms(50);...................... <--- pour voir la
progression de la tempo sur le terminal YAT
}
CPrint("\r\n TMR1 elapsed \r\n");
SOFTWARE MPLAB XC8
Projet : 12F1840_Generator_DTMF_2022-12.zip
Source : main_DTMF_12F1840_2022-1229.c
version XC8 2.36
PIC presque
PLEIN !
Program space used EA5h ( 3749) of 1000h words ( 91.5%)
Data space used DDh ( 221) of 100h bytes ( 86.3%)
Résultats :
pour les test , la duree du signal DTMF est de 1 seconde
( pour avoir le temps de le capturer avec l'appli Two Tone Tester)
avec touche #1 : R=0 C=0 F1= 697
Hz F2= 1209 Hz
avec OSCTUNE initial de =0, on obtient 691Hz et
1197Hz
affichage des fréquences touche #1
application Two Tone Tester V0.92
Reglage fin des frequences
DTMF, via OSCTUNE value ,
correction de FOSC dans la limite max possible de +-3%
... vu qu'on a pas ,ici, de quartz !
commande au clavier terminal :
Leds: LLLH , F1= 697, F2= 1209 ........... <-- consignes de
fréquences
OSC=20
New OSCTUNE value Ok
Leds: LLLH , F1= 697, F2= 1209
on obtient alors 693Hz et 1203Hz
soit ecarts de -0,7% et -0,5% => OK dans les
clous !
Evolution possible :
Mettre un HC05 ou HC06 sur la sortie UART
Faire une Aplli Apinventor2 avec clavier DTMF ..liaison BlueTooth
avec PIC12F1840 !
à suivre
Guirlande Sapin de
Nöel
24/12/2022
Schema:
Utile ?...voir config Pin MPLAB.
Bloc Alim secteur : 5V DC 2A
Sortie UART3 TX 19200bds (utilisée seulement pour debugging)
Sortie PWM sur RA2 --> 390 ohm -> gate MOSFET canal N IRLZ14
Led rouge de controle sur RA4 ..3,3k --Led Rouge --Vcc
connection ISCP possible (rajout d'une pin male sur MCLR pin 4)
4 ensembles de 10 leds blanches en parallele, entre sortie Drain
Mosfet PWM et +5V
nota:
R de 330 ohms entre sortie Drain Mosfet et +Vcc pour améliorer
la commuation ..(because led blanches avec seuils !!)
Hardware
Test préallable (avec IRFZ14) sur bread board ...OK
![]() |
![]() |
![]() |
Front view.....................PIC12F1840 | Back View ... condo jaune : decouplage alim PIC | en service |
test sur ce
montage ..aussi simple !...... BAD ?????? ..=> à suivre !
Apres maintes verifications, à l'ohmetre, test continuité ...test
soudures et coupures de pistes à la grosse loupe ..idem !
doute sur l'usage d'un Mosfet SOT23 AO3400A => je mets donc le
même que sur ma breadboard -> IRFZ14 en TO220 !--> Idem !
...pas étonnant avec en plus, de vrais Bugs, à cause de ce sapin !
Le lendemain, je m'y replonge dessus .. Bon Dieu ,mais
c'est bien sùr ..comme dirait l'inspecteur Bourel
!
Le condo (petit jaune ) entre pins =Vcc et Gnd ne fait que 33nF
..marqué D03302X
était mélangé dans ma boite de 100nF .. je le remplace par un
(vrai) 100nF .(marqué 104). "Allez Louis là"..
C'est
OK !
Cela prouve que l' electrochimique de 470µF ne suffit pas du tout pour les phenomenes rapides
( tels que fronts de commuation PWM !)
Le 100nF est là pour cela.
Software MPLABX IDE XC8
main_Guirlande_12F1840_2022-12.c
Transistor MOSFET
IRLZ14 (faible
VGS) ou
Transistor MOSFET AO3400A canal N SOT23
Derniere modif :
Possibilité d'imposer la valeur PWM de 0 à 255 via une commande
UART Keyboard PWM= xxx avec xxx de 0 à 255
sortie de ce mode via PWM=256 ou apres 1 minute
On passe alors en mode Guirlande PWM evolue , en
boucle, de 0 à Maxi, puis maxi à Mini ,
jusqu'à l'envoi du caractere 'R' <CR> via
Keyboard
qui relance alors le programme..
Software :
Guirlande_PWM_12F1840_2022-1225.zip
main_Guirlande_12F1840_2022-1225.c
Guirlande_PWM_12F1840_2022.X.production.hex
terminal YAT :
Terminal_Guirlande_PWM_2022-12.yat
YAT-Log-20221225-181439.log
Test Etats des Entrees Non
Connectées
Que doit-on faire des Entrées NON Connectées d'un MCU
J 'avais l'habitude de considérer les entrees Non Connectées à
l'état logique 1
... une mauvaise habitude ..car pas tout le temps vrai !
Un test fait avec 4 entrées d'un MCU pour le démontrer
HARDWARE
PIC12F1840 en DIP8
Fosc interne 8x4 (PLL) => 32MHz
Alim 4.5V
Usage de 4 entrées :RA0,RA1,RA2,RA4
Sortie RA5 réservé à sortie UART3 Sofware (asm) à 38400 bauds
vers un Terminal PC YAT
via le cordon prolific TLL/USB qui va bien.
4 modes de config des entrées ....via MCC
..pas vu comment l'option High ..est gérée.???
SOFTWARE
Simple lecture des entrées et affichage état 0 ou 1 sur le
terminal
Test AVEC et SANS validation globale des Pull up : WPUEN ...
Nota:
les 4 pins n'ont pas toutes des Pull UP
etat WPUA =5....... Pin RA0 et RA2, conformement à l'image MCC
ci dessus !
Ne pas oublier de deconnecter le PICKIT3 des pins ICSP du 12F1840
!
Projet MPLABX XC8
(sans MCC)
12F1840_Test_entrees_N.C_2022.zip
12F1840_TEST_entrees_N_C_2022.X.production.hex
12F1840_Test_entrees_N.C_2022.c
Resultats :
sur terminal YAT
Projet
MPLABX : TEST ETAT des entrees Non Connectees
Version : 31-12-2022
Source: 12F1840_Test_entrees_N.C_2022.c
Compile le Dec 31 2022 a 16:09:26 UTC
avec version XC8 : 2360
Hardware : PIC12F1840 DIP8 , FOSC interne =32MHz
UART3 38400 bds Tx sur RA5
Test sur les 4 inputs RA0,RA1,RA2,RA4 ----- <- Les 4 entrées
sont en l'air
avec nWPUEN bit=0---------------------<-------------
/ WPUEN donc un 0, active les pull-ups
etat OPTION REG avec nWPUEN MSB bit (128) : 7F
etat WPUA =5
Etat Pins PORTA :37 1111 --------<------ etat des pins RA0,RA1,RA2,RA4
PORTA en Hexa et etat binaire des 4 pins
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
avec nWPUEN bit=1
......................<------------- / WPUEN
donc un 1 , inhibe les pull-ups
etat OPTION REG avec nWPUEN MSB bit (128) : FF
etat WPUA =5
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1111
Etat Pins PORTA :37 1011 <- alea !
Etat Pins PORTA :37 1111
Etat Pins PORTA :35 1001 <- alea !
Etat Pins PORTA :37 1111
Etat Pins PORTA :33 1101 <- alea !
Etat Pins PORTA :37 1111
Etat Pins PORTA :33 1101 <- alea !
Il s'avere qu' AVEC des pull-up
actives , la lecture des entrées est FIABLE
mais devient ALEATOIRE
SANS cette activation ..
il faudrait un test
bien plus long .. car
2 pins n'ont pourtant pas de pull up active!