2012-06-07 4 views
0

저는 rs232 용 PIC18F4620을 사용하여 PC (리눅스)의 통신을 실현하려고합니다. Transmition (PIC -> PC는 괜찮습니다). 그러나 PC에서 PIC로 somenthing을 전달하려고하면 PIR1bits.RCIF 플래그가 설정되지 않고 인터럽트가 발생하지 않습니다. 이다PIC18f4620 SDCC에서 수신하십시오

내 (PIC18F) 코드 (한 버전) : 내가 한 PC에서

/* 
* sdcc --use-non-free -mpic16 -p18f4620 test_lcd_serial.c 
* stty -F /dev/ttyUSB0 9600 
*/ 

#include <pic18fregs.h> 
#include <pic18f4620.h> 
#include <delay.h> 
#include <stdio.h> 
#include <usart.h> 
#include "lcd.c" 

//__code char __at 0x300000 _conf0 = 0x00; 
//~ __code char __at __CONFIG1H _conf1 = 0x06;// oscilador HS-PLL 
__code char __at __CONFIG1H _conf1 = 0x02;// oscilador HS 
__code char __at __CONFIG2L _conf2 = 0x1e; 
__code char __at __CONFIG2H _conf3 = 0x1e; 
__code char __at 0x300004 _conf4 = 0x00; 
__code char __at __CONFIG3H _conf5 = 0x01; 
__code char __at __CONFIG4L _conf6 = 0x81; 
__code char __at 0x300007 _conf7 = 0x00; 
__code char __at __CONFIG5L _conf8 = 0x0f; 
__code char __at __CONFIG5H _conf9 = 0xc0; 
__code char __at __CONFIG6L _confA = 0x0f; 
__code char __at __CONFIG6H _confB = 0xe0; 
__code char __at __CONFIG7L _confC = 0x0f; 
__code char __at __CONFIG7H _confD = 0x40; 

char buf[255]; 

void main(void) 
{ 
    unsigned char count; 
    unsigned char caracter; 

    lcd_init(FOURBIT_MODE); 
    lcd_home();lcd_puts("Start Test"); delay_s(1); 
    lcd_home();lcd_puts("Start Test."); delay_s(1); 
    lcd_home();lcd_puts("Start Test.."); delay_s(1); 
    lcd_home();lcd_puts("Start Test..."); delay_s(1); 

    INTCONbits.GIE = 1; 
    INTCONbits.PEIE = 1; 

    usart_open(
     USART_TX_INT_OFF & //0x7f 
     USART_RX_INT_ON & //0xff 
     USART_BRGH_HIGH & //0xff 
     USART_EIGHT_BIT & // 0xfd 
     USART_ASYNCH_MODE, //0xfe 
     129 // 9600 at 20MHz 
    ); 
    stdout = STREAM_USART; 

    count = 1; 

    while(1){ //This works fine :) 
     printf("To PC: %i\r", count); 
     sprintf(buf, "Sent: %i", count); 
     //even if I print (in LCD) the PIR1bits.RCIF is always 0 
     // sprintf(buf, "Sent: %i,%i", count, PIR1bits.RCIF); 
     lcd_home();lcd_puts("    "); 
     lcd_home();lcd_puts(buf); 
     delay_ms(500);   
     count++; 
    } 
} 

void printrx(){ 
    unsigned char pnt = 0; 
    while(PIR1bits.RCIF){ 
     buf[ pnt++ ] = RCREG; 

     // clear CREN 
     // RCSTAbits.CREN = 0; 
     // RCSTAbits.CREN = 1; 
    } 
    if(pnt){ 
     sprintf(buf, "GOT1 %s", buf); 
     lcd_home();lcd_puts("    "); 
     lcd_home();lcd_puts(buf); 
     delay_ms(1000); 
    } 
} 

void receive_intr1() interrupt 1 { //this is never call 
    if(PIR1bits.RCIF) // serial received 
     printrx(); 
} 
void receive_intr2() interrupt 2 { 
    if(PIR1bits.RCIF) // serial received 
     printrx(); 
} 

:

>cat /dev/ttyUSB 
To PC: 1 
To PC: 2 
To PC: 3 
To PC: 4 
To PC: 5 
To PC: 6 
To PC: 7 
To PC: 8 
To PC: 9 
To PC: 10 
... 

그래서, PC에 PIC는 OK입니다. 그러나 나는하려고하면

에코 "뭔가">는/dev/ttyUSB0를

또는

cat > /dev/ttyUSB0 
something 

또는 내가 열 수있는 코드를 작성하는 경우에도는/dev/ttyUSB0를 A와 파일 및 쓰기, 파이썬 직렬 모듈을 사용하면 아무 일도 일어나지 않습니다.

답변

1

SDCC usart 구현에 고정되어있어 잘 보입니다. 그러나 나는 최근에 어떤 일들이 바뀌 었다는 것을 알아 차렸다. (SDCC usart source). 어쩌면 SDCC usart에 오류가있을 수 있으며 직접 구현 도구를 결정합니다. (인터럽트와 RX 8 비트, 패리티 없음) 내 특정 코드에 의해

usart_open(
    USART_TX_INT_OFF & //0x7f 
    USART_RX_INT_ON & //0xff 
    USART_BRGH_HIGH & //0xff 
    USART_EIGHT_BIT & // 0xfd 
    USART_ASYNCH_MODE, //0xfe 
    129 // 9600 at 20MHz 
); 

:

// Serial Interrupts 
INTCONbits.GIE = 1; 
INTCONbits.PEIE = 1; 
PIE1bits.RCIE = 1; 
IPR1bits.RCIP = 0; 
PIE1bits.TXIE = 0; 
IPR1bits.TXIP = 0; 

TRISCbits.TRISC7 = 1; //RX (1:input) 
TRISCbits.TRISC6 = 1; //TX (0:output) 

//~ TXSTAbits.CSRC = 0; //Don't care 
TXSTAbits.TX9 = 0; 
TXSTAbits.TXEN = 1; 
TXSTAbits.SYNC = 0; 
TXSTAbits.SENDB = 0; 
TXSTAbits.BRGH = 1; 
//~ TXSTAbits.TRMT //Read Only 
TXSTAbits.TX9D = 0; 

RCSTAbits.SPEN = 1; 
RCSTAbits.RX9 = 0; 
//~ RCSTAbits.SREN = 0; //Don't care 
RCSTAbits.CREN = 1; 
//~ RCSTAbits.ADDEN = 0; //Don't care 
//~ RCSTAbits.FERR //Read Only 
//~ RCSTAbits.OERR //Read Only 
//~ RCSTAbits.RX9D //Read Only 


//~ BAUDCONbits.ABDOVF //Read 
//~ BAUDCONbits.RCIDL //Read Only 
BAUDCONbits.RXDTP = 0; 
BAUDCONbits.TXCKP = 0; 
BAUDCONbits.BRG16 = 0; 
//~ Not implemented 
BAUDCONbits.WUE = 0; 
BAUDCONbits.ABDEN = 0; 

SPBRG = 129; 

stdout = STREAM_USART; 

그리고 모두 괜찮 그래서 USART 코드를 변경합니다. stty 명령을 사용하여 장치 통신과 관련된 많은 정보를 구성하는 데 유용 할 수 있습니다. 예를 들어 9600 전송 속도를 설정하고 에코

stty -echo -F /dev/ttyUSB0 9600 

모두 표시 구성을 사용하지

stty -a -F /dev/ttyUSB0