Pages: [1]   Go Down
Print
Author Topic: สงสัยกับ usart ใครพอจะช่วยได้บ้าง  (Read 14324 times)
0 Members and 2 Guests are viewing this topic.
sositon
Jr. Member
**
Offline Offline

Posts: 12


Email
« on: February 08, 2009, 01:27:36 AM »

#include <p18f458.h>
#include <usart.h>
void main(void)
{
   unsigned char o=0;
   TRISD = 0x00;
   LATD=0x00;
   OpenUSART(   USART_TX_INT_OFF   &
            USART_RX_INT_OFF   &
            USART_ASYNCH_MODE   &
            USART_EIGHT_BIT   &
            USART_CONT_RX   &
            USART_BRGH_LOW,
            64          );
   while(1)
   {      
      PIR1bits.RCIF = 0;
      while(!PIR1bits.RCIF);
      o = ReadUSART();
      LATD = o;
   }
   CloseUSART();
}

จากโปรแกรมข้างบนทำไมไม่มีผลที่พ็อตดีเลยครับ
ผมใช้คริสตอลออสซิลเลท 10 MHz ตั้งคอนฟิกบิทแบบ HS PLL ที่ Oscillator

แต่ผมเขียนโปรแกรมส่งค่า A/D ก็แสดงที่ไฮเปอร์ได้นะบอรดเลทกับคอนฟิกบิทก็อันเดียวกัน แท้ๆ ??...
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #1 on: February 08, 2009, 11:30:18 PM »


ผมเองก็ไม่ได้ใช้ C18 มานานแล้วครับเลยไม่มี complier ไว้ลอง
แต่สงสัยว่า PIC18F458 ไม่มี config fuse HS PLL  นะครับ
ไม่เหมือนพวก PIC18F4550

ลองดูตัวอย่างนี้นะครับทำไว้นานแล้ว


//HW UART TX=RC6 RX=RC7 baudrate=9600 8 bit
#include <p18F458.h>
#pragma config OSC=HS,PWRT=ON,WDT=OFF,LVP=OFF

#include <usart.h>
#define FOSC  10000000L
#define BAUD  9600


void WriteUSARTStr(char *Str)
{
int i,len;
   
    len =strlen(Str);
    for(i=0;i<len;i++)
    {
     while (BusyUSART());
     WriteUSART(Str);
    }
}

char Str1[]="*** Rs232 Demo3 ***\r\n";
void main(void)
{
char c;


// CONFIGURE USART baudrate 9600
//USART_BRGH_HIGH:   spbrg = ((int)(FOSC/(16UL * BAUD) -1))
    OpenUSART( USART_TX_INT_OFF &
                USART_RX_INT_OFF &
                USART_ASYNCH_MODE &
                USART_EIGHT_BIT &
                USART_CONT_RX &
                USART_BRGH_HIGH,
                ((int)(FOSC/(16UL * BAUD) -1)) );
    WriteUSARTStr(Str1);

    while(1)
    {
     while(!DataRdyUSART());// Wait for data to be received
      {
        c = getcUSART();
        //Insert your code here
      }
     WriteUSART(c);
    }
}
 

ลองทดสอบดูนะครับ เสร็จแล้วค่อยแทรก code การแสดงผล


Logged
sositon
Jr. Member
**
Offline Offline

Posts: 12


Email
« Reply #2 on: February 09, 2009, 11:34:52 PM »

คำว่า
*** Rs232 Demo3 ***
ไม่แสดงผลเลยครับ
ผมตั้ง คอนฟิก แล้วก็ใช้บรอดเลทหลายอันแล้ว
ปวดหมอง...
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #3 on: February 10, 2009, 05:30:39 AM »

รองดูอีกทีนะครับ
 
//HW UART TX=RC6 RX=RC7 baudrate=9600 8 bit
#include <p18F458.h>
#pragma config OSC=HS,PWRT=ON,WDT=OFF,LVP=OFF

#include <usart.h>
#include <string.h>

#define FOSC  10000000L
#define BAUD  9600


void rx_handler (void); //Declare the ISR function

//Lets the compiler know the location of the ISR
#pragma code rx_interrupt = 0x8
void rx_int (void)
{
 _asm goto rx_handler _endasm
}

#pragma code
//Lets the compiler know that this function is the ISR
#pragma interrupt rx_handler
void rx_handler (void)
{
unsigned char c;
    c = getcUSART();        //get a single character off the USART line
    while(BusyUSART());
    WriteUSART(c);          //put a single character on the USART line
    PIR1bits.RCIF = 0;      //reset the ISR flag.
}

void WriteUSARTStr(char *Str)
{
int i,len;
   
    len =strlen(Str);
    for(i=0;i<len;i++)
    {
     while (BusyUSART());
     WriteUSART(Str);
    }
}

char Str1[]="*** Rs232 RX Interrupt Demo ***\r\n";
void main()
{
// CONFIGURE USART baudrate 9600
//USART_BRGH_HIGH:   spbrg = ((int)(FOSC/(16UL * BAUD) -1))
    OpenUSART( USART_TX_INT_OFF &
                USART_RX_INT_ON &
                USART_ASYNCH_MODE &
                USART_EIGHT_BIT &
                USART_CONT_RX &
                USART_BRGH_HIGH,
                ((int)(FOSC/(16UL * BAUD) -1)) );


    RCONbits.IPEN = 1;      /* Enable interrupt priority */
    IPR1bits.RCIP = 1;      /* Make receive interrupt high priority */
    INTCONbits.GIEH = 1;    /* Enable all high priority interrupts */

    WriteUSARTStr(Str1);
    while(1);
   
}



//Test แล้ว OK ครับ
ถ้าไม่ได้สงสัยเรื่อง fuse ครับ
XTAL = 10MHz
OSC=HS,PWRT=ON,WDT=OFF,LVP=OFF

Hex file ที่ผม Test แล้วใส่ fuse ไว้ที่ท้ายไฟล์
http://www.thaimicrotron.com/forumpic/TestUartInt.zip
« Last Edit: February 10, 2009, 09:54:35 PM by smitdh » Logged
sositon
Jr. Member
**
Offline Offline

Posts: 12


Email
« Reply #4 on: February 10, 2009, 08:23:41 PM »

เหมือนเดิมเลยครับ
เฮ้อ.....ทำใจ?
Logged
sositon
Jr. Member
**
Offline Offline

Posts: 12


Email
« Reply #5 on: February 10, 2009, 08:29:11 PM »

 fuse ไว้ที่ท้ายไฟล์

ทำไงเหรอครับ
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #6 on: February 10, 2009, 09:52:40 PM »

ใน MLab IDE  ก็มีอยู่ครับ ใน memu Configure\Configuraton Bits
ให้เลือกที่ Configuration Bits set incode

โดยถ้าใส่ใน code ก็ด้วยคำสั่ง
#pragma config OSC=HS,PWRT=ON,WDT=OFF,LVP=OFF

แต่เมื่อผมใช้ PICKit2 โหลด Hex ไฟล์ มันจะฟ้องว่า



เนื่องจาก PICKit2 set Fuse ไม่ได้ ต้อง set มาจากโปรแกรม
และผมไม่ได้มีความชำนาญ ทาง C18  (กว่าจะค้นหา Compiler มาลงได้ก็มึนเหมือนกัน)
ผมเลยใช้ WINPIC 800  http://www.winpic800.com
โหลด hexfile เพื่อตรวจสอบ fuse


แต่เนื่องจาก WINPIC 800 โปรแกรม PICKIT2 ไม่ได้เลยต้อง save กลับออกไปเพื่อความแน่ใจว่าจะไม่มีปัญหาเรื่อง fuse
ผมนำ hex ไฟล์นั้นมาโปรแกรมด้วย PICKIT2 ก็ใช้ได้
fuse และ config ต่างๆที่ท้าย hex ไฟล์
....
....
:020000040030CA
:0E00000000220E0EFFFF8100FFFFFFFFFFFF3B
:020000040020DA
:08000000FFFFFFFFFFFFFFFF00
:00000001FF


หาก hex ไฟล์ที่ให้ไปยังไม่ออก สงสัยคงต้องตรวจดู Hardware อีกทีแล้วครับ




« Last Edit: February 10, 2009, 10:01:12 PM by smitdh » Logged
sositon
Jr. Member
**
Offline Offline

Posts: 12


Email
« Reply #7 on: February 11, 2009, 08:20:20 AM »

อืมม์....
ผมใช้ MPLAB IDE แล้วก็ด้วย compile c18
แปลกมั้ยผมก็เขียนส่งแบบ CHAR ทีละตัวก็ได้นะ ไม่มีปัญหา
แต่เป็นสตริงยาวๆไม่ได้แล้วก็รับค่าจากคีย์บอร์ดออกพ็อร์ตไม่ได้

จะเกิดจากฮาร์ดแวร์หรือเปล่า? งงงง

ขอบคุณครับ(ครั้งที่2)ที่ช่วยหาข้อมูล Cheesy

 Cry
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #8 on: February 11, 2009, 02:18:42 PM »

อาจจะเป็นแค่เส้นผมบังภูเขา เดี๋ยวก็คงหาเจอครับ
ไม่ลองใช้ CCS ดูบ้างละครับ ใช้ง่ายกว่ากันเยอะ มีทั้ง PIC16, PIC18, PIC24, PIC30
ตัวเดียวใช้ได้หมด third party ก็มีเยอะ พวกหนังสือก็มีคนเขียนให้อ่าน
Logged
Pages: [1]   Go Up
Print
 
Jump to: