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

 
 
> Не кооректный старт программы
bullit
сообщение May 21 2009, 14:36
Сообщение #1


пуля
****

Группа: Свой
Сообщений: 674
Регистрация: 10-05-06
Из: Уфа
Пользователь №: 16 959



Написал программу, заливаю, включаю, неработает.

Начинает работать только после внешнего ресета.

Код:
CODE
u8 buf[3801];
u8 crc8_crn = 0; // CRC8 для текущей команды
u8 crc8_prev = 0; // CRC8 для предыдущей команды
u8 crc8 = 0xFF; // CRC8 для подсчета, используется как буфер
u8 comand_crn[5] = {0,0,0,0,0}; // Запрос текущий
u8 comand_prev[5] = {0,0,0,0,0}; // Запрос предыдущий



u8 crc8_array[256] =
{...};


void ReadADC(void); // тение данных с АЦП
u8 ReadWriteSPI1(u8 data); // Чтение и запись с SPI1
u8 CalcCOMAND_CRC8(u8 col); // Расчет CRC8 приходящей команды
u8 crc8_table(u8 data); // Расчет CRC8 по таблице
void CalcBUF_CRC8(void); // Расчет CRC8 у buf[] и запись в последний номер crc8

int main (void){

// System initialization, this will map the exception vectors.
SystemInit(APBDIVISOR);

// initialization PLL
PLLInit();

// Power Control
PowerControl();

// First disable interrupts.
__disable_interrupt();

// Setup interrupt controller.
InitVIC();
InitTimer0Interrupt(Timer0Beat);

// Periodic timer initialization.
InitTimer0();
// Enable interrupts.
__enable_interrupt();

// Start periodic timer.
// StartTimer0();

// Set up peripheral registers.
InitGPIO();
InitSPI1();

u8 i = 0;
u8 fg;

crc8_prev = 0;

for (;;){ // Loop forever.

fg = ReadWriteSPI1(0);
if (fg != 0) {
comand_crn[0] = fg;
S1SPDR = 0;
i = 1;
while (SPI1_SSEL == 0){
if ((S1SPSR & 0x80)) {
comand_crn[i++] = S1SPDR;
S1SPDR = 0;
}
}// end While


// Проверка CRC8 приходящего запроса
crc8 = 0xFF;
crc8_crn = CalcCOMAND_CRC8(i-1);// щас фиксированно 3 байта приходит

if (crc8_prev == 0)
{
//====================================================
// Сначала отвечаем на запрос (предыдущий)
for (u16 k = 0; k <=3800; k++)
{ReadWriteSPI1(buf[k]);};
//====================================================
// Затем выполняем команду
switch (comand_crn[0]){ // В зависимости какая команда пришла
//----------------------------------------------------
case 'k' : //0x6B = 107 // Команда ""
.....
break;
//----------------------------------------------------
case 'z' : //'z' = 122 = 0x7A - Команда "Тест памяти"
.....
break;
//----------------------------------------------------
case 0xA0 : //'' 160 = - Команда ""
.....
break;
//----------------------------------------------------
default: {
....
}
//----------------------------------------------------
}// Конец swith
crc8_prev = crc8_crn;
for (u8 ct = 0; ct <= 4; ct++)
{comand_prev[ct] = comand_crn[ct];};
} //else { S1SPDR = 0;}
}// Есть ли команда
}// For - LOOP

}// End Main

u8 ReadWriteSPI1(u8 data){
S1SPDR = data;
while (!(S1SPSR & 0x80));
return S1SPDR;
};

u8 crc8_table(u8 data){
crc8 = crc8_array[(data ^ crc8)&0xff];
return crc8;
}


u8 CalcCOMAND_CRC8(u8 col){
crc8 = 0xFF;
for (u8 n = 0; n <= 2; n++)
{ crc8 = crc8_array[((comand_crn[n])^ crc8)&0xff]; }
return crc8;
}

void CalcBUF_CRC8(void){
crc8 = 0xFF;
for (u16 n = 0; n <= 3799; n++)
{ crc8 = crc8_table(buf[n]); }
buf[3800] = crc8;
}

Так вот crc8 в строке
Код
  // Проверка CRC8 приходящего запроса
      crc8 = 0xFF;
      crc8_crn = CalcCOMAND_CRC8(i-1);// щас фиксированно 3 байта приходит
проверятеся и не равен нулю. Хотя приходит коректное...
Проверял ...
Если нажать на кнопку сброса - то всё окей! (!)
Затык получается в "if (crc8_prev == 0)" , хотя при 2-3 приходе команды crc ведь должен нормальным быть...
Инициализация мк проходит - это точно. Стоит супервизор. МК LPC2194 /01. Среда IAR, оптимизация High, ставил none - не помогает.
Что может быть? почему после ресета начинает нормально работать???
Заранее большое спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sergeeff
сообщение May 21 2009, 16:18
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Железо лучше инициализировать при запрещенных прерываниях, и разрешать прерывания потом.

Инициализация железа в main - дурной тон. В startup'e для этого вызывается low_level_init.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- bullit   Не кооректный старт программы   May 21 2009, 14:36
- - bullit   ЦитатаИнициализация железа в main - дурной тон. В ...   May 21 2009, 16:45
- - DpInRock   Казалось бы, чего проще. Убираем из программы всё...   May 21 2009, 19:10
- - bullit   Немного подправил код... Код for (;;){ ...   May 22 2009, 05:38
- - bullit   Проанализировав результаты, посоветовавщись со ста...   May 22 2009, 08:22
|- - SasaVitebsk   Цитата(bullit @ May 22 2009, 11:22) Проан...   May 22 2009, 09:05
- - bullit   А пример реализации интерфейса SPI не покажите? У ...   May 22 2009, 09:25
- - SasaVitebsk   Честно говоря не совсем понял Ваши предложения/воп...   May 22 2009, 11:10
- - bullit   Моё устройство работает по запросу (мое устройство...   May 22 2009, 11:32
|- - SasaVitebsk   Цитата(bullit @ May 22 2009, 14:32) Что-т...   May 22 2009, 11:46
- - bullit   1) сбой как я понимаю появляется уже на приеме. по...   May 22 2009, 12:04
- - SasaVitebsk   Предлогаю простую проверку. Вы в слэёве при приёме...   May 22 2009, 13:05
- - bullit   Рещил на Чипселект поставить прерывание по спаду. ...   May 23 2009, 10:57
- - bullit   Решил пока не заморачиваться с прерыванием... Напи...   May 23 2009, 14:44
- - bullit   Всем огромное спасибо кто отозвался. Решил проблем...   May 24 2009, 09:25


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:58
Рейтинг@Mail.ru


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