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

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



  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

  2. #2
    invite5979bd73

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

    excusez moi il y avait une erreur suite a de nombreux essais en desespoir de cause! voila le code normalement avec moins de faute!

    merci

    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|=0x30;
    //PORTB=8;
    			/*saisie du délai de théta avec le bouton 3 et 4*/
    	if(PORTB&0b00010000==0b00010000)
    		{//PORTB=4;
    			if(itheta<9)
    			{
    			itheta++;				//bouton 3 incrémente
    			Delay1KTCYx(200);
    			}
    		}
    	else if(PORTB&0b00100000==0b00100000)
    		{//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|=0xC0;
    	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&0b10000000==0b10000000)
    		{//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;
    }

  3. #3
    invite5979bd73

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

    nan personne?^^ s'il vous plait je ne sais plus quoi faire!!

  4. #4
    cherwam07

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

    Salut,

    j'espère avoir été relativement clair
    Désolé de te décevoir, mais non, ce n'est pas clair du tout.

    Il y a d'emblée quelque chose qui ne va pas dans ton code :

    Code:
    int ipedale;
    ...
    ipedale=0;
    ...
    while(ipedale == 0)
    {
    ...
    }
    Code:
    int ifinish;
    ifinish=0;
    ...
    while(ifinish == 0)
    {
    ...
    }
    Il n'y a aucune facon de rentrer dans une de tes 2 boucles while()
    Donc ton code ne fait rien...

  5. A voir en vidéo sur Futura
  6. #5
    invite5979bd73

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

    dsl pour le manque de clarté ^^ et merci pour la réponse!
    mais si pourtant mon code fonctionne dans cette partie, les variables ifinish et i pedale ont été initialisée à 0 en début de programme du coup il rentre dans la boucle while, la première boucle on en sort lorsque que ipedale==1 lorsque l'entrée RC0 est à 1 et pour le ifinish cette varaible ne sert à rien enfait j'ai mis en commentaire le code qui devait la mettre a 1 donc du coup à la place de ce while(ifinish==0) j'aurais tout aussi pu bien mettre while(1). mon programme pour le moment affiche le nombre de pulse ainsi que de retard, il arrive à générer le nombre de pulse demander ainsi que le retard demander mais il faut que je rentre le nombre de pulse et le temps de retard directement dans le programme sinon lorsque je laisse la fonction de saisie faire son travail et donc saisir ces données grâce a des boutons poussoirs, et bien le nombre de pulse et de retard s'incrémente (je peux le voir sur l'affichage) tout seul jusqu'à atteindre la valeur maximal 9 sans meme que j'ai besoin de toucher aux boutons (qu'il soit au niveau haut ou bas)
    mon problème est dans la boucle while(ipédale==0), lorsqu'il y a appel des fonctions de saisie, et je pense que le problème viens des entrées du pics, meme si je pense avoir bien configurer en entrées les pins RB4 à RB7, nan?

    jeannette

  7. #6
    ezel120

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

    salut

    Je veux que vous m'aidiez svp

    mon projet est redresseur triphasé commandé simple alternance (3thyristor) par pic 16f877

    comment ecrit le programme en langage c pour crée les impulsions du 3thyristor avec retard de 60 degré implique 3.33ms

    merciiiiii d'avence

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. Réponses: 18
    Dernier message: 03/06/2008, 13h10
  3. liaison série entre un PC et un PIC18F4520
    Par frouby 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
Découvrez nos comparatifs produits sur l'informatique et les technologies.