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
Dosya bulunamadı diyor. Bu dosyaya nasıl ulaşabilirim acaba?
BASIC için burası (https://etepic.com/index.php/topic,18.0.html) daha uygun olur. C için isterseniz UART fonksiyonlarını paylaşırım.
c'de olursa makbule geçer
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/