MCS51, вопросы перехода с "классики" на SiLabs...
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
да это тестовая прога. что бы освоить передачу/прием нескольких байтов. Так что памятью мк я не заморачиваюсь
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: MCS51, вопросы перехода с "классики" на SiLabs...
В принципе, глядя на прогу я не очень хорошо понимаю что и как вы хотите делать. Опишите подробно алгоритм работы.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Устанавливаем флаг разрешения чтения
Для того что бы передача от мк в комп не зациклилась в бесконечность, я все сделал в цикле. Пока флаг прога выполняется.
идем далее
пока прием разрешен, мы находимся в ожидании байта данных. Как только пришел стоп бит от первого принимаемого байта...хм... %^*ть. вот тут загвоздка... как я себе представлял. Как только пришел стоп бит от первого принимаемого байта мы записываем этот байт в нулевую ячейку массива, а затем поднимается флаг RI0=1, затем идем в прерывание и обрабатываем этот цикл
тут я указываю что следующий байт должен сохраниться в следующей ячейке.
Но, как я только что стал подозревать, работает все иначе.
Т.е пришел байт, его стоп-бит поднял RI0=1, и мы сразу попадаем в этот цикл. И получается (могу ошибаться) что этот байт, который должен был бы попасть в ячейку 0 массива, попадает в 1... и так все остальные. Получается сместились в... влево?
Код: Выделить всё
RxEn=1;Для того что бы передача от мк в комп не зациклилась в бесконечность, я все сделал в цикле. Пока флаг
Код: Выделить всё
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...
добавил комментариев в коду на предыдущей странице.
А как можно в кейле отладить UART ? не получается у меня там что то посылать и принимать байты в режиме отладки
Да и еще не пойму почему я посылаю 3 байта, а приходит 4 ? не могу найти глюк:(
А как можно в кейле отладить UART ? не получается у меня там что то посылать и принимать байты в режиме отладки
Да и еще не пойму почему я посылаю 3 байта, а приходит 4 ? не могу найти глюк:(
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Для начала...
4 байта вместо трёх принимается из-за того, что считаете вы от нулевого: нулевой, первый, второй и третий.
4 байта вместо трёх принимается из-за того, что считаете вы от нулевого: нулевой, первый, второй и третий.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Так ) вроде пошло дело ) Вот только остался один вопрос. В кейле реально отладку провести задействуя юарт? И как это сделать? Передаю данные с терминала в контроллер, в режиме отладки, а отладчик не реагирует. А так хочется посмотреть что там твориться.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Chip115 писал(а):В кейле реально отладку провести задействуя юарт?
Не знаю, с УАППом отладку не запускал. Подозреваю, что можно.
Chip115 писал(а):И как это сделать?
Как всегда — ставите где-нибудь точку останова. Например, там где вы сбрасываете флаг прерывания УАППа.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Спасибо!
Теперь новые грабли.
Не могу сообразить почему не передается информация три раза,а передается только один раз...
тут задача так же простая. Передать три байта 2B C0 40 три раза.
Теперь новые грабли.
Не могу сообразить почему не передается информация три раза,а передается только один раз...
Код: Выделить всё
#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...
Chip115 писал(а):тут задача так же простая. Передать три байта 2B C0 40 три раза.
Не знаток СИ, но всё же... не пробовали объявлять i и j глобально?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
нет,не пробовал. А зачем? ведь я их только в этой функции использую. Ну попробую , но думаю проблема не в этом. А так , по логике вещей, работать должна программа?
И еще вопрос. По УАПП.
Если прерывания от модуля UART0 разрешены, то запрос прерывания генерируется при завершении
передачи байта данных (установка в 1 флага TI0 в регистре SCON0).
Тело подпрограммы обработки прерывания я взял из примера в IDE.
интересует этот момент
тут мы записываем байт в регистр SBUF0 для передачи.
по идее (как я понял) при окончании передачи , флаг TI0 поднимается автоматически. Почему мы не зацикливаемся тогда в цикле
Или если мы записываем байт в регистр SBUF0 в подпрограмме обработки прерывания, то TI0 не устанавливается? что то в доке не нашел объяснения этого момента
или не по глазам... .
И еще вопросик относительно приема
Вот что "говорит" даташит:
"Прием данных может быть начат в любое время после установки в 1 флага включения приемника REN0
(SCON0.4)."
т.е при мы будем ожидать приема в каждый момент времени, и как только что то появилось на Rx, это записывается в SBUF0 и выставляется . А если при мы попытаемся передать байт, передача должна пройти? Прошу прощения за такие глупые вопросы. просто не работал до этого момента с УАПП и в доке не нашел описания этих моментов.
И еще вопрос. По УАПП.
Если прерывания от модуля 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)."
т.е при
Код: Выделить всё
REN0=1;Код: Выделить всё
RI0=1Код: Выделить всё
REN0=1;Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
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...
Вот еще проблема.
Кеил говорит:"Program Size: data=39.0 xdata=0 code=810"
что "жрет" память программ? типы переменных? Как еще можно выцеганить памяти? оптимизировать код? ни когда не сталкивался с такой проблемой. раньше на все хватало. ( а тут только половина кода, а уже 810 байт.
почему то когда код переваливает за 1000, то кеил отказывается его компилировать.
В мк есть столько памяти:
- 2304 (256 + 2048) байт встроенного ОЗУ данных.
- 32/16 Кбайт FLASH-памяти; возможно внутрисистемное
программирование FLASH-памяти секторами по 512 байт.
- 64 байт ОЗУ с аварийным батарейным питанием (smaRTClock).
Почему же кеил тогда больше 1000 не пускает?
Кеил говорит:"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...
И это проблема?
Когда я применил функцию sprintf, она сразу сожрала у меня килобайт
флэша. Так что каждая такая функция типа getchar съедает флэш. Да, выход - оптимизировать код.
Бывает, вроде невзломаный кейл не компилирует большие объёмы.
Бывает, вроде невзломаный кейл не компилирует большие объёмы.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
в чем заключается оптимизация? все переменные у меня объявлены типом,который не обходим для каждый переменной.
есть куча самописных функций. Как их можно оптимизировать? вообще есть какой нибудь алгоритм оптимизации кода... ? ну хотя бы в общих чертах? у меня 80% кода весит больше 2к . где раньше не компилировалось - я разобрался.
32/16 Кбайт FLASH-памяти; это можно как нибудь использовать?
вот например ф-ция опроса клавиатуры 3x3 и вывода введенных значений на LED дисплей. написано наверное криво, но работает как то.
если она много жрет то как можно оптимизировать ее? повторяющиеся модули (если они есть. я уже забыл када писал ее) в отдельные функции?
есть куча самописных функций. Как их можно оптимизировать? вообще есть какой нибудь алгоритм оптимизации кода... ? ну хотя бы в общих чертах? у меня 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...
Chip115 писал(а):в чем заключается оптимизация? все переменные у меня объявлены типом,который не обходим для каждый переменной.
есть куча самописных функций. Как их можно оптимизировать? вообще есть какой нибудь алгоритм оптимизации кода... ? ну хотя бы в общих чертах? у меня 80% кода весит больше 2к . где раньше не компилировалось - я разобрался.
Я же говорю, я не знаток СИ и не могу сказать где и что можно оптимизировать.
Chip115 писал(а):32/16 Кбайт FLASH-памяти; это можно как нибудь использовать?
Что значит "можно как нибудь использовать"? Это память программ, туда помещается программа.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
вот теперь ни чего не понял. кеил вот что пишет
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 ?
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...
Что-то у вас не то с процедурой инициализации УАППа.
Data — ОЗУ, Xdata — внешнее ОЗУ, Code — флэш (сам код).
Chip115 писал(а):data это память данных,а code память программ? что значит xdata ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Gudd-Head писал(а):Что-то у вас не то с процедурой инициализации УАППа.Chip115 писал(а):data это память данных,а code память программ? что значит xdata ?
Data — ОЗУ, Xdata — внешнее ОЗУ, Code — флэш (сам код).
Просто я не использовал в программе инициализацию. вот и материться что зря написано.
Еще проблема вылезла.
Такое чувство что идет срыв стэка. Определяю кучу массивов. Если часть из них закоменчу, то нормально работает. Иначе зацикливается контроллер где то и все. Короче виснет,гад . Причем массивы я и в xdata помещал. все равно так же.
Кстати, xdata - область памяти на кристалле. раньше была внешняя.сейчас интегрировали. И что то я про память не могу разобраться.
В этой архитектуре есть память программ и память данных. А что такое флэш память? Не похоже что бы это была область code так как по доке
Код: Выделить всё
Память
- 2304 (256 + 2048) байт встроенного ОЗУ данных.
- 32/16 Кбайт FLASH-памяти; возможно внутрисистемное
программирование FLASH-памяти секторами по 512 байт.
- 64 байт ОЗУ с аварийным батарейным питанием (smaRTClock).Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: MCS51, вопросы перехода с "классики" на SiLabs...
Вполне возможно что не хватает оперативки. Флэш — это как раз область памяти code.
Хе, а у вас Кейл с лекарством? Потому что мне больше 4 кбайт бесплатный компилировать не давал.
Chip115 писал(а):она 32/16 Кбайт, а я чуть за 2500 залезаю и все. говорит что не хватает памяти.
Хе, а у вас Кейл с лекарством? Потому что мне больше 4 кбайт бесплатный компилировать не давал.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Chip115
- Сверлит текстолит когтями
- Сообщения: 1132
- Зарегистрирован: Пт фев 16, 2007 14:18:20
- Откуда: Новосибирск
- Контактная информация:
Re: MCS51, вопросы перехода с "классики" на SiLabs...
да. вылечен. мне больше 2 к не давал 
еще глюк заметил. при размещении всех массивов в xdata он тоже виснет
еще глюк заметил. при размещении всех массивов в 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 раз.
Теория — это когда все известно, но ничего не работает. Практика — это когда все работает, но никто не знает почему. Мы же объединяем теорию и практику: ничего не работает… и никто не знает почему!
© Альберт Эйнштейн
© Альберт Эйнштейн