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

 
 
> Портирование программы с IAR на WinAVR (GCC), тонкости с асемблером
PrSt
сообщение Nov 14 2007, 11:37
Сообщение #1


http://uschema.com
****

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



привет всем!

Портировать пришлось программу из среды IAR на среду WinAVR (GCC), и столкнулся с тем что я чегото не понимаю или не знаю...
помогите плиз разобраться

Вот привожу кусок кода как это было под IAR
Код
NAME loader
;     INCLUDE ""
     PUBLIC loader6000
     RSEG CODE  

.globl loader6000

SCLK  DEFINE 0
Data  DEFINE 1
Latch DEFINE 2

PORTA var 18h    

.text      
loader6000;
...
...



Но программу нужно портировать на WinAVR

А вот как я сделал под WinAVR

Код
;NAME loader
;;     INCLUDE ""
;     PUBLIC loader6000
;     RSEG CODE  

.globl loader6000


;SCLK  DEFINE 0
;Data  DEFINE 1
;Latch DEFINE 2
#define SCLK  0
#define Data  1
#define Latch 2

;PORTA var 18h    
PORTA = 0x18    

.text      
;loader6000;
loader6000:
....


Программа компиллируется но не работает

я так подозреваю что я некоррктно першел от записи PORTA var 18h или чтото не так понял как правильно интерпретировать иаровский DEFINE
Код
SCLK  DEFINE 0
Data  DEFINE 1
Latch DEFINE 2

PORTA var 18h


к записи

Код
#define SCLK  0
#define Data  1
#define Latch 2

PORTA = 0x18


я не могу понять как ему можно еще сказать.
как сделать правильно?
подскажите плиз!




.


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alcosar
сообщение Nov 16 2007, 14:31
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 44
Регистрация: 30-03-06
Пользователь №: 15 598



У Вас
Код
Data:      65087 bytes (1627.2% Full)
(.data + .bss + .noinit)


Цитата
тоесть программа собирается
но полученный хекс файл не работает...


озу заполненно на 1627.2%. Не здесь ли собака порылась.
Go to the top of the page
 
+Quote Post
PrSt
сообщение Nov 19 2007, 13:08
Сообщение #3


http://uschema.com
****

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



проблема с памятью решена

...наткнулся на следующую проблемму, присущую именно пути портирования с IAR на GCC

как я понял из инета проблема эта у многих, не не понял как ее обходят, да и не нашел по форумам.

дело в том что в той программе что я редактирую есть некоторое веселье, в ней используется 2 длинных массива по 32k тоесть всего 64К данных в массиве и чуточку кода на 20К

...в иаре они были объявленны как
farflash unsigned char ga_field [32385] = {
0x0FF,0x0FF,....
}

Но для GCC я их сделал как
//farflash unsigned char ga_field [32385] = {
//__attribute__((progmem))
__ATTR_PROGMEM__ const unsigned char ga_field [32385] = {
0x0FF,0x0FF,....
}

если верить что я все верно понял их мануала на GCC и из интернета - то это правильно
Но есть у AVR друга проблемма, он не умеет прагать через длину кода с раздывом в адресе в 64K....

и видать с этим сзязано подвисание, вот я его локализовал и вот это место


SPDR = ga_field[i];
// veter
//------------------------------------------
// YELOW_1; //LED1_off; LEDs |= LED1C
RED_1; //LED1_off; LEDs |= LED1A
// YELOW_2; //LED2_off; LEDs |= LED2C
RED_2; //LED2_off; LEDs |= LED2A
//------------------------------------------
while(!(SPSR&SPIF));
// veter
//------------------------------------------
YELOW_1; //LED1_off; LEDs |= LED1C
// RED_1; //LED1_off; LEDs |= LED1A
YELOW_2; //LED2_off; LEDs |= LED2C
// RED_2; //LED2_off; LEDs |= LED2A
//------------------------------------------

так вот я вижу только загоревшиеся красные сретодиоды RED_1; и RED_2; и потом срабатывает ватч дог на опереции чтения флага статуса о собитии прерывания - while(!(SPSR&SPIF));.
тоесть желтых не вижу - что и логично раз сработал ватчдог.

значит проблемма может быть или при операции (SPDR = ga_field[i] wink.gif или же в вызове чтения флага прерывания...

теперь,
помогите пожалуйста дальше разобраться - а то тут я не могу уже понять куда копать

Ребята - крыша улетает, нид хелп.

.


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2007, 13:33
Сообщение #4


Гуру
******

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



По объявлению - можно и так: prog_uint8_t ga_field [32385] = {...};
По коду: Во-первых SPDR = pgm_read_byte(&ga_field[i]); А почему собака - трудно сказать. Передача по SPI идет? Попробуйте просто передавать что-нибудь типа SPDR = 0xAA, может у вас SPI не проинициализирован и передачи нет, поэтому и флаг не выставляется.


--------------------
На любой вопрос даю любой ответ
"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
PrSt
сообщение Nov 20 2007, 08:11
Сообщение #5


http://uschema.com
****

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



Цитата(Сергей Борщ @ Nov 19 2007, 15:33) *
По объявлению - можно и так: prog_uint8_t ga_field [32385] = {...};
По коду: Во-первых SPDR = pgm_read_byte(&ga_field[i]); А почему собака - трудно сказать.

1111493779.gif
так я тоже исппробовал, как Вы посоветовали - не помогло
все одно срабатывает ловушка
пробовал так
SPDR = pgm_read_byte(&ga_field[i])
и так
SPDR = pgm_read_byte(&ga_field+i)
и так
SPDR = pgm_read_byte(&ga_field[0]+i)

не помогло sad.gif

help.gif
.


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2007, 08:40
Сообщение #6


Гуру
******

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



Цитата(PrSt @ Nov 20 2007, 10:11) *
не помогло sad.gif
Все три варианта эквивалентны. Передача происходит? SPI инициализируется? Покажите инициализацию, поставьте в нее ловушку, убедитесь что программа попадает в инициализацию.


--------------------
На любой вопрос даю любой ответ
"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
PrSt
сообщение Nov 20 2007, 08:55
Сообщение #7


http://uschema.com
****

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



Цитата(Сергей Борщ @ Nov 20 2007, 10:40) *
Все три варианта эквивалентны.

разобрался
правильно не так
SPDR = pgm_read_byte(&ga_field[i])
а так
SPDR = pgm_read_byte(ga_field+i)
тоесть не нужно разадрессовывать массив при передаче в функцию, 0й элемент и есть же адрес массива.
теперь значение получил из массива 0xFF.

но делу это не помогло похоже

Код
    for(i = 0; i < ga_count; i++)
    {        
      //SPDR = ga_field[i];
        SPDR = pgm_read_byte(ga_field[i]);

// veter
//------------------------------------------
//  YELOW_1;  //LED1_off; LEDs |= LED1C
  RED_1;    //LED1_off; LEDs |= LED1A
//  YELOW_2;  //LED2_off; LEDs |= LED2C
  RED_2;    //LED2_off; LEDs |= LED2A
//------------------------------------------
      while(!(SPSR&SPIF));
// veter
//------------------------------------------
  YELOW_1;  //LED1_off; LEDs |= LED1C
//  RED_1;    //LED1_off; LEDs |= LED1A
  YELOW_2;  //LED2_off; LEDs |= LED2C
//  RED_2;    //LED2_off; LEDs |= LED2A
//------------------------------------------

горят красные светодиоды, значит продлемма осталась с прерыванием.

crying.gif help.gif


Цитата(Сергей Борщ @ Nov 20 2007, 10:40) *
Пере дача происходит? SPI инициализируется? Покажите инициализацию, поставьте в нее ловушку, убедитесь что программа попадает в инициализацию.


вот инициализация
в IARовском варианте она работало
Код
void set_spi(void)
{
  DDRB=0x17;
  PORTB=0xF0;  //11110000   open drain input          

  SPCR = SPE|DORD|MSTR;
}

вроде все впорядке...



.


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2007, 09:33
Сообщение #8


Гуру
******

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



Цитата(PrSt @ Nov 20 2007, 10:55) *
разобрался
правильно не так
SPDR = pgm_read_byte(&ga_field[i])
а так
SPDR = pgm_read_byte(ga_field+i)
Давайте смотреть листинг. С точки зрения синтаксиса оба варианта тождественны. В первом случае вы берете адрес i-го элемента масива, во втором - берете адрес массива и прибавляете к нему размер i элементов, т.е. получаете тот же адрес i-го элемента. Первая запись более наглядна.
Цитата(PrSt @ Nov 20 2007, 10:55) *
вот инициализация
в IARовском варианте она работало
Программа точно в это место попадает? Раз не выставляется SPIF, значит не идет передача, значит SPI не проинициализирован в режим мастер. Прерывание у вас не разрешено, значит прерывание сбросить SPIF не может. Других мыслей у меня нет... Или может в этот момент срабатывает какое-то другое прерывание и программа циклится в обработчике? Попробуйте перед зажиганием красных светлодиодов запретить прерывания. Если поможет - ищите, в какой вектор улетает программа.


--------------------
На любой вопрос даю любой ответ
"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
PrSt
сообщение Nov 20 2007, 14:51
Сообщение #9


http://uschema.com
****

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



Цитата(Сергей Борщ @ Nov 20 2007, 11:33) *
Прерывание у вас не разрешено, значит прерывание сбросить SPIF не может. Других мыслей у меня нет... Или может в этот момент срабатывает какое-то другое прерывание и программа циклится в обработчике? Попробуйте перед зажиганием красных светлодиодов запретить прерывания. Если поможет - ищите, в какой вектор улетает программа.

полез я осцилограффом и пощюпал шину SPI судя по всему она не работает с этим моим полученным HEX, нет даже клоков на шине.
похоже чтото такое там происходит что я не могу предположить.
я уже и проверки делал - вроде все ок
Код
void set_spi(void)
{
  DDRB=0x17;
  PORTB=0xF0;  //11110000   open drain input          

  SPCR = SPE|DORD|MSTR;

if (&SPCR == 0x2d){
// veter
//------------------------------------------
//  YELOW_1;  //LED1_off; LEDs |= LED1C
  RED_1;    //LED1_off; LEDs |= LED1A
  YELOW_2;  //LED2_off; LEDs |= LED2C
//  RED_2;    //LED2_off; LEDs |= LED2A
//-----------------------------------------
while (1);

}

}

что это может быть за проблемма?


на этой же прошивке от IAR - все работает.

.


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2007, 14:58
Сообщение #10


Гуру
******

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



Цитата(PrSt @ Nov 20 2007, 16:51) *
Код
  SPCR = SPE|DORD|MSTR;

на этой же прошивке от IAR - все работает.
ЧуднО smile.gif Странный у вас ИАР - и указатели присваивает, и биты у него описаны иначе smile.gif SPCR = ( 1 << SPE) | ( 1 << DORD) | (1 << MSTR);

Исправлено: Извините, про указатели это я с другой веткой попутал.


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- PrSt   Портирование программы с IAR на WinAVR (GCC)   Nov 14 2007, 11:37
- - forever failure   да так же и записать: #define PORTA ...   Nov 14 2007, 12:26
- - GDI   Что то я не понял что за программа такая и на како...   Nov 14 2007, 12:33
|- - PrSt   Цитата(GDI @ Nov 14 2007, 14:33) Что то я...   Nov 14 2007, 13:26
- - forever failure   #include <avr/io.h> а в командной строке ком...   Nov 14 2007, 13:35
|- - PrSt   Цитата(forever failure @ Nov 14 2007, 15...   Nov 14 2007, 13:50
- - forever failure   Практика - вот единственный критерий правильности....   Nov 14 2007, 14:10
|- - PrSt   Цитата(forever failure @ Nov 14 2007, 16...   Nov 14 2007, 14:35
- - ReAl   Код.nolist #define __SFR_OFFSET 0 #include <av...   Nov 14 2007, 15:27
- - forever failure   Просто по выходу препроцессора можно посмотреть ка...   Nov 14 2007, 16:20
- - mdmitry   В исходном файле должны быть соответствующие загол...   Nov 14 2007, 21:09
|- - PrSt   Цитата(mdmitry @ Nov 14 2007, 23:09) В ис...   Nov 15 2007, 08:28
- - mdmitry   У Вас действительно atmega103? Для разбора проблем...   Nov 15 2007, 20:08
|- - PrSt   Цитата(mdmitry @ Nov 15 2007, 22:08) У Ва...   Nov 16 2007, 12:53
- - PrSt   Цитата(alcosar @ Nov 16 2007, 16:31) У Ва...   Nov 16 2007, 15:27
- - PrSt   Цитата(Сергей Борщ @ Nov 19 2007, 15:33) ...   Nov 19 2007, 13:57
- - PrSt   Цитата(Сергей Борщ @ Nov 20 2007, 11:33) ...   Nov 20 2007, 10:25


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

 


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


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