addi II 0 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба Здравствуйте! Есть программа, компилируеться в codemaster-96, принимает с компорта строки и отвечает на них Но правильный ответ происходит не постоянно, в основном либо нет ответа, либо ответ "error" На команду $01V200, должен быть ответ - !01 Скрин монитора во вложении Вот код, глаз замылен, не могу понять ошибку #include "uart.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> //#pragma CCB 0xCE #pragma CCB 0x2E //#define SP_MODE_1 0x09 #define TI_RI_MASK 0x3 //Transmit/Receive interrupt enable void int_Timer1OVF(); //#define PWM1_value 0x80 // 50% #pragma interrupt 0 int_Timer1OVF volatile unsigned char temp=0; volatile unsigned char PWM1_value; 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 unsigned char A,N,R; volatile unsigned char tv,tvl,tvh; //volatile char* data1; volatile unsigned char data1[16];//= "$AAM\r"; //volatile char* data2; 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-TPO-1000\r"; volatile char cmd2[] = "!02-TPO-1000\r"; volatile char reccmd1[] = "$01M\r"; volatile char error[] = "error"; volatile char stop[] = "stop"; volatile char reccmd2[] = "$02M\r"; volatile char toend[] = ">AA\r"; volatile char toend3[] = ">AA\r"; volatile char toend2[] = "!AA\r"; volatile char reccmd3[] = "#01S3\r"; volatile char reccmd10[] = "#01S7\r" ; volatile char reccmd11[] = "#01S8\r" ; volatile char reccmd22[] = "#01S2\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"; volatile unsigned char Uart[2]; volatile unsigned char toasc[2]; volatile unsigned char Hex; ///volatile char toend[] = ">AA\r"; volatile unsigned char count = 0; volatile unsigned char numb[2] = {0,0}; volatile unsigned char tempv, temp4; //volatile unsigned char 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; volatile unsigned char dat; volatile unsigned char dat2; volatile unsigned char dat4; volatile unsigned char dat5; volatile unsigned char dat6; volatile unsigned char dat7; void main() { volatile unsigned char i; __NOP(); __NOP(); __NOP(); __NOP(); pref=0, aa=0,b=0,dd=0,n=0,d=0; temp3 = 0; _ei_(); clk_init(); timer1_init() ; PWM1_value = 1; PWM1_init(); USART0_Init(SP_MODE_1); SPI_init(); // 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; tv =0 ; tvl = 0; tvh = 0; status_uart =0; IOPORT1 = 0xFF; cntglob = 0; IOPORT2 |= 0x80; IOPORT1 |= 0x04; for(i=0;i<16;i++) { data1[i] = 0; } for(i=0;i<16;i++) { data2[i] = 0; } adr = 0; dat = 255; dat2 = 255; dat4 = 255; dat5 = 255; dat6 = 255; dat7 = 255; A = 0; N = 0; R = 0; while(1) { if(temp == 1) { if((ByteReceived == 0x24) && (sts ==0)) { cntb = 0; sts = 1; data1[cntb] = ByteReceived; cntb++ ; ByteReceived = 0x00; temp = 0; } else { if((sts==1) && (ByteReceived == 0x0d)) { data1[cntb] = ByteReceived; data1[cntb + 1] = '\0'; if(data1[3]==0x56) { A = 0; N = 0; R = 0; sts = 0; temp = 0; ByteReceived = 0x00; numb[0] = data1[1]; numb[1] = data1[2]; numberch = hex2int((char*)numb); HEX2ASC2(numberch); A = data1[4] - 0x30; N = data1[5] - 0x30; R = data1[6] - 0x30; debugout = 0x01; for(i=0;i<16;i++) { data1[i] = 0; } } else { if(data1[3]==0x46) { sts = 0; temp = 0; ByteReceived = 0x00; numb[0] = data1[1]; numb[1] = data1[2]; numberch = hex2int((char*)numb); HEX2ASC2(numberch); tvl = data1[4] - 0x30; tvh = data1[5] - 0x30; tvl= tvl *22; tvh = tvh*6; tv = tvl + tvh; /* ((data[4]-'0')*6594+(data[5]-'0')*659 + 128) >> 8 íó èëè ((data[4]-'0')*6554+(data[5]-'0')*655 + 128) >> 8 */ debugout = 0x02; } else { if(debugout==0) //&& ((sts==1) && (ByteReceived == '\r')) ) { debugout = 254; sts = 0; temp = 0; ByteReceived = 0x00; } } } } else { if( (sts==1) && (ByteReceived != 0x0d) ) { data1[cntb] = ByteReceived; cntb++ ; temp = 0; ByteReceived = 0x00; } } } } else { __NOP(); __NOP(); __NOP(); if(tempd ) { obezgas(); tempd =0; } if((debugout== 0x01) && (sts == 0)) { IOPORT2 &= ~0x80; IOPORT1 &= ~0x04; SBUF_TX0 = '!';//ByteReceived;//0x01; do{status_uart = SP_STAT0;} while(!(status_uart & 0x08)); tr_s = 2;//((unsigned char)sizeof(toasc)) - 1; j = 0; do { SBUF_TX0 = toasc[j];//ByteReceived;//0x01; do{status_uart = SP_STAT0;} // while(!(status_uart & 0x20)) ; while(!(status_uart & 0x08)); tr_s --; j++; } while(tr_s); sts = 0; while(!(status_uart & 0x08)); IOPORT2 |= 0x80; IOPORT1 |= 0x04; debugout = 0; numberch = 0; toasc[0] = 0; toasc[1] = 0; toasc[0] = 0; numb[0] = 0; numb[1] = 0; adr = 0xC000 + A; switch(A){ case 0x02: { if((N==0) && (R == 1) ) dat2 |= 0x01; else if((N==0) && (R == 0)) dat2 &= ~0x01; if((N==1) && (R == 1) ) dat2 |= 0x02; else if((N==1) && (R == 0)) dat2 &= ~0x02; if((N==2) && (R == 1) ) dat2 |= 0x04; else if((N==2) && (R == 0) ) dat2 &= ~0x04; if((N==3) && (R == 1)) dat2 |= 0x08; else if((N==3) && (R == 0)) dat2 &= ~0x08; if((N==4) && (R == 1) ) dat2 |= 0x10; else if((N==4) && (R == 0)) dat2 &= ~0x10; if((N==5) && (R == 1) ) dat2 |= 0x20; else if((N==5) && (R == 0) ) dat2 &= ~0x20; if((N==6) && (R == 1) ) dat2 |= 0x40; else if((N==6) && (R == 0) ) dat2 &= ~0x40; if((N==7) && (R == 1) ) dat2 |= 0x80; else if((N==7) && (R == 0)) dat2 &= ~0x80; *(volatile unsigned char*)(adr) = dat2; } break; case 0x04: { if((N==0) && (R == 1) ) dat4 |= 0x01; else if((N==0) && (R == 0)) dat4 &= ~0x01; if((N==1) && (R == 1) ) dat4 |= 0x02; else if((N==1) && (R == 0)) dat4 &= ~0x02; if((N==2) && (R == 1) ) dat4 |= 0x04; else if((N==2) && (R == 0) ) dat4 &= ~0x04; if((N==3) && (R == 1)) dat4 |= 0x08; else if((N==3) && (R == 0)) dat4 &= ~0x08; if((N==4) && (R == 1) ) dat4 |= 0x10; else if((N==4) && (R == 0)) dat4 &= ~0x10; if((N==5) && (R == 1) ) dat4 |= 0x20; else if((N==5) && (R == 0) ) dat4 &= ~0x20; if((N==6) && (R == 1) ) dat4 |= 0x40; else if((N==6) && (R == 0) ) dat4 &= ~0x40; if((N==7) && (R == 1) ) dat4 |= 0x80; else if((N==7) && (R == 0)) dat4 &= ~0x80; *(volatile unsigned char*)(adr) = dat4; } break; case 0x05: { if((N==0) && (R == 1) ) dat5 |= 0x01; else if((N==0) && (R == 0)) dat5 &= ~0x01; if((N==1) && (R == 1) ) dat5 |= 0x02; else if((N==1) && (R == 0)) dat5 &= ~0x02; if((N==2) && (R == 1) ) dat5 |= 0x04; else if((N==2) && (R == 0) ) dat5 &= ~0x04; if((N==3) && (R == 1)) dat5 |= 0x08; else if((N==3) && (R == 0)) dat5 &= ~0x08; if((N==4) && (R == 1) ) dat5 |= 0x10; else if((N==4) && (R == 0)) dat5 &= ~0x10; if((N==5) && (R == 1) ) dat5 |= 0x20; else if((N==5) && (R == 0) ) dat5 &= ~0x20; if((N==6) && (R == 1) ) dat5 |= 0x40; else if((N==6) && (R == 0) ) dat5 &= ~0x40; if((N==7) && (R == 1) ) dat5 |= 0x80; else if((N==7) && (R == 0)) dat5 &= ~0x80; *(volatile unsigned char*)(adr) = dat5; } break; case 0x06: { if((N==0) && (R == 1) ) dat6 |= 0x01; else if((N==0) && (R == 0)) dat6 &= ~0x01; if((N==1) && (R == 1) ) dat6 |= 0x02; else if((N==1) && (R == 0)) dat6 &= ~0x02; if((N==2) && (R == 1) ) dat6 |= 0x04; else if((N==2) && (R == 0) ) dat6 &= ~0x04; if((N==3) && (R == 1)) dat6 |= 0x08; else if((N==3) && (R == 0)) dat6 &= ~0x08; if((N==4) && (R == 1) ) dat6 |= 0x10; else if((N==4) && (R == 0)) dat6 &= ~0x10; if((N==5) && (R == 1) ) dat6 |= 0x20; else if((N==5) && (R == 0) ) dat6 &= ~0x20; if((N==6) && (R == 1) ) dat6 |= 0x40; else if((N==6) && (R == 0) ) dat6 &= ~0x40; if((N==7) && (R == 1) ) dat6 |= 0x80; else if((N==7) && (R == 0)) dat6 &= ~0x80; *(volatile unsigned char*)(adr) = dat6; } break; case 0x07: { if((N==0) && (R == 1) ) dat7 |= 0x01; else if((N==0) && (R == 0)) dat7 &= ~0x01; if((N==1) && (R == 1) ) dat7 |= 0x02; else if((N==1) && (R == 0)) dat7 &= ~0x02; if((N==2) && (R == 1) ) dat7 |= 0x04; else if((N==2) && (R == 0) ) dat7 &= ~0x04; if((N==3) && (R == 1)) dat7 |= 0x08; else if((N==3) && (R == 0)) dat7 &= ~0x08; if((N==4) && (R == 1) ) dat7 |= 0x10; else if((N==4) && (R == 0)) dat7 &= ~0x10; if((N==5) && (R == 1) ) dat7 |= 0x20; else if((N==5) && (R == 0) ) dat7 &= ~0x20; if((N==6) && (R == 1) ) dat7 |= 0x40; else if((N==6) && (R == 0) ) dat7 &= ~0x40; if((N==7) && (R == 1) ) dat7 |= 0x80; else if((N==7) && (R == 0)) dat7 &= ~0x80; *(volatile unsigned char*)(adr) = dat7; } break; } // tempd = 1; } } Заренее благодарен! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба "Замечательный" способ писать программу в одном файле в один "поток" мега-функции main(). 29 минут назад, addi II сказал: глаз замылен, не могу понять ошибку Это и неудивительно, при таком стиле написания. Я вот тоже вообще ничего не могу понять, что и куда. Наиболее вероятные причины: - неверная работа с периферией, ошибки кода в последовательности приема/отправки - неверная логика парсинга, то есть проверки условий. Что можно (нужно) сделать: - прочитать мануал к МК и написать работу с периферией как он того требует, - переписать логику парсинга строки, написать проверки условий так, чтобы не было неоднозначностей и логических ошибок Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 41 минуту назад, EdgeAligned сказал: Наиболее вероятные причины: - неверная работа с периферией, ошибки кода в последовательности приема/отправки - неверная логика парсинга, то есть проверки условий. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 1 час назад, addi II сказал: Вот код В утиль такую "программу" и в сад программиста, сляпавшего такое @#$*& ! Всё переписать с нуля, нормально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба Ну дак как вот пытаться разгрести сиё "чудо", мало того, что засунутое в одну непрерывную портянку main(), так еще и без единого коммента, без самодокументированности, без пояснений? Кроме автора "портянки" никто и не разберется. Посему, пусть автор портянки и разргебает свои перлы. Я дал общие рекомендации, на что обратить внимание при написании, они известны каждому здравомыслящему: написать аппаратную часть строго по мануалу и протестировать, и написать парсинг строки, обращая особое внимание на логику, и оттестировать отдельно парсинг и затем совместно с аппаратной частью. Так делают все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба Да нормальный говнокод. Может помер говнокодер. Разобраться можно - глаза промыть только. Вы ж программист - разберёсь ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба Кстати... После исправления непарных скобок (отсутствовали две закрывающиеся скобки), получилась вот такая блок-схема сей занимательной пое$#%* : В левой части блок-схемы как раз находится парсинг строки. "Если первый принятый байт равен 0х24 (символ $ )..." и так далее. Пусть автор разгребает, че он там понаписал. А лучше конечно дождаться принятия всей строки до завершающего символа (если таковой есть) и затем проверить (сравнить в стандартной ф-ции strcmp() ) всю строку или её ключевую часть с требуемым шаблоном и сформировать ответную строку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 31 июля, 2023 Опубликовано 31 июля, 2023 · Жалоба 21 минуту назад, EdgeAligned сказал: получилась вот такая блок-схема Так так, а это что это у Вас такое, поделитесь)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 53 31 июля, 2023 Опубликовано 31 июля, 2023 (изменено) · Жалоба Старая древняя программулина, FlowChart называется. Не помню, откуда её взял и кто её делал. Суть проги - просматривает сишный файл и составляет блок-схему ветвлений, циклов, переходов. А, вот, в еёйном описании есть ссылка: Автозарисовщик блок-схем (almiur.ru) Изменено 31 июля, 2023 пользователем EdgeAligned 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться