bonjour,
j'aurais besoin d'un avis, je tente de réaliser un programme qui me permet de créer des impulsions grace au pic 18f4520 que j'utilise, ces impulsions sont envoyées sur un thyristor. pour valider l'envoie de ces impulsions j'utilise deux entrées du pic qui fonctionne très bien, lorsque que je les active, les impulsions sont bien envoyées. je veux également utiliser quatre autres entrées de mon pic pour permettre à l'utilisateur, grâce a des boutons poussoirs (deux + et deux -), de sélectionner le nombre d'impulsions et le temps de retard de l'envoie de l'impulsions mais mon problème est le suivant: je configure les broches utilisées comme des entrées mais lorsque j'envoie un niveau haut sur ces dernière il n'y a pas vraiment de réaction et j'ai l'impression que le pic lui voit sur toutes les broches des boutons poussoir des niveau haut car il arrive à passer la condition du "if" et incrémente des valeurs tout seul jusqu'à arriver au maximum. en gros je souhaite seulement utiliser les quatre broches (RB4 à RB7) en entrées avec des boutons poussoirs mais le pic n'a pas l'air de bien les reconnaitre.
j'espère avoir été relativement clair car j'ai du mal à expliquer mon problème, je vous joint le code en C18 ça sera surement plus clair pour vous que mes explications.
merci d'avance si vous avez un peu de temps pour m'aider.
jeannette74
Code:#include <p18f4520.h> #include <p18cxxx.h> #include <stdio.h> #include "xlcd.h" #include "delays.h" #include "stdlib.h" #pragma config OSC = INTIO67 #pragma config WDT = OFF #pragma config FCMEN=ON, IESO=ON, XINST=OFF, LVP=OFF #pragma config PBADEN=OFF int affichage(int ipulses,int itheta) //sous fonction gestion de l'affichage des valeurs de pulse et de retard { /*declaration des variables*/ char declarp[]="Pulses:"; char declart[]="Retard(ms):"; char stringp[8]; char stringt[8]; int i=0; unsigned char row_address; unsigned char config=0xFF; // TRISB&=0xf0; TRISA|=0x0F; //PORTB=7; /*initialisation du LCD*/ ADCON1=0x0f; config = FOUR_BIT & LINES_5X7; OpenXLCD(config); /*affichage*/ while(BusyXLCD()); SetDDRamAddr(0x80); row_address=0x80; while(declarp[i]!='\0') //affichage de "pulses:" { while(BusyXLCD()); SetDDRamAddr(row_address); putcXLCD(declarp[i]); row_address++; i++; } row_address=0x88; //affichage nbre pulses ltoa(ipulses,stringp); i=0; while(BusyXLCD()); while(stringp[i]!='\0') { SetDDRamAddr(row_address); putcXLCD(stringp[i]); row_address++; i++; } row_address=0x40; i=0; while(declart[i]!='\0') //affichage de "retard(ms):" { while(BusyXLCD()); SetDDRamAddr(row_address); putcXLCD(declart[i]); row_address++; i++; } row_address=0x4C; //affichage valeur de theta (retard) ltoa(itheta,stringt); i=0; while(BusyXLCD()); while(stringt[i]!='\0') { SetDDRamAddr(row_address); putcXLCD(stringt[i]); row_address++; i++; } //PORTB=8; SetDDRamAddr(0x4F); //PORTB=9; } int saisie_theta(int itheta) // sous fonction de saisie de la valeur souhaitée du retard des pulses { INTCON2&=0b01111111; TRISA|=0x01; TRISB|=0x0C; //PORTB=8; /*saisie du délai de théta avec le bouton 3 et 4*/ if(PORTA&0b00000001==0b00000001) {//PORTB=4; if(itheta<9) { itheta++; //bouton 3 incrémente Delay1KTCYx(200); } } else if(PORTB&0b00000100==0b00000100) {//PORTB=5; if(itheta>0) { itheta--; //bouton 4 décremente Delay1KTCYx(200); } } itheta=4; return itheta; } int saisie_pulses(int ipulses) //sous focntion de saisie du nombre de pulses souhaitée par l'utilisateur { TRISB|=0x03; INTCON2&=0b01111111; //PORTB=12; /*saisie du nombres de pulses avec le bouton 1 et 2*/ if(PORTB&0b01000000==0b01000000) { //PORTB=1; if(ipulses<9) { ipulses++; //bouton 1 incrémente Delay1KTCYx(200); } } else if(PORTB&0b00000001==0b00000001) {//PORTB=2; if(ipulses>0) { ipulses--; //bouton 2 décremente Delay1KTCYx(200); } } ipulses=5; return ipulses; } void main() { int ipulses; int itheta; int ipedale; //pour la pédale => RC0 int i; int ifinish; ifinish=0; ipedale=0; itheta=0; ipulses=0; //TRISB&=0xF0; TRISC&=0xDF; //sortie pour le thyristor TRISC|=0x01; //entrée pour la pédale //TRISA|=0x20; TRISE|=0x01; //entrée pour le TCA785 //TRISD|=0xC0; PORTC&=0b11011111; //mise à zéro de la sortie RC5 (thyristor) //PORTE&=0b11111110; while(ipedale==0) //cette boucle attent la validation par l'utilisateur idiquant qu'il a finit la saisie { // PORTB=1; itheta=saisie_theta(itheta); // Delay1KTCYx(200); ipulses=saisie_pulses(ipulses); //PORTB=3; // Delay1KTCYx(200); affichage(ipulses,itheta); //PORTB=4; Delay1KTCYx(50); if(PORTC&0b00000001==0b00000001) //pédale sur Rc0 si la condition est vrai, l'utilisateur a appuyer sur la pédale { //PORTB=5; ipedale=1; } } //PORTB=6; i=ipulses; while(ifinish==0) //boucle gérant les impulsions { //PORTB=15; //Delay1KTCYx(200); if(PORTE&&0b00000001==0b00000001) //tca785 RE0 si on a une impulsions venant du TCA785 le cycle peut commencer afin d'etre synchronisés avec les impulsions du tca785 son du secteur 50Hz {//PORTB=9; switch(itheta) //gestion du retard par rapport au tca choisi par l'utilisateur { case 1: //theta 1ms Delay10TCYx(25); break; case 2://theta 2ms Delay10TCYx(50); break; case 3://theta 3ms Delay10TCYx(75); break; case 4://theta 4ms Delay10TCYx(100); break; case 5://theta 5ms Delay10TCYx(125); //PORTB=9; break; case 6://theta 6ms Delay10TCYx(150); break; case 7://theta 7ms Delay10TCYx(175); break; case 8://theta 8ms Delay10TCYx(200); break; case 9://theta 9ms Delay10TCYx(225); // PORTB=7; break; } //PORTB=10; while(i!=0) //génération des impulsions {//PORTB=11; i--; PORTC|=0b00100000; //rc5 => sortie correspondant a la gachette du thyristor/ mise a 1 de la broche thyristor (impulsion) // prescaler=0; // val_init=0xC7; //PORTB=12; Delay10TCYx(1); //temporisations utile pour les essais afin de bien voir l'impulsions a l'oscilloscope et pour que le géné d'impulsions ai le temps de reperer il faut laisser un minimum de tempo PORTC&=0b11011111; //PORTB=13; Delay100TCYx(50); //temporisations de 20ms correspondant à la fréquence du secteur 50Hz // if(i=0){ // ifinish=1; // } /*temporisation 20ms*/; } } } //PORTB=10; return; }
-----