Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с прерыванием от UART на ds pic 30f2011
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Zlodei
День добрый!
Помогите разобраться в чём проблема.

DSPic 30f2011

Суть программы заключается в следующем: pic ожидает прихода определенного байта на UART, и запускает или останавливает подпрограмму генерирования синуса или устанавливает один из выводов порта С или В в единицу. Прием байтов с UART происходит по прерыванию. Проверка поступившего байта на соответсвие происходит в обработчике прерывания.

Проблема
заключается в следующем: почемуто не вызывается (срабатывает) прерывание, а значит не выполняются требуемые действия.

Проверка:
1. На входной порт UART поступают отсылаемые с компьютера байты (проверялось осциллографом), временные интервалы соблюдатся, ошибок в искажении бит не происходит (проверялось соответсвующими битами в регистрах UART).
2. pic запускается и основная программа работает
3. Что удивительно.... таже самая программа, но только с добавлением другой функции (чтения с АЦП (которая тоже запускается после того как пришел соответсвующий байт на UART)) работает на УРА!!! Прием и отправка байт происходит так же без проблем.

Текст программы:
Код
Код:
//Program UART
#include "p30fxxxx.h"
#include <libpic30.h>
#include <uart.h>
#include <timer.h>
#include "math.h"

#define AddressSensor 0x00;

_FOSC(0xFFE3);
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PWRT_OFF);
_FGS(CODE_PROT_OFF);
_FICD(ICS_PGD);

const unsigned char AddressUnit=AddressSensor;
const unsigned char AddressChannal1=0x24;
const unsigned char AddressChannal2=0x25;
const unsigned char AddressChannal3=0x26;
const unsigned char AddressChannal4=0x27;

//For UART
char Test485[]={0x04,'\0'};
//For ADC
float MasSin[151];

unsigned char Start=0x00;

void TransData (unsigned int *buffer)        //Send data by UART
{
//unsigned int i;
PORTDbits.RD0=1;
putsUART1 (buffer);
while(BusyUART1());
PORTDbits.RD0=0;
}

void __attribute__((__interrupt__,auto_psv)) _U1RXInterrupt(void)
{
    unsigned char InRx;
    unsigned char i;
    IFS0bits.U1RXIF = 0;
    TransData((unsigned int *)Test485);
    while(DataRdyUART1())
    {
        InRx=ReadUART1();
        i=InRx&0b11111100;
        switch (i)
            {
            case 0x00:
                i=InRx&0x03;
                switch (i)
                    {
                    case 0x02: //Test net
                    TransData((unsigned int *)Test485);
                    break;    
                    };
                break;
            case 0x24:
                PORTCbits.RC13=1;
                PORTCbits.RC14=0;
                PORTBbits.RB6=0;
                PORTBbits.RB7=0;
                break;
            case 0x25:
                PORTCbits.RC13=0;
                PORTCbits.RC14=1;
                PORTBbits.RB6=0;
                PORTBbits.RB7=0;
                break;
            case 0x26:
                PORTCbits.RC13=0;
                PORTCbits.RC14=0;
                PORTBbits.RB6=1;
                PORTBbits.RB7=0;
                break;
            case 0x27:
                PORTCbits.RC13=1;
                PORTCbits.RC14=0;
                PORTBbits.RB6=0;
                PORTBbits.RB7=0;
                break;
            default:
                if (i>=0x80)
                    {
                    i=InRx&0x0F;
                    switch (i)
                        {
                        case 0x00: //Start
                            Start=0x01;
                            break;
                        case 0x01: //Stop
                            Start=0x00;
                            break;
                        };
                    };
                break;
            };
    };
}

//Set UART
void InitUART()
{
    // Holds the value of baud register  
    unsigned int baudvalue;    
    // Holds the value of uart config reg
    unsigned int U1MODEvalue;
    // Holds the information regarding uart TX & RX interrupt modes    
    unsigned int U1STAvalue;  
    // Turn off UART1module
    CloseUART1();
    // Configure uart1 receive and transmit interrupt
    ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 &  
                    UART_TX_INT_DIS & UART_TX_INT_PR2);
    // Configure UART1 module to transmit 8 bit data with one stopbit. Also Enable loopback mode  
      baudvalue = 194;
    U1MODEvalue = UART_EN & UART_IDLE_CON &
                    UART_DIS_WAKE & UART_DIS_LOOPBACK  &
                    UART_EN_ABAUD & UART_NO_PAR_8BIT  &
                    UART_1STOPBIT & 0xFBE7;
    U1STAvalue  = UART_INT_TX_BUF_EMPTY  &  
                    UART_TX_PIN_NORMAL &
                    UART_TX_ENABLE & UART_INT_RX_CHAR &
                    UART_ADR_DETECT_DIS &
                    UART_RX_OVERRUN_CLEAR;
    OpenUART1(U1MODEvalue, U1STAvalue, baudvalue);
}

void CreateSin ()
{
double sindata;
unsigned char f;
float fd;
float t;
unsigned int i;
f=72;
fd=150;
t=0;
for (i=0;i<150;i++)
    {
    sindata=5*(sin(((2*3,114)*f)*t));
    if (sindata<0)
        MasSin[i]=floor(0x7ff+((sindata*0x7ff)/0x05))+0x800;
    else
        MasSin[i]=floor((sindata*0x7ff)/0x05);
    t=t+((2*3,14)/fd);
    };
}

int main()
{
OSCCON=0xff34;
//For UART
TRISDbits.TRISD0=0;
PORTDbits.RD0=0;
//For DAC
TRISCbits.TRISC15=0;        //SCLK
TRISBbits.TRISB3=0;        //SDIN
TRISBbits.TRISB2=0;        //#SYNC
PORTCbits.RC15=0;
PORTBbits.RB3=0;
PORTBbits.RB2=1;
//For Channal
TRISCbits.TRISC13=0;
PORTCbits.RC13=0;
TRISCbits.TRISC14=0;
PORTCbits.RC14=0;
TRISBbits.TRISB6=0;
PORTBbits.RB6=0;
TRISBbits.TRISB7=0;
PORTBbits.RB7=0;
//For UART
InitUART();
Test485[0]='%';
unsigned int i=0x0000;
//For DAC
CreateSin();
unsigned int DACdata;
int j;
while(1)
{
    if (Start==0x01)
        {
        DACdata=MasSin[j];
        PORTBbits.RB2=0;
        for (i=0x00;i<0x10;i++)
            {
            PORTCbits.RC15=1;
            PORTBbits.RB3=(DACdata/0x8000)%0x02;
            PORTCbits.RC15=0;
            DACdata=DACdata*0x02;
            };
        PORTBbits.RB2=1;
        for (i=0;i<1300;i++);
        j=j+1;
        if (j==150)
            j=0;
        };
};
CloseUART1();
return 0;
}

Прохожий
Цитата(Zlodei @ Aug 12 2011, 16:26) *
День добрый!
Помогите разобраться в чём проблема.
...

Проблема в том, что Вы замесили в кучу два подхода.
Вы либо библиотекой пользуйтесь.
Либо руками через прерывания все делайте.
Особо порадовала конструкция:
Код
while(DataRdyUART1())

внутри обработчика прерывания от UART.
_Pasha
Что говорит товарищ симулятор?
Или, на входе в прерывание поставить инвертирование какого-нить свободного пина и глянуть, шо скажет товарищ осцылл.
Zlodei
Проблема решена!
Входы UART использовались АЦП, и при инициализации нужно было указать в регистре ADPCF (АЦП),
что данные контакты используются как цифровые входы\выходы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.