Сейчас деваю один девайс и меня очень удивляет его глючность. Устройство должно просто отправлять ответы на USB-HID запросы с компа.
Вот код программы:
CODE
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include "main.h"
#include "usbdrv/usbdrv.c"
#include "usbdrv/requests.h"
#include "USB_Commands.h"
vuchar outputs;
vuchar currentAddress;
vuchar bytesRemaining;
vuchar rqtemp[2];
uchar temp_str[2];
unsigned char temperature[3]; // 0-Low, 1-Hight, 2-Status
char CheckButton(char pin_number)
{
vuchar pin=0;
switch(pin_number)
{
case 1: pin = 0; break;
case 2: pin = 1; break;
}
return !CheckBit(PINB, pin);
}
usbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t *rq = (void *)data;
uchar var1 = rq->wValue.bytes[0];
uchar var2 = rq->wIndex.bytes[0];
// uchar str[10];
switch(rq->bRequest)
{
case UComm_CheckButton:
usbMsgPtr[0] = CheckButton(var1);
return 1;
}
return 0;
}
int main(void)
{
DDRB = 0b00001100; PORTB = 0b00000011;
DDRC = 0b11111111; PORTC = 0b00000000;
DDRD = 0b00000000; PORTD = 0b00000000;
usbInit();
usbDeviceDisconnect();
_delay_ms(300);
usbDeviceConnect();
sei();
while(1)
{
usbPoll();
}
}
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
#include "main.h"
#include "usbdrv/usbdrv.c"
#include "usbdrv/requests.h"
#include "USB_Commands.h"
vuchar outputs;
vuchar currentAddress;
vuchar bytesRemaining;
vuchar rqtemp[2];
uchar temp_str[2];
unsigned char temperature[3]; // 0-Low, 1-Hight, 2-Status
char CheckButton(char pin_number)
{
vuchar pin=0;
switch(pin_number)
{
case 1: pin = 0; break;
case 2: pin = 1; break;
}
return !CheckBit(PINB, pin);
}
usbMsgLen_t usbFunctionSetup(uchar data[8])
{
usbRequest_t *rq = (void *)data;
uchar var1 = rq->wValue.bytes[0];
uchar var2 = rq->wIndex.bytes[0];
// uchar str[10];
switch(rq->bRequest)
{
case UComm_CheckButton:
usbMsgPtr[0] = CheckButton(var1);
return 1;
}
return 0;
}
int main(void)
{
DDRB = 0b00001100; PORTB = 0b00000011;
DDRC = 0b11111111; PORTC = 0b00000000;
DDRD = 0b00000000; PORTD = 0b00000000;
usbInit();
usbDeviceDisconnect();
_delay_ms(300);
usbDeviceConnect();
sei();
while(1)
{
usbPoll();
}
}
Как видите, ничего сложного, программа для ПК должна отобразить, нажата ли какая нить с двуй кнопок, запрос с компа каждые 500мс.
Ну сначала отображает вроде бы нормально но через 7-10 сек вместо состояния нажатия приходят левые числа и ещё через 3 сек устройсво дисконнектиться. Пробовал заменить usbMsgPtr[0] = CheckButton(var1); на usbMsgPtr[0] = 1; - сначала нормально приходит 1 а потом опять левые числа и отваливаеться.
Но самый большой прикол в том, что почему то после "отваливания" загораеться светодиод на PORTC2,
Подскажите плиз, в чем тут проблема.
Заранее спасибо!