Перейти к содержанию
    

глаз замылился, прошу посмотреть

Здравствуйте !

 

Есть простой код, написанный под МК который не поддерживает отладку

Поэтому если что-то не работает понять сложно

В коде присутствует три условия - 3 парсинга команд по UART

Прошу посмотреть его на предмет того почему условия больше 1 не работают

По отдельности если компилируешь каждое условие, оно работает

Но когда добавляешь хотя бы одно, - перестает

Спасибо!

void IRQ_uart_rx_tx()
{
  _di_();
  status_uart = SP_STAT0;    //?????????? ??????? ???????
  if (status_uart&0x40)     //???????????? ?????????? ?? ??????
  {
      ByteReceived = SBUF_RX0;
      temp = 1;
  }
  _ei_();
}
volatile unsigned char temp=0;
extern unsigned char ByteReceived;
extern unsigned char status_uart ;
volatile unsigned char sts;
volatile unsigned char c0_reg;
volatile unsigned char cntb;
volatile unsigned char cmd;
volatile unsigned char tr_s;
volatile unsigned char i;
volatile unsigned char j;
volatile unsigned char datah;
volatile unsigned char datal;
volatile unsigned char cntglob=0;
volatile char data1[6];
volatile char data2[16];
volatile char* data3;
volatile char* data4;
volatile char* data5;
volatile unsigned int adr = 0x8000;
volatile char* strres ;
volatile char cmd1[] = "!01-SPU-1000\r";
volatile char cmd2[] = "!02-SPU-1000\r";
volatile char reccmd1[] = "$01M\r";
volatile char error[] = "error";
volatile char reccmd2[] = "$02M\r";
volatile char toend[] = ">AA\r";
volatile char toend3[] = ">AA\r";
volatile char reccmd3[] = "#01S3\r";
volatile char reccmd10[] = "#01S7\r"  ;
volatile char reccmd11[] = "#01S8\r" ;
volatile char reccmd4[] = "#02S3\r";
volatile char toend4[] = "!013\r";
volatile char toend5[] = "!023\r";
volatile char toend10[] = "!ADC value:\r";
volatile char toend11[] = "!Stop obezgaz!:\r";
unsigned char tempo=0xFF;
volatile uint16_t pref, aa,b,dd,n,d;
volatile unsigned char debugout;
volatile unsigned char temp3, kk;
volatile unsigned char tempd;
extern unsigned char ByteReceived;
void main()
{
        unsigned char c, tmp2;
        __NOP();
        __NOP();
        __NOP();
        __NOP();
         pref=0, aa=0,b=0,dd=0,n=0,d=0;
         temp3 = 0;
        _ei_();
        timer1_init() ;
        USART0_Init(SP_MODE_1);
         tempv = 0;
         sts=0;
         cntb=0;
         cmd=0;
         tr_s=0;
         i=0;
         j=0;
         tempd = 0;
         debugout =0;
         c0_reg = 0;
        IOPORT1 = 0x00;
        IOPORT2 = 0x00;
        IOPORT3 = 0x00;
        IOPORT4 = 0x00;
        IOPORT1 = 0xFF;
        IOPORT2 = 0xFF;
        IOPORT3 = 0xFF;
        IOPORT4 = 0xFF;
        IOPORT2 &= ~0x80;
        IOPORT1 &= ~0xFF;
        ByteReceived = 0;
        temp = 0;
        status_uart =0;
        IOPORT1 = 0xFF;
        cntglob = 0;
        IOPORT2 |= 0x80;

   while(1)
   {
    if(temp == 1)
    {			
		        if((ByteReceived == 0x23) && (sts == 0)) 
                {
                       cntb = 0;
                       sts = 2;
                       data2[cntb] = ByteReceived;
                       cntb++ ;
                       ByteReceived = 0x00;
                       temp = 0;
                }
                else
                {
                        if((sts==2) && ((ByteReceived == 0x0d) || (ByteReceived == 0x0D)) && cntb == 5)
                        {
                               data2[cntb ] =  ByteReceived ;
                               data2[cntb+1] = '\0';
                               if(strcmp((const char *)data2,(const char *) reccmd3) == 0 )
                               {
                                       debugout = 0x08;
                               }
							  sts = 0;
							  temp = 0;
							  ByteReceived = 0x00;
                        }
                        else
                        {
                               if((sts==2) && (cntb <5))
                               {
                                data2[cntb] = ByteReceived;
                                cntb++ ;
                                temp = 0;
                                ByteReceived = 0x00;
                               }
                        }
                }
				
				if((ByteReceived == 0x23) && (sts == 0))
                {
                       cntb = 0;
                       sts = 3;
                       data2[cntb] = ByteReceived;
                       cntb++ ;
                       ByteReceived = 0x00;
                       temp = 0;
                }
                else
                {
                        if((sts==3) && ((ByteReceived == 0x0d) || (ByteReceived == 0x0D)) && cntb == 5)//(cntb==(strlen("#AABDD"))))
                        {
                                data2[cntb ] =  ByteReceived ;
                                data2[cntb+1] = '\0';
                                if(strcmp((const char *)data2,(const char *) reccmd10) == 0 )
                                {
                                        debugout = 0x11;
                                }
                                sts = 0;
                                temp = 0;
                                ByteReceived = 0x00;
                        }
                        else
                        {
                               if((sts==3) && (cntb <5))//(cntb<(strlen("#01s3"))))
                               {
									data2[cntb] = ByteReceived;
									cntb++ ;
									temp = 0;
									ByteReceived = 0x00;
                               }
                        }
                }
				
		        if((ByteReceived == 0x23) && (sts == 0))
                {
                       cntb = 0;
                       sts = 4;
                       data2[cntb] = ByteReceived;
                       cntb++ ;
                       ByteReceived = 0x00;
                       temp = 0;
                }
                else
                {
                        if((sts==4) && ((ByteReceived == 0x0d) || (ByteReceived == 0x0D)) && cntb == 6)
                        {
                               data2[cntb ] =  ByteReceived ;
                               data2[cntb+1] = '\0';
                               if(strcmp((const char *)data2,(const char *) reccmd11) == 0 )
                               {
                                       debugout = 0x12;
                               }
                               sts = 0;
                               temp = 0;
                               ByteReceived = 0x00;
                        }

                        else
                        {
                               if((sts==2) && (cntb <6))
                               {
									data2[cntb] = ByteReceived;
									cntb++ ;
									temp = 0;
									ByteReceived = 0x00;
                               }
                        }


                }
                
        }
        else
        {
				if((debugout== 0x08)   && (sts == 0))
                {
					IOPORT2 &= ~0x80;
					tr_s = ((unsigned char)sizeof(toend4)) - 1;
					j = 0;
					do
					{
							SBUF_TX0 = toend4[j];
							do{status_uart = SP_STAT0;}
							while(!(status_uart & 0x08));
							tr_s --;
							j++;
					}
					while(tr_s);
					sts = 0;
					while(!(status_uart & 0x08));
					IOPORT2 |= 0x80;
					debugout = 0;
					tempd = 1;
                }
				
				if((debugout == 0x11)    && (sts == 0))
                {       
					IOPORT2 &= ~0x80;
                    tr_s = ((unsigned char)sizeof(toend10)) - 1;
					j = 0;
					do
					{
							SBUF_TX0 = toend10[j];
							do{status_uart = SP_STAT0;}
							while(!(status_uart & 0x08));
							tr_s --;
							j++;
					 }
					while(tr_s);
					sts = 0;
					cntb = 0;
					debugout = 0;
					while(!(status_uart & 0x08));
					adr = 0xC000;
					*(volatile short*)(adr) = 0x01;
				    datah = SPI_Send(0x01);
				    datal = SPI_Send(0x02);
				    Uart[1] = datah;
				    Uart[0] = datal;
					tr_s = ((unsigned char)sizeof(Uart)) - 1;
					j = 0;
					do
					{
							SBUF_TX0 = Uart[j];
							do{status_uart = SP_STAT0;}
							while(!(status_uart & 0x08));
							tr_s --;
							j++;
					 }
					while(tr_s);
					sts = 0;
					cntb = 0;
					debugout = 0;
					while(!(status_uart & 0x08));
					IOPORT2 |= 0x80;

                }
                if((debugout== 0x12)   && (sts == 0))
                {
                        IOPORT2 &= ~0x80;
                        tr_s = ((unsigned char)sizeof(toend11)) - 1;
                        j = 0;
                        do
                        {
                                SBUF_TX0 = toend11[j];
                                do{status_uart = SP_STAT0;}
                                while(!(status_uart & 0x08));
                                tr_s --;
                                j++;
                        }
                        while(tr_s);
                        sts = 0;
                        while(!(status_uart & 0x08));
                        IOPORT2 |= 0x80;
                        debugout = 0;
                        adr = 0xC004;
                        *(volatile short*)(adr) = 0xFF;
                }
                
		}
   }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если аппаратная отладка не работает, что мешает перенести код на PC и отладить там. Или на эмуляторе "родного" контроллера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  

да уж, ну и код...

одно и то же условие повторяется 3 раза:

Цитата

if((ByteReceived == 0x23) && (sts == 0)) {...} else {...}

при этом в каждой ветке условия if ... else вы не прерываете выполнение обработки, хотя у вас обработка всего одного байта идёт. Обработчик может по одному входящему байту выполнить сразу 2 условия.

Добавьте перед каждой закрывающей скобкой в обработчике:

Цитата

continue; }

А вообще, обработчик написан как каша - всё в одну кучу. Рекомендую изменить подход к написанию кода:

1) отсечь все варианты, которые вам не подходят:

Цитата

if (sts == 0) continue;

2) обработчик запихнуть в switch (не забывать аналогично про break!!!!!)
 

Цитата

 

switch () {

case A: {...; break;}

... }

 

3) вы ведь понимаете, что ваш обработчик будет принципиально терять входящие данные в случае их быстрого поступления, т.к. вторая часть кода занимается ретрансляцией данных в ручном режиме без возможности своевременной обработки нового входящего байта?...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 минут назад, Aaron сказал:

  да уж, ну и код...

Я даже не стал отвечать на исходный пост, так как единственный совет там - всё переписать заново, нормально, с задействованием головы. Смысла нет рабираться в той каше...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно сказали, что код больше на кашу похож, отсюда и поведение соответствующее. 

Изменено пользователем ДЕЙЛ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 07.08.2022 в 18:02, aaarrr сказал:

Этому никак не помочь, увы.

это, чтобы наверняка, если в первый раз не сработает 🙂

jmp label

jmp label

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 minutes ago, Xekep said:

это, чтобы наверняка, если в первый раз не сработает 🙂

Боюсь, тут дело глубже: обратите внимание на смену регистра шестнадцатиричной константы в последовательных сравнениях.

0x0d -> 0x0D

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, aaarrr сказал:

0x0d -> 0x0D

Я бы посоветовал проверить байт ещё и на равенство 0x000D и 0x000d, соответственно. Ну и условие

ByteReceived == (0x0d|0x0D)

тоже бы не помешало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, tgruzd said:

Я бы посоветовал

Почаще читать стандарт С

https://learn.microsoft.com/en-us/cpp/c-language/c-integer-constants?view=msvc-170

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...