Re: MCS51, вопросы перехода с "классики" на SiLabs...
Добавлено: Вс мар 27, 2011 10:42:45
да это тестовая прога. что бы освоить передачу/прием нескольких байтов. Так что памятью мк я не заморачиваюсь
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
RxEn=1;Код: Выделить всё
stop = 0Код: Выделить всё
if(RxEn==1)
{
REN0=1; // ждем начала передачи
UART_Buffer[i]=SBUF0; // принятый код посылаем в регистр SBUF0
}
Код: Выделить всё
if(RI0==1) // тут мы принемаем
{
i++;
RI0=0;
if (i==3)
{
RxEn=0;
TxEn=1;
i=0;
}
Не знаю, с УАППом отладку не запускал. Подозреваю, что можно.Chip115 писал(а):В кейле реально отладку провести задействуя юарт?
Как всегда — ставите где-нибудь точку останова. Например, там где вы сбрасываете флаг прерывания УАППа.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){};
Не знаток СИ, но всё же... не пробовали объявлять i и j глобально?Chip115 писал(а):тут задача так же простая. Передать три байта 2B C0 40 три раза.
Код: Выделить всё
Byte = UART_Buffer[UART_Output_First];Код: Выделить всё
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
}Код: Выделить всё
REN0=1;Код: Выделить всё
RI0=1Код: Выделить всё
REN0=1;Все. разобрался. Девять байт,пачками по три, уходят )) Перед каждым возвращением в j-й цикл поставил задержку в 5 мсGudd-Head писал(а):Не знаток СИ, но всё же... не пробовали объявлять i и j глобально?Chip115 писал(а):тут задача так же простая. Передать три байта 2B C0 40 три раза.
Код: Выделить всё
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);
}
}Код: Выделить всё
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);
}
}
}Я же говорю, я не знаток СИ и не могу сказать где и что можно оптимизировать.Chip115 писал(а):в чем заключается оптимизация? все переменные у меня объявлены типом,который не обходим для каждый переменной.
есть куча самописных функций. Как их можно оптимизировать? вообще есть какой нибудь алгоритм оптимизации кода... ? ну хотя бы в общих чертах? у меня 80% кода весит больше 2к . где раньше не компилировалось - я разобрался.
Что значит "можно как нибудь использовать"? Это память программ, туда помещается программа.Chip115 писал(а):32/16 Кбайт FLASH-памяти; это можно как нибудь использовать?
Chip115 писал(а):data это память данных,а code память программ? что значит xdata ?
Просто я не использовал в программе инициализацию. вот и материться что зря написано.Gudd-Head писал(а):Что-то у вас не то с процедурой инициализации УАППа.Chip115 писал(а):data это память данных,а code память программ? что значит xdata ?Data — ОЗУ, Xdata — внешнее ОЗУ, Code — флэш (сам код).
Код: Выделить всё
Память
- 2304 (256 + 2048) байт встроенного ОЗУ данных.
- 32/16 Кбайт FLASH-памяти; возможно внутрисистемное
программирование FLASH-памяти секторами по 512 байт.
- 64 байт ОЗУ с аварийным батарейным питанием (smaRTClock).Хе, а у вас Кейл с лекарством? Потому что мне больше 4 кбайт бесплатный компилировать не давал.Chip115 писал(а):она 32/16 Кбайт, а я чуть за 2500 залезаю и все. говорит что не хватает памяти.
Код: Выделить всё
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}; // ïðî÷èòàòü ðåãèñòð ñòàòóñà
//****************************************************** */