2017-01-16 4 views
2

Ich baue einen IR Empfänger mit PIC12F1572 mit Empfängermodul TSOP2438 Mein Ziel dieses Projekts ist es, Daten per Fernsteuerung zu empfangen und per UART an den PC zu senden. Ich habe den Code gemacht und Ich teste es Ich kann den normalen Wert über den UART senden, aber Somewhere ist falsch, so dass ich die Hex-Werte in Bezug auf die Befehle der Fernbedienung nicht erhalten kann Kann jemand meinen Code sehen und sagen, wo ich falsch goping bin? Hier ist mein CodeIR Empfänger RC5 mit Pic12F1572

void main(void) 
{ 
    OSCILLATOR_Initialize();   // 0x78 for Fosc = 16Mhz 
    PIN_MANAGER_Initialize();   //All port pins Digital and input 
    EUSART_Initialize(); 
    INTCONbits.IOCIF = 0;   // Interrupt on-change Flag 
    INTCONbits.PEIE = 1;   //SEt Peripheral Interrupt 
    INTCONbits.GIE = 1;    //Set Global Interrupt 
    //while(!OSCSTATbits.HFIOFS);  //Check here or wait here to OSC stable/ 0.5% accuracy 

    TRISAbits.TRISA2 = 1;   //Configure R1 as input 

// uint16_t Input_buffer [20]; 

    EUSART_Write(0x40);    // 0x40 = @ some flag 


    while(1) 
    { 
    count = 0; 
    //while((IR_PIN));    //IR_PIN receives an IR signal its output pin goes from logic 1 to logic 0 
            //which causes the microcontroller to start reading the IR signal using the function. decode() 
    EUSART_Write(0x41); 
    //while(IR_PIN); 

    if(Decode())     //check if RC5 decoding- new data is arrived 
    { 

     EUSART_Write(0x42); 

     toggle_bit = bit_test(IR_Code, 11); 
     address = (IR_Code >> 6) & 0x1F; 
     command = IR_Code & 0x3F; 

     EUSART_Write(toggle_bit); 
     EUSART_Write(address); 
     EUSART_Write(command); 

     EUSART_Write(0x43); 


    } 
    } 
} 

/*----------*/ 
uint8_t Measure_space() 
{ 
    TMR0_Initialize(); 

    while(IR_PIN && (count < 2000)) 
    count = TMR0_ReadTimer();    //Read timer value and store it in count value 
    if((count > 1999) || (count < 700)) 
    return 0;        //0 = If width is out of range 
    if(count > 1200) 
    return 1;        //1 = If width is long 
    else 
    return 2;        //2 = If the width is short 
} 

uint8_t Decode() 
{ 
    uint8_t i = 0, check; 
    mid1: 
    check = Measure_Pulse(); 
    if(check == 0) 
    return FALSE; 
    bit_set(IR_Code, 13 - i); 
    i++; 

    if(i > 13) 
    return TRUE; 

    if(check == 1) 
    goto mid0; 
    else 
    goto start1; 

    mid0: 
    check = Measure_space(); 
    if((check == 0) && (i != 13)) 

    return FALSE; 

    bit_clear(IR_Code, 13 - i); 
    i++; 

    if(i > 13) return TRUE; 

    if(check == 1) 
    goto mid1; 
    else 
    goto start0; 

start1: 
    check = Measure_space(); 
    if(check != 2) 
    return FALSE; 
    goto mid1; 
    start0: 
    check = Measure_Pulse(); 
    if(check != 2) 
    return FALSE; 
    goto mid0; 
} 

Antwort

1

Ich denke, das liegt daran, dass Sie Hex-Wert senden, ohne auf Zeichenfolge zu konvertieren. Wenn Sie diesen Hex-Wert im PC-Terminal ausdrucken wollen, müssen Sie ihn zunächst in ASCII-String konvertieren.

+0

Danke @ user7424291,, werde ich implementieren – Garryp

+0

Kannst du mir bitte alle Stimmen abgeben ?? Ich kann keine Frage mehr stellen ... – Garryp