pic18f4520 problème série de port en entrées
Affichage des résultats 1 à 6 sur 6

pic18f4520 problème série de port en entrées



Mode arborescent

  1. #1
    invite5979bd73

    pic18f4520 problème série de port en entrées

    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;
    }
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. HELP!!!probleme programmation port serie win32
    Par inviteac751535 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 28/11/2010, 15h11
  2. Liaison série entre un PIC18F4520 et un PC avec hyperterminal
    Par inviteadb2df5e dans le forum Électronique
    Réponses: 18
    Dernier message: 03/06/2008, 13h10
  3. liaison série entre un PC et un PIC18F4520
    Par inviteadb2df5e dans le forum Électronique
    Réponses: 11
    Dernier message: 21/05/2008, 13h12
  4. Problème port série RS232
    Par RomainD2 dans le forum Électronique
    Réponses: 1
    Dernier message: 02/05/2008, 19h37
  5. probleme de connexion port serie et 16f877
    Par invite6b4dc7fb dans le forum Électronique
    Réponses: 0
    Dernier message: 04/03/2008, 22h11
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...