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

прошу помочь определить ошибку

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

 

Есть программа, компилируеться в 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;


                }



}

Заренее благодарен!

monitor.jpg

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


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

"Замечательный" способ писать программу в одном файле в один "поток" мега-функции main(). 

29 минут назад, addi II сказал:

глаз замылен, не могу понять ошибку

Это и неудивительно, при таком стиле написания. Я вот тоже вообще ничего не могу понять, что и куда.

Наиболее вероятные причины:
- неверная работа с периферией, ошибки кода в последовательности приема/отправки
- неверная логика парсинга, то есть проверки условий.

Что можно (нужно) сделать:
- прочитать мануал к МК и написать работу с периферией как он того требует,
- переписать логику парсинга строки, написать проверки условий так, чтобы не было неоднозначностей и логических ошибок

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


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

41 минуту назад, EdgeAligned сказал:

Наиболее вероятные причины:
- неверная работа с периферией, ошибки кода в последовательности приема/отправки
- неверная логика парсинга, то есть проверки условий.

:biggrin:

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


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

1 час назад, addi II сказал:

Вот код

:shok::shok::shok:

В утиль такую "программу" и в сад программиста, сляпавшего такое @#$*& ! Всё переписать с нуля, нормально.

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


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

Ну дак как вот пытаться разгрести сиё "чудо", мало того, что засунутое в одну непрерывную портянку main(), так еще и без единого коммента, без самодокументированности, без пояснений? Кроме автора "портянки" никто и не разберется. Посему, пусть автор портянки и разргебает свои перлы. Я дал общие рекомендации, на что обратить внимание при написании, они известны каждому здравомыслящему: написать аппаратную часть строго по мануалу и протестировать, и написать парсинг строки, обращая особое внимание на логику, и оттестировать отдельно парсинг и затем совместно с аппаратной частью. Так делают все.

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


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

Да нормальный говнокод. Может помер говнокодер. Разобраться можно - глаза промыть только.

Вы ж программист - разберёсь !

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


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

Кстати... После исправления непарных скобок (отсутствовали две закрывающиеся скобки), получилась вот такая блок-схема сей занимательной пое$#%* :

 

111.png

В левой части блок-схемы как раз находится парсинг строки.
"Если первый принятый байт равен 0х24 (символ $ )..." и так далее. Пусть автор разгребает, че он там понаписал. 

А лучше конечно дождаться принятия всей строки до завершающего символа (если таковой есть) и затем проверить (сравнить в стандартной ф-ции strcmp() ) всю строку или её ключевую часть с требуемым шаблоном и сформировать ответную строку.

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


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

21 минуту назад, EdgeAligned сказал:

получилась вот такая блок-схема

Так так, а это что это у Вас такое, поделитесь))

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


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

Старая древняя программулина, FlowChart называется. Не помню, откуда её взял и кто её делал. Суть проги - просматривает сишный файл и составляет блок-схему ветвлений, циклов, переходов. 

А, вот, в еёйном описании есть ссылка: Автозарисовщик блок-схем (almiur.ru)

Изменено пользователем EdgeAligned

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


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

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

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

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

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

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

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

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

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

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