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

 
 
> перенос программы с IAR на AVR-GCC, нужна помощь..., вопросик для опытных в linux avr-gcc, нужна Ваша помошь...
PrSt
сообщение May 3 2007, 16:25
Сообщение #1


http://uschema.com
****

Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394



Нужно произвести операцию: (именно под linux-AVR-GCC)
перенос программы с IAR на GCC, помогите пожалуйста решить возникшую проблемку...
вероятно все проблеммы по не знанию тонкостей или ньюансов...
сам с AVR не работал до этого толком....
возникли проблеммы в частности с с прерыванием...

программа была написанная на IAR, какойто там версии под контроллер ATMEGA161 (хотя камень впаян 162)...
Но все это работает с HEX от IAR

а нужно перенести под GCC и довольствоваться результатом...

я программу эту портировал под GCC...
Местати что надо подправил под специфику компилятора, полазив по инету и подсмотрев как...
например кое что тут - http://www.avrfreaks.net/wiki/index.php/Do...GCC/IarToAvrgcc

Получил HEX
патаюсь его прошить - прошиваю, даже загорается на платке светодиод...
...но светодиод должен сменить свой цвет при возникновении прерывания и остаться с этим значением...
Однако этого не происходит...

вот как было под IAR
#pragma vector=INT1_vect
__interrupt void INT1_(void) // INT1 interrupt service routine
{
.....
while(1){LED_RED;}
}

вот как теперь стало под GCC
#pragma vector=INT1_vect
//__interrupt void INT1_(void) // INT1 interrupt service routine
ISR (INT1_vect) // INT1 interrupt service routine // veter
{
....
while(1){LED_RED;}
}

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


заранее Большое-Человеческое спасибо ответевшим!


--------------------
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 16)
defunct
сообщение May 4 2007, 02:50
Сообщение #2


кекс
******

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



Вроде все ок, #pragma - лишняя, но поидее GCC ее просто проигнорирует.

Может вы пропустили:
__enable_interrupt() --> sei()

?
Go to the top of the page
 
+Quote Post
PrSt
сообщение May 4 2007, 10:31
Сообщение #3


http://uschema.com
****

Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394



Цитата(defunct @ May 4 2007, 02:50) *
Вроде все ок, #pragma - лишняя, но поидее GCC ее просто проигнорирует.
Может вы пропустили:
__enable_interrupt() --> sei()
?

Да, Вы правы игнорирует, причем тихонько, без варнингов...
#pragma не привела ни к каким результатам - по этому я ее просто оставил...

на счет sei и cli - Использовались _SEI и _CLI я на всякий случай и в нижний регист переводил...
но позже нашел в хиделе что _CLI и _SEI задефайнены на sei и cli соответственно...

.


--------------------
Go to the top of the page
 
+Quote Post
PrSt
сообщение May 4 2007, 12:08
Сообщение #4


http://uschema.com
****

Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394



Цитата(defunct @ May 4 2007, 02:50) *
Вроде все ок, #pragma - лишняя, но поидее GCC ее просто проигнорирует.
Может вы пропустили:
__enable_interrupt() --> sei()
?

о! наткнулся на подобное чтото
именно после вызова sei() программа не выходит из процедуры sei
// _SEI();
sei(); // veter
LED_RED;
так вот светодиод LED_RED - не загорается....

.


--------------------
Go to the top of the page
 
+Quote Post
aesok
сообщение May 4 2007, 12:17
Сообщение #5


Знающий
****

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



Версия avr-libc, все сообщения компилятора, больше кода....
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение May 4 2007, 12:34
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Вообще то советовал бы поменять ISR на
SIGNAL (INT1_vect)
{
....
}
Далее посмотерть есть ли аддр этого кода с векторном пространстве.И если всё сошлось тогда просто посмотреть осцилографом - есть ли сигналы на входной лапке..
Да.. ещё, мож вы где просто отключаете прерывания - если программа у вас большая, потому если не сработает всё выше приведённое - попробуйте просто с голым мэйном и интеруптом.
Go to the top of the page
 
+Quote Post
PrSt
сообщение May 4 2007, 12:36
Сообщение #7


http://uschema.com
****

Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394



Цитата(aesok @ May 4 2007, 12:17) *
Версия avr-libc, все сообщения компилятора, больше кода....

а что именно из куда нужно?
...
status = 0x00;
status_minute = 0x00;
status_hour = 0x00;
status_month = rd_char(STATUS); //status_month = eeprom_status;
LED_RED; - вот здесь загорается светодиод... как и положено

// _SEI();
sei(); // veter
LED_RED; - вот здесь не загорается, такое впечятление что не выходит из прерывания...

delay_ms(1000);
....

avr-libc - тот что идет стандартный с debian etch
veter@server:~/for_gcc$ apt-cache showpkg avr-libc
Package: avr-libc
Versions:
1:1.4.5-2(/var/lib/apt/lists/_mnt_cd2_dists_stable_main_binary-i386_Packages)(/var/lib/apt/lists/Debian%20GNU_Linux%204.0%20r0%20%5fEtch%5f%20-%20Official%20i386%20DVD%20Binary-2%2020070407-11:40_dists_etch_main_binary-i386_Packages)(/var/lib/dpkg/status)

Reverse Depends:
avr-libc,avr-libc
gcc-avr,avr-libc 1:1.2.3-3
Dependencies:
1:1.4.5-2 - avr-libc (0 (null)) avr-gcc (1 1:3.4.3-2)
Provides:
1:1.4.5-2 -
Reverse Provides:


--------------------
Go to the top of the page
 
+Quote Post
Igor26
сообщение May 4 2007, 12:46
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 521
Регистрация: 10-02-05
Пользователь №: 2 544



Может попробовать заменить sei(); на ASM-вставку типа
asm("sei");?
Go to the top of the page
 
+Quote Post
Hz!
сообщение May 4 2007, 09:53
Сообщение #9


Участник
*

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



А вы разрешаете калие-либо другие прерывания?
Не может получиться так, что у вас постоянно вызывается прерывание от какой-ть другой переферии?
Или WDT?
Go to the top of the page
 
+Quote Post
aesok
сообщение May 4 2007, 10:54
Сообщение #10


Знающий
****

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



Цитата(PrSt @ May 4 2007, 16:36) *
а что именно из куда нужно?


Какие заголочные файлы включены?

Цитата
// _SEI();
sei(); // veter
LED_RED; - вот здесь не загорается, такое впечятление что не выходит из прерывания...


Очень похоже что не правильно описаны обработчики прерываний, или не все.

Цитата
delay_ms(1000);


покажите код 'delay_ms' - тоже возможны ошибки.

При компиляции точно нет ни одного предупреждения?

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


http://uschema.com
****

Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394



Цитата(Hz! @ May 4 2007, 12:53) *
А вы разрешаете калие-либо другие прерывания?
Не может получиться так, что у вас постоянно вызывается прерывание от какой-ть другой переферии?
Или WDT?

WDT - отключен в конфиге...
по программе используется для профилактики сброс вачдога...

>Какие заголочные файлы включены?
//#include "iom161.h"
#include <avr/io.h>
#include <compat/ina90.h>

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

>Очень похоже что не правильно описаны обработчики прерываний, или не все.
я нашел по ходу ошибку в ASM файле
было
;PORTA var 0x1b
;PINA var 0x19
;DDRA var 0x1a
;PORTC var 0x15
;PINC var 0x13

стало
#define PORTA 0x1B
#define PINA 0x19
#define DDRA 0x1A
#define PORTC 0x15
#define PINC 0x13

но ведь это не правильно...
;PORTA var 0x1b - это же заявляется адресс для PORTA
а #define PORTA 0x1B это было сделано временно...
так вот - еще вопросик...
как правильно в GCC в ASM файле корректно написать это?
(имеюю ввиду - аналог написанному в IAR - PORTA var 0x1b )

я подозреваю что проблемма именно тут а не в прерыванеии...
хотя и там может тоже...

>покажите код 'delay_ms' - тоже возможны ошибки.
void delay_ms(unsigned int t)
{ __watchdog_reset();
while(t--){
DelayUS(250);
DelayUS(250);
DelayUS(250);
// CLRWDT();
DelayUS(250);
}
__watchdog_reset();
}

>При компиляции точно нет ни одного предупреждения?
точно - При компиляции нет ни одного предупреждения...


--------------------
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение May 4 2007, 13:40
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(PrSt @ May 4 2007, 15:36) *
// _SEI();
sei(); // veter
LED_RED; - вот здесь не загорается, такое впечятление что не выходит из прерывания...

Вы строку из исходника вставили?
Может, правильнее записать LED_GREEN; wink.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
defunct
сообщение May 4 2007, 18:50
Сообщение #13


кекс
******

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



Цитата(PrSt @ May 4 2007, 14:36) *
sei(); // veter
LED_RED; - вот здесь не загорается, такое впечятление что не выходит из прерывания...


Если у вас обработчик прерывания до сих пор такой:

..... (INT1_vect) // INT1 interrupt service routine // veter
{
....
while(1){LED_RED;}
}

То выхода из прерывания и не должно быть, т.к. там бесконечный цикл.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 4 2007, 20:13
Сообщение #14


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

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



>Вообще то советовал бы поменять ISR на
>SIGNAL (INT1_vect)
>{
>....
>}
Запись обработчика прерывания зависит от версии компилятора. Указанная версия для старых версий AVR-GCC. В новых требуется ISR. Это описано в документации к компилятору и библиотекам.
defunct прав. Из этого обработчика нет выхода, кроме сторожевого таймера, а он отключен.
LED_RED - это что такое? Если запись в порт, то хотелось бы увидеть макро.
//#include "iom161.h" !!!!!! указан ли правильно тип процессора в makefile?
#include <avr/io.h>
#include <compat/ina90.h> это зачем, если код полностью переделан под GCC?

Сообщение отредактировал mdmitry - May 4 2007, 20:24


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
forever failure
сообщение May 5 2007, 04:07
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Цитата
я нашел по ходу ошибку в ASM файле
было
;PORTA var 0x1b
/* ... */

стало
#define PORTA 0x1B


Коренное отличие GCC-ишного асма AVR от IAR-овского состоит в том, в GCC обращение к порту in/out делается через макроподстановку _SFR_IO_ADDR, т. е. Вам придётся в асмовском файле заменить все
in r**, PORT** на in r**, _SFR_IO_ADDR(PORT**).
Ну и проделать тоже с out, cbi, sbi. Тогда заработает.
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 5 2007, 07:56
Сообщение #16


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(forever failure @ May 5 2007, 06:07) *
Коренное отличие GCC-ишного асма AVR от IAR-овского состоит в том, в GCC обращение к порту in/out делается через макроподстановку _SFR_IO_ADDR, т. е. Вам придётся в асмовском файле заменить все
in r**, PORT** на in r**, _SFR_IO_ADDR(PORT**).
Ну и проделать тоже с out, cbi, sbi. Тогда заработает.


Не обязательно.
Можно сделать так:

Код
#define __SFR_OFFSET 0
.nolist
#include <avr/io.h>
.list

           .section .text
           .global main
main:
    ; запис в OSCCAL - перша операція, щоб не змінювалася адреса
    ; команди LDI
    ldi temp, 0x80    $ out OSCCAL, temp
    ldi temp, (1<<ACD) $ out ACSR, temp
    ; Вихід NO_VIDEO вмикається відразу як активний.
    ldi temp, 0x19 $ out PORTB, temp
    ldi temp, 0x0B $ out DDRB, temp


и не морочить себе голову этим _SFR_IO_ADDR
Да, они сами пишут, что лучше морочить :-), но я ленюсь писать многа букафф. Даже если вдруг они переделают sfr_defs.h так, что #define __SFR_OFFSET 0 перестанет работать - напущу SED на те из старіх исходников, которіе надо поддерживать.

Ну а если адреса портов заданы вручную через #define PORTB и т.п., то тогда _SFR_IO_ADDR противопоказан, так как адрес задан уже правильно.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
mdmitry
сообщение May 5 2007, 10:25
Сообщение #17


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

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



В Си доступ к портам прост. Например, запись в порт А значения 0x5A:
POTRA = 0x5A;
Это описано в документации к библиотеке и FAQ.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th August 2025 - 23:34
Рейтинг@Mail.ru


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