реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> at90usb162, наработки по at90USB (Mouse Demonstration)
sergeus
сообщение Feb 3 2008, 23:23
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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 не хотел прошивать.
С уважением, Сергей
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 4 2008, 08:15
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Чем компилируете?
Go to the top of the page
 
+Quote Post
sergeus
сообщение Feb 4 2008, 13:33
Сообщение #3


Частый гость
**

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



Цитата(aesok @ Feb 4 2008, 11:15) *
Чем компилируете?


AVRStudio
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 4 2008, 15:43
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
sergeus
сообщение Feb 4 2008, 16:23
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 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... (проверял на осциллографе)
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 4 2008, 16:53
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Во первых:

#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?

Анатолий.
Go to the top of the page
 
+Quote Post
sergeus
сообщение Feb 4 2008, 17:27
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 4 2008, 17:47
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 4 2008, 17:53
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(sergeus @ Feb 4 2008, 20:27) *
Насчет сhar: тип char от 0 до 255 (1байт)

char - (-128).. +127
Go to the top of the page
 
+Quote Post
sergeus
сообщение Feb 4 2008, 17:55
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 4 2008, 18:00
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
sergeus
сообщение Feb 4 2008, 18:01
Сообщение #12


Частый гость
**

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



Цитата(defunct @ Feb 4 2008, 20:53) *
char - (-128).. +127

точно, я ошибся это unsigned char от 0 до 255, а просто char от -128 до +127
Спасибо
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 4 2008, 18:06
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
sergeus
сообщение Feb 4 2008, 18:21
Сообщение #14


Частый гость
**

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



#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);
}

Может кто сталкивался с подобной проблемой?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 4 2008, 21:19
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016