Цитата(Сергей Борщ @ Nov 20 2007, 11:33)

Давайте смотреть листинг. С точки зрения синтаксиса оба варианта тождественны. В первом случае вы берете адрес i-го элемента масива, во втором - берете адрес массива и прибавляете к нему размер i элементов, т.е. получаете тот же адрес i-го элемента. Первая запись более наглядна.
да тождественны не спорю. кстати пробовал даже так
SPDR = pgm_read_byte_far((unsigned short)(ga_field+i));
вместо
SPDR = pgm_read_byte((unsigned short)(ga_field+i));
почему pgm_read_byte_far? так советуют.
Код
/* I read in file pgmspace.h :
\note If possible, put your constant tables in the lower 64 KB and use
pgm_read_byte_near() or pgm_read_word_near() instead of
pgm_read_byte_far() or pgm_read_word_far() since it is more efficient that
way, and you can still use the upper 64K for executable code.
All functions that are suffixed with a \c _P \e require their
arguments to be in the lower 64 KB of the flash ROM, as they do
not use ELPM instructions. This is normally not a big concern as
the linker setup arranges any program space constants declared
using the macros from this header file so they are placed right after
the interrupt vectors, and in front of any executable code. However,
it can become a problem if there are too many of these constants, or
for bootloaders on devices with more than 64 KB of ROM.
<em>All these functions will not work in that situation.
*/
Цитата(Сергей Борщ @ Nov 20 2007, 11:33)

Программа точно в это место попадает? Раз не выставляется SPIF, значит не идет передача, значит SPI не проинициализирован в режим мастер. Прерывание у вас не разрешено, значит прерывание сбросить SPIF не может. Других мыслей у меня нет...
И проходит инициализацию SPI тоже, вот
Да, точно попадает в нее.
Код
set_spi();
set_UART();
if (eeprom.Speed==0xff)
{
//load_FLEX6000_old();
}
else
{
load_FLEX6000();
}
load_FLEX6000(); - это и есть текущая процедура с приведениями и фантомами которые тут обсуждаются.
и вот она
Код
void load_FLEX6000(void)
{
unsigned char OKLoad;
unsigned int i;
OKLoad = 1;
while(OKLoad)
{
.....
// 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
//------------------------------------------
for(i = 0; i < ga_count; i++)
{
//SPDR = ga_field[i];
SPDR = pgm_read_byte_far((unsigned short)(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
//------------------------------------------
if(!(InLoad & nStatus)) break;
}
if(i >= ga_count - 1) OKLoad = 0;
}
.....
}
и я постоянно наблюдаю красные светодиоды...
Цитата(Сергей Борщ @ Nov 20 2007, 11:33)

Или может в этот момент срабатывает какое-то другое прерывание и программа циклится в обработчике? Попробуйте перед зажиганием красных светлодиодов запретить прерывания. Если поможет - ищите, в какой вектор улетает программа.
угу, щас покопаю в этом направлении тоже, тем более что вид HEX файла в PonyProg.е на это намикает, в начале HEX файла какието значения присутствуют может то и есть прерывания лишние.
:100000000C94B13F0C94D13F0C94D13F0C94D13F50
:100010000C94D13F0C94D13F0C94D13F0C94D13F20
:100020000C94D13F0C94D13F0C94D13F0C94D13F10
:100030000C94D13F0C94D13F0C94D13F0C94D13F00
:100040000C94D13F0C94D13F0C9461600C94D13F3F
:100050000C94D13F0C94D13F0C94D13F0C94D13FE0
это наверно программа, точнее ее кусок.
:100060004120000042C80000461C40004CBEBC209D
:100070005A0E1BCA749DC5AE3DCCCCCD3C23D70ACD
:1000800038D1B717322BCC7724E695950A4FB11F9C
:100090000639652C033AA23B593C1EBAE03D633B4E
:1000A000F43E75FF4E3F3172113F80000000054065
:1000B000B504F441A0000141E2463241A0000040F5
:1000C000E246303F8000000541778C4F40C32CE270
:1000D0004117BF24C1A48DD9C0E1D8A1C05B6782FC
это уже массив, который я и читаю как pgm_read_byte_far((unsigned short)(ga_field+i));
:1000E000FFFF627516FFFFFFFFFFFFFFFFFFFFFF30
:1000F000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FE
....
....
который объявлен как
//const unsigned char ga_field [32385] __ATTR_PROGMEM__ = {
prog_uint8_t ga_field [32385] = {...}
так вот к чему я веду
вот начало HEX от программы собранной IAR
:100000000C9433000000000000000000000000001D
:1000100000000000000000000000000000000000E0
:10002000000000000C9455110000000000000000CA
:1000300000000000000000000000000000000000C0
:100040000C94E110000000000C94D213000000009A
:10005000000000000C94A010FFFFFFFFFFFFFFFF58
:10006000FFFF00EC05BFCDEFD4E000EE03500DBF65
:1000700000E000400EBF0E94C016002309F424D007
:10008000E0E6F0E000E010E00E942619E0EDF0E08C
:1000900000E610E040E050E00E941819E3E0F1E0D3
:1000A0000DEB10E00E942619E0EDF0E000EE10E00C
как видно от сюда - в начале похоже что это явно ссылка на обработчики прерывания остальное забито нулями, в отличие от моего HEX собранного под GCC
вот я не могу понять - это нужно какойто ключик дополнительный компилятору указать или же нужно в коде прорнаммы явно отключать все прерывания?
...помогите плз, а то уже хочется повеситься на полку.
.