Signal analogique avec pic16f877a

Télecharges « SouceBoost C » c’est un IDE en C et il y a en exemple exactement ce que tu cherches , en plus avec un simu et des pluggins .Il est gratuit
Lien IDE SourceBoost C

Fais un décalage << ou >>

bonjour, ha je prends ce sujet en cours de route, mais je programme bien les Pic et j’utilise souvent son ADC.
il y a pas mal de pièges…
le ADFM (blaireau en parle plus haut) le can fait 10 bit mais le micro fait 8 bits : ou vont les 2 bits ?

mais il y a un autre piège: ADRESH et ADRESL sont dans 2 banques différentes !!!

si vous voulez, j’ai des routines (bouts de programmes) en assembleur pour convertir simplement en décimal …
on peut alors ajouter 0x30 pour afficher un nombre entre 0 et 1023 sur un affi LCD

Le principe de la conversion binaire vers décimal est simple : on fait la division entière par 10. Le reste est la valeur utile (unité puis dizaine, centaine…), et on recommence avec l’autre partie ainsi de suite jusqu’à ce qu’elle soit nulle.
J’incite aussi vraiment à faire l’effort de programmer en C. Une fois le principe des fichiers compris, c’est beaucoup plus efficace, en temps d’écriture, lisibilité, et même efficacité du code. Un compilateur fait mieux qu’un programmeur lambda en assembleur.
Bon, pour un programme excessivement court comme celui-ci, pourquoi pas l’assembleur…mais autant apprendre à programmer en C.
Côté développement, MPLABX est la solution Microchip la plus logique. Utiliser aussi un debugger permet de comprendre plus vite où se trouve un problème : point d’arrêt, lecture des registres…, le Microchip Snap coûte une misère, le rapport qualité/prix est imbattable. Ayant l’ICE, l’ICD4, l’ICD5 et plusieurs Snap, on les utilise tous et le Snap est utilisé même pour de gros développements.

1 « J'aime »

Pour la conversion c’est pas un souci je sais faire. C’était juste savoir si je peut me servir de adressh et adressl comme si c’était deux entier

je ne vois pas très bien ce que vous voulez dire
adresh et L sont par définition 2 OCTETS
ils représentent donc chacun un chiffre entre 0 et 255

Est ce que je peut écrire :
int x = adressh
Quelq’un au dessus m’a répondu que oui

Oui ce registre n’est rien d’autre qu’un entier non signé sur 8 bits, un uint8_t.
Le problème est ce que tu vas faire avec cet entier ?
Si tu viens du monde Arduino, attention à la place mémoire très limitée sur ces petits PIC. On la dépasse rapidement si on multiplie les variables.

Avec 368 octets, pour cette application, cela devrait aller !
Mais franchement, au prix des PIC32, le choix est vite fait pour moi.
Enfin, en C, il suffit alors d’utiliser des entiers 16bits et c’est plus facile que l’assembleur.

Et bien j’ai deux possibilités, soit je divise mon signal 0-5v par 255 et je multiplie la valeur de mon adressh par le pas que ça me donne et je tomberai relativement proche de la réalité, soit je crée une constante dans laquelle je rentre le pas de mon signal 0-5v divisé par 1024 (0.19…) puis je multiplie mon adressh par ce pas, de même pour mon adressl et enfin j’additionne les deux ce qui me donne la valeur exacte de mon signal.

Toujours bien penser aux arrondis et à la quantification quand on reste en entiers (et aucun intérêt de faire autrement, surtout sur un petit contrôleur). La façon et l’ordre de calcul peuvent donner des valeurs très différentes, de très bon à complètement faux.
Regarder aussi comment on calcule avec une virgule fixe (donc fondamentalement avec des entiers).

////////////////////////////////////////////////////////////////////////////
// Sample code that shows how to set up and use ADC on PIC16 series
// To test run under SourceBoost IDE and use Variable PSU plugin
// connected to Port A to change input and LED Block plugin connected
// to port B to visualize ADC sampled values.
////////////////////////////////////////////////////////////////////////////
// Author(s): Pavel Baranov
// Date: 13 June 2008
//
// Copyright(C) 2004-2010 Pavel Baranov
// Copyright(C) 2004-2010 David Hobday
////////////////////////////////////////////////////////////////////////////

#include <system.h>
#include <adc.h>

int value; //----------------------------------------------------------------------------------------

#pragma CLOCK_FREQ 4000000

void main()
{
//Initialise PortB
trisb = 0; //configure port B
portb = 0; //clear port B

//Initialise ADC
set_bit( adcon1, ADFM ); // AD result needs to be right justified
set_bit( adcon1, PCFG0 ); // all analog inputs
set_bit( adcon1, PCFG1 ); // Vref+ = Vdd
set_bit( adcon1, PCFG2 ); // Vref- = Vss
set_bit( adcon0, ADCS1 ); // Select Tad = 32 * Tosc (this depends on the Xtal here 10 MHz, should work up to 20 MHz)
clear_bit( adcon0, CHS0 ); // Channel 0
clear_bit( adcon0, CHS1 ); //
clear_bit( adcon0, CHS2 ); //
volatile bit adc_on @ ADCON0 . ADON; //AC activate flag
adc_on = 1; // Activate AD module

//Every 250ms sample ADC, discard 4 low bits and output into port B
while( 1 )
{
	portb = adc_measure( 0 )>> 2;
	//portb = adc_measure( 1 )>> 2; //-----------essai sur chanel(1)-----------------------------------------
	value = adc_measure( 0 );//>> 2; //-----afficher value dans Toggle Watch Bar----------------------------
	//value = adc_measure( 1 );//--------------essai sur chanel(1)-------------------------------------------
	delay_ms( 250 );
}

}

J’ai fais des tas d’applications avec cet IDE en C sur PIC
Il y des bibliothèques pour à peu près tout
Emmnanuel