Перейти к содержанию
    

Здравствуйте! Помогите пожалуйста, не могу разобраться с example (hid usb mouse):

http://atmel.com/dyn/resources/prod_docume...mouse-1_0_3.zip

может кто разобрался, или есть какие-нибудь материалы? И как мне показалось, по дефолту внутренний RC-генератор на 8MHZ отключен(в даташите написано, что подключен), т.к. без внешнего кварца at90usb162 не определялся, а Flip не хотел прошивать.

С уважением, Сергей

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

AVRStudio

 

.... ну нельзя же не знать названя инструментов которыми вы пользуетесь... зачем заставлять людей играть в угадалки.....

 

avr-gcc входящий в состав WinAVR компилирует неправильный код для AT90USB162 и AT90USB82 контролеров. Он использует инструкции умножения, хотя они не не работают в AT90USB162 и AT90USB82.

 

Или ждите новый WinAVR или попробуйте использовать сборку от klen-на:

http://electronix.ru/forum/index.php?showtopic=42167

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

.... ну нельзя же не знать названя инструментов которыми вы пользуетесь... зачем заставлять людей играть в угадалки.....

 

avr-gcc входящий в состав WinAVR компилирует неправильный код для AT90USB162 и AT90USB82 контролеров. Он использует инструкции умножения, хотя они не не работают в AT90USB162 и AT90USB82.

 

Или ждите новый WinAVR или попробуйте использовать сборку от klen-на:

http://electronix.ru/forum/index.php?showtopic=42167

 

Анатолий.

 

Подскажите пожалуйста, поэтому эта программа откомпиленная в WinAVR под at90usb162 работает но "не очень правильно":

 

 

/*at90usb162

я повесил внешний кварц = 8MHZ (т.к. мне показалось, что внутренний RC - генератор отключен по дефолту),

кнопка висит к земле на PD.3 (светодиоды на PB.0 и PB.1)

при нажатой кнопке красный светодиод мигает с периодом 10мс,

при отпущенной кнопке мигает зелёный с периодом 20мс

*/

 

#include <avr/io.h>

#include <util/delay.h>

 

#define F_CPU = 8000000;

 

 

char i;

 

void led (char a){

 

switch (a){

 

case 0: // кнопка не нажата

{

for (i=0; i<200; i++){

PORTB = 0b00000010; // green led

_delay_ms(10);

PORTB = 0x00;

_delay_ms(10);

}

return 0;

};

 

 

 

case 1: // кнопка нажата

{

for (i=0; i<200; i++){

PORTB = 0b00000001; // red led

_delay_ms(5);

PORTB = 0x00;

_delay_ms(5);

}

return 0;

};

 

 

}

 

}

 

 

void button (void){

 

 

if ((PIND & 0b00001000) == 0b00001000) led(0);

else led(1);

}

 

 

 

int main (void){

 

DDRB = 0xFF; // portb - output

PORTB = 0x00;

 

DDRD = 0x00; // all - inpupts

PORTD = 0xFF; // all pull up resistors ON

 

while(1) {

button();

}

 

}

не всё good с количеством циклов for i... (проверял на осциллографе)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых:

 

#include <avr/io.h>

#define F_CPU = 8000000UL;

#include <util/delay.h>

 

 

Во вторых:

 

char i;

 

void led (char a){

....

{

for (i=0; i<200; i++){...}

....

}

 

Какое максимальное число можно сохранить а веременой типа char?

 

Анатолий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во первых:

 

#include <avr/io.h>

#define F_CPU = 8000000UL;

#include <util/delay.h>

Во вторых:

 

char i;

 

void led (char a){

....

{

for (i=0; i<200; i++){...}

....

}

 

Какое максимальное число можно сохранить а веременой типа char?

 

Анатолий.

 

Спасибо.

что означает UL?

 

#include <avr/io.h>

#define F_CPU = 8000000UL;

#include <util/delay.h> - после правки, как Вы посоветовали, компилятор выдает ошибку:

 

Compiling: led_usb.c

...

c:/avr/winavr/bin/../avr/include/util/delay.h: In function '_delay_us':

c:/avr/winavr/bin/../avr/include/util/delay.h:106: error: expected expression before '=' token

c:/avr/winavr/bin/../avr/include/util/delay.h: In function '_delay_ms':

c:/avr/winavr/bin/../avr/include/util/delay.h:131: error: expected expression before '=' token

...

make.exe: *** [led_usb.o] Error 1

 

 

 

Насчет сhar: тип char от 0 до 255 (1байт)

Изменено пользователем sergeus

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что означает UL?
Керниган и Ритчи, "Язык программирования С". Книга не настолько большая, чтобы ее тут пересказывали в каждой теме, где упоминается <avr/delay.h>
Насколько я знаю, #define F_CPU может располагаться в любой части программы, а компилятор сам поймет, что описано, а что нет.
Сам не поймет. Символ должен быть определен до того места, где он будет использован.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Керниган и Ритчи, "Язык программирования С". Книга не настолько большая, чтобы ее тут пересказывали в каждой теме, где упоминается <avr/delay.h>Сам не поймет. Символ должен быть определен до того места, где он будет использован.

 

Спасибо за четкие ответы. Скажите пожалуйста тогда почему выдаёт ошибку:

 

Compiling: led_usb.c

 

c:/avr/winavr/bin/../avr/include/util/delay.h: In function '_delay_us':

c:/avr/winavr/bin/../avr/include/util/delay.h:106: error: expected expression before '=' token

c:/avr/winavr/bin/../avr/include/util/delay.h: In function '_delay_ms':

c:/avr/winavr/bin/../avr/include/util/delay.h:131: error: expected expression before '=' token

 

make.exe: *** [led_usb.o] Error 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет сhar: тип char от 0 до 255 (1байт)

 

Строго говоря в языке С три типа char.

1. unsigned char - может принимать значения от 0 до 255.

2. signed char - может принимать значения от -127 до 128.

3. char - в зависимость от реализации компилятора может быть как 'unsigned char' так и 'signed char'. В makefile из приведеного Вами примера код компилируеться с ключем компилятора '-fsigned-char' - тоесть тип 'char' эквивалентен типу 'signed char' и следовательно максимальное значение переменой i равно 128. Вот вы и видете меньше 200 миганий светодиода. 128?

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

char - (-128).. +127

точно, я ошибся это unsigned char от 0 до 255, а просто char от -128 до +127

Спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за четкие ответы. Скажите пожалуйста тогда почему выдаёт ошибку:

 

Compiling: led_usb.c

 

c:/avr/winavr/bin/../avr/include/util/delay.h: In function '_delay_us':

c:/avr/winavr/bin/../avr/include/util/delay.h:106: error: expected expression before '=' token

c:/avr/winavr/bin/../avr/include/util/delay.h: In function '_delay_ms':

c:/avr/winavr/bin/../avr/include/util/delay.h:131: error: expected expression before '=' token

 

make.exe: *** [led_usb.o] Error 1

#define F_CPU = 8000000UL;

 

удалите ; в конце строки

 

 

Анатолий.

Изменено пользователем aesok

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#include <avr/io.h>

#define F_CPU = 1000000UL; - когда комментирую эту строку - не выдает ошибку

#include <util/delay.h>

 

если не комментировать 2-ую строку, компилятор выдает сообщение об ошибке:

 

Compiling: led_usb.c

...

c:/avr/winavr/bin/../avr/include/util/delay.h: In function '_delay_us':

c:/avr/winavr/bin/../avr/include/util/delay.h:106: error: expected expression before '=' token

c:/avr/winavr/bin/../avr/include/util/delay.h: In function '_delay_ms':

c:/avr/winavr/bin/../avr/include/util/delay.h:131: error: expected expression before '=' token

led_usb.c: In function 'led':

 

из <util/delay.h>

 

 

void

_delay_us(double __us)

{

uint8_t __ticks;

double __tmp = ((F_CPU) / 3e6) * __us; !!!! эта свмая 106 строка

if (__tmp < 1.0)

__ticks = 1;

else if (__tmp > 255)

__ticks = 0; /* i.e. 256 */

else

__ticks = (uint8_t)__tmp;

_delay_loop_1(__ticks);

}

 

...

 

 

void

_delay_ms(double __ms)

{

uint16_t __ticks;

double __tmp = ((F_CPU) / 4e3) * __ms; !!! а это 131

if (__tmp < 1.0)

__ticks = 1;

else if (__tmp > 65535)

__ticks = 0; /* i.e. 65536 */

else

__ticks = (uint16_t)__tmp;

_delay_loop_2(__ticks);

}

 

Может кто сталкивался с подобной проблемой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#define F_CPU = 1000000UL; - когда комментирую эту строку - не выдает ошибку
Причитайте K&R, честное слово - очень полезная книжка. #define указывает компилятору сделать в исходном тексте текстовую постановку: заменить F_CPU на то, что написано в #define справа от F_CPU. Авторы библиотеки ожидали, что строка будет выглядеть примерно так:
#define F_CPU  1000000UL

Без ; и без =.

Теперь подумайте, как компилятор должен был отреагировать на получившуюся после вашего определения F_CPU строку:

double __tmp = ((= 1000000UL;) / 4e3) * __ms;

Вы сами, какое поведение ожидаете от компилятора на такой исходник?

 

А если символ F_CPU не определен в вашем исходном коде, он определяется в delay.h (что мне кажется неправильным) и это как раз и происходит, когда вы коментируете строку в своем файле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...