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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Вопрос по WinAVR
Jagupop
сообщение May 15 2007, 05:08
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Сразу оговорюсь - я только учусь!!! Взял книгу Ю.Шпака Программирование на языке C для AVR и PIC микроконтроллеров. В придачу дан диск, на котором WINAVR версии 20040404 и примеры программ. Я некоторые пробовал и проверял на ATTINY2313. Но этот WINAVR не поддерживает такой процессор. Пришлось программы делать для AT90S2313 и прошивать ими тини. Но когда я поставил на комп. поддерживающий тини WINAVR 20060421, у меня перестали компилироваться программы, работавшие со старой версией WINAVR. Не знаю, что и делать. Уж не возвращаться же к старой версии! Подвкажите, спецы! Спасибо!
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 15 2007, 05:18
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(Jagupop @ May 15 2007, 14:08) *
Сразу оговорюсь - я только учусь!!! Взял книгу Ю.Шпака Программирование на языке C для AVR и PIC микроконтроллеров. В придачу дан диск, на котором WINAVR версии 20040404 и примеры программ. Я некоторые пробовал и проверял на ATTINY2313. Но этот WINAVR не поддерживает такой процессор. Пришлось программы делать для AT90S2313 и прошивать ими тини. Но когда я поставил на комп. поддерживающий тини WINAVR 20060421, у меня перестали компилироваться программы, работавшие со старой версией WINAVR. Не знаю, что и делать. Уж не возвращаться же к старой версии! Подвкажите, спецы! Спасибо!

А можно чуть подробнее? Что значит перестали компилироваться? Скорее всего используются специфичные для старой версии пакета макросы. Если это так, то просто замените их.
P.S. Сам сталкивался в свое время с этой проблемой. И моя проблема была из за макросов. К сожалению не помню их название...


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Jagupop
сообщение May 15 2007, 05:29
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Ну вот простая программка мигания светодиодом по прерыванию от переполнения T/C1:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define Freq 4000000

INTERRUPT(SIG_OVERFLOW1)
{
TCNT1 = 0x10000 - (Freq / 1024);
PORTB ^= 0x01;
}

int main (void)
{
DDRB = 0x01;
TCCR1A = 0;
TCCR1B = 5;
TCNT1 = 0x10000 - (Freq / 1024);
TIFR = 0;
TIMSK = 0x80;
GIMSK = 0;
sei();
while(1) ;
}

Сейчас ругается так:

Compiling: LEDBlink.c
avr-gcc -c -mmcu=at90s8515 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=LEDBlink.lst -std=gnu99 -Wp,-M,-MP,-MT,LEDBlink.o,-MF,.dep/LEDBlink.o.d LEDBlink.c -o LEDBlink.o
LEDBlink.c:8: warning: return type defaults to `int'
LEDBlink.c:8: warning: function declaration isn't a prototype
LEDBlink.c: In function `INTERRUPT':
LEDBlink.c:8: warning: type of "__vector_6" defaults to "int"
LEDBlink.c:11: warning: control reaches end of non-void function

То есть, что-то не то в подпрограмме прерываний. Ачто??? Не могу понять!
Go to the top of the page
 
+Quote Post
big256
сообщение May 15 2007, 05:42
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 15
Регистрация: 9-08-05
Из: Киев-Борисполь
Пользователь №: 7 472



В новом ВинАвре используется ISR вместо INTERRUPT и константа прерывания соотв получила другое имя
Go to the top of the page
 
+Quote Post
haker_fox
сообщение May 15 2007, 05:51
Сообщение #5


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Слегка изменил, компиляция проходит нормально. В Вашем случае тоже все ок, просто это не ошибки, а предупреждения. Но про работоспособность кода сказать ничего не могу.... Сейчас нет платы с AVR.
Код
#include <avr/io.h>
#include <avr/interrupt.h>

#define Freq 4000000

ISR(TIMER0_OVF_vect)
{
  TCNT1 = 0x10000 - (Freq / 1024);
  PORTB ^= 0x01;
}

int main (void)
{
  DDRB = 0x01;
  TCCR1A = 0;
  TCCR1B = 5;
  TCNT1 = 0x10000 - (Freq / 1024);
  TIFR = 0;
  TIMSK = 0x80;
  GIMSK = 0;
  sei();
  while(1);
}

Также прикладываю makefile (свой). На всякий случай.
И еще: не стоит писать макрос Freq в программе. Он выносится в makefile под именем F_CPU. Хотя это не так важно.
Лог сборки:
Код
-------- begin --------
Cleaning project:
rm -f main.hex
rm -f main.srec
rm -f main.eep
rm -f main.cof
rm -f main.elf
rm -f main.map
rm -f main.sym
rm -f main.lss
rm -rf obj
rm -f main.s
rm -f main.d
rm -rf .dep
-------- end --------
-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Compiling C: main.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.lst  -std=gnu99 -MD -MP -MF .dep/main.o.d main.c -o obj/main.o
Linking: main.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o  -std=gnu99 -MD -MP -MF .dep/main.elf.d obj/main.o --output main.elf -Wl,-Map=main.map,--cref --section-start=.text=0x0000,
Creating load file for Flash: main.hex
avr-objcopy -O ihex -R .eeprom main.elf main.hex
srec_cat main.hex -Intel -Output main.srec -Motorola
srec_cat: main.hex: 15: warning: no start address record
Creating load file for EEPROM: main.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex main.elf main.eep
Creating Extended Listing: main.lss
avr-objdump -h -S main.elf > main.lss
Creating Symbol Table: main.sym
avr-nm -n main.elf > main.sym
Size after:
main.elf  :
section           size      addr
.text              224         0
.data                0   8388704
.bss                 0   8388704
.noinit              0   8388704
.eeprom              0   8454144
.stab              876         0
.stabstr           132         0
.debug_aranges      20         0
.debug_pubnames     43         0
.debug_info        138         0
.debug_abbrev       86         0
.debug_line        198         0
.debug_str         128         0
Total             1845
-------- end --------
Process terminated with status 0 (2 minutes, 29 seconds)
0 errors, 1 warnings

Прикрепленные файлы
Прикрепленный файл  Makefile.rar ( 2.79 килобайт ) Кол-во скачиваний: 44
 


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Jagupop
сообщение May 15 2007, 07:14
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 28
Регистрация: 15-05-07
Пользователь №: 27 727



Спасибо. Сажусь "ковыряться" дальше.

Еще попутный вопрос по WINAVR. Почему иногда программа выдает в новом проекте при попытке компиляции следующее:

-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright © 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

make.exe: *** No rule to make target `obj/main.o', needed by `main.elf'. Stop.

> Process Exit Code: 2
> Time Taken: 00:00

Скажу откровенно, решаю это "танцами с бубном", а вот конкретно, что не так? В каталоге проекта изначально лежат два файла - файл.c и makefile
Go to the top of the page
 
+Quote Post
manul78
сообщение May 15 2007, 15:57
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719



Цитата(Jagupop @ May 15 2007, 15:14) *
Спасибо. Сажусь "ковыряться" дальше.

Еще попутный вопрос по WINAVR. Почему иногда программа выдает в новом проекте при попытке компиляции следующее:

-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright © 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

make.exe: *** No rule to make target `obj/main.o', needed by `main.elf'. Stop.

> Process Exit Code: 2
> Time Taken: 00:00

Скажу откровенно, решаю это "танцами с бубном", а вот конкретно, что не так? В каталоге проекта изначально лежат два файла - файл.c и makefile



Как это не смешно, но я тоже ловился на эту удочку lol.gif Ты просто забываешь поставить

расширение файла (myfile.c.) или cpp.


--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 16 2007, 03:35
Сообщение #8


Гуру
******

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



Цитата(Jagupop @ May 15 2007, 14:14) *
В каталоге проекта изначально лежат два файла - файл.c и makefile
где-то в makefile перечислены .c или .cpp файлы, входящие в этот пронкт. Судя по сообщению, один из них - main.c, которого в вашей папке нет. Так что надо просто подправить список компилируемых файлов в makefile


--------------------
На любой вопрос даю любой ответ
"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
hd44780
сообщение May 16 2007, 03:38
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Привет всем.

Использую WinAVR 20070122.
Проект использует все 3 таймера (с помощью avrLib) с прерываниями по переполнению, и USART с прерываниями (avrLib). работает великолепно, как часы. Еще там висит LCD 20x4, тоже управляемый avrlib.
Подключил внешние прерывания - INT0 от IR датчика, INT1 - просто кнопка в землю, так для отладки.
Обработчики:

// INT0 handler
// edge from IR receiver detected. This is assumed to be the middle of a bit.
//ISR ( INT0_vect )
SIGNAL ( SIG_INTERRUPT0 )
{
count0 ++;
.............

return 0;
} // int0

// INT1 handler by low
ISR ( INT1_vect )
{
count1 ++;

if ( ledFlag == 0 )
{
LED3_ON;
ledFlag = 1;
} // if
else
{
LED3_OFF;
ledFlag = 0;
} // else
return 0;
} // int1

Заголовки специально написал по-разному.
При компиляции этого богатства лезут предупреждения:

main.c:97: warning: return type defaults to `int'
main.c:97: warning: function declaration isn't a prototype
main.c: In function `SIGNAL':
main.c:97: warning: type of "__vector_1" defaults to "int"
main.c: At top level:
main.c:128: warning: return type defaults to `int'
main.c:128: warning: function declaration isn't a prototype
main.c: In function `ISR':
main.c:128: warning: type of "__vector_2" defaults to "int"

Т.е. ругаеся на оба вектора.

Игнорирую, прошиваю, запускаю.
При нажатии кнопки на ДУ - сброс проца, как по reset.
При нажатии кнопки на INT1 - такой же сброс.

Взял WinAVR 20060421 - точь-в-точь то же самое.

На CvAVR подобный вещи работают идеально на этой же самой микросхеме.
Вывод - или я чего-то не добираю в WinAVR, или он глючит.

Найти примеов под WinAVR с внешними прерываниями мне не удалось.

Кто-нибудь знает, как это побороть?
Перенести проект в CVAVR нереально - там не работают другие вещи, работающие в WinAVR.
Куда не кинь всюду клин ...


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
aesok
сообщение May 16 2007, 04:46
Сообщение #10


Знающий
****

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



В С файле есть строка #include <avr/interrupt.h>?

Анатолий.
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 16 2007, 05:51
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(aesok @ May 16 2007, 10:46) *
В С файле есть строка #include <avr/interrupt.h>?

Анатолий.


Ха, прозевал .. Нема такой.

Спасибо.

Вставил, warning-и пропали, 2006 WinAVR откомпилил молча. А работает или нет, проверю позже и отпишу.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 16 2007, 10:38
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Работает нормально.

Проблемы с раскодировкой сигналов датчика, но это уже другая тема ...


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 16 2007, 17:13
Сообщение #13


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



>Использую WinAVR 20070122.
>SIGNAL ( SIG_INTERRUPT0 )
В данной версии следует использовать ISR(vector_name).
Эта рекомендация описана в документации к библиотеке, старый тип описания может не поддерживаться в последующих версиях.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
the_last_dreamer
сообщение Sep 20 2010, 20:21
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 20-09-10
Из: Киев
Пользователь №: 59 612



Доброго времени суток!
Имеется такой простенький код:
CODE
#include <avr/io.h>
#include <math.h>

double b=15.485;
double tmpVar;

int main (void)
{
tmpVar = floor(b); //берем целую часть от 15.485, т.е. 15
while (1)
{
char i=1;
}
return (0);
}


Компилируется нормально. Олаживаю в avr studio. При выполнении команды tmpVar = floor(b) переменной tmpVar должно быть присвоено значение 15, но вместо этого выполнение передается в цикл, и в окне Watch в качестве значения переменной tmpVar появляется "Not in Scope", а на следующем шаге обратно из цикла и при этом в окне watch появляется значение переменной tmpVar равное 15. И далее выполнение программы продолжается правильно. Похожая программа написанная в codeVision AVR в avr studio работает корректно.

Такой код работает правильно:
CODE
#include <avr/io.h>
#include <math.h>

double tmpVar;

int main (void)
{
tmpVar = floor(15.485);
while (1)
{
char i=1;
}
return (0);
}


Подскажите, пожалуйста, в чем может быть ошибка.

Сообщение отредактировал the_last_dreamer - Sep 20 2010, 20:23
Go to the top of the page
 
+Quote Post
WHALE
сообщение Sep 21 2010, 07:26
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



ну дык посмотрите ассемблерные листинги.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 17:38
Рейтинг@Mail.ru


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