This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problem in PWM and UART (T89C51AC2)

#include <t89c51ac2.h>
//#include <math.h>

void serialInterrupt (void);
volatile char uart_data;

char duty;

void main(void)
{

        // Set up UART mode
        SCON = 0x50;                    // uart in mode 1 (8 bit), REN=1
        TMOD = TMOD | 0x20 ;    // Timer 1 in mode 2
        TH1 = 0xFB;                     // 9600 Bds at 18.432MHz
        TL1 = 0xFB;                     // 9600 Bds at 18.432MHz
        ES = 1;                                 // Enable serial interrupt
        EA = 1;                                 // Enable global interrupt      */
        TR1 = 1;

        // Set up PWM mode
        CMOD = 0x02;                    // Setup PCA timer
        CL = 0x00;
        CH = 0x00;
        CCAP0L = 0x40;                  // Set the initial value same as CCAP0H
        CCAP0H = 0x40;                  // 75% Duty Cycle
        CCAPM0 = 0x42;                  // Setup PCA module 0 in PWM mode.
        CR = 1;                                 // Start PCA Timer.*/



        // Init variable

        uart_data = 128;                        // 50% Duty Cycle


        //Program main routime, do forever
        while (1)
        {
                P2 = 0xFF;                      // turn off all lamps (for test)
                P2_2=0;                         // Turn on
                CCAP0H = (int) uart_data;

        }
}

void serialInterrupt (void) interrupt 4 using 1{
        if (RI)
        {                                                               // Byte received on UART.

                uart_data = SBUF;

                if (uart_data == '1')           // For Testing
                        P2_0 = 0;

                SBUF = uart_data;                       // Initiate transmit of the byte received.

                RI = 0;                                 // Clear interrupt flag.

        }
        else if (TI)
        {                               // Finished transmitting a byte.
                //P2_4 = 0;
                TI = 0;

        }
}

I try to control position of motor. So I need receive new position from computer through RS232 and control motor by PWM mode 1.

My PWM code (without UART) controlling a motor.
Result: SUCCESS!

My UART code (without PWM) echoing characters it receives.
Result: SUCCESS!

I have 2 questions:

1. Why in UART code, in serialInterrupt function I have to put this code:

if (uart_data == '1')           // For Testing
                        P2_0 = 0;


and in main loop :

P2 = 0xFF;                      // turn off all LED (for test)
                P2_2=0;                         // Turn on


If I use this code (first time I only think it only use for test) UART is well done, but when I close it, UART can not work correct.

2. If I combine UART and PWM projects, the new project (above code) only has PWM but can not send/receive.

One body said that: "If that indicates a PCA interrupt (I don't know because I'm not familiar with how uVision debugger presents the PCA subsystem) and you don't have an ISR for it, then that could cause a lot of problems."

But I don't understand much.

Did I miss somethings in my code?

Kind Regards,
Mr. Huy

Parents
  • I see nothing blatantly wrong with your code (besides the 'else'), but vaguely remember that the T89Cxxx xhips were 'recalled' and replaced by AT89Cxxx 'equivalents.

    Now since these are Atmel chips, it is very likely that the errata is grossly incomplete, so my first try would be to assume that the PCA interrupt may be active when not enabled and insert a dummy PCA ISR in the code.

    If that does not help, try inplementing 'something else' that is not controlled by the serial in the PCA and see what happens.

    BTW, you know the existence of The PCA cookbook
    www.intel.com/.../270609.htm I hope

    Erik

Reply
  • I see nothing blatantly wrong with your code (besides the 'else'), but vaguely remember that the T89Cxxx xhips were 'recalled' and replaced by AT89Cxxx 'equivalents.

    Now since these are Atmel chips, it is very likely that the errata is grossly incomplete, so my first try would be to assume that the PCA interrupt may be active when not enabled and insert a dummy PCA ISR in the code.

    If that does not help, try inplementing 'something else' that is not controlled by the serial in the PCA and see what happens.

    BTW, you know the existence of The PCA cookbook
    www.intel.com/.../270609.htm I hope

    Erik

Children
No data