Witam.
Używam biblioteki vusb.
Napisałem wstępnie program, i chcę go skompilować. Lecz niestety, natknąłem na poważny błąd, który sam nie rozwiąże:
Sytuacja jest dla mnie tak dziwna, że mam załączony nagłówek:
#include "usbconfig.h"
#include "usbdrv/usbdrv.h"
#include "usbdrv/oddebug.h"
W pliku
usbdrv/usbdrv.h
jest zdefiniowana funkcja USBpoll:
Więc kompilator powinien to przełknąć.
W załączniku http://goo.gl/P6ujK przesyłam projekt eclipse z folderu workspace.
Tutaj mój kod main.c
/*
* main.c
*
* Created on: 25-01-2012
* Author: Bordeux
*/
#define F_CPU 12000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include "usbconfig.h"
#include "usbdrv/usbdrv.h"
#include "usbdrv/oddebug.h"
#define DDS1_SDA (1<<1) //PORTB1
#define DDS_SCL (1<<3) //PORTB3
#define DDS_UPDATE (1<<4) //PORTB4
static uchar usb_val;
USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len) //sends len bytes to DDS_SDA
{
uchar i;
uchar b;
uchar adr=0;
while (len!=0){
b=1;
for (i=0;i<8;i++){
if (b & data[adr]){
PORTB = (PORTB | DDS1_SDA) & ~DDS_SCL;
PORTB = PORTB | DDS_SCL;
}
else{
PORTB = PORTB & (~DDS1_SDA & ~DDS_SCL);
PORTB = PORTB | DDS_SCL;
}
b=b<<1;
}
len--;
adr++;
}
if (usb_val){
PORTB = PORTB | DDS_UPDATE; // update DDS
PORTB = PORTB & ~DDS_UPDATE;
}
return 1;
}
USB_PUBLIC uchar usbFunctionSetup(uchar data[8])
{
usbRequest_t *rq = (void *)data;
static uchar replyBuf[3];
usbMsgPtr = replyBuf;
if(rq->bRequest == 0){ // ECHO value
replyBuf[0] = data[2]; // rq->bRequest identical data[1]!
replyBuf[1] = data[3];
return 2;
}
if(rq->bRequest == 1){ // set port directions
//DDRA = data[2];
DDRB = data[3];
DDRD = data[4] & (~USBMASK & ~(1 << 2)); // protect USB interface
return 0;
}
if(rq->bRequest == 2){ // read ports
// replyBuf[0] = PINA;
replyBuf[1] = PINB;
replyBuf[2] = PIND;
return 3;
}
if(rq->bRequest == 3){ // read port states
// replyBuf[0] = PORTA;
replyBuf[1] = PORTB;
replyBuf[2] = PORTD;
return 3;
}
if(rq->bRequest == 4){ // set ports
// PORTA = data[2];
PORTB = data[3];
PORTD = data[4];
return 0;
}
if(rq->bRequest == 5){ // use usbFunctionWrite to transfer len bytes to DDS
usb_val = data[2]; // usb_val!=0 => DDS update pulse after data transfer
return 0xff;
}
if(rq->bRequest == 6){
PORTB = PORTB | DDS_UPDATE; // issue update pulse to DDS
PORTB = PORTB & ~DDS_UPDATE;
return 0;
}
replyBuf[0] = 0xff; // return value 0xff => command not supported
return 1;
}
int main(void)
{
wdt_enable(WDTO_1S); //set Watchdog Timer
odDebugInit();
PORTB=0xe0; //Set PortB 0-4 zero
DDRB=0x1f; //Set PORTB 0-4 output
PORTD = 0; /* no pullups on USB pins */
DDRD = ~USBMASK & ~(1 << 2); /* all outputs except USB data and PD2 = INT0 */
usbInit();
sei();
for(;;){ /* main event loop */
wdt_reset();//restart watchdog timer
usbPoll();
}
return 0;
}