Arf. J'espère qu'il est sous garantie.
-----
Arf. J'espère qu'il est sous garantie.
Même pas, il était à soudé soit même, distribué par mon ancien IUT.
Je vais devoir allez les revoir = 17.8€ le billet de train l'aller-retour.
Salut,
Si tu dois continuer je te recommande de considérer l'achat d'un Pickit3 car l'ICD2 n'est pas géré sous les PC 32bits..et pas non plus sous MPLAB X.
Un des avanatges du Pickit est de ne pas avoir besoin de driver car il utilise la classe HID.
a+
Je l'ai remmené à mon ancien IUT où mon prof, me l'a tout simplement reprogrammé. Apparemment, suite à des pics de surtension produite par l'alim de la carte(l'ICD2), il y a dès fois un bit qui saute dans l'un des deux µC sur la carte.
Arf, j’espère juste que ça ne se reproduira pas.
Il m'a passé un 2eme pic préprogrammé au cas où ça re-arrive.
J'ai réussi à programmé un CAN puis une PWM puis Une PWM qui dépend de la CAN.
Et maintenant je n'arrive pas à lire une entrée pourtant je pense avoir bien configuré tout les registres.
Voici mon code :
Code:#include <xc.h> #pragma config IESO = OFF #pragma config BOREN = OFF #pragma config CPD = OFF #pragma config CP = OFF #pragma config MCLRE = ON #pragma config PWRTE = ON #pragma config WDTE = OFF #pragma config FOSC = INTOSCIO // Osc interne + GP4 et GP5 libre #define A0 GPIObits.GP0 #define A1 GPIObits.GP1 #define A2 GPIObits.GP2 #define A4 GPIObits.GP4 //Pas de GP3 #define A5 GPIObits.GP5 #define _XTAL_FREQ 4000000 //la freq de ton oscillateur void main(void) { OSCCONbits.IRCF = 0b111; // 4Mhz OSCCONbits.SCS = 0; // Configuration de l'horloge systeme // CAN : ADCON0 = 0b00000001 ; ANSEL = 0b00011000 ; // PWM : PR2 = 249 ; CCPR1L = 127 ; //Va changer TRISIObits.TRISIO2 = 0 ; T2CON = 0b00000101 ; CCP1CON = 0b00001100 ; TRISIObits.TRISIO0 = 1 ; TRISIObits.TRISIO1 = 1 ; // Le 2 est plus haut pour la PWM TRISIObits.TRISIO4 = 0 ; TRISIObits.TRISIO5 = 1 ; ANSELbits.ANS2 = 0 ; unsigned int POT ; if(A1 == 0) { while(1) { // Il rentre toujours ici } } else { CCP1CON = 0b00000000 ; T2CON = 0b00000000 ; while(1) { // Il ne rentre jamais ici } } return ; }
Sinon, quelqu'un connaitrait pas un site avec des exemples de code pour PIC12F J'ai cherché mais en trouvant que pour PIC16F et 18F. Lire une entrée numérique ne doit normalement pas être si compliqué je pense...
Concernant ton pin que tu n'arrive pas à lire, j'ai l'impression qu'il est configuré en entrée analogique.
Dans la doc j'ai :
ANSEL --> bit 3-0:
ANS<3:0>: Analog Select bits
Analog select between analog or digital function on pins AN<3:0>, respectively.
1 = Analog input. Pin is assigned as analog input.(1)
0 = Digital I/O. Pin is assigned to port or special function.
Si je comprends bien ton code, tu veux pouvoir choisir au démarrage entre 2 modes, c'est ça ?
oui, c'est ça.
Sinon, si tu cherchais des exemples de codes, il y en a ici : http://www.gooligum.com.au/tutorials...IC_Mid_C_1.pdf
Merci pour le pdf, mais d'après celui-ci je pense toujours avoir tout bien fait :/
Je remet mon code en simplifié au maximum :
Code:#include <xc.h> #pragma config IESO = OFF #pragma config BOREN = OFF #pragma config CPD = OFF #pragma config CP = OFF #pragma config MCLRE = ON #pragma config PWRTE = ON #pragma config WDTE = OFF #pragma config FOSC = INTOSCIO #define A0 GPIObits.GP0 #define A1 GPIObits.GP1 #define A2 GPIObits.GP2 #define A4 GPIObits.GP4 #define A5 GPIObits.GP5 #define _XTAL_FREQ 4000000 void main() { OSCCONbits.IRCF = 0b00000111; // 4Mhz OSCCONbits.SCS = 0; // Configuration de l'horloge systeme ANSEL = 0b01000001 ; // -fff3210 TRISIO = 0b00101011 ; // --543210 while(1) { if(A1 == 0) A4 = 1 ; // Le programme est toujours ici. else A4 = 0 ; } return ; }
Dernière modification par AmigaOS ; 11/06/2013 à 03h31.
Essaye de rajouter
CMCON0=0b00000111;
et ça devrait marcher.
Ce code permet de désactiver le comparateur qui utilise la broche GP1 comme l'entrée inverseuse.
Merci !
Ça fonctionne enfin
Maintenant je peux à peu près faire tout les fonctions que j'ai besoin avec ce µC.
Je me suis déjà fais avoir sur un 16F628, lui aussi équipé de comparateurs.
En règle générale, toujours regarder TOUTES les fonctions que peut réaliser une broche, il y fort à parier qu'une bonne moitié sont activées par défaut, empêchant l'utilisation en simple entrée numérique.
Salut,
Comme d'habitude...la solution est dans la datasheet du PIC12F683, chapitre 4 (bien lire la NOTE en grisé)...
a+
Judicieuse remarque
Finalement j'ai encore des problèmes avec ces quelques fonctionnalités que j'ai besoin
Enfaite mon programme doit convertir plusieurs signaux analogiques en numérique, sauf que je n'arrive pas à en faire plusieurs. Quand j'écris juste l'une ou juste l'autre la conversion fonctionne mais si je met les deux j'ai des résultats bizarres. Je n'ai rien trouvé dans la doc..
Voici mon code :
(POT et AMP sont deux variables unsigned int)Code:while(1) { ADCON0bits.CHS1=1; ADCON0bits.CHS0=1; //AN3 ADCON0bits.GO = 1 ; POT = (ADRESH<<2)|(ADRESL>>6) ; ADCON0bits.CHS1=0; ADCON0bits.CHS0=0; //AN0 ADCON0bits.GO = 1 ; AMP = (ADRESH<<2)|(ADRESL>>6) ; if(AMP<499) GPIObits.GP5=1; else GPIObits.GP5=0; //Ceci ne fonctionne que quand j’efface les 3 lignes pour AN3 }
Dernière modification par AmigaOS ; 14/06/2013 à 01h58.
Le convertisseur A/N est lent, entre ton ADCON0bits.GO = 1 et AMP = (ADRESH<<2)|(ADRESL>>6) il n'a pas le temps de faire la conversion, car il lui faut plusieurs cycles d'horloge.
Rajoute la ligne suivante :
while(ADCON0bits.GO);
après chaque ligne ADCON0bits.GO = 1, comme ça ton code attendra que la conversion A/N soit terminée.
Ça ne fonctionne toujours pas, même en rajoutant un delay de 200ms pour chaque conversion.
Je vais remettre tout mon code :
Code:#include <xc.h> #pragma config IESO = OFF #pragma config BOREN = OFF #pragma config CPD = OFF #pragma config CP = OFF #pragma config MCLRE = ON #pragma config PWRTE = ON #pragma config WDTE = OFF #pragma config FOSC = INTOSCIO #define A0 GPIObits.GP0 #define A1 GPIObits.GP1 #define A2 GPIObits.GP2 #define A4 GPIObits.GP4 #define A5 GPIObits.GP5 #define _XTAL_FREQ 4000000 void main(void) { // OSC : OSCCONbits.IRCF = 0b111; // 4Mhz OSCCONbits.SCS = 0 ; // Configuration de l'horloge systeme TRISIO = 0b00011001 ; // --543210 CMCON0 = 0b00000111 ; // CAN : ADCON0 = 0b00000001 ; // AN0=000 AN3=011 ANSEL = 0b00011001 ; // Fosc/8, AN0 et AN3 Analog unsigned int POT, AMP ; while(1) { ADCON0bits.CHS1=1; ADCON0bits.CHS0=1; //AN3 ADCON0bits.GO = 1 ; while(ADCON0bits.GO) ; POT = (ADRESH<<2)|(ADRESL>>6) ; ADCON0bits.CHS1=0; ADCON0bits.CHS0=0; //AN0 ADCON0bits.GO = 1 ; while(ADCON0bits.GO) ; AMP = (ADRESH<<2)|(ADRESL>>6) ; if(AMP<499) A5=1; else A5=0; //Ceci ne fonctionne que quand j’efface les 4 lignes pour AN3 } return ; }
Dernière modification par AmigaOS ; 14/06/2013 à 15h17.
Hum, étrange. Et si tu rajoute un delay de 1ms entre
ADCON0bits.CHS1=1; ADCON0bits.CHS0=1; //AN3
et
ADCON0bits.GO = 1 ;
ça marche mieux ?
Ah oui, c'est ce que j'étais en train de tester. Maintenant ça marche. Fallait le trouver ^^
Merci!