Bienvenu(e)! Identification Créer un nouveau profil

Recherche avancée

tuto carte acquisition USB 18f4550

Envoyé par prinz metal 
tuto carte acquisition USB 18f4550
jeudi 4 juillet 2013 14:50:12
Bonjour tout le monde !

nouveau sur ce forum, je suis tombé sur votre site sympathique, en cherchant de réalisé une carte d interface USB je suis alors tombé sur votre tutoriel :

[www.roboticus.org]

assez bien expliqué winking smiley

mais en cherchant a modifié le contenu pour une autre application j'ai découvert un problème, apparemment si on ajoute plusieurs ligne de code qui dur plus de 100ms (dans mon cas une boucle for) dans la procédure "ProcessIO" le périphérique n'est plus reconnu! ça marche au fait simplement dans le cas ou vous aurez besoin de quelque ligne, comme dans le tuto faire un acquisition ADC ou simplement allumer une LED qui prendra 5us...

void ProcessIO(void)
{   
	int i;
	static pressed=0;
 unsigned char pulscounter2;
 unsigned char pulscounter;
 unsigned char pulscounter3;


   if (HIDRxReport(Buffer,PacketSize ) > 0) // USB receive buffer has data
    {	
		PORTCbits.RC0 = 1;


		if (Buffer[33]==1){
			for (i=0; i<Buffer[33]; i++) {
				PORTCbits.RC1 = 1;
				Delay10KTCYx(Buffer[33]);
				PORTCbits.RC1 = 0;	
				Delay10KTCYx(Buffer[33]);
				}
			}	

		if (Buffer[0]==0)
			{
			Buffer[33]=255;
			getacd(0, 1);
			Buffer[33] = ADRESH ;
			Buffer[33] = ADRESL ;
			}			
		
		

        if(!mHIDTxIsBusy()) {                 // blocking
        HIDTxReport(Buffer, PacketSize ); }  // transmit packet

		PORTCbits.RC0 = 0;
	}

	if (PORTCbits.RC2 == 0) {
		if (!pressed) {



for (pulscounter2=0;pulscounter2<20;pulscounter2++) //20
{
for (pulscounter=0;pulscounter<100;pulscounter++)   //100
  {
  LEDIR = 1   ;
  Delay10TCYx(5)     ;
  LEDIR = 0   ;
  Delay10TCYx(5)     ;
  Nop();
  Nop();
}
}
_asm
btfsc   tsop2,0
bsf     PORTB,3,0
btfss   tsop2,0
bcf     PORTB,3,0

btfsc   tsop1,0
bsf     PORTB,5,0
btfss   tsop1,0
bcf     PORTB,5,0
_endasm
Delay1KTCYx(250) ;
Delay1KTCYx(250) ;
Delay1KTCYx(250) ;



			Buffer[0]=255;
			Buffer[1] = PORTBbits.RB5 ;
			Buffer[2] = PORTBbits.RB3 ;
//			Buffer[2] = ADRESL ;

			 if(!mHIDTxIsBusy()) {                // blocking
        		HIDTxReport(Buffer, PacketSize );   // transmit packet
				pressed=1;
			}
		}
	}

	if (PORTCbits.RC2 == 1) {
		pressed=0;
	}




}//end ProcessIO

et pour que sa marche (périphérique reconnu) faut diminuer le temps d exécution de la boucle FOR pour pulscounter<5

est-ce normal ?!

merci smiling smiley



Modifié 1 fois. Dernière modification le 04/07/13 14:51 par prinz metal.

Re: tuto carte acquisition USB 18f4550
jeudi 4 juillet 2013 17:44:51
salut

après de nombreux teste et recherche j'ai trouvé que: la fonction USBDeviceTasks() ( USBTasks() sur le tuto du site ) doit t’être appeler a chaque fois:

// Check bus status and service USB interrupts.
USBDeviceTasks(); // Interrupt or polling method. If using polling, must call
// this function periodically. This function will take care
// of processing and responding to SETUP transactions
// (such as during the enumeration process when you first
// plug in). USB hosts require that USB devices should accept
// and process SETUP packets in a timely fashion. Therefore,
// when using polling, this function should be called
// frequently (such as once about every 100 microseconds) at any
// time that a SETUP packet might reasonably be expected to
// be sent by the host to your device. In most cases, the
// USBDeviceTasks() function does not take very long to
// execute (~50 instruction cycles) before it returns.


source "Microchip Solutions/USB Device - HID - Keyboard"

et pour moi cette fonction qu il faut appeler tout les 100us dérange, y a t il pas un moyen de la faire appelé automatiquement ?.... surement avec interruption du au timer (ce que je ne sais pas faire en C mais en ASM)... mais sa vaudra dire que ça vas influer sur la précision si on la cherche... je crois que ce point doit être préciser dans le tuto si j ose dire.

sinon y a t il pas une autre solution ?

autre chose:
Interrupt or polling method. If using polling, must call
// this function periodically

ça vaudra dire qui si on n'utilise pas le "pollig methode" pas besoin d appeler la fonction a chaque fois.... mais que veut dire le "polling methode" ????????????? lol



Modifié 3 fois. Dernière modification le 04/07/13 17:48 par prinz metal.
Re: tuto carte acquisition USB 18f4550
dimanche 7 juillet 2013 17:17:32
Salut,

Désolé j'étais parti en vacances (ça arrive ;-))

En effet les tâches USBTasks() doivent être régulièrement appelée pour maintenir la communication USB, je pensais que c'était indiqué dans le tutoriel.

Tu pourrais faire un appel périodique au travers d'une interruption comme tu le proposes. Ou l'inverse faire fonctionner ton application sur base d'événements. Je ne comprends ce que tu veux dire par la "perte de précision". Le tout est de voir selon les besoins de l'application que tu réalises pour savoir comment prioriser les tâches

Le polling est le fait de lancer toi même l'appel tous les X temps pour relancer la communication. Dans ce cas, la fonction doit être appelée dans Process IO. Le polling se ferra à chaque fois que tu boucles dans process IO

Si en effet tu l'utilises sous forme d'interruption, tu dois retirer l'appel à la fonction dans ProcessIO. Mais dans les deux cas, la fonction doit être appelée périodiquement (en pooling ou en interruption). C'est ça qui est signifié dans l'explication.

Benjamin

.: [www.roboticus.org] :. Control your own world !
Re: tuto carte acquisition USB 18f4550
dimanche 7 juillet 2013 17:56:07
Benjamin écrivait:
-------------------------------------------------------
> Salut,
>
> Désolé j'étais parti en vacances
> ;-))
>

j'aimerais tant être a ta place :'( sinon contant pour toi ^^

> En effet les tâches USBTasks() doivent être
> régulièrement appelée pour maintenir la
> communication USB, je pensais que c'était
> indiqué dans le tutoriel.

il est juste indiqué que "ProcessIO" vas être exécuter en boucle ... c'est tout

>
> Tu pourrais faire un appel périodique au travers
> d'une interruption comme tu le proposes. Ou
> l'inverse faire fonctionner ton application sur
> base d'événements. Je ne comprends ce que tu
> veux dire par la "perte de précision"

beh imaginer que je crée une boucle de 500ma a la micro seconde prés....avec l'appelle de la fonction USBtask() tout les 100us... ma boucle ne sera plus précise, et on pourra pas faire un arrangement vus que cette dernier prend A PEU PRES 50 cycle (elle même n'étant pas précise), j'aurais bien aimé savoir pourquoi doit-on toujours maintenir la communication, et si c'était le cas pour tout les périphériques USB....imprimante par exemple, et a quoi ça sert? est-ce que c'est sa qui permet au PC de savoir qu un périphérique viens d’être déconnecter ?

> Le polling est le fait de lancer toi même l'appel
> tous les X temps pour relancer la communication.
> Dans ce cas, la fonction doit être appelée dans
> Process IO. Le polling se ferra à chaque fois que
> tu boucles dans process IO

désoler toujours pas compris sad smiley

> Si en effet tu l'utilises sous forme
> d'interruption, tu dois retirer l'appel à la
> fonction dans ProcessIO. Mais dans les deux cas,
> la fonction doit être appelée périodiquement
> (en pooling ou en interruption). C'est ça qui est
> signifié dans l'explication.
>
tu veux dire l'enlever de la boucle while(1) et non pas de ProcessIO!... car il n'ont existe pas dans cette dernier!.

voila merci grinning smiley j adore ton site
Re: tuto carte acquisition USB 18f4550
mercredi 10 juillet 2013 17:25:57
Salut
beh imaginer que je crée une boucle de 500ma a la micro seconde prés....avec l'appelle de la fonction USBtask() tout les 100us... ma boucle ne sera plus précise, et on pourra pas faire un arrangement vus que cette dernier prend A PEU PRES 50 cycle (elle même n'étant pas précise), j'aurais bien aimé savoir pourquoi doit-on toujours maintenir la communication, et si c'était le cas pour tout les périphériques USB....imprimante par exemple, et a quoi ça sert? est-ce que c'est sa qui permet au PC de savoir qu un périphérique viens d’être déconnecter ?

Dans ce genre de programme, tu ne dois surtout pas essayé de faire des boucles de autant de microseconde précisément. Tu vas te casser la figure. C'est bien mieux pour toi de déclencher une interruption toutes les 500ms. De cette manière tu assures que ton code sera exécuté toutes les 500ms sans faute! Après, importe peu les tâches de l'usb tant que celle-ci puissent s'exécuter régulièrement


La différence entre polling et interruption.

Faire du polling c'est choisir toi même quand tu vas aller écouter/lire une information. Par exemple, tous les cycles d'une boucle tu vas lire les données. Une interruption c'est déclencher un événement dès que l'information apparait. Donc dans le cas ou l'usbtask est fait dans processio, il est exécuté cyclement, donc en polling.

Maintenant tu pourrais ne rien avoir dans ta boucle while(1) et faire tout s'exécuter via des interruptions du timer. avoir par exemple une interrupt tous les 100ms pour l'usb task et une toutes les 500 pour ta fonction. Mais ça c'est à toi a choisir selon l'architecture que tu veux et ce que tu as a traiter.

Amuse toi bien et n'hésite pas si tu as d'autres questions. N'hésite pas à entrer plus dans les détails en faisant un schéma. ça aide souvent à comprendre

Benjamin

.: [www.roboticus.org] :. Control your own world !
Utilisateur anonyme
Re: tuto carte acquisition USB 18f4550
vendredi 11 avril 2014 05:54:21
Salut J'ai une problème sur mon projet Pour quoi le Win7 ne connait le Pic 18f4550 en utilsant USB avec Quartz 20Mhz
Re: tuto carte acquisition USB 18f4550
vendredi 11 avril 2014 16:48:01
Salut,

L'exemple de ce site n'est pas compatible avec Windows 7... les choses ont évolué depuis l'écriture...

Ce que tu peux faire:

Télécharger les firmware de microchip, c'est gratuit sur leur site

Prendre le code d'exemple mouse in a circle

Flasher ta carte avec et constater si ça marche ou non... si ça marche la souris devrait tourner en rond sur l'écran

Si ça marche, il faut alors repartir d'un exemple de microchip en reprenant le descripteur de l'exemple de ce site pour faire ton application

Cordialement

Benjamin

.: [www.roboticus.org] :. Control your own world !
Seuls les utilisateurs enregistrés peuvent poster des messages dans ce forum.

Cliquez ici pour vous connecter