|
at90usb162, наработки по at90USB (Mouse Demonstration) |
|
|
|
Feb 3 2008, 23:23
|

Частый гость
 
Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174

|
Здравствуйте! Помогите пожалуйста, не могу разобраться с example (hid usb mouse): http://atmel.com/dyn/resources/prod_docume...mouse-1_0_3.zipможет кто разобрался, или есть какие-нибудь материалы? И как мне показалось, по дефолту внутренний RC-генератор на 8MHZ отключен(в даташите написано, что подключен), т.к. без внешнего кварца at90usb162 не определялся, а Flip не хотел прошивать. С уважением, Сергей
|
|
|
|
|
Feb 4 2008, 13:33
|

Частый гость
 
Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174

|
Цитата(aesok @ Feb 4 2008, 11:15)  Чем компилируете? AVRStudio
|
|
|
|
|
Feb 4 2008, 15:43
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(sergeus @ Feb 4 2008, 16:33)  AVRStudio .... ну нельзя же не знать названя инструментов которыми вы пользуетесь... зачем заставлять людей играть в угадалки..... avr-gcc входящий в состав WinAVR компилирует неправильный код для AT90USB162 и AT90USB82 контролеров. Он использует инструкции умножения, хотя они не не работают в AT90USB162 и AT90USB82. Или ждите новый WinAVR или попробуйте использовать сборку от klen-на: http://electronix.ru/forum/index.php?showtopic=42167Анатолий.
Сообщение отредактировал aesok - Feb 4 2008, 15:51
|
|
|
|
|
Feb 4 2008, 16:23
|

Частый гость
 
Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174

|
Цитата(aesok @ Feb 4 2008, 18:43)  .... ну нельзя же не знать названя инструментов которыми вы пользуетесь... зачем заставлять людей играть в угадалки..... 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... (проверял на осциллографе)
|
|
|
|
|
Feb 4 2008, 17:27
|

Частый гость
 
Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174

|
Цитата(aesok @ Feb 4 2008, 19:53)  Во первых:
#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 - Feb 4 2008, 17:48
|
|
|
|
|
Feb 4 2008, 17:47
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sergeus @ Feb 4 2008, 19:27)  что означает UL? Керниган и Ритчи, "Язык программирования С". Книга не настолько большая, чтобы ее тут пересказывали в каждой теме, где упоминается <avr/delay.h> Цитата(sergeus @ Feb 4 2008, 19:27)  Насколько я знаю, #define F_CPU может располагаться в любой части программы, а компилятор сам поймет, что описано, а что нет. Сам не поймет. Символ должен быть определен до того места, где он будет использован.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Feb 4 2008, 17:55
|

Частый гость
 
Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174

|
Цитата(Сергей Борщ @ Feb 4 2008, 20:47)  Керниган и Ритчи, "Язык программирования С". Книга не настолько большая, чтобы ее тут пересказывали в каждой теме, где упоминается <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
|
|
|
|
|
Feb 4 2008, 18:00
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(sergeus @ Feb 4 2008, 20:27)  Насчет с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 - Feb 4 2008, 18:01
|
|
|
|
|
Feb 4 2008, 18:01
|

Частый гость
 
Группа: Участник
Сообщений: 157
Регистрация: 11-12-07
Из: Москва
Пользователь №: 33 174

|
Цитата(defunct @ Feb 4 2008, 20:53)  char - (-128).. +127 точно, я ошибся это unsigned char от 0 до 255, а просто char от -128 до +127 Спасибо
|
|
|
|
|
Feb 4 2008, 18:06
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(sergeus @ Feb 4 2008, 20:55)  Спасибо за четкие ответы. Скажите пожалуйста тогда почему выдаёт ошибку:
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 - Feb 4 2008, 18:07
|
|
|
|
|
Feb 4 2008, 21:19
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sergeus @ Feb 4 2008, 20:21)  #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 (что мне кажется неправильным) и это как раз и происходит, когда вы коментируете строку в своем файле.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|