|
Вопрос по WinAVR |
|
|
|
May 15 2007, 05:08
|
Участник

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

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

Группа: Новичок
Сообщений: 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
То есть, что-то не то в подпрограмме прерываний. Ачто??? Не могу понять!
|
|
|
|
|
May 15 2007, 05:51
|

Познающий...
     
Группа: Свой
Сообщений: 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
--------------------
Выбор.
|
|
|
|
|
May 15 2007, 07:14
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
May 15 2007, 15:57
|

Местный
  
Группа: Участник
Сообщений: 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 Как это не смешно, но я тоже ловился на эту удочку  Ты просто забываешь поставить расширение файла (myfile. c.) или cpp.
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
May 16 2007, 03:38
|

Профессионал
    
Группа: Свой
Сообщений: 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. Куда не кинь всюду клин ...
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
May 16 2007, 05:51
|

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

|
Цитата(aesok @ May 16 2007, 10:46)  В С файле есть строка #include <avr/interrupt.h>?
Анатолий. Ха, прозевал .. Нема такой. Спасибо. Вставил, warning-и пропали, 2006 WinAVR откомпилил молча. А работает или нет, проверю позже и отпишу.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Sep 20 2010, 20:21
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|