Отговори на тема  [ 10 мнения ] 
PIC24F UART 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 20, 2013 5:18 pm
Мнения: 381
Местоположение: България
Мнение PIC24F UART
Здравейте,

Трябва да се понауча да програмирам PIC24F със XC16. Досега съм ползвал само CCS и малко Асемблер. Първите ми впечатления бяха, че работата с този компилатор ще е приятна - особено с всички регистри в хедърите, което е голямо улеснение. Успях да подкарам таймер 1 на PIC24F04KA200, и се опитах да направя няколко функции за UART, за да ми е по-лесно за дебъгване. Вече две вечери подред го мъча този UART и нищо не излиза. Правя UART инициализация както е по PIC24F Reference Manual. Всичко е наред, докато не активирам UART модула - в този момент нещо става и не мога да разбера какво, тъй като не мога да дебъгвам с Pickit3. Излиза ми следното съобщение:
Programming/Verify complete
The target device is not ready for debugging. Please check your configuration bit settings and program the device before proceeding.

Хубаво де, проверявам ги тези неща - всичко си е наред, според мен. Използвам вътрешния осцилатор, но това би трябвало да не е проблем. И дотук - чипът забива и аз не знам къде точно, още-по малко защо. Ще сложа кода тук, но накратко това се слува - имам си timer 1 interrupt, което си работи и за индикация мига един светодиод. Пробвах го със MPLAB X Simulator - дава точно време, като брой цикли. Нямам осцилоскоп тук, но колкото-толкова, нали е за учебна цел. Дотук добре. В момента, в който извикам функцията за инициализиране на UART, всичко свършва - никакво прекъсване, никакви признаци на живот. Опитах да компилирам целия файл, като въпросната фунцкия я пиша линия по линия, и така установих къде забиват нешата - точно когато активирам UART модула. Тази функция е писана точно по предписанията на Микрочип. Ето кода:

Код:
#include <xc.h>
#include <libpic30.h>
#include "config.h"

#define CLK 8000000L //8MHZ
#define FCY (CLK/2)

volatile struct {
    unsigned BIT0:   1;
    unsigned BIT1:   1;
    unsigned BIT2:   1;
    unsigned BIT3:   1;
    unsigned BIT4:   1;
}port_a;

void uart_setup(void);
void uart1putchar(char ch);
char uart1getchar();

int main (int argc, char * argv[])
{
    //oscillator confuguration
    OSCCONbits.COSC = 0;            //8MHz FRC Oscillator

    //set all I/O digital
    AD1PCFG = 0xFFFF;

    //configure port a
    TRISA = 0b110011;
    //TMR1 configuration
    T1CONbits.TCS = 0;              //internal clock selected
    T1CONbits.TGATE = 0;            //gate disabled
    T1CONbits.TCKPS = 2;            //prescaler 1:64

    //TMR1 interrupt configuration
    TMR1 = 0;                       //clear timer
    PR1 = 62500 + 3;                //Load the Period Register with the value to cause overflow
    _T1IF = 0;                      //clear flag
    IPC0bits.T1IP = 4;              //higher level interrupt
    IEC0bits.T1IE = 1;              //enable interrupt
    T1CONbits.TON = 1;              //start the timer

    uart_setup();
    unsigned char temp = 0;

    while (1)
    {
        //temp = uart1getchar();
        //uart1putchar(temp);
    }

   return 0;
}

void _ISR _T1Interrupt( void)
{
    PORTAbits.RA2 ^= 1;
    _T1IF = 0;                      //clear flag
} //T1Interrupt

void uart_setup(void)
{
    U1BRG = 25;                     //Baud rate set to 9600
    IPC2bits.U1RXIP = 4;            //interrupt priority level for receive
    IPC3bits.U1TXIP = 4;            //interrupt ptiority level for transmit
    U1STA = 0;

    U1MODE = 0;                     //8-bit data, no parity, 1 stop bit
    U1MODEbits.UARTEN = 1;          //enable the module
   
    U1STAbits.UTXISEL0 = 0;
    U1STAbits.UTXISEL1 = 1;         //interrupt generated transmit is complete
    IFS0bits.U1RXIF = 0;            //clear receive interrupt flag

    U1STAbits.UTXEN = 1;            //enable transmission
    IEC0bits.U1RXIE = 1;            //UART receiver interrupt enabled
    IEC0bits.U1TXIE = 1;            //UART transmitter interrupt enabled
}

void uart1putchar(char ch)
{
    while(U1STAbits.UTXBF);         //transmit only if TX buffer is empty
    U1TXREG = ch;
}

char uart1getchar()
{
    char temp;
    while(IFS0bits.U1RXIF == 0);    //wait for the buffer to fill up
    temp = U1RXREG;                 //copy char
    IFS0bits.U1RXIF = 0;            //reset interrupt
    return temp;                    //return received char
}


Ето и конфигурационните битове:

Код:
// FGS
#pragma config GWRP = OFF               // General Segment Code Flash Write Protection bit (General segment may be written)
#pragma config GCP = OFF                // General Segment Code Flash Code Protection bit (No protection)

// FOSCSEL
#pragma config FNOSC = FRC              // Oscillator Select (Fast RC oscillator (FRC))
#pragma config IESO = ON                // Internal External Switch Over bit (Internal External Switchover mode enabled (Two-Speed Start-up enabled))

// FOSC
#pragma config POSCMOD = NONE           // Primary Oscillator Configuration bits (Primary oscillator disabled)
#pragma config OSCIOFNC = ON            // CLKO Enable Configuration bit (CLKO output disabled)
#pragma config POSCFREQ = HS            // Primary Oscillator Frequency Range Configuration bits (Primary oscillator/external clock input frequency greater than 8 MHz)
#pragma config SOSCSEL = SOSCHP         // SOSC Power Selection Configuration bits (Secondary oscillator configured for high-power operation)
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock switching is disabled, Fail-Safe Clock Monitor is disabled)

// FWDT
#pragma config WDTPS = PS32768          // Watchdog Timer Postscale Select bits (1:32,768)
#pragma config FWPSA = PR128            // WDT Prescaler (WDT prescaler ratio of 1:128)
#pragma config WINDIS = OFF             // Windowed Watchdog Timer Disable bit (Standard WDT selected; windowed WDT disabled)
#pragma config FWDTEN = ON              // Watchdog Timer Enable bit (WDT enabled)

#pragma config MCLRE = ON               // MCLR Pin Enable bit (MCLR pin enabled; RA5 input pin disabled)

// FICD
#pragma config ICS = PGx2               // Reserved (PGC2/PGD2 are used for programming the device)


Малко дълго се получи. Ако някой се е срещал с това, да казва :) Не ми се иска да ползвам готовите библиотеки още в началото, че нищо няма да разбера.

И последен въпрос - къде мога да намеря имената на прекъсванията? Имам предвид _T1Interrupt и така нататък - не можах да ги намеря в хедъра на чипа, а доколкото разбрах са дефинирани и не мога аз да си слагам измислени имена.

Благодаря :)


Пет Окт 11, 2013 1:16 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение Re: PIC24F UART
........................................................................................................................................

Рек, сложи един бутон "Изтрий" някъде, за да няма такива мнения :-). Или аз не го виждам!?


Пет Окт 11, 2013 8:08 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение Re: PIC24F UART
Някъде в MPlab-a имаш падащо меню, където си дал да ти компилира кода за "дебъгване". Промени го :)

_________________
Хайде де!


Пет Окт 11, 2013 8:31 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение Re: PIC24F UART
Пиша по спомен.
Подробност при 24, конфигурацията на някои регистри става при изключен модул, иначе не се получва.
Пример при уарта, ако не е станала конфигурацията, при опит да предаваш нещо, контролера забива в брезкраен цикъл да полира флаг за свободен трансмит буфер. В този случай работят само прекъсвания,


Пет Окт 11, 2013 8:57 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC24F UART
Не виждам интеръпт хандлер за UART-а. Така като плякне интеръпт от UART-а, отива в хандлера по подразбиране, който или правеше екзепшън, или безкраен цикъл, или нещо от сорта.

Няма нищо лошо да ползваш стандартните библиотеки за да го подкараш. Пък след като го подкараш си напиши твои ако искаш, гледайки в сорса на оригиналните или в чаршафа.


Пет Окт 11, 2013 1:38 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение Re: PIC24F UART
stewie написа:
...
...
The target device is not ready for debugging. ...

...

_________________
Хайде де!


Пет Окт 11, 2013 2:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Юни 25, 2009 1:01 pm
Мнения: 2251
Мнение Re: PIC24F UART
Това при мен излиза, когато чипът не е програмиран. То си пише - устройството не е готово за дебъг! Когато заредиш програмата, трябва да се оправи!

_________________
www.elkran.com


Пет Окт 11, 2013 7:38 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Сря Фев 20, 2013 5:18 pm
Мнения: 381
Местоположение: България
Мнение Re: PIC24F UART
Проработи UART-а. Проблемът беше в прекъсванията и в четенето на микрочипските фермани. Документацията им не е от най-добрите. Ако някой иска кода, да каже, че е дълъг.


Вто Окт 15, 2013 7:11 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: PIC24F UART
stewie написа:
Документацията им не е от най-добрите.


Не знам с какво я сравняваш, но далеч не е и от най-лошите, еле пък като и свикнеш.


Вто Окт 15, 2013 8:16 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: PIC24F UART
+1

Даже документацията им е цвете в сравнение с някой други. Е за 24-ките е малко по объркваща от тая за 18-ки и то най-вече заради 16 битовите регистри - трябва по-голиемичък екран за да се чете удобно.


Вто Окт 15, 2013 8:30 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни