Initialisation PIC18f24k22

Lesquels choisir ? Comment les utiliser ?

Postby tibo66 » Sun Mar 31, 2013 12:00 am

Bonjour tous le monde.
J'ai comme projet de faire une alarme de maison. pour cela j'utilise des capteurs un un pic 18f24k22.

Je suis entrain de faire des tests depuis 3 jours sur mon pic mais rien ne marche, hormis le reset ou l'alimentation.

Cependant j'essaye d'ordonner à une sortie du pic de faire un signal carré lorsqu'à une entrée nous lui envoyons 5V. Ceci à l'aide d'un boucle if.
Mais je n'y arrive pas. Je ne sais pas si l'erreur provient des initialisations, des déclarations des registres...

Voici mon début de code :

#include  #include  #include  #include "delay.h"#include "delays.h"#define Capteur_Porte PORTAbits.RA5//#pragma config = 0x#pragma config FOSC = XT// XT oscillator#pragma config PLLCFG = OFF// Oscillator used directly#pragma config FCMEN = OFF// Fail-Safe Clock Monitor disabled#pragma config IESO = OFF// Oscillator Switchover mode disabled#pragma config PWRTEN = ON// Power up timer disabled#pragma config BOREN = OFF// Brown-out reset disabled in hardware and software#pragma config WDTEN = OFF// Watch dog timer is sleep, otherwise enabled. SWDTEN has no effect#pragma config MCLRE = EXTMCLR// MCLR pin enabled, RE3 input pin disabled#pragma config STVREN = OFF// Stack full/underflow will not cause Reset#pragma config LVP = OFF// Single-Supply ICSP disabled#pragma config XINST = OFF// Instruction set extension and Indexed Addressing #pragma config DEBUG = ON// Enabled/****************************************************************************//*  Wait for X Milliseconds                                                 *//*  Function : DelayMs                                                      *//*      Parameters                                                          *//*          Input   :   Delay in Ms between 0 and 65535                     *//*          Output  :   Nothing                                             *//****************************************************************************/void DelayMs(unsigned int cnt){//1000 cycles for one millisecond @4MHzwhile(cnt--){Delay1KTCYx(1);//1000 cycles}}/****************************************************************************//*  Wait for X Seconds                                                      *//*  Function : DelayS                                                       *//*      Parameters                                                          *//*          Input   :   Delay in S between 0 and 255                        *//*          Output  :   Nothing                                             *//****************************************************************************/void DelayS(unsigned char cnt){//1.000.000 cycles pour une seconde @4MHzwhile(cnt--){Delay10KTCYx(100);//1,000,000 cycles}}void main(void){TRISA = 0b11111111;//Initiallisation du TRISA comme etant que des sortiesPORTA = 0;//Initialisation de PORTA à 0;TRISB = 0b11000000;//Initiallisation du TRISA comme etant que des entrées avec RB6 et RB7 en entréesPORTB = 0;//Initialisation de PORTA à 0;RCON = 0b11001111;T0CON = 0b11010000;//OSCCON = 0b01011111;ADCON1 = 0x0F;ANSELA = 0b00101111;ANSELB = 0b00111111;if(PORTAbits.RA5 == 1){while(1){PORTBbits.RB2 = 0;DelayS(1);PORTBbits.RB2 = 1;DelayS(1);}}}


sans la boucle if j'ai bien un signal carré a ma sortie RB2.
A mon entrée RA5 j'arrive à lui mettre soit 0V soit 5V.

Où est l'erreur?

Merci beaucoup d'avance à tous ceux qui prendront le temps de lire ce message.
tibo66
 
Posts: 6
Joined: Mon Jan 20, 2014 8:07 am

Postby ppa94 » Sun Mar 31, 2013 12:00 am

Bonjour,
Les ANSELx sont à l'envers, 1 = analog, 0=digital; =1 par défaut.
Il faut aussi corriger les commentaires incohérents quand on soumet un source, si on veut une réponse ciblée : c'est la moindre des choses.
Il faut aussi initialiser les comparateurs.
Cordialement,
Philippe.
ppa94
 
Posts: 415
Joined: Mon Jan 20, 2014 7:54 am
Location: Ivry-Sur-Seine, France

Postby tibo66 » Sun Mar 31, 2013 12:00 am

Je ne veux que de l'analogique moi vu que je veux soit un 0 soit un 1.
Que sont les comparateurs?
tibo66
 
Posts: 6
Joined: Mon Jan 20, 2014 8:07 am

Postby ppa94 » Sun Mar 31, 2013 12:00 am

??? 0/1 c'est digital, pour RA5 ET RB2 il faut être en digital.
Comme programmé, toutes les entrées sont définies comme entrées analogiques, donc les entrées digitales sont inhibées.
La sortie peut marcher mais consommera plus si elle est aussi définie comme entrée analogique...
Une fois encore, lire la datasheet c'est TRES bien expliqué (RTFM disent les anglo)...
Cordialement,
Philippe.
ppa94
 
Posts: 415
Joined: Mon Jan 20, 2014 7:54 am
Location: Ivry-Sur-Seine, France

Postby tibo66 » Sun Mar 31, 2013 12:00 am

D'accord, donc mettre :

ANSELA = 0b11010000;
ANSELB = 0b11000000;

Mais je n'ai toujours pas compris l'histoire des comparateurs...
tibo66
 
Posts: 6
Joined: Mon Jan 20, 2014 8:07 am

Postby ppa94 » Sun Mar 31, 2013 12:00 am

Sur certains PIC, les circuits des comparateurs du PIC ont des valeurs par défaut qui font que les pins associées by-passent les ANSELx pour les forcer en entrées analogiques.
Toutefois, après vérification de la datasheet ça ne semble pas être le cas pour le 24K22.
Cordialement,
Philippe.
ppa94
 
Posts: 415
Joined: Mon Jan 20, 2014 7:54 am
Location: Ivry-Sur-Seine, France

Postby tibo66 » Sun Mar 31, 2013 12:00 am

D'accord, merci bien.

Donc selon toi si je change mes ANSELx je pourrais lui ordonner en sortie quelque chose dépendant de l'entrée?
tibo66
 
Posts: 6
Joined: Mon Jan 20, 2014 8:07 am

Postby ppa94 » Sun Mar 31, 2013 12:00 am

tibo66ANSELA = 0b11010000;
ANSELB = 0b11000000;

Pour info, il vaut mieux mettre en commentaire ce qu'on veut faire.
Les bits inutilisés ne doivent pas être mis à 1 mais à 0, c'est mieux pour la compréhension.
Pour la clarification du source (peut dépendre du compilateur), si on veut par exemple AN1 et AN5, on peut faire :
ANSELA = (1<Le même principe s'applique à toutes sortes de registres comme les TRIS : TRISA = (1<Mais bon, c'est une question de goût...
Cordialement,
Philippe.
ppa94
 
Posts: 415
Joined: Mon Jan 20, 2014 7:54 am
Location: Ivry-Sur-Seine, France

Postby ppa94 » Sun Mar 31, 2013 12:00 am

tibo66Donc selon toi si je change mes ANSELx je pourrais lui ordonner en sortie quelque chose dépendant de l'entrée?

Les ANSELx ne contrôlent que les circuits d'entrée, d'où mon message précédent sur la consommation.

Il faut toujours regarder la circuiterie associée aux pins que l'on veut utiliser, comme beaucoup sont multi-fonctions, il faut que ces fonctions soient bien maîtrisées / inhibées.

Il n'y a pas de "selon moi" mais c'est "selon la datasheet Microchip".
Les datasheet sont la référence et doivent toujours être lues au préalable car souvent, un PIC ressemble à un autre, on croit que ce sera pareil et ça marche pas.

Les forum sont pleins de questions de gens qui veulent aller trop vite. Une recherche rapide sur ANSEL ou ANSELA te montrera que parfois ça agace de répondre toujours aux mêmes questions...

Ceci dit on répond quand même en général.

You're welcome.
Cordialement,
Philippe.
ppa94
 
Posts: 415
Joined: Mon Jan 20, 2014 7:54 am
Location: Ivry-Sur-Seine, France

Postby tibo66 » Sun Mar 31, 2013 12:00 am

Du coup ça donne :
ANSELA = 0b00000000;
ANSELB = 0b00000000;

Exact?
tibo66
 
Posts: 6
Joined: Mon Jan 20, 2014 8:07 am

Next

Return to Microcontrôleurs & microprocesseurs

Who is online

Users browsing this forum: No registered users and 1 guest