110-Utilisation du port USB E/S
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