Announcement

Collapse
No announcement yet.

Serial ports counts error

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Serial ports counts error

    Click image for larger version

Name:	20190127_065958.jpg
Views:	35
Size:	1.31 MB
ID:	66879
    Hello,

    I connected RX0 and RX1 to a microcontroller PIC18.

    I have two counters on the screen, see picture attached, sometimes I got increment of 256 instead of 1,2,3....

    I tried lower the baud rate but it is not solving the problem.

    It looks like pwr on/off some times help.

    The Micro PIC18 CODE for both uart:

    " (all Long types)

    byte1 = Temp_value_12 >> 8 ;
    byte2 = Temp_value_12 & 0x00FF;
    // unsigned char result = ( ( byte1 - '0' ) << 4 ) | ( byte2 - '0' );

    putc(byte1, uart2);
    putc(byte2, uart2);

    "


    PICASO CODE:

    "

    #platform "uLCD-32PTU"

    #inherit "VisualConst.inc"

    #inherit "NegDigitsConst.inc"

    #inherit "ledDigitsDisplay-ve.inc"

    #inherit "VisualConst.inc"

    //#inherit "spectrumConst.inc"

    func main()
    var numx, ch, numx1, ch1, numx2, ch2;
    var combuf[10] ;
    var combuf1[10] ;
    var bar, frame ;
    var i, x, y, state, n, Wbs1, Wbs3to5, WHITE, BLACK, FUCHSIA ;

    putstr("Mounting...\n");
    if (!(file_Mount()))
    while(!(file_Mount()))
    putstr("Drive not mounted...");
    pause(200);
    gfx_Cls();
    pause(200);
    wend
    endif
    hndl := file_LoadImageControl("NEGDIG~1.dat", "NEGDIG~1.gci", 1);
    Wbs1 := 0 ; // up, set to non zero (specifically 2) when down
    snd_BufSize(3);
    snd_Volume(127);
    file_PlayWAV("bl16k.wav");
    while(snd_Playing());

    gfx_Set(SCREEN_MODE,LANDSCAPE_R);
    com_Init(combuf, 8, 0);
    com1_Init(combuf1, 8, 0);
    com_SetBaud(COM0, 120); //9600 / 10
    com_SetBaud(COM1, 120); //9600 / 10

    //gfx_Set(CONTRAST,5) ;
    //txt_Set(TEXT_OPACITY, OPAQUE);

    //gfx_TransparentColour(0x0020);
    //gfx_Transparency(ON);


    // Label2 1.0 generated 04/11/2017 01:31:54
    //txt_FGcolour(WHITE) ;
    //txt_BGcolour(BLACK) ;
    gfx_MoveTo(244, 164) ;
    putstr ("Reset") ;

    //pin_Set(OUTPUT, AUDIO_ENABLE);
    pin_HI(AUDIO_ENABLE);

    // Winbutton1 generated 20/12/2011 3:55:28 PM
    // img_SetWord(hndl, iWinbutton1, IMAGE_FLAGS, (img_GetWord(hndl, iWinbutton1, IMAGE_FLAGS) | I_STAYONTOP) & ~I_TOUCH_DISABLE); // set to enable touch, only need to do this once

    //serout('Test') ; // SERIAL TEST
    // to(COM0); print("serial input test:\n");
    //trout('\n');OM1); print("serial input test:\n");


    img_ClearAttributes(hndl, i4Dbutton1, I_TOUCH_DISABLE); // set to enable touch, only need to do this once
    img_SetWord(hndl, i4Dbutton1, IMAGE_INDEX, 0); // where state is 0 for up and 1 for down
    img_Show(hndl,i4Dbutton1) ;

    img_ClearAttributes(hndl, i4Dbutton2, I_TOUCH_DISABLE); // set to enable touch, only need to do this once
    img_SetWord(hndl, i4Dbutton2, IMAGE_INDEX, 0); // where state is 0 for up and 1 for down
    img_Show(hndl,i4Dbutton2) ;

    // Image1 1.0 generated 02/11/2017 12:59:13
    img_Show(hndl,iImage1) ;

    touch_Set(TOUCH_ENABLE); // enable the touch screen
    img_Show(hndl, iLeddigits2); // show all digits at 0, only do this once
    img_Show(hndl, iLeddigits1); // show all digits at 0, only do this once
    //img_Show(hndl,iCoolgauge2) ;
    //img_Show(hndl,iCoolgauge1) ;

    // Statictext1 1.0 generated 26/01/2019 23:48:56
    img_Show(hndl,iStatictext1) ;

    // Statictext2 1.0 generated 26/01/2019 23:49:02
    img_Show(hndl,iStatictext2) ;

    repeat
    txt_FGcolour(WHITE) ;



    //ch := serin();
    if(com_Count() > 1)

    ch := (serin() << 8 ) + serin();
    endif
    state := touch_Get(TOUCH_STATUS); // get touchscreen status
    n := img_Touched(hndl,-1) ;

    //if (ch != -1)
    gfx_MoveTo(0,0);
    //print( [CHR] ch ); // if a key was received from PC, print its ascii value

    numx := ch; //RAND() % 999 ;

    // Leddigits1 1.0 generated 23/01/2019 23:57:34


    // Leddigits1 1.0 generated 26/01/2019 23:46:14
    ledDigitsDisplay(numx, iLeddigits1+1, 120, 4, 1, 41, 1) ;


    // Coolgauge1 1.0 generated 26/01/2019 23:27:46
    // img_SetWord(hndl, iCoolgauge1, IMAGE_INDEX, numx) ; // where frame is 0 to 100 (for a displayed -1 to -1)


    if(com1_Count() > 1)

    ch1 := (serin1() << 8 ) + serin1();
    endif
    state := touch_Get(TOUCH_STATUS); // get touchscreen status
    n := img_Touched(hndl,-1) ;

    //if (ch != -1)
    gfx_MoveTo(0,0);
    //print( [CHR] ch ); // if a key was received from PC, print its ascii value

    numx1 := ch1; //RAND() % 999 ;


    // Leddigits2 1.0 generated 26/01/2019 23:46:31
    ledDigitsDisplay(numx1, iLeddigits2+1, 124, 4, 1, 40, 1) ;

    // Coolgauge2 1.0 generated 26/01/2019 23:29:04
    // img_SetWord(hndl, iCoolgauge2, IMAGE_INDEX, numx1) ; // where frame is 0 to 100 (for a displayed -1 to -1)



    //-----------------------------------------------------------------------------------------
    if(state == TOUCH_RELEASED) // if there's a release
    if (n == i4Dbutton1)
    if (Wbs1) Wbs1 := 0 ; else Wbs1 := 2 ; // toggle status
    img_SetWord(hndl, i4Dbutton1, IMAGE_INDEX, Wbs1); // where state is 0 for up, 1 for down, 2 for 'on' up and 3 for 'on' down
    img_Show(hndl,i4Dbutton1) ;
    print([DEC3ZB] 'a') ;
    // ASCII number written to the com port, or
    //serout(ch >> 8) ;
    serout('a') ;
    snd_BufSize(30);
    snd_Volume(30);
    file_PlayWAV("bleep1.wav");
    while(snd_Playing());
    endif

    if (n == i4Dbutton2)
    if (Wbs1) Wbs1 := 0 ; else Wbs1 := 2 ; // toggle status
    img_SetWord(hndl, i4Dbutton2, IMAGE_INDEX, Wbs1); // where state is 0 for up, 1 for down, 2 for 'on' up and 3 for 'on' down
    img_Show(hndl,i4Dbutton2) ;
    print([DEC3ZB] 'f') ;
    // ASCII number written to the com port, or
    //serout(ch >> 8) ;
    serout('f') ;
    snd_BufSize(30);
    snd_Volume(30);
    file_PlayWAV("beep.wav");
    while(snd_Playing());
    endif

    //-----------------------------------------------------------------------------------------
    if(state == TOUCH_MOVING) // if it's moving
    x := touch_Get(TOUCH_GETX);
    y := touch_Get(TOUCH_GETY);
    endif

    state := touch_Get(TOUCH_STATUS); // get touchscreen status
    n := img_Touched(hndl,-1) ;

    //-----------------------------------------------------------------------------------------
    if(state == TOUCH_PRESSED) // if there's a press
    x := touch_Get(TOUCH_GETX);
    y := touch_Get(TOUCH_GETY);
    if (n == i4Dbutton1)
    img_SetWord(hndl, i4Dbutton1, IMAGE_INDEX, Wbs1+1); // where state is 0 for up, 1 for down, 2 for 'on' up and 3 for 'on' down
    img_Show(hndl,i4Dbutton1);
    print([DEC3ZB] 's') ;
    // ASCII number written to the com port, or
    //serout(ch >> 8) ;
    serout('s') ;

    endif
    endif

    endif

    forever
    endfunc
    "



    THANKS
    EYALL







  • #2
    Hi,

    I have noticed that, in your code, there's a blocking code as shown below:

    Code:
    while(snd_Playing());
    Blocking codes such as for loop, while loop and pause(), are not recommended to use when there's a running serial routine function.

    These control structure/function may affect the serial synchronization of the display to the MCU.

    Please try to remove / comment out them as much as possible, and observe if it works normal.



    Please let me know if it works.

    Best regards,
    Kayven
    Last edited by kayven@4d; 30th January 2019, 10:52 AM.

    Comment


    • #3
      Hi,

      Additional to my reply.

      Designer or ViSi Loop Back Testing with a PIC MCU

      If you have not seen this application note yet, it may help you with your current concern.

      Best regards,
      Kayven
      Last edited by kayven@4d; 30th January 2019, 11:17 AM.

      Comment

      Working...
      X