11 Replies Latest reply on Jan 11, 2019 10:07 PM by MoTa_728816

    UART DMA

    tavonunez260_3626206

      Hello everyone, I hope you are OK. I have found out on the forums around here that the best way to send data from Filter to UART is by interrupt request. I have developed so on my project, but for some unknown reason my project doesn't work. Can someone give me a hand? Thanks before hand.

        • 1. Re: UART DMA
          MoTa_728816

          Hi,

           

          You started isr which requires UART before starting UART.

          I modified your main as below, and it seems to be orking.

           

          ====================

              CyGlobalIntEnable; /* Enable global interrupts. */

             

              Filter_Start();

              Filter_SetCoherency(Filter_CHANNEL_A, Filter_KEY_LOW);

          //    isr_Filter_StartEx(Filter_UART);

          //    isr_UART_StartEx(UART_Receive);

              UART_Start();

              ADC_Start();

              ADC_StartConvert();

             

              sprintf(TransmitBuffer, "program started! (%s %s)\n", __DATE__, __TIME__) ;

              UART_PutString(TransmitBuffer) ;

             

              isr_Filter_ClearPending() ;

              isr_Filter_StartEx(Filter_UART);

             

              isr_UART_ClearPending() ;

              isr_UART_StartEx(UART_Receive);

          ====================

           

          moto

          • 2. Re: UART DMA
            tavonunez260_3626206

            Could you check once more? Please

            It doesn't seem to show any result on the UART Port.

             

            I already implemented your corrections.

             

            Thanks beforehand.

            Gustavo.

            • 3. Re: UART DMA
              MoTa_728816

              Dear Gustavo-san,

               

              Indeed the project you attached this time did now work for me either.

              As the previous project was working, I ran diff on main.c for both project.

              <     CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)ADC_DEC_SAMP_PTR), LO16((uint32)Filter_STAGEA_PTR));

              ---

              >     CyDmaTdSetAddress(DMA_1_TD[0], LO16((uint32)ADC_DEC_SAMP_PTR), LO16((uint32)Filter_STAGEB_PTR));

               

              So you changed Filter_STAGEA_PTR to Filter_STAGEB_PTR and it caused the project hang.

               

              Returning to the UART story, there was another point which I should have mentioned in the earlier post,

              which is the clock frequency of UART.

              You assigned "16Mhz" for the UART clock, so the baudrate of the UART is "2 MBaud".

              I assumed that you have some UART hardware which requires "2MHz" baud.

               

              000-UART.JPG

               

              002-UART-Config-ExtClock.JPG

               

              001-UART-Config.JPG

               

              But as my PC and TeraTerm set up does not allow such baud rate, I changed the UART setup

              (1) use internal clock

              (2) baud rate = 115200

              003-UART-Config-IntClock.JPG

               

              004-UART-Config-115200.JPG

               

              The the schematic looked like below

               

              005-UART2.JPG

               

              Although Clock_1 is not used anymore, in case you need "2 MBaud",

              I left it as it is.

               

              When I debugged your program with PC/TeraTerm, the log looked like below.

              At first the program showed the "Program started!.." line.

              When I typed 's" the "Sample:.. " lines started showing up.

              Then when I typed 'x' it stopped.

              I hope this was the way how you expected your program to work, right?

              006-TeraTerm-Log.JPG

               

              Attached is the project archive I tested.

              Note: Since the only 5LP board I have access is CY8CKIT-050,

              so I changed the device to CY8C5868AXI-LP035 in project "FILTER_190110"

               

              Best Regards,

              10-Jan-2019

              Motoo Tanaka

              • 4. Re: UART DMA
                tavonunez260_3626206

                Thanks a lot for your help Motoo sama.

                 

                Here is the thing, I have a 2MHz Baud rate device connected. I am trying to build an oscilloscope with a low bandwidth, up to 2khz. I did it at first only with ADC and UART modules.

                By the way, this is some other project I have, which it works.

                 

                I am only connecting to P3_5 VDD this time, so this is the result.

                 

                Now the thing I need is to filter the signal, that's why I added the filter to the schematic. But this time for some reason the UART, like you saw, it only shows zeroes but it doesn't print any real values read from the ADC. I am doing this in this way because I've read in some forums that the best way to send filter vales to UART port is by an interrupt.

                 

                If it is not much to ask, I would like you to try with a random sinusoidal signal on P3_5 with an offset so it could be fully read. And also I would appreciate your help.

                 

                Gustavo san

                • 5. Re: UART DMA
                  MoTa_728816

                  Dear Gustavo-san,

                   

                  So I tried to connect a funcgen, which I wrote with mbed a few years ago.

                  funcgen - Yet another implementation of wave function gen... | Mbed

                   

                  And I generated a 3.00V pp Sine wave.

                  000-Funcgen-log.JPG

                   

                  First with the filter

                  002-TeraTerm_filter.JPG

                   

                  Then I modified the program to refer to the ADC value

                  //            Output = Filter_Read8(Filter_CHANNEL_A + 128u);

                              Output = ADC_GetResult8() ;

                  001-TeraTerm-log.JPG

                   

                  So the good news is that at least ADC is doing its job.

                  The bad news is that the result from the filter is always 0 for the time being.

                   

                  Best Regards,

                  11-Jan-2019

                  Motoo Tanaka

                  P.S. I also wrote an oscilloscope there ;-)

                  oscilloscope - A simple oscilloscope using Adafruit 2.8" TFT w... | Mbed

                  • 6. Re: UART DMA
                    user_342122993

                    tavonunez_260,

                    attached is DelSig-Filter-DVDAC project using interrupt to write data from the Filter to DVDAC. Use this code and substitute DVDAC with UART.

                    Secondly, never put formatting / UART statements inside ISR:

                                {  

                                    // Format ADC result for transmition

                                    sprintf(TransmitBuffer, "Sample: %5ld mV\r\n", Output);

                                    // Send out the data

                                    UART_PutString(TransmitBuffer);

                                }

                    This hangs interrupt for indefinite time and may lead to non-working code. Instead set a flag and process it in the main loop.

                    /odissey1

                    DelSigADC-Filter-DVDA_01a_scm.png

                    1 of 1 people found this helpful
                    • 7. Re: UART DMA
                      tavonunez260_3626206

                      Thanks my friend.

                      So, the thing is that you're suggesting an algorithm written in the main loop with a flag right? A polling process, meaning. Because I don't see any other way of sending filter values from filter to UART but by formatting. Could you give me an example? I'd appreciate it.

                       

                      Gustavo.

                      • 8. Re: UART DMA
                        tavonunez260_3626206

                        Exactly Motoo! I have just checked and you are right. I am about to consider the way of sending the Filter data to UART by using polling instead of interrupt.

                         

                        Gustavo.

                        • 9. Re: UART DMA
                          MoTa_728816

                          Dear Gustavo-san,

                           

                          I have just noticed something!

                              Output = Filter_Read8(Filter_CHANNEL_A + 128u);

                           

                          Didn't you mean ?

                               Output = Filter_Read8(Filter_CHANNEL_A)  + 128u ;

                           

                          The current line should always generate 0 as it is.

                           

                          Best Regards,

                          12-Jan-2019

                          Motoo Tanaka

                          • 10. Re: UART DMA
                            tavonunez260_3626206

                            Hello Motoo, this time didn't work either and not even by polling. I guess I'll have to implement the filter analogically.

                            Thanks for your help!

                             

                            Gustavo.

                            • 11. Re: UART DMA
                              MoTa_728816

                              Dear Gustavo-san,

                               

                              > this time didn't work either

                              I'm sorry for hearing that.

                               

                              When I read your CY_ISR(Filter_UART) the first line

                               

                                  if(ADC_IsEndConversion(ADC_WAIT_FOR_RESULT))

                               

                              does not make sense, since this condition check should have been done before the filter does its work,

                              so as /odissey1-san suggested duplicate and learn how the existing working project is doing will be very helpful.

                               

                              Meantime, although I agree /odissey1-san the we should not put formatted print in an ISR,

                              I'd suggest you to attack one problem at a time.

                               

                              So I recommend you to decide which problem you solve first and concentrate on that one.

                              For example

                              (1) If you want to make UART polling work, then just use ADC output value for the data.

                              (2) If you want to make the filter work, don't worry about fixing the print format

                                  as at least it is working for UART terminal (not a recommended method though).

                               

                              Best Regards,

                              12-Jan-2019

                              Motoo Tanaka