|
Какой бесплатный компилятор Си для AVR лучше? Поделитесь!, Поделитесь опытом с новичком. |
|
|
|
Jan 2 2007, 22:41
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(Samodelkin @ Jan 2 2007, 13:37)  Начинаю писать на Си для АВР. Посоветуйте компилятор Си для написания и отладки проектов. Попробовал WinAVR. Вроде удобная штука. Интегрируется в AVR Studio, там очень удобно отлаживать. В одной проге и пишишь, и отлаживаешь. Только вот столкнулся с проблемой, при отработке прерывания компилятор при выходе из него ставит RET вместо RETI. В результате ничего не работает, после выхода из прерывания программа начинает работу с 0-го адреса!!!??? Может быть есть что-то более удобное, бесплатное или взломанное???!!!! Заранее благодарен! А как Вы процедуру прерывания описываете?
Сообщение отредактировал _Bill - Jan 2 2007, 22:41
|
|
|
|
|
Jan 3 2007, 01:16
|

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

|
Цитата(Samodelkin @ Jan 2 2007, 13:37)  Только вот столкнулся с проблемой, при отработке прерывания компилятор при выходе из него ставит RET вместо RETI. В результате ничего не работает, после выхода из прерывания программа начинает работу с 0-го адреса!!!??? #include <avr/interrupt.h> .. функцию обработчик прерывания описать как: SIGNAL (Вектор_прерывания) Если будет продолжать сбоить - код в студию. Цитата Может быть есть что-то более удобное, бесплатное или взломанное???!!!! Более бесплатного точно нет. Более удобное (в плане работы с flash/eeprom) - IAR.
|
|
|
|
|
Jan 4 2007, 00:21
|
Местный
  
Группа: Новичок
Сообщений: 239
Регистрация: 5-10-06
Пользователь №: 21 004

|
советую http://www.codevision.be/ (он бесплатный как IAR) Цитата(defunct @ Jan 3 2007, 01:16)  Цитата(Samodelkin @ Jan 2 2007, 13:37)  Только вот столкнулся с проблемой, при отработке прерывания компилятор при выходе из него ставит RET вместо RETI. В результате ничего не работает, после выхода из прерывания программа начинает работу с 0-го адреса!!!???
#include <avr/interrupt.h> .. функцию обработчик прерывания описать как: SIGNAL (Вектор_прерывания) а в новом WinAVR разве не иначе объявление ?
|
|
|
|
|
Jan 4 2007, 01:02
|

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

|
Цитата(_Bill @ Jan 2 2007, 22:41)  Цитата(Samodelkin @ Jan 2 2007, 13:37)  Начинаю писать на Си для АВР. Посоветуйте компилятор Си для написания и отладки проектов. Попробовал WinAVR. Вроде удобная штука. Интегрируется в AVR Studio, там очень удобно отлаживать. В одной проге и пишишь, и отлаживаешь. Только вот столкнулся с проблемой, при отработке прерывания компилятор при выходе из него ставит RET вместо RETI. В результате ничего не работает, после выхода из прерывания программа начинает работу с 0-го адреса!!!??? Может быть есть что-то более удобное, бесплатное или взломанное???!!!! Заранее благодарен!
А как Вы процедуру прерывания описываете? Вот код: если что-то наплужил, сильно не ругайте, я еще только учусь. Компилятор WinAVR-20060421-install. По идее после переполнения ТС1 должно отработать прерывание, но вместо этого прога начинает работу с самого начала!!!??? В коде при выходе их прерывания вместо RETI стоит RET!!!??? Что делать? #include <avr/io.h> #include <avr/interrupt.h> //#include <avr/signal.h> #define Freq 11059200 INTERRUPT(SIG_OVERFLOW1) { TCNT1 = 0x22; PORTB ^= 0x01; } int main (void) { DDRB = 0x01; TCCR1A = 0; TCCR1B = 1;//5; TCNT1 = 0xFFF0;//10000 - (Freq / 1024); TIFR = 0; TIMSK = 0x80; GIMSK = 0; sei(); while(1) ; } Цитата(defunct @ Jan 3 2007, 01:16)  Цитата(Samodelkin @ Jan 2 2007, 13:37)  Только вот столкнулся с проблемой, при отработке прерывания компилятор при выходе из него ставит RET вместо RETI. В результате ничего не работает, после выхода из прерывания программа начинает работу с 0-го адреса!!!???
#include <avr/interrupt.h> .. функцию обработчик прерывания описать как: SIGNAL (Вектор_прерывания) Если будет продолжать сбоить - код в студию. Цитата Может быть есть что-то более удобное, бесплатное или взломанное???!!!! Более бесплатного точно нет. Более удобное (в плане работы с flash/eeprom) - IAR. Вот код: если что-то наплужил, сильно не ругайте, я еще только учусь. Компилятор WinAVR-20060421-install. По идее после переполнения ТС1 должно отработать прерывание, но вместо этого прога начинает работу с самого начала!!!??? В коде при выходе их прерывания вместо RETI стоит RET!!!??? Что делать? #include <avr/io.h> #include <avr/interrupt.h> //#include <avr/signal.h> #define Freq 11059200 INTERRUPT(SIG_OVERFLOW1) { TCNT1 = 0x22; PORTB ^= 0x01; } int main (void) { DDRB = 0x01; TCCR1A = 0; TCCR1B = 1;//5; TCNT1 = 0xFFF0;//10000 - (Freq / 1024); TIFR = 0; TIMSK = 0x80; GIMSK = 0; sei(); while(1) ; }
Сообщение отредактировал Samodelkin - Jan 4 2007, 00:59
|
|
|
|
|
Jan 4 2007, 01:06
|

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

|
Цитата(beer_warrior @ Jan 4 2007, 01:02)  !!!!SIGNAL(SIG_OVERFLOW1)!!!! Найдите в доке разницу между SIGNAL и INTERRUPT и почитайте. Я Вас понял, но дело в том что INTERRUPT ведет себя точно так-же!!!!!!!
|
|
|
|
|
Jan 4 2007, 05:24
|

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

|
Цитата(Samodelkin @ Jan 4 2007, 01:06)  Я Вас понял, но дело в том что INTERRUPT ведет себя точно так-же!!!!!!! Значит проблема может быть и не в прерываниях. Возможны три причины по которым МК у Вас сбрасывается: 1. запрограммирован сооветствующим Fuse-битом WDT, решение проблемы - оключить WDT или добавить в основной цикл программы asm("WDR"). 2. глючит BOD, решение проблемы - отключить BOD при знакомстве с МК. 3. помеха на Reset'е, решение - добавить конденсатор между землей и Reset'ом 0.1..1uF.
|
|
|
|
|
Jan 4 2007, 05:50
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(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 - это на самом деле имеет место быть? Вы смотрели ассемблерный листинг Вашего творения?
--------------------
|
|
|
|
|
Jan 4 2007, 06:10
|

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

|
Цитата(prottoss @ Jan 4 2007, 05:50)  Хм...Вроде бы автор топика глаголил, что "...Только вот столкнулся с проблемой, при отработке прерывания компилятор при выходе из него ставит RET вместо RETI..." ??? Но мы же с Вами знаем, что по поведению RET и RETI отличаются только влиянием на флаг I. Это отличие никак не могло привести к перезапуску девайса. Тут либо вектором ошиблись, либо непредсказуемый сброс МК (по причинам, описанным в предыдущем моем посте). Сомневаюсь я, что тут что-то не так генерится. Цитата(Samodelkin @ Jan 4 2007, 01:02)  ... TIMSK = 0x80; <--- вот здесь что разрешается-то? соответвует ли это SIG_OVERFLOW1?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|