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 :

images/t_PIC12F1840_DTMF_generator_Kickad_Schem.gif Circuit

Imprimé ....?

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

images/t_DTMF_12F140_Timer2_config.gif
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

images/t_12F1840_Gene_DTMF_Two_tone_result.gif images/t_12F1840_Gene_DTMF_osctune_20_Two_tone_result.gif  
Osctune=0 avec 0sctune=20  

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

images/t_Guirlande_PWM_12F1840_Hardware_2022-1222.gif images/t_Guirlande_PWM_12F1840_Hardware_2022-1222.gif images/t_Guirlandes_Sapin_2022-12.gif
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.

images/t_Test_12F1840_etat_inputs_N.gif

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!







retour à l'index général