MCS51, вопросы перехода с "классики" на SiLabs...

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

да это тестовая прога. что бы освоить передачу/прием нескольких байтов. Так что памятью мк я не заморачиваюсь
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

В принципе, глядя на прогу я не очень хорошо понимаю что и как вы хотите делать. Опишите подробно алгоритм работы.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Устанавливаем флаг разрешения чтения

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

Код: Выделить всё

stop = 0
прога выполняется.
идем далее

Код: Выделить всё

if(RxEn==1)
            {   
                REN0=1;                           // ждем начала передачи
                UART_Buffer[i]=SBUF0;     // принятый код посылаем в регистр SBUF0
            }

пока прием разрешен, мы находимся в ожидании байта данных. Как только пришел стоп бит от первого принимаемого байта...хм... %^*ть. вот тут загвоздка... как я себе представлял. Как только пришел стоп бит от первого принимаемого байта мы записываем этот байт в нулевую ячейку массива, а затем поднимается флаг RI0=1, затем идем в прерывание и обрабатываем этот цикл

Код: Выделить всё

if(RI0==1)            // тут мы принемаем
      {   
         i++;
         RI0=0;
         if (i==3)
         {       
            RxEn=0;
            TxEn=1;
            i=0;
         }

тут я указываю что следующий байт должен сохраниться в следующей ячейке.
Но, как я только что стал подозревать, работает все иначе.
Т.е пришел байт, его стоп-бит поднял RI0=1, и мы сразу попадаем в этот цикл. И получается (могу ошибаться) что этот байт, который должен был бы попасть в ячейку 0 массива, попадает в 1... и так все остальные. Получается сместились в... влево?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

добавил комментариев в коду на предыдущей странице.
А как можно в кейле отладить UART ? не получается у меня там что то посылать и принимать байты в режиме отладки
Да и еще не пойму почему я посылаю 3 байта, а приходит 4 ? не могу найти глюк:(
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Для начала...
4 байта вместо трёх принимается из-за того, что считаете вы от нулевого: нулевой, первый, второй и третий.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Так ) вроде пошло дело ) Вот только остался один вопрос. В кейле реально отладку провести задействуя юарт? И как это сделать? Передаю данные с терминала в контроллер, в режиме отладки, а отладчик не реагирует. А так хочется посмотреть что там твориться.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):В кейле реально отладку провести задействуя юарт?

Не знаю, с УАППом отладку не запускал. Подозреваю, что можно.
Chip115 писал(а):И как это сделать?

Как всегда — ставите где-нибудь точку останова. Например, там где вы сбрасываете флаг прерывания УАППа.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Спасибо!
Теперь новые грабли.
Не могу сообразить почему не передается информация три раза,а передается только один раз...

Код: Выделить всё

#define UART_BUFFERSIZE 8
#define BUFFERSIZE 8
unsigned char UART_Buffer[UART_BUFFERSIZE];
unsigned char Buffer[BUFFERSIZE];
unsigned char UART_Buffer_Size = 0;
unsigned char UART_Input_First = 0;
unsigned char UART_Output_First = 0;
static char Byte;

void UART0_Interrupt (void) interrupt 4
{
   
   if (TI0 == 1)                   // Check if transmit flag is set
   {
      TI0 = 0;                           // Clear interrupt flag
      if (UART_Buffer_Size != 0)         // If buffer not empty
      {
         // If a new word is being output
         if ( UART_Buffer_Size == UART_Input_First ) {
              UART_Output_First = 0;  }
         // Store a character in the variable byte
         Byte = UART_Buffer[UART_Output_First];
         //if ((Byte >= 0x61) && (Byte <= 0x7A)) { // If upper case letter
           // Byte -= 32; }
         SBUF0 = Byte;                   // Transmit to Hyperterminal
         UART_Output_First++;            // Update counter
         UART_Buffer_Size--;             // Decrease array size
      }
      else
      {
         UART_Buffer_Size = 0;            // Set the array size to 0
         TX_Ready = 1;                    // Indicate transmission complete
      }
   }
}
void putdata(unsigned char PutByte)      // функция формирования массива для передачи
{
         
          if (UART_Buffer_Size < UART_BUFFERSIZE)
          {
            UART_Buffer[UART_Input_First] = PutByte; // Store in array

            UART_Buffer_Size++;             // Update array's size

            UART_Input_First++;             // Update counter
           }
   
}

void MC3PHAC_Identification()
{
 
   unsigned char i;
   unsigned char Test_Link1[3] = {0x2B,0xC0,0x40};
   for (unsigned char j=0; j<3;j++)
      {      for (i=0;i<3;i++)                           
                putdata(Test_Link1[i]);             //формируем массив для передачи
      TI0=1;                                           // вызвав прерывание передаем данные
   }
                            
}

MC3PHAC_Identification();   
while(1){};
         
 

тут задача так же простая. Передать три байта 2B C0 40 три раза.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):тут задача так же простая. Передать три байта 2B C0 40 три раза.

Не знаток СИ, но всё же... не пробовали объявлять i и j глобально?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

нет,не пробовал. А зачем? ведь я их только в этой функции использую. Ну попробую , но думаю проблема не в этом. А так , по логике вещей, работать должна программа?
И еще вопрос. По УАПП.
Если прерывания от модуля UART0 разрешены, то запрос прерывания генерируется при завершении
передачи байта данных (установка в 1 флага TI0 в регистре SCON0).
Тело подпрограммы обработки прерывания я взял из примера в IDE.
интересует этот момент

Код: Выделить всё

 Byte = UART_Buffer[UART_Output_First];

тут мы записываем байт в регистр SBUF0 для передачи.
по идее (как я понял) при окончании передачи , флаг TI0 поднимается автоматически. Почему мы не зацикливаемся тогда в цикле

Код: Выделить всё

if (TI0 == 1)                   // Check if transmit flag is set
   {
      TI0 = 0;                           // Clear interrupt flag
      if (UART_Buffer_Size != 0)         // If buffer not empty
      {
         // If a new word is being output
         if ( UART_Buffer_Size == UART_Input_First ) {
              UART_Output_First = 0;  }
         // Store a character in the variable byte
         Byte = UART_Buffer[UART_Output_First];
         //if ((Byte >= 0x61) && (Byte <= 0x7A)) { // If upper case letter
           // Byte -= 32; }
         SBUF0 = Byte;                   // Transmit to Hyperterminal
         UART_Output_First++;            // Update counter
         UART_Buffer_Size--;             // Decrease array size
      }
      else
      {
         UART_Buffer_Size = 0;            // Set the array size to 0
         TX_Ready = 1;                    // Indicate transmission complete
      }

Или если мы записываем байт в регистр SBUF0 в подпрограмме обработки прерывания, то TI0 не устанавливается? что то в доке не нашел объяснения этого момента :( или не по глазам... .
И еще вопросик относительно приема :)
Вот что "говорит" даташит:
"Прием данных может быть начат в любое время после установки в 1 флага включения приемника REN0
(SCON0.4)."
т.е при мы будем ожидать приема в каждый момент времени, и как только что то появилось на Rx, это записывается в SBUF0 и выставляется . А если при мы попытаемся передать байт, передача должна пройти? Прошу прощения за такие глупые вопросы. просто не работал до этого момента с УАПП и в доке не нашел описания этих моментов.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Gudd-Head писал(а):
Chip115 писал(а):тут задача так же простая. Передать три байта 2B C0 40 три раза.

Не знаток СИ, но всё же... не пробовали объявлять i и j глобально?

Все. разобрался. Девять байт,пачками по три, уходят )) Перед каждым возвращением в j-й цикл поставил задержку в 5 мс

Код: Выделить всё

void MC3PHAC_Identification()
{
 
   unsigned char i,j;
   unsigned char Test_Link1[3] = {0x2B,0xC0,0x40};
   for (j=0; j<3;j++)
   {
         for (i=0;i<3;i++)
             putdata(Test_Link1[i]);
      TI0=1;
      delay_ms(5);
   
   }
                      
}

но остальные вопросы так и остались тайной ((
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Вот еще проблема.
Кеил говорит:"Program Size: data=39.0 xdata=0 code=810"
что "жрет" память программ? типы переменных? Как еще можно выцеганить памяти? оптимизировать код? ни когда не сталкивался с такой проблемой. раньше на все хватало. ( а тут только половина кода, а уже 810 байт.
почему то когда код переваливает за 1000, то кеил отказывается его компилировать.
В мк есть столько памяти:

- 2304 (256 + 2048) байт встроенного ОЗУ данных.
- 32/16 Кбайт FLASH-памяти; возможно внутрисистемное
программирование FLASH-памяти секторами по 512 байт.
- 64 байт ОЗУ с аварийным батарейным питанием (smaRTClock).
Почему же кеил тогда больше 1000 не пускает?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

И это проблема? :) Когда я применил функцию sprintf, она сразу сожрала у меня килобайт :shock: флэша. Так что каждая такая функция типа getchar съедает флэш. Да, выход - оптимизировать код.
Бывает, вроде невзломаный кейл не компилирует большие объёмы.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

в чем заключается оптимизация? все переменные у меня объявлены типом,который не обходим для каждый переменной.
есть куча самописных функций. Как их можно оптимизировать? вообще есть какой нибудь алгоритм оптимизации кода... ? ну хотя бы в общих чертах? у меня 80% кода весит больше 2к . где раньше не компилировалось - я разобрался.
32/16 Кбайт FLASH-памяти; это можно как нибудь использовать?
вот например ф-ция опроса клавиатуры 3x3 и вывода введенных значений на LED дисплей. написано наверное криво, но работает как то.

Код: Выделить всё

void Scan (void)
{

   P1=0x3E;
   if(P1==mas[0])                     // If press key down_1 (Dn_1)
   {
      delay_ms(DFC);
      while (P1==mas[0]){};
      delay_ms(DFC);
      if (flag_1==0)                  // ïðîâåðÿåì òåêóùèé ðåæèì ðàáîòû øòàíãà/ëåíòà
      {
          if (timer_hi>0)
         {
            if (timer_hi==1000)
            {      
               timer_lo=90;
               COLL=9;
            }
            

            timer_hi=timer_hi-100;
            COLL_1=timer_hi/100;
            if (COLL_1!=10)
            {
               SSISend5CharVolt(0,0,COLL_1,COLL);
            }
            
         }   
      }    
   }
   if (P1==mas[1])                     // If press key up_1
   {
      delay_ms(DFC);
      while (P1==mas[1]){};
      delay_ms(DFC);
      if (flag_1==0)
      {
         if (timer_hi<1000)
         {
            timer_hi=timer_hi+100;
            COLL_1=timer_hi/100;
            if (COLL_1!=10)
            {
               
               SSISend5CharVolt(0,0,COLL_1,COLL);
            }
            else
            {
               timer_hi=1000;                         // óñòàíàâëèâàåì òàéìåð àðàáîòû äâèãàòåëÿ íà 1 ñåê
               timer_lo=0;                            //
               SSISend5CharVolt(0,1,0,0);
            }
         }            
      }   
   }   
   if (P1==mas[2]&flag_1==1)                     // ñáðîñ "Øòàíãà"
   {
      delay_ms(DFC);
      while (P1==mas[2]){};
      delay_ms(DFC);
      COLS=0;
      nfreq=0;
      SSISend5CharVolt(0,0,0,COLS);
   
   }   

   P1=0x3D;
   if(P1==mas[3])                     // If press down _0 (Dn_0)
   {
      
      delay_ms(DFC);
      while (P1==mas[3]){};
      delay_ms(DFC);                                                                     
      if (flag_1==1)                // Åñëè âûáðàí ðåæèì "øòàíãà"
      {
         
            if (nfreq>0)
            {
               
               
               nfreq--;
               COLS--;
               SSISend5CharVolt(0,0,0,COLS);         
            }         
      }
      else                               // èíà÷å îáðàáàòûâàåì ðåæèì "ëåíòà"
      {
          if (timer_lo>0)
         {
            timer_lo=timer_lo-10;
            COLL=timer_lo/10;
            if (COLL>=0)
               SSISend5CharVolt(0,0,COLL_1,COLL);
            
         }      
      }
   }
   if (P1==mas[4])                     // If press  up_0
   {
      delay_ms(DFC);
      while (P1==mas[4]){};
      delay_ms(DFC);
      if (flag_1==1)                // Åñëè âûáðàí ðåæèì "øòàíãà"
      {
         if (nfreq<10)
         {
            nfreq++;
            COLS=nfreq;
            if (COLS!=10)
               SSISend5CharVolt(0,0,0,COLS);
            else SSISend5CharVolt(0,0,1,0);               
         }
               
      }
      else                                    // Èíà÷å îáðàáàòûâàåì ðåæèì "ëåíòà"
      {
          if(timer_hi<1000){
         if (timer_lo<100)
         {
            timer_lo=timer_lo+10;
            COLL=timer_lo/10;
            if (COLL<10)
               SSISend5CharVolt(0,0,COLL_1,COLL);
            else
            {
                COLL=9;
               timer_lo=90;
               SSISend5CharVolt(0,0,COLL_1,COLL);
            }   
         
         }}         
            
      }
   }
   if (P1==mas[5]&flag_1==0)                     //  reset lenta
   {
      delay_ms(DFC);
      while (P1==mas[5]){};
      delay_ms(DFC);
      COLL=0;
      COLL_1=0;
      timer_lo=0;
      timer_hi=0;   
      SSISend5CharVolt(0,0,COLL_1,COLL);
   
   }   

   P1=0x3B;
   if(P1==mas[6])                     // if press stop
   {
      delay_ms(DFC);
      while (P1==mas[6]){};
      delay_ms(DFC);
//      Stop();
   }
   if (P1==mas[7])                     // if press start
   {
      delay_ms(DFC);
      while (P1==mas[6]){};
      delay_ms(DFC);
//      Start();
      
   }
   if (P1==mas[8])                     // if press shtanga/lenta
   {
      delay_ms(DFC);
      while (P1==mas[8]){};
      delay_ms(DFC);
      if (flag_1==0)                  
      {
         flag_1=1;
         if (COLS!=10)
            SSISend5CharVolt(0,0,0,COLS);
         else SSISend5CharVolt(0,0,1,0);   
         
      }
      else
      {
         flag_1=0;                   //øòàíãà
         if (COLL_1!=10)
            {
               if (COLL==10)
                  SSISend5CharVolt(0,0,COLL_1,0);
               else SSISend5CharVolt(0,0,COLL_1,COLL);
            }
            else SSISend5CharVolt(0,1,0,0);
      }        
   
   }
}

если она много жрет то как можно оптимизировать ее? повторяющиеся модули (если они есть. я уже забыл када писал ее) в отдельные функции?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Chip115 писал(а):в чем заключается оптимизация? все переменные у меня объявлены типом,который не обходим для каждый переменной.
есть куча самописных функций. Как их можно оптимизировать? вообще есть какой нибудь алгоритм оптимизации кода... ? ну хотя бы в общих чертах? у меня 80% кода весит больше 2к . где раньше не компилировалось - я разобрался.

Я же говорю, я не знаток СИ и не могу сказать где и что можно оптимизировать.
Chip115 писал(а):32/16 Кбайт FLASH-памяти; это можно как нибудь использовать?

Что значит "можно как нибудь использовать"? Это память программ, туда помещается программа.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

вот теперь ни чего не понял. кеил вот что пишет

Build target 'Target 1'
compiling main_prog.c...
D:\PROGECTS\SYSTEM'S_CONTROL_ADP-2\PROGRAM\V2_3\FUNC\MC3PHAC_INDEF.H(57): warning C275: expression with possibly no effect
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?UART0_INIT?MAIN_PROG
/* и еще куча таких сообщений */

Program Size: data=126.2 xdata=0 code=2538
Target not created

data это память данных,а code память программ? что значит xdata ?
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Что-то у вас не то с процедурой инициализации УАППа.
Chip115 писал(а):data это память данных,а code память программ? что значит xdata ?

:) Data — ОЗУ, Xdata — внешнее ОЗУ, Code — флэш (сам код).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

Gudd-Head писал(а):Что-то у вас не то с процедурой инициализации УАППа.
Chip115 писал(а):data это память данных,а code память программ? что значит xdata ?

:) Data — ОЗУ, Xdata — внешнее ОЗУ, Code — флэш (сам код).

Просто я не использовал в программе инициализацию. вот и материться что зря написано.
Еще проблема вылезла.
Такое чувство что идет срыв стэка. Определяю кучу массивов. Если часть из них закоменчу, то нормально работает. Иначе зацикливается контроллер где то и все. Короче виснет,гад . Причем массивы я и в xdata помещал. все равно так же.
Кстати, xdata - область памяти на кристалле. раньше была внешняя.сейчас интегрировали. И что то я про память не могу разобраться.
В этой архитектуре есть память программ и память данных. А что такое флэш память? Не похоже что бы это была область code так как по доке

Код: Выделить всё

Память
- 2304 (256 + 2048) байт встроенного ОЗУ данных.
- 32/16 Кбайт FLASH-памяти; возможно внутрисистемное
программирование FLASH-памяти секторами по 512 байт.
- 64 байт ОЗУ с аварийным батарейным питанием (smaRTClock).
она 32/16 Кбайт, а я чуть за 2500 залезаю и все. говорит что не хватает памяти.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Gudd-Head »

Вполне возможно что не хватает оперативки. Флэш — это как раз область памяти code.
Chip115 писал(а):она 32/16 Кбайт, а я чуть за 2500 залезаю и все. говорит что не хватает памяти.

Хе, а у вас Кейл с лекарством? Потому что мне больше 4 кбайт бесплатный компилировать не давал.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Chip115
Сверлит текстолит когтями
Сообщения: 1132
Зарегистрирован: Пт фев 16, 2007 14:18:20
Откуда: Новосибирск
Контактная информация:

Re: MCS51, вопросы перехода с "классики" на SiLabs...

Сообщение Chip115 »

да. вылечен. мне больше 2 к не давал :(
еще глюк заметил. при размещении всех массивов в xdata он тоже виснет

Код: Выделить всё

unsigned char  cmd_RESET[5] =   {0xE3, 0x10, 0x00, 0x30, 0x00};   
unsigned char const cmd_PPWM[5] =    {0xE3, 0x10, 0x00, 0x50, 0x00};
unsigned char const cmd_DEADT[5] =   {0xE3, 0x00, 0x36, 0x30, 0x00}; // 6 ìêñ  ìåðòâîå âðåìÿ  48*125ns=6 us
unsigned char const cmd_ACB[5] =     {0xE3, 0x10, 0x00, 0x61, 0x00}; //  50 Ãö   áàçîâàÿ ÷àñòîòà
unsigned char const cmd_ACC[5] =     {0xE4, 0x00, 0x60, 0x05, 0x00}; //    óñêîðåíèå
unsigned char const cmd_F[5] =       {0xE4, 0x00, 0x62, 0x3C, 0x99}; //  çàäàíèå ñèíóñîèäàëüíîé ÷àñòîòû
unsigned char const cmd_FPWM[5] =    {0xE3, 0x10, 0x00, 0x42, 0x00}; //10.6 êÃö  ÷àñòîòà ØÈÌ
unsigned char const cmd_VBOOST[5] =  {0xE3, 0x00, 0x6C, 0x00, 0x00}; //   0 %    àìïëèòóäà ñèíóñà ïðè íóëåâîé ñèíóñîèäàëüíîé ÷àñòîòå
unsigned char const cmd_MODIN[5] =   {0xE3, 0x00, 0x75, 0xFE, 0x00}; //  99 %    èíäåêñ ìîäóëÿöèè ñèíóñà (àìïëèòóäà)
xdata unsigned char const cmd_FTOUT[5] =   {0xE4, 0x00, 0x6A, 0x00, 0x08}; // òàéìàóò ïîñëå àâàðèè
xdata unsigned char const cmd_VBDEC[5] =   {0xE4, 0x00, 0xC9, 0x03, 0x55}; // 119 %    çíà÷åíèå Vbus ïðè êîòîðîì íà÷èíàåòñÿ ñíèæåíèå ñêîðîñòè òîðìîæåíèÿ
xdata unsigned char const cmd_VBRAKE[5] =  {0xE4, 0x00, 0x64, 0x03, 0x55}; // 119 %    çíà÷åíèå Vbus ïðè êîòîðîì ïîÿâëÿåòñÿ ñèãíàë âêë. òîðìîçíîãî  VT
xdata unsigned char const cmd_VBROWN[5] =  {0xE4, 0x00, 0x66, 0x80, 0x00}; //  50 %    íèæíåå çíà÷åíèå Vbus ïðè îòêë. ØÈÌ è ïîÿâëÿåòñÿ ñèãíàë àâàðèè   

/*
xdata unsigned char const cmd_VBOVR[5] =   {0xE4, 0x00, 0x68, 0x03, 0x71}; // 123 %    âåðõíåå çíà÷åíèå Vbus ïðè îòêë. ØÈÌ è ïîÿâëÿåòñÿ ñèãíàë àâàðèè
xdata unsigned char const cmd_FORW[5] =    {0xE3, 0x10, 0x00, 0x10, 0x00}; // "âïåðåä"
xdata unsigned char const cmd_REW[5] =     {0xE3, 0x10, 0x00, 0x11, 0x00}; // "íàçàä"
xdata unsigned char const cmd_STOP[5] =    {0xE3, 0x10, 0x00, 0x20, 0x00}; // "ñòîï"
unsigned char const read_ACTF[3] =   {0xD1, 0x00, 0x85};             // ïðî÷èòàòü òåêóùþþ ñèíóñîèäàëüíóþ ÷àñòîòó
unsigned char const read_SETUP[3] =  {0xD0, 0x00, 0xAE};             // ïðî÷èòàòü ðåãèñòð óñòàíîâîê
unsigned char const read_VBUS[3] =   {0xD1, 0x00, 0x79};             // ïðî÷èòàòü íàïðÿæåíèå ïèòàíèÿ èíâåðòîðà (DC_bus)
unsigned char const read_F[3] =      {0xD1, 0x00, 0x62};             // ïðî÷èòàòü çàäàíèå íà ñèíóñîèäàëüíóþ ÷àñòîòó
unsigned char const read_STATUS[3] = {0xD0, 0x00, 0xC8};             // ïðî÷èòàòü ðåãèñòð ñòàòóñà
//******************************************************  */
Последний раз редактировалось Chip115 Ср апр 06, 2011 18:19:49, всего редактировалось 1 раз.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»