addi II 1 6 августа, 2022 Опубликовано 6 августа, 2022 · Жалоба Здравствуйте ! Есть простой код, написанный под МК который не поддерживает отладку Поэтому если что-то не работает понять сложно В коде присутствует три условия - 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; } } } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 7 августа, 2022 Опубликовано 7 августа, 2022 · Жалоба Если аппаратная отладка не работает, что мешает перенести код на PC и отладить там. Или на эмуляторе "родного" контроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 7 августа, 2022 Опубликовано 7 августа, 2022 · Жалоба 21 hours ago, addi II said: (ByteReceived == 0x0d) || (ByteReceived == 0x0D) Этому никак не помочь, увы. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aaron 1 9 августа, 2022 Опубликовано 9 августа, 2022 · Жалоба да уж, ну и код... одно и то же условие повторяется 3 раза: Цитата if((ByteReceived == 0x23) && (sts == 0)) {...} else {...} при этом в каждой ветке условия if ... else вы не прерываете выполнение обработки, хотя у вас обработка всего одного байта идёт. Обработчик может по одному входящему байту выполнить сразу 2 условия. Добавьте перед каждой закрывающей скобкой в обработчике: Цитата continue; } А вообще, обработчик написан как каша - всё в одну кучу. Рекомендую изменить подход к написанию кода: 1) отсечь все варианты, которые вам не подходят: Цитата if (sts == 0) continue; 2) обработчик запихнуть в switch (не забывать аналогично про break!!!!!) Цитата switch () { case A: {...; break;} ... } 3) вы ведь понимаете, что ваш обработчик будет принципиально терять входящие данные в случае их быстрого поступления, т.к. вторая часть кода занимается ретрансляцией данных в ручном режиме без возможности своевременной обработки нового входящего байта?... 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 9 августа, 2022 Опубликовано 9 августа, 2022 · Жалоба 7 минут назад, Aaron сказал: да уж, ну и код... Я даже не стал отвечать на исходный пост, так как единственный совет там - всё переписать заново, нормально, с задействованием головы. Смысла нет рабираться в той каше... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ДЕЙЛ 32 17 августа, 2022 Опубликовано 17 августа, 2022 (изменено) · Жалоба Правильно сказали, что код больше на кашу похож, отсюда и поведение соответствующее. Изменено 17 августа, 2022 пользователем ДЕЙЛ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xekep 2 6 января, 2023 Опубликовано 6 января, 2023 · Жалоба В 07.08.2022 в 18:02, aaarrr сказал: Этому никак не помочь, увы. это, чтобы наверняка, если в первый раз не сработает 🙂 jmp label jmp label Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 6 января, 2023 Опубликовано 6 января, 2023 · Жалоба 30 minutes ago, Xekep said: это, чтобы наверняка, если в первый раз не сработает 🙂 Боюсь, тут дело глубже: обратите внимание на смену регистра шестнадцатиричной константы в последовательных сравнениях. 0x0d -> 0x0D Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 7 января, 2023 Опубликовано 7 января, 2023 · Жалоба 9 часов назад, aaarrr сказал: 0x0d -> 0x0D Я бы посоветовал проверить байт ещё и на равенство 0x000D и 0x000d, соответственно. Ну и условие ByteReceived == (0x0d|0x0D) тоже бы не помешало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 7 января, 2023 Опубликовано 7 января, 2023 · Жалоба 1 minute ago, tgruzd said: Я бы посоветовал Почаще читать стандарт С https://learn.microsoft.com/en-us/cpp/c-language/c-integer-constants?view=msvc-170 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 7 января, 2023 Опубликовано 7 января, 2023 · Жалоба 1 минуту назад, x893 сказал: Почаще читать стандарт С да зачем? и так всё понятно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 60 7 января, 2023 Опубликовано 7 января, 2023 · Жалоба 1 minute ago, tgruzd said: да зачем? Что бы знаний было больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться