Utilisation du port USB





Nous allons utiliser le Port USB pour commander les LEDs.

Prérequis:

Voir chapitre Faire clignoter les Leds ici.


Programme pour la carte:


Dans un premier temps il faut charger la bibliothèque  V-USB library de OBdev ou ici.


Ouvrir un nouveau projet avec Atmel Studio6. Exemple USBPROG.




Décompresser l'archive et copier les fichiers du répertoire usbdrv dans votre projet.




Dans mon cas C:\Users\Christophe\Documents\Atmel Studio\6.2\USBPROG\USBPROG.



Ouvrir le fichier usbconfig-prototype.h avec notepad+.


Et modifier les paramètres suivant:


# Define USB_CFG_IOPORTNAME B

# define USB_CFG_DMINUS_BIT       0

# define USB_CFG_DPLUS_BIT        1


#define USB_CFG_VENDOR_NAME     'u', 's', 'b', 'p', 'r', 'o', 'g'

#define USB_CFG_VENDOR_NAME_LEN 7


#define USB_CFG_DEVICE_NAME     'T', 'e', 'm', 'p', 'l', 'a', 't', 'e'

#define USB_CFG_DEVICE_NAME_LEN 8


#define USB_CFG_IMPLEMENT_FN_WRITE      1


Sauvegarder et renommer le fichier en usbconfig.h.


Copier le programme suivant dans l'IDE Atmel Studio6:


/**

* Project: AVR ATtiny USB Tutorial at http://codeandlife.com/

* Author: Joonas Pihlajamaa, joonas.pihlajamaa@iki.fi

* Inspired by V-USB example code by Christian Starkjohann

* Copyright: (C) 2012 by Joonas Pihlajamaa

* License: GNU GPL v3 (see License.txt)

*/

// Modifier par Christophe Caron www.caron.ws


#include <avr/io.h>

#include <avr/interrupt.h>

#include <avr/wdt.h>


#include "usbdrv.h"


#define F_CPU 12000000L

#include <util/delay.h>


#define USB_LED_OFF 0

#define USB_LED_ON  1

#define USB_DATA_OUT 2

#define USB_DATA_WRITE 3

#define USB_DATA_IN 4


static uchar replyBuf[16] = "Hello, USB!";

static uchar dataReceived = 0, dataLength = 0; // for USB_DATA_IN


// this gets called when custom control message is received

USB_PUBLIC uchar usbFunctionSetup(uchar data[8]) {

       usbRequest_t *rq = (void *)data; // cast data to correct type

       

       switch(rq->bRequest) { // custom command is in the bRequest field

   case USB_LED_ON:

               PORTC |= 1; // turn LED on

               return 0;

       case USB_LED_OFF:

               PORTC &= ~1; // turn LED off

               return 0;

   case USB_DATA_OUT: // send data to PC

       usbMsgPtr = replyBuf;

       return sizeof(replyBuf);

       case USB_DATA_WRITE: // modify reply buffer

               replyBuf[7] = rq->wValue.bytes[0];

               replyBuf[8] = rq->wValue.bytes[1];

               replyBuf[9] = rq->wIndex.bytes[0];

               replyBuf[10] = rq->wIndex.bytes[1];

               return 0;

   case USB_DATA_IN: // receive data from PC

               dataLength  = (uchar)rq->wLength.word;

       dataReceived = 0;

               

               if(dataLength  > sizeof(replyBuf)) // limit to buffer size

                       dataLength  = sizeof(replyBuf);

                       

               return USB_NO_MSG; // usbFunctionWrite will be called now

   }


   return 0; // should not get here

}


// This gets called when data is sent from PC to the device

USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len) {

       uchar i;

                       

       for(i = 0; dataReceived < dataLength && i < len; i++, dataReceived++)

               replyBuf[dataReceived] = data[i];

               

   return (dataReceived == dataLength); // 1 if we received it all, 0 if not

}


int main() {

       uchar i;


       DDRC = 1; // PC0 as output

       

   wdt_enable(WDTO_1S); // enable 1s watchdog timer


   usbInit();

       

   usbDeviceDisconnect(); // enforce re-enumeration

   for(i = 0; i<250; i++) { // wait 500 ms

       wdt_reset(); // keep the watchdog happy

       _delay_ms(2);

   }

   usbDeviceConnect();

       

   sei(); // Enable interrupts after re-enumeration

       

   while(1) {

       wdt_reset(); // keep the watchdog happy

       usbPoll();

   }

       

   return 0;

}


Ajouter les fichiers suivant en faisant un clique droit sur votre projet:


usbdrvasm.S

usbdrv.c

oddebug.c







Faire un double clique sur le fichier usbdrvasm.S et modifier la ligne 390 qui se trouve vers la fin:


#       include "usbdrvasm20.inc"

#   else

#     include "usbdrvasm12.inc" //error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!"

#   endif

#endif /* USB_CFG_CHECK_CRC */


Sélectionner les trois fichiers


usbdrvasm.S

usbdrv.c

oddebug.c


Et faire un crtl + F7 ou aller dans le menu Build et Complie.


Puis faire F7 ou un Build


Maintenant vous pouvez charger le programme dans le Programmateur ISP. Voir chapitre ici.


Installation du Driver pour Windows:


Télécharger libusb-win32 ou ici. Décompresser l'archive.


Brancher votre Programmateur sur le port USB.

Aller dans le répertoire bin et ouvrir le programme  inf-wizard.exe.




Appuyer sur Next. Et choisir le nom de votre driver. Dans mon cas, c'est Template.



Faire Next.



Encore Next. Et Enregistrer.



Puis Install now






Programme pour l'ordinateur:


Installer un compilateur dans mon cas se sera MinGW. Aller sur le site http://www.mingw.org/ puis dans la section download. Et après dans installer. Télécharger le fichier mingw-get-setup.exe et le lancer.



Cliquer sur Install et faire continuer.


Choisir les options de bases.



Puis installation et Apply change.


Aller dans les paramètres windows pour inscrire un PATH.



Faire modifier après avoir cliquer sur Path. Et écrire C:\MinGW\bin.



Télécharger le programme http://codeandlife.com/data/usb_tutorial_20120204.zip ou ici.

Décompresser l'archive.

Editer le fichier usbtest.c avec notepad++

Modifier la ligne 131.


handle = usbOpenDevice(0x16C0, "codeandlife.com", 0x05DC, "USBexample");


Comme cela:


handle = usbOpenDevice(0x16C0, "usbprog", 0x05DC, "Template");


Sauvegarder et fermer notepad++


Taper cmd dans la recherche de programme et faire entrée.



Aller dans le répertoire ou se trouve le fichier usbtest.c.



Taper la commande suivante pour créer le fichier exécutable.


gcc -I ./libusb/include -L ./libusb/lib/gcc -O -Wall usbtest.c -o usbtest.exe -lusb




Brancher votre carte sur le port USB et taper usbtest puis entrée.



Maintenant en faisant usbtest on ou usbtest off vous devriez voir la led changer d'état



Mise à jour 09/05/2014

Créé avec HelpNDoc Personal Edition: Créer des aides HTML, DOC, PDF et des manuels depuis une même source