예제 #1
0
파일: sync.c 프로젝트: AE9RB/peaberry
void Sync_Main(void) {
    static uint16 frac = FracN_DEFAULT;
    static int16 prev_error = 0;
    
    static uint8 pll_resetting = 0;
    static uint16 pll_testing = PLL_VERIFY_TIME;
    static uint16 pll_diff_acc = 0, pll_error_count = 0;
    
    int16 cur_error, diff, p_term, d_term;
    uint16 pos;
    
    pos = CY_GET_REG8(SyncSOF_FRAME_POS_LO__STATUS_REG);
    if (pos & 0x01) {
        pos += (uint16)CY_GET_REG8(SyncSOF_FRAME_POS_HI__STATUS_REG) << 8;

        cur_error = pos - SYNC_SOF_CENTER;
            
        diff = cur_error - prev_error;
        p_term = cur_error * SYNC_P_GAIN;
        d_term = diff * SYNC_D_GAIN;
        prev_error = cur_error;
        
        frac += p_term + d_term;
        
        if (frac > SYNC_FRAC_MAX) frac = SYNC_FRAC_MAX;
        if (frac < SYNC_FRAC_MIN) frac = SYNC_FRAC_MIN;
        
        if (pll_testing) {
            if (pll_resetting) {
                frac = 0;
                // Wait for PLL reset
                if (!(--pll_resetting)) {
                    Control_Write(Control_Read() & ~CONTROL_LED);
                    frac = FracN_DEFAULT;
                    FRAC_CLK_SetDividerValue(13);
                }
            } else {
                pll_testing--;
                if (diff < 0) pll_diff_acc -= diff;
                else pll_diff_acc += diff;
                pll_diff_acc /= 2;
                if (pll_diff_acc < 2) {
                    if (pll_error_count) pll_error_count--;
                } else if (pll_diff_acc > 7) {
                    pll_error_count++;
                }
                if (pll_error_count > 50) {
                    pll_diff_acc = 0;
                    pll_error_count = 0;
                    pll_resetting = PLL_RESET_TIME;
                    pll_testing = PLL_VERIFY_TIME;
                    Control_Write(Control_Read() | CONTROL_LED);
                    FRAC_CLK_SetDividerValue(14);
                }
            }
        }

        FracN_Set(frac);
    }
}
예제 #2
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void NRF_ReuseTxPayload(void){
    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_REUSE_TX_PL);
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    
    return;    
}
예제 #3
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void NRF_WriteSingleRegister(uint8_t reg, uint8_t data){
    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_W_REGISTER | reg);
    SPI_WriteTxData(data);
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    return;
}
예제 #4
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
/**
 * @brief Vaciamos el TX FIFO.
 */
void NRF_FlushTx(void){
    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_FLUSH_TX);
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    
    return;
}
예제 #5
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
/**
 * @brief Funcion para obtener el registro STATUS.
 * @return  Valor del registro STATUS.
 */
uint8_t NRF_GetStatus(void){
    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteByte(NRF_NOP);
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    
	return (uint8_t)SPI_ReadRxData();  
}
예제 #6
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void NRF_ReadSingleRegister(uint8_t reg, uint8_t* data){
    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_R_REGISTER | reg);
    SPI_WriteTxData(NRF_NOP);
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    (void)SPI_ReadRxData(); /* Dummy read, this is the STATUS Register */
    *data = SPI_ReadRxData();
    
    return;
}
예제 #7
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void NRF_WriteMultipleRegister(uint8_t reg, uint8_t* bufIn, uint8_t bufSize){
	uint8_t i = 0;

    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_W_REGISTER | reg);
    for(; i < bufSize; i++){
        SPI_WriteTxData(bufIn[i]);
    }
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    
    return;
}
예제 #8
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void NRF_RxWritePayload(uint8_t pipe, uint8_t* data, uint8_t payloadSize){
    uint8_t i = 0;

    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_W_ACK_PAYLOAD | (pipe & 0x7));
    for(; i < payloadSize; i++){
        SPI_WriteTxData(data[i]);
    }
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    
    return;
}
예제 #9
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void NRF_FillTxFIFO(uint8_t* data, uint8_t payloadSize){
    uint8_t i = 0;

    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_W_TX_PAYLOAD);
    for(; i < payloadSize; i++){
        SPI_WriteTxData(data[i]);
    }
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    
    return;
}
예제 #10
0
파일: morse.c 프로젝트: AE9RB/peaberry
// Example usage:
// Morse_Main("Repeating Message ");for(;;){sleep(240);Morse_Main(0);}
void Morse_Main(char* msg) {
    static uint8 pos, codes, len, state, timer, *message;
    uint8 i;

    if (msg) {
        state = pos = 0;
        message = msg;
    }
    else switch (state) {
    case 0:
        if (!message[pos]) pos = 0;
        i = message[pos++];
        if (i >= 0x61 && i <= 0x7A) i -= 32;
        if (i < 0x22 || i > 0x5A) codes = 7;
        else codes = MCODES[i-0x22];
        len = codes & 0x07;
        if (len==0) len = 6;
        if (codes==7) {
            timer = MORSE_WORD - MORSE_CHAR - 2;
            len = 0;
            state = 3;
            break;
        }
    case 1:
        if (codes & 0x80) timer = MORSE_DASH;
        else timer = MORSE_DOT;
        codes <<= 1;
        len--;
        Control_Write(Control_Read() & ~CONTROL_LED);
        state = 2;
    case 2:
        if (!timer) {
            state = 3;
            if (!len) timer = MORSE_CHAR - 1;
            else timer = MORSE_DOT - 1;
            Control_Write(Control_Read() | CONTROL_LED);
        }
        else {
            timer--;
            break;
        }
    case 3:
        if (!timer) {
            if (!len) state = 0;
            else state = 1;
        }
        else timer--;
    }
}
예제 #11
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void NRF_TxTransmitWaitNoACK(uint8_t* data, uint8_t payloadSize){
    uint8_t i = 0;

    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_W_TX_PAYLOAD_NOACK);
    for(; i < payloadSize; i++){
        SPI_WriteTxData(data[i]);
    }
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    NRF_TransmitPulse();
    
    return;
}
예제 #12
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void writeBufferTest(uint8_t reg, uint8_t* bufIn, uint8_t bufSize){
    SPI_ClearRxBuffer();
    uint8_t auxBuffer[(bufSize + 1)], i = bufSize, h = bufSize;
    
    for(; i > 0; i--){
        h--;
        auxBuffer[i] = bufIn[h];
    }
    
    auxBuffer[0] = (uint8_t)(NRF_W_REGISTER | reg);
    Control_Write(0);
    SPI_PutArray(auxBuffer, (bufSize + 1));
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    
    return;
}
예제 #13
0
파일: NRF.c 프로젝트: C47D/nRF24_Rx
void NRF_ReadMultipleRegister(uint8_t reg, uint8_t* bufIn , uint8_t bufSize){
	uint8_t i = 0, j = 0;
	
    SPI_ClearRxBuffer();
    Control_Write(0);
    SPI_WriteTxData(NRF_R_REGISTER | reg);
    for(; i < bufSize; i++){
        SPI_WriteTxData(NRF_NOP);
    }
    (void)SPI_ReadRxData(); /* Dummy read, this is the STATUS Register */
    for(; j < bufSize; j++){
        *(bufIn + j) = SPI_ReadRxData();
    }
    while(!(SPI_ReadTxStatus() & SPI_STS_SPI_IDLE));
    Control_Write(1);
    
    return;
}
예제 #14
0
파일: t1.c 프로젝트: AE9RB/peaberry
void T1_Main(void) {
    static uint8 state = 0, timer, band, send, bits, band_request, band_request_timer;
    static uint16 tune_timer; 
    
    if (tune_timer) {
        tune_timer--;
        if (!tune_timer) {
            Control_Write(Control_Read() & ~CONTROL_ATU_1);
        }
    }

    if (band_request_timer) band_request_timer--;
    else if (T1_Band_Number != band) {
        band_request = 1;
        band_request_timer = 200;
    }

    switch(state) {
    case 0: // idle
        if (Status_Read() & STATUS_ATU_0) timer++;
        else {
            if (timer >= 85 && timer <= 115) {
                state = 1;
                timer = 20;
                send = band = T1_Band_Number;
                bits = 4;
                Control_Write(Control_Read() & ~CONTROL_ATU_0 | CONTROL_ATU_0_OE);
            }
            else {
                timer = 0;
                if (band_request || T1_Tune_Request) {
                    Control_Write(Control_Read() | CONTROL_ATU_1);
                    if (T1_Tune_Request) tune_timer = 1000;
                    else tune_timer = 10;
                    band_request = T1_Tune_Request = 0;
                }
            }
        }
        break;
    case 1: // data low
        timer--;
        if (!timer) {
            if (bits) {
                Control_Write(Control_Read() | CONTROL_ATU_0);
                if (send & 0x08) timer = 8;
                else timer = 3;
                send <<= 1;
                bits--;
                state = 2;
            } else {
                Control_Write(Control_Read() & ~(CONTROL_ATU_0 | CONTROL_ATU_0_OE));
                state = 0;
            }
        }
        break;
    case 2: // data high
        timer--;
        if (!timer) {
            if (bits) timer = 3;
            else timer = 10;
            Control_Write(Control_Read() & ~CONTROL_ATU_0);
            state = 1;
        }
        break;
    }   

}