RCSTA VE TXSTA registerleriyle 16F877A uart örneği (yeni başlayanlar için)

Başlatan xcyqp09k2, 25 Haziran 2015, 14:20:28

xcyqp09k2

başlangıç aşamasında olanlar için bir örnek hazırladım. bu örnekten faydalanarak protonun hazır komutlarını kullanmadan pic'in datasheetinden yararlanarak nasıl TX ve RX registerleri doldurulur , baud rate nasıl ayarlanır ve seri olarak gönderme alma işlemi nasıl yapılır görebilirsiniz. isis'da ve gerçekte de denedim sıkıntı yok kodlar çalışıyor.

linkte 16F877A için datasheet, pin diyagramı, proton hex ve isis7.0 dosyaları vardır.

https://yadi.sk/d/QgAQazbwhUGqo

Yunusemre1


mehmet

BASIC için burası daha uygun olur. C için isterseniz UART fonksiyonlarını paylaşırım.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

ertuğrul54


mehmet


Alttaki kodları nereden aldığımı hatırlamıyorum. Kodları yazan görürse, kızmasın bana. ;)
Rx ve Tx pinlerini donanım giriş çıkış özelliklerini kendisi hallediyor.

/*
*
*/
void UART_Init(const uint32_t baud_rate)
{
    int16_t n = (_XTAL_FREQ / (16 * baud_rate)) - 1;
    if(n < 0)
        n = 0;
    if(n > 255) // low speed
    {
        n = (_XTAL_FREQ / (64 * baud_rate)) - 1;
        if(n > 255)
        {
            n = 255;
        }
        SPBRG = (uint8_t) n;
        TXSTA = 0x20; // transmit enabled, low speed mode
    }
    else // high speed
    {
        SPBRG = (uint8_t) n;
        TXSTA = 0x24; // transmit enabled, high speed mode
    }
    RCSTA = 0x90; // serial port enabled, continues receive enabled
}
/*
 *
 */
uint8_t UART_Data_Ready(void)
{
    return PIR1bits.RCIF; // return RCIF bit (register PIR1, bit 5)
}
/*
 *
 */
uint8_t UART_GetC(void)
{
    while(PIR1bits.RCIF == 0); // wait for data receive
    if(RCSTAbits.OERR) // if there is overrun error
    {
        // clear overrun error bit
        RCSTAbits.CREN = 0;
        RCSTAbits.CREN = 1;
    }
    return RCREG; // read from EUSART receive data register
}
/*
 *
 */
int16_t UART_GetCWithTimeout(uint16_t timeout_ms)
{
    uint16_t timeout_counter = 0;
    while(!PIR1bits.RCIF) // Veri gelene kadar veya timeout süresi aşılıncaya kadar bekle
    {
        mb_delay(100); // 1 milisaniye bekleme
        timeout_counter++;
        if(timeout_counter >= timeout_ms)
        {
            // Timeout durumu, isteğe bağlı olarak bir işlem yapabilirsiniz
            // Örneğin, timeout durumunu işaretlemek için bir bayrağı ayarlayabilirsiniz
            // veya gerekirse başka bir işlem yapabilirsiniz.
            return -1; // Timeout durumunu belirten bir değer döndürülebilir
        }
    }
    if(RCSTAbits.OERR)
    {
        // Overrun hatası durumunda, hatayı düzelt
        RCSTAbits.CREN = 0;
        RCSTAbits.CREN = 1;
    }
    return RCREG; // EUSART alınan veriyi döndür
}
/*
 *
 */
void UART_PutC(const char data)
{
    while(TXSTAbits.TRMT == 0); // wait for transmit shift register to be empty
    TXREG = data; // update EUSART transmit data register
}
/*
 *
 */
void UART_Print(const char *data)
{
    uint8_t i = 0;
    while(data[i] != '\0')
        UART_PutC(data[i++]);
}

Eğer basit bir itoa fonksiyonu da gerekirse:
http://www.strudel.org.uk/itoa/
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"