rev0 04/04/2015
rev 27/10/2015
rev 21/06/2016

Presentation Demo Board 44 Pin MicroChip 16F887
Mesure de frequence via RB0 interrupt et Timer0
Mesure ADC0 et gestion Interrupt RX UART
Mesure de Frequence via mode Capture CCP1 et Timer1
Gestion Afficheur MAX7219 pilotant 8 afficheurs 7 seg en mode SPI

16F887 sur Pickit2 Demo Board Microchip 02-1924

Le Materiel :

images/t_16F887_demo_board_Schem.gif images/t_16F887_demo_board_Circuit.gif
Connecteur RJ pour l' ICSP !! Test liaison IR avec PC et cle IR Shangai


Le Raccordement :

images/t_16F887_demo_board_1504..gif
Liaison Pickit2 et BlueTooth


../common/GIF/lgreen_cligno.gif
04-04-2014
Test interrupt RB0 et Timer0 , sortie sur UART -> BlueTooth HC06 avec MikroC version 6.50

Source : 16F887_UART_IT_Test_150723.c

Test Mesure indirecte de Frequence via RB0 et Timer0

Hardware :
La carte Demoboard est alimentée via la connection Pickit2
La pin RB0 est relié au signal delivré par "la Boite à Quartz"
qui peut delivrer 24 valeurs de frequences connues (signal TTL)

images/t_16F887_Demo_Board_Freq_CCP1_151028.gif t_Generateur-Quartz_4040_2011.gif
mode de test Boite à Quartz



Usage de FOSC interne =8MHz (car pas de quartz sur Demoboard)
RB0 interrupt est utilisée pour detecter les 2 fronrts montants du signal à mesurer
Entre ces 2 InTerrupts , le Timer0 reçoit FOS/4 soit 2Mhz, et avec PRESSCALER minimum= 2
interne au Timer0 , ramene à 1MHz, soit 1 count = 1µSec
Le timer0 initialisé à 0 compte de 0 à 65535 , et on compte le nombre de debordement
timer0 , via l'interrupt Timer0
Il convient de respecter les tailles de variables pour eviter des debordements de comptage
surtout aux tres basses frequences
L'UART est activé ici pour afficher le resultat, car seulement 8 leds sont connectées sur le PORTD
L'usage de flottant permet d'ameliorer tres notablement la resolution

le source MikroC et chargeur :
16F887_Freqmeter_ITRB0_Timer0.zip
l'usage d'une compilation condiitionelle permet aussi l'usage de Q=20Mhz , SANS UART.


Resultat sur terminal Vbray

Resultats honorables pour frequences faibles , avec Q=20MHz (au lieu de 8Mhz) on pourrait etre mieux

Rajout mesure ADC channel 1 voie RA0 et interrupt RX UART

Mesure EA0 0 à1023, cette voie est reliée au potar VR1 sur la carte..
Mesure de frequence sur RB0
Test interrupt UART , affichage de la chaine de caractere saisie au clavier et terminée par CR ou longueur >31 car.

Affichage ecran (RS232)
Projet MikroC :
16F887_Freq_IT_RB0_TMR0_ADC0_UART.zip

Attention
: espace RAM pas tres important sur ce PIC
Surveiller le resultat de compilation, si alerte de ce genre :
53 1511 IRP bit must be set manually for indirect access to 'buffer' variable 16F887_Freq_IT_RB0_TMR0_ADC0_UART.c
sinon ,le programme se compile sans Erreur , mais comportement aleatoire !

Resultat terminal VBRAY


L'erreur de mesure augmente vite avec la frequence ..
nota:
Liaison RS232 via interface 2Tr ou via un module sans fil Bluetooth HC06



Version Mesure de periode via CCP1 mode et Timer1 16 bits

Hardware :
la frequence à mesurer doit entrer en RC2 (CC1 input)
Le Timer1 16 bits est utilisé dans ce mode
A chaque front , le timer1 est copié dans le registre CCP1
On mesure donc l'ecart entre 2 fronts= periode
pas de prescaler sur timer1 => resolution 0,5µS at 8Mhz

Resultat :



comme toujours, avec ce mode de mesure, la precision decroit avec la frequence
precision meilleure que 0,5% à 625Hz
precision meilleure que 0.3% à 311 Hz
precision meilleure que 0.03% à 9,7Hz
à1250Hz il ne reste plus que 401 points pour definir la periode
dans ce cas il faudrait passer au moins à 4 edges ..pour rester à 1% ou 16 edges pour 0,25%
ou alors mettre le prescaler timer1 à 1/1
Compromis à realiser entre le mini et le maxi de l'echelle
d'où la solution :
Périodmetre / frequencemetre à commuation automatique..
voir version 18F




15/06/2016

TEST Interface 8 digits 7 segment MAX7219 avec 16F887 demoboard

HARDWARE :


pour moins de 7 € !
Cet afficheur 8 digits de 7 sehments, piloté par un MAX7219 , via un bus SPI (3 fis)

Prototype :



Le module d'affichage est relié au PIC16F877 (à la carte Demoboard) via 5 fils
2 fils : alimentation 5V bornier PWR +V et GND
3 fils SPI :
RC3 -> CLK MAX7219
RC5 -> DIN MAX7219
RC0 - > CS MAX7219
RC4 nn connecté
Le Pickit2 , connecté directement sur le port ICSP de la demoboard, alimente l'ensemble en 5V.
nota: j'ai soudé des fils avec embout femelle sur les sorties PIC (car trou pastillé au pas de 0,1 mm) afin de faciliter les connections

Schema de principe :




void MAX7219_Init(void);
void MAX7219_Mode_BCD(void);
void MAX7219_Mode_7seg(void);
void MAX7219_Affiche_ON (void);
void MAX7219_Affiche_OFF (void) ;
void MAX7219_Efface(void);
void MAX7219_Affiche_Long(unsigned long L);
void MAX7219_Affiche_HELP();
unsigned char MAX7219_LookupCode (char cx);
void MAX7219_Write (unsigned char reg_number, unsigned char dataout);
void MAX7219_DisplayChar (char digit, char character) ;
void MAX7219_Luminosite_Maxi(void);
void MAX7219_Luminosite_Mini(void);
void MAX7219_Display_Text(char * T);
void MAX7219_Luminosite(int Lu); // reglage 0 à 3


Le MAX7219 possede un decodage interne BCD permettant l'affichage direct de valeur 0 à 9
+ autres sigles : - H E L P , mise en evidence par la fonction MAX7212_Affiche_HELP
A l'init du MAX7219, le mode est mis par defaut en mode BCD
On utilise alors MAX7219_Write (Numero du digit, chiffre à afficher);

Cet afficheur n'est pas fait au départ pour afficher de l'ASCII , mais
Une table* de correspondance ASCII -> 7 segments, crée dans l'espace ROM FLASH ,
permet aussi l'affichage ( pas tres joli, because de la limite de 7 segments)
des lettres A à Z et Chiffre 0 à 9 + autrescaracteres - + = pas tres lisibles!..



Attention: sur internet on trouve des tables de transcodage .. qui ne sont pas conformes !
Le dot est rajouté pour les lettres X,W,Z car risque de confusion avec H,V,S
Il faut alors changer de mode : MAX7219_Mode_7Seg()
La fonction MAX7219_LoockupCode(Char Cx); permet de retrouver le codage 7 segment correspondant au code ascii à afficher
Cet afficheur n'est pas fait au départ pour afficher de l'ASCII .(Cela me rappelle le bon vieux temps .. sur un KIM 6502 !)
pour afficher un seul caractere: MAX7219_Display_Char(numero de digit, carcatere ascii)
ou pour ecrire du texte limité à 8 chars :MAX7219_Display_Text(pointeur sur texte);
nota: developpement possible : Texte déroulant ...
La luminosité des afficheurs 7seg est reglable sur 4 niveaux : 0 =mini 3=maxi

En mode BCD, Affichage d'un entier long sur 8 cars maxi soit 99999999 avec MAX7219_Affiche_Long( long value);
Effacement affichage ON/OFF

En mode 7 segment :

Affichage d'un Texte ascii (8 cars maxi !)
Usage d'entier long pour multiplier la mesure par 16 bits par 100 , afin d'afficher les centiemes
au lieu de flottant, pour eviter d'utiliser trop de ressources .
Affichage Special "Mesure de temperature" :
Apres filtrage exponentiel K=0,2 de la mesure ADC0 1024pts pour 5,0V , en prevision pour LM35DZ 5000mV => 500°C
est mise à l'echelle 0,00 à 500,00 °C, avec 2 decimales fixes sur 5 digits maxi
Le point decimal est integré au digit unité.
Les zeros inutiles à gauches ne sont pas affichés, changés en blancs , pour conserver la position de mesure sur 5 digits.
video:
L'affichage ajusté à gauche au depart, peut etre decalé jusqu'à x digits à droite , tant que N digit + x decalages <=8



SOFTWARE (MikroC)

liaison SPI Hardware extrait Datasheet 16F887:



Projet zipé:
16F887_Max7219_Afficheur_8digits_SPI_160614.zip
contenu du zip:



Running Test :



Mesure de la consommation ,alim 5V :
Amperemetre intercalé entre la sortie VDD du Pickit2 et le + alim de la DemoBoard connecteur ICSP( inclus donc le PIC16F887)
avec Luminosité minimum et affichage de 88888888 => 27mA
avec Luminosité Maximum et affichage de 88888888 =>123mA

nota: le code est tres facilement transposable sur un autre PIC ayant un SPI hardware.. sinon utiliser un SPI software !

à suivre ... texte defilant de longueur variable ...up to 64 cars en RAM , voir plus si texte en Flash ou Eeprom


paulfjujo@free.fr