Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: at90usb162
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
sergeus
Здравствуйте! Помогите пожалуйста, не могу разобраться с example (hid usb mouse):
http://atmel.com/dyn/resources/prod_docume...mouse-1_0_3.zip
может кто разобрался, или есть какие-нибудь материалы? И как мне показалось, по дефолту внутренний RC-генератор на 8MHZ отключен(в даташите написано, что подключен), т.к. без внешнего кварца at90usb162 не определялся, а Flip не хотел прошивать.
С уважением, Сергей
aesok
Чем компилируете?
sergeus
Цитата(aesok @ Feb 4 2008, 11:15) *
Чем компилируете?


AVRStudio
aesok
Цитата(sergeus @ Feb 4 2008, 16:33) *
AVRStudio


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

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

Или ждите новый WinAVR или попробуйте использовать сборку от klen-на:
http://electronix.ru/forum/index.php?showtopic=42167

Анатолий.
sergeus
Цитата(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... (проверял на осциллографе)
aesok
Во первых:

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

Анатолий.
sergeus
Цитата(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, 19:27) *
что означает UL?
Керниган и Ритчи, "Язык программирования С". Книга не настолько большая, чтобы ее тут пересказывали в каждой теме, где упоминается <avr/delay.h>
Цитата(sergeus @ Feb 4 2008, 19:27) *
Насколько я знаю, #define F_CPU может располагаться в любой части программы, а компилятор сам поймет, что описано, а что нет.
Сам не поймет. Символ должен быть определен до того места, где он будет использован.
defunct
Цитата(sergeus @ Feb 4 2008, 20:27) *
Насчет сhar: тип char от 0 до 255 (1байт)

char - (-128).. +127
sergeus
Цитата(Сергей Борщ @ 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
aesok
Цитата(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?

Анатолий.
sergeus
Цитата(defunct @ Feb 4 2008, 20:53) *
char - (-128).. +127

точно, я ошибся это unsigned char от 0 до 255, а просто char от -128 до +127
Спасибо
aesok
Цитата(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;

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


Анатолий.
sergeus
#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);
}

Может кто сталкивался с подобной проблемой?
Сергей Борщ
Цитата(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 (что мне кажется неправильным) и это как раз и происходит, когда вы коментируете строку в своем файле.
sergeus
Большое спасибо.
VladimirYU
[2.3 Константы
Целая константа, например 1234, имеет тип int. Константа типа long завершается буквой l или L, например 123456789L: слишком большое целое, которое невозможно представить как int, будет представлено как long. Беззнаковые константы заканчиваются буквой u или U, а окончание ul или UL говорит о том, что тип константы - unsigned long.

Константы с плавающей точкой имеют десятичную точку (123.4), или экспоненциальную часть (1е-2), или же и то и другое. Если у них нет окончания, считается, что они принадлежат к типу double. Окончание f или F указывает на тип float, а l или L - на тип long double.

Целое значение помимо десятичного может иметь восьмеричное или шестнадцатеричное представление. Если константа начинается с нуля, то она представлена в восьмеричном виде, если с 0x или с 0X, то - в шестнадцатеричном. Например, десятичное целое 31 можно записать как 037 или как 0X1F. Записи восьмеричной и шестнадцатеричной констант могут завершаться буквой L (для указания на тип long) и U (если нужно показать, что константа беззнаковая). Например, константа 0XFUL имеет значение 15 и тип unsigned long.

K&R.

Может проще так.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.