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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Какой бесплатный компилятор Си для AVR лучше? Поделитесь!, Поделитесь опытом с новичком.
Punk
сообщение Jan 4 2007, 17:07
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 19-06-06
Из: Новосибирск
Пользователь №: 18 167



Цитата(kamedi_clab @ Jan 4 2007, 00:21) *
советую http://www.codevision.be/ (он бесплатный как IAR)


CodeVisionAVR это конечно просто и замечательно, но вот с огромной кучей библиотек ему не тягаться с WinAVR ну с IAR если его сравнивать то ИМХО:вижн просто учебник для студентов,......очень кайфовый учебник
Go to the top of the page
 
+Quote Post
kamedi_clab
сообщение Jan 4 2007, 18:23
Сообщение #17


Местный
***

Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004



и для радиолюбителей. а по списку компаний его использующих и по голосованию на этом сайте и для проффи тоже.

Цитата(aesok @ Jan 4 2007, 15:36) *
INTERRUPT(SIG_OVERFLOW1) Интерпретируеться компилятором ни как описание функции обработчика прерывания, а как описание обычной функции с именем INTERRUPT.

Анатолий.


Анатолий, напишите пожалуйста окончательно пример - как в последнем WinAVR объявлять прерывание. например по переполнению Timer0.

Спасибо !
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 4 2007, 22:12
Сообщение #18


Знающий
****

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



Цитата(kamedi_clab @ Jan 4 2007, 18:23) *
и для радиолюбителей. а по списку компаний его использующих и по голосованию на этом сайте и для проффи тоже.

Цитата(aesok @ Jan 4 2007, 15:36) *

INTERRUPT(SIG_OVERFLOW1) Интерпретируеться компилятором ни как описание функции обработчика прерывания, а как описание обычной функции с именем INTERRUPT.

Анатолий.


Анатолий, напишите пожалуйста окончательно пример - как в последнем WinAVR объявлять прерывание. например по переполнению Timer0.

Спасибо !


Короткий ответ:
ISR(TIMER0_OVF_vect)
{
код
}

Длинный ответ:
1. В '.с' файл где пишете обработчик прерывания должен быть включен заголовочный файл <avr/interrupt.h>:
#include <avr/interrupt.h>

2. Описываете обработчик прерывания:
ISR(*_vect)
{
код
}

3. Для того чтобы правильно написать имя вектора прерывания '*_vect', открываете в даташите таблицу с описанием векторов прерывания (Table XX. Reset and Interrupt Vectors), находите нужное вам прерывание. Слова в имени прерывания должны быть разделены одним знаком подчеркивания и в конец добавлено _vect. Примеры:
TIMER1 OVF -> TIMER1_OVF_vect;
USART, RXC -> USART_RXC_vect.

Но проще открыть заголовочный файл на ваш контроллер и скопировать оттуда (например 'include/avr/iom8.h'), для некоторых контроллеров заголовочные файлы идут на семейство, например для AT90USB1286 ищете не в 'iousb1286.h' а в 'iousbxx6_7.h'.

4. Компилируете проект и внимательно смотрите на варинги компилятора, если выскочило что-то типа:
"XXXX appears to be a misspelled signal handler" - значит вы ошиблись с именем прерывания повторить пункт 3.

5. Если вы хотите быть уверенным на 100%, открываете файл листинга, находите 0-вой адрес:

Код
00000000 <__vectors>:
   0:    12 c0           rjmp    .+36    ; 0x26 <__ctors_end>
   2:    2a c0           rjmp    .+84    ; 0x58 <__vector_1>
   4:    29 c0           rjmp    .+82    ; 0x98 <__vector_2>
   6:    27 c0           rjmp    .+78    ; 0x56 <__bad_interrupt>
   8:    26 c0           rjmp    .+76    ; 0x56 <__bad_interrupt>
   a:    25 c0           rjmp    .+74    ; 0x56 <__bad_interrupt>
   c:    24 c0           rjmp    .+72    ; 0x56 <__bad_interrupt>
   e:    23 c0           rjmp    .+70    ; 0x56 <__bad_interrupt>
  10:    22 c0           rjmp    .+68    ; 0x56 <__bad_interrupt>
  12:    21 c0           rjmp    .+66    ; 0x56 <__bad_interrupt>
  14:    20 c0           rjmp    .+64    ; 0x56 <__bad_interrupt>
.....


Для тех векторов для которые есть обработчики осуществляется переход на метки __vector_XX, для которых нет на __bad_interrupt.


Анатолий.

Сообщение отредактировал aesok - Jan 4 2007, 22:15
Go to the top of the page
 
+Quote Post
Samodelkin
сообщение Jan 4 2007, 22:56
Сообщение #19


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

Группа: Участник
Сообщений: 102
Регистрация: 29-05-05
Из: Днепропетровск
Пользователь №: 5 520



Цитата(aesok @ Jan 4 2007, 01:37) *
Для какого контроллера компилируете? Для некоторых новых контролеров не определены имена прерываний начинающейся с 'SIG_*'. В новых проектах не используйте SIGNAL(), INTERRUPT() и SIG_*, этот интерфейс устарел.

Используйте новые макросы ISR() и имена прерываний заканчивающийся на _vect,
ISR(*_vect)
{
}

INTERRUPT() решили удалить как раз из-за того что некоторые не читают документацию.....

И еще, вместо:
#define Freq 11059200
напишите:
#define Freq 11059200UL
и тогда формула в:
TCNT1 = 0xFFF0;//10000 - (Freq / 1024);
заработает.


Анатолий.



А какя в WinAVR-20060421 версия avr-libc? Написана в avr-libc-user_manual.

Анатолий.



Спасибо за "ISR()"
После исправления этого, ассемблерный код стал нормальным, но поведение симулятора не изменилось. Как оказалось сам был виноват, в проекте и в опциях симулятора стояли разные типы контроллеров.
А зачем в строке "#define Freq 11059200UL" вконце добавлять UL???
Заранее спасибо, С уважением Samodelkin!
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 4 2007, 23:17
Сообщение #20


Знающий
****

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



Цитата(Samodelkin @ Jan 4 2007, 22:56) *
А зачем в строке "#define Freq 11059200UL" вконце добавлять UL???
Заранее спасибо, С уважением Samodelkin!



В языке С константы по умолчанию имеют тип int, так как int в avr-gcc 16-битный то они могут принимать значение от -32 768 до 32 767. Ели вам нужно значение константы больше используйте суфиксы UL - для токо чтобы сообщит коппилятору что константа имеет тип unsigned long (32-бита в avr-gcc 0 до 4 294 967 295), L - long (-2 147 483 648 до 2 147 483 647), ULL - unsidned long long (64 бита) , ... итд.
Для более полной информации прочтите в вашей книге по 'C' раздел про константы.

Анатолий.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 4 2007, 23:28
Сообщение #21


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(prottoss @ Jan 4 2007, 05:50) *
Цитата(defunct @ Jan 4 2007, 09:24) *
Цитата(Samodelkin @ Jan 4 2007, 01:06) *

Я Вас понял, но дело в том что INTERRUPT ведет себя точно так-же!!!!!!!

Значит проблема не в прерываниях.
Возможны три причины по которым МК у Вас сбрасывается:
1. запрограммирован сооветствующим Fuse-битом WDT, решение проблемы - оключить WDT или добавить в основной цикл программы asm("WDR").
2. глючит BOD, решение проблемы - отключить BOD при знакомстве с МК.
3. помеха на Reset'е, решение - добавить конденсатор между землей и Reset'ом 0.1..1uF.


Хм...Вроде бы автор топика глаголил, что "...Только вот столкнулся с проблемой, при отработке прерывания компилятор при выходе из него ставит RET вместо RETI..." ???

2 Samodelkin - это на самом деле имеет место быть? Вы смотрели ассемблерный листинг Вашего творения?

Насколько мне известно, в WinAVR функции обработки прерываний описываются при помощи квалификатора SIGNAL. Или нет?
Go to the top of the page
 
+Quote Post
aesok
сообщение Jan 4 2007, 23:49
Сообщение #22


Знающий
****

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



Цитата(_Bill @ Jan 4 2007, 23:28) *
Насколько мне известно, в WinAVR функции обработки прерываний описываются при помощи квалификатора SIGNAL. Или нет?


До avr-libc весии 1.4.4 обработчики прерываний в которых были запрещены прерывания описывались с помощью SIGNAL, а в которых были разрешены прерывания описывались с помощью INTERRUPT.
К сожалению новички очень часто не прочитав документацию и/или не поняв в чем разница использовали INTERRUPT ..... и получали граблями по лбу. Поэтому в avr-libc 1.4.4 SIGNAL был заменен на ISR (SIGNAL конечно же остался для совместимости, только не рекомендован для использования), а INTERRUPT удален, точнее перемещен в <compat/deprecated.h>.

Если вам нужна функциональность INTERRUPT, значит .... вы уже профессиональный разработчик и знаете как описать такой обработчик прерываний.

Анатолий.

Сообщение отредактировал aesok - Jan 4 2007, 23:51
Go to the top of the page
 
+Quote Post
kamedi_clab
сообщение Jan 4 2007, 23:57
Сообщение #23


Местный
***

Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004



Анатолий, огромное спасибо за толерантность !
Go to the top of the page
 
+Quote Post
_Bill
сообщение Jan 5 2007, 11:09
Сообщение #24


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(aesok @ Jan 4 2007, 23:49) *
Цитата(_Bill @ Jan 4 2007, 23:28) *


Насколько мне известно, в WinAVR функции обработки прерываний описываются при помощи квалификатора SIGNAL. Или нет?


До avr-libc весии 1.4.4 обработчики прерываний в которых были запрещены прерывания описывались с помощью SIGNAL, а в которых были разрешены прерывания описывались с помощью INTERRUPT.
К сожалению новички очень часто не прочитав документацию и/или не поняв в чем разница использовали INTERRUPT ..... и получали граблями по лбу. Поэтому в avr-libc 1.4.4 SIGNAL был заменен на ISR (SIGNAL конечно же остался для совместимости, только не рекомендован для использования), а INTERRUPT удален, точнее перемещен в <compat/deprecated.h>.

Если вам нужна функциональность INTERRUPT, значит .... вы уже профессиональный разработчик и знаете как описать такой обработчик прерываний.

Анатолий.

Спасибо за разъяснение. Сам я этим компилятором не пользовался, поэтому этих тонкостей не знал. Теперь буду знать. Или нет?
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 - 10:54
Рейтинг@Mail.ru


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