Merhaba arkadaslar,
Bu kodlar ile transmit yapamadım. Problem ne olabilir?
/*
* File: Uart_TX.c
* Author: Bulut
*
* Created on 16 May?s 2015 Cumartesi, 10:29
*/
#include <xc.h>
#include "Config.h"
void main(void) {
// PIC16F628A Configuration Bit Settings
// 'C' source line config statements
//#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG
#pragma config FOSC = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 4000000
TRISA=0;
PORTA=0;
TRISB=0;
PORTB=0;
CMCON=7;
TXSTAbits.BRGH=1; // select low speed Baud Rate (see baud rate calcs below)
TXSTAbits.TX9=0; // select 8 data bits
TXSTAbits.TXEN = 1; // enable transmit
TXSTAbits.SYNC=0;
SPBRG=25; // here is calculated value of SPBRGH and SPBRGL
void uart(void);
while (1)
{
uart();
}
}
void uart()
{
while(!TXSTAbits.TRMT) // make sure buffer full bit is high before transmitting
TXREG ='M';
return;
}
İlk bakışta göze iki hata çarpıyor:
1) RCSTA.SPEN biti 1 yapılmamış. Seri port modülünün ana açma kapama anahtarı bu.
2) Seri port ile ilgili bacakların TRIS bitleri 1 olmalı. TX için de böyle, çıkış diye 0 olmayacak yani. Kulağa yanlış gibi geliyor ama datasheet'te böyle yazmış.
Başka hata var mı bilmiyorum, çok ayrıntılı bakmadım.
dedikleriniz yaptım gelişme yok hocam.
Şimdi bir tane daha gördüm: while(!TXSTAbits.TRMT) satırından sonra noktalı virgül olacak. Yani TXREG = 'm'; ifadesi döngünün bir parçası olmamalı. Döngünün amacı TRMT 0 olduğu sürece (ki bu gönderme işleminin devam ettiğini gösterir) boş boş dönüp beklemek.
onuda düzelttim. bişeyler daha var kaçan ama.. ne :)
mesaj birleştirme:: 16 Mayıs 2015, 18:43:15
donanımı basic ile denedim sorun yok..xc8'de çalışmıyor. son hali asağıda
/*
* File: Uart_TX.c
* Author: Bulut
*
* Created on 16 May?s 2015 Cumartesi, 10:29
*/
#include <xc.h>
//#include "Config.h"
void main(void) {
// PIC16F628A Configuration Bit Settings
// 'C' source line config statements
//#include <xc.h>
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG
#pragma config FOSC = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 4000000
TRISA=0;
PORTA=0;
TRISB=6;
PORTB=0;
CMCON=7;
TXSTAbits.BRGH=1; // select low speed Baud Rate (see baud rate calcs below)
TXSTAbits.TX9=0; // select 8 data bits
TXSTAbits.TXEN = 1; // enable transmit
RCSTAbits.CREN=1;
//OPTION_REGbits.nRBPU=0;
TXSTAbits.SYNC=0;
SPBRG=25; // here is calculated value of SPBRGH and SPBRGL
void uartt(void);
while (1)
{
uartt();
}
}
void uartt()
{
while(!TXSTAbits.TRMT); // make sure buffer full bit is high before transmitting
TXREG ='M';
//return;
}
İlk mesajımda bahsetmiş olduğum RCSTAbits.SPEN = 1; ifadesi vermiş olduğun son kodda bulunmuyor. Gözünden kaçmadığından emin misin?
Uart tx/rx pinlerini giriş yaptınmı ?
Deneyiniz...
/*
* File: main.c
* Author: mbmb
*
* Created on 17 Mayıs 2015 Pazar, 00:38
*/
#include <xc.h>
// CONFIG 16F628A
#pragma config FOSC = INTOSCCLK // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define _XTAL_FREQ 4000000
void uartt(void);
void main(void)
{
TRISA = 0;
PORTA = 0;
TRISB = 6;
PORTB = 0;
CMCON = 7;
TXSTAbits.BRGH = 1; // select low speed Baud Rate (see baud rate calcs below)
TXSTAbits.TX9 = 0; // select 8 data bits
TXSTAbits.TXEN = 1; // enable transmit
RCSTAbits.CREN = 1;
//OPTION_REGbits.nRBPU = 0;
TXSTAbits.SYNC = 0;
SPBRG = 25; // here is calculated value of SPBRGH and SPBRGL
while (1)
{
uartt();
}
}
void uartt(void)
{
while(!TXSTAbits.TRMT); // make sure buffer full bit is high before transmitting
TXREG = 'M';
}
gerçektende spen bitini kaçırmışım şu anda çalışıyor. Teşekkürler arkadaşlar. teşekkürler Tagli hocam.
Çalışan kodu ekleyebilirsiniz...
peki bu gönderme işinde text halinde nasıl gönderirim. kendi library'mi mi kurmam gerekiyor paylaşılan bir yer var mı_?
yazarken mesajıınızı aldım mehmet hocam.asağıdaki kodu ekledim.
RCSTAbits.SPEN=1;
Text denen şey arka arkaya sıralanmış ASCII karakterinden ibarettir. Sonlandığının anlaşılabilmesi için diznin sonunca \0 karakteri bulunur (ki bildiğin sıfırdır bu). Yani yapman gereken şey, yukarıda yaptığın işlemi bir döngü içinde dizinin tüm elemanları için tekrarlamak ve en son \0 karakterini gönderdikten sonra durmak.
@canbulut; C yapısına biraz dikkat edebilirsiniz.
aşağıdaki kodlar ile text şeklinde gönderebiliyorum ama rakam,sayı gönderemiyorum.
void xmitt(char TxArray[]) // An array that can hold 25 characters
{
int b=0;
while (TxArray[b]!='\0')
{
while(!TXSTAbits.TRMT); // make sure buffer full bit is high before transmitting
TXREG =TxArray[b];
b++;
}
}
void xmitt(char TxArray[]) // An array that can hold 25 characters
{
int b=0;
while (TxArray[b]!='\0') // stringin sonuna gelene kadar döngü çalışır
{
while(!TXSTAbits.TRMT); // meşguliyet bitene kadar bekle
TXREG =TxArray[b]; // stringin sıradaki karakterini gönder
b++; //sırayı 1 artır
}
}
void xmittData(char TxArray[], unsigned int boyut) // An array that can hold 25 characters
{
int b=0;
while (boyut--) // sayac 0 olana kadar döngüyü dönder
{
while(!TXSTAbits.TRMT); // meşguliyet bitene kadar bekle
TXREG =TxArray[b]; // stringin sıradaki karakterini gönder
b++; //sırayı 1 artır
}
}
kullanım:
TxArray[0]=0xFF;
TxArray[1]=0x00;
TxArray[2]=0x15;
TxArray[3]=0x75;
xmittData(&TxArray[0], 4) // dizideki verilerden 4 tanesini gönder
stringler 0 ile bittiğinden sıfıra ulaşana kadar döngüyü döndeririz, fakat göndereceğiniz şey, sayısal data ise, adet belirtmeniz şart.
hocam yazdığınız koddan bir şey anlayamadım maalesef. Verdiklerinize istinaden bir şey çıkardım fonksiyon dışında TxArray=75; tarzı tanımlarımı tanımsız olarak algıladı ve bana da biraz karmaşık geldi. ama istediğim şu şekilde tabi C yapısına uygun olmalı ve ben bunu yapamıyorum.
int Değişken=75;
xmit ("Veri:",Değişken,"Sayısını gönderdiniz.");//sonuçta istenilen bu.
Belki sprintf ile degiskenleri yaziya cevirip ondan sonra yollayabilirsin. Ancak bu fonksiyon nedense cok yer istiyor program hafizasinda. Zamaninda yanlis hatirlamiyorsam PIC16F1826'da hafiza yetmedigi icin kullanamamistim ama yine de bir sansini dene bence.
printf ile göndermek istediğimi nasıl birleştirebilirim?
mesaj birleştirme:: 24 Mayıs 2015, 19:30:04
örneksel sadece printf("Veri : %d",LowPeryot);
kod ekledim %6dan %22ye çıktı. (harcanan)
Tamam işte yukarıdaki mesajımda bahsettiğim sprintf aynı mantıkla o dediğin işi yapıyor.
Önce yeterli boyutta bir buffer tanımlıyorsun. Mesela char buffer[20];
Sonra sprintf(buffer, "Veri : %d", LowPeryot); çalıştırılınca yazı buffer dizisinin içine gitmiş oluyor. Sonunda da '\0' oluyor.
Bundan sonra normal şekilde yazı gönderdiğin gibi gönderebilirsin.
az yer kaplayan nasıl yapacağız? Gökhan hocanın yazdığını tam olarak anlayamadım. anladığım gönderme fonksiyonu içinden yapacağımız.ama araya yazılar falan yazamıyorum galiba.sonuçta anlamadım :)
Gökhan'ın bahsettiği başka, ham veri basmak için. Anladığım kadarıyla senin alıcı taraf zaten sadece yazı okuyacak şekilde. Bu durumda ham veri basmak senin işine yaramaz. Ham veri basmanın anlamlı olması için kendin bir kural (bir diğer deyişle protokol) belirlemeli ve hem alıcı hem verici tarafında işlemleri buna göre yapmalısın, bu bu çoğu durumda alıcı tarafında da kodu senin yazmanı gerektirir. Yazı göndermeye göre daha zor ama daha esnek ve daha hızlıdır.
Alıntı yapılan: Tagli - 23 Mayıs 2015, 19:58:30
Gökhan'ın bahsettiği başka, ham veri basmak için. Anladığım kadarıyla senin alıcı taraf zaten sadece yazı okuyacak şekilde. Bu durumda ham veri basmak senin işine yaramaz. Ham veri basmanın anlamlı olması için kendin bir kural (bir diğer deyişle protokol) belirlemeli ve hem alıcı hem verici tarafında işlemleri buna göre yapmalısın, bu bu çoğu durumda alıcı tarafında da kodu senin yazmanı gerektirir. Yazı göndermeye göre daha zor ama daha esnek ve daha hızlıdır.
ben bu işlemleri basicte şu şekilde yapıyordum Hserout["Veri:",Dec Veri,"sayısı gitmiştir.",13] şeklindeydi. şimdi bu yüzden C zorluyor.
XC8'de bir sanki bir sekilde printf kullanmak da mumkundu ama seri iletisim icin senin ismi belli olan bir fonksiyonu doldurman gerekiyordu. Fonksiyon putc gibi bir seydi. Derleyici dokumaninda bunun nasil yapildigi anlatiliyordu.
şöyle bir şey buldum
/*****************************
Dependencies: xc.h, stdio.h
Processor: PIC16F1824
Complier: XC8 v1.00 or higher
Result: Prints to the UART1 Window of the IDE
Debugger: Simulator
*****************************/
void putch(unsigned char byte)
{
TXSTA=0x26;
RCSTAbits.SPEN=1;
TXREG=byte;
while(!TXIF)continue;
TXIF=0;
}
Ben başka bişeyden bahsetmiştim.
int Degisken=75;
xmit ("Veri:");
if(Degisken>=100){
xmit ((Degisken/100)+48); //yuzler basamagi
xmit (((Degisken%100)-(Degisken%10))+48); //onlar basamagi
xmit ((Degisken%10)+48); // birler basamagi
}
else if(Degisken>=10 && Degisken<100){
xmit ((Degisken-(Degisken%10))+48); //onlar basamagi
xmit ((Degisken%10)+48); // birler basamagi
}else{
xmit (5+48); // birler
}
xmit ("Sayısını gönderdiniz.");
Alıntı yapılan: Gökhan BEKEN - 23 Mayıs 2015, 22:21:41
Ben başka bişeyden bahsetmiştim.
int Degisken=75;
xmit ("Veri:");
if(Degisken>=100){
xmit ((Degisken/100)+48); //yuzler basamagi
xmit (((Degisken%100)-(Degisken%10))+48); //onlar basamagi
xmit ((Degisken%10)+48); // birler basamagi
}
else if(Degisken>=10 && Degisken<100){
xmit ((Degisken-(Degisken%10))+48); //onlar basamagi
xmit ((Degisken%10)+48); // birler basamagi
}else{
xmit (5+48); // birler
}
xmit ("Sayısını gönderdiniz.");
nasıl bir işlem var burda Gökhan hocam.daha büyük sayılarıda içerir mi?
3 basamaklı sayılar için yazdım, doğruluğunu test etmedim, kafadan yazdım.
İsterseniz basamak sayısını artırmak için yeni if'ler ekleyebilirsiniz.
Çeşitli yöntemlerle yapabilirsiniz.
http://www.ckodu.com/ornek/201-basamak-degeri-c.html (http://www.ckodu.com/ornek/201-basamak-degeri-c.html)
Yalnız benim yazdığım kodda can alıcı nokta 48 sayısıdır. 0 sayısını ascii olarak yazdırmak için 48 olarak göndermeniz gerekir.
1 sayısı için 49, 9 için 57...
bununla harcanan flash kapasitesi %25lere çıktı.programda gördüğüm veri şuVeri:???????????????????????????????????????????????????????????Say?s?n? g?nderdiniz.
madem çevirmede bu kadar yer kaplayacaksa printf gibi bir fonksiyonla daha rahat hemde anlaşılır olacağını düşünüyorum. printf gibi bir fonksiyonla gönderme şeklini nasıl kullanabilirim.
mesaj birleştirme:: 24 Mayıs 2015, 00:01:07
printf ("Veri: %d",Degisken," sayısını gönderdiniz.");
bu kodu uart TX ile nasıl birleştirebilirim.
arkadaslar xc8'de integer sayı uarttan nasıl gönderilir? mesela artan bir sayı olsun. i++; her artışta 250msde bir i artacak ve uarttan gönderecek.ta ki sayı 1000 olana kadar.
öyle uzun uzun yazmasının sebebi, xmit fonksiyonun içeriğinde olan şeyler yüzünden.
Ben senin yazdığın koda göre yazdım.
xmit yerine 1 byte'lık veri gönderen bir fonksiyon ismi yazman gerkir.
mesela "putc" olabilir.
Alıntı yapılan: canbulut - 24 Mayıs 2015, 01:25:57
arkadaslar xc8'de integer sayı uarttan nasıl gönderilir? mesela artan bir sayı olsun. i++; her artışta 250msde bir i artacak ve uarttan gönderecek.ta ki sayı 1000 olana kadar.
xc8 veya dünyanın herhangi bir derleyicisi veya dili ile, usarttan tek seferde gönderebileceğin maksimum sayı 255'dir. Daha fazla gönderemezsin.
Sen amacını yaz, string olarak mı almak istiyorsun?
printf(...) fonksiyonlarının kısıtlanmış versiyonu kütüphane içinde var olabilir. Kısıtlanmış versiyonda floating point çevirimler olmadığı için daha az yer kaplar. Belki kısıtlı sürümü kullanabileceğin bir derleyici yönergesi vardır.
Alıntı yapılan: Klein - 24 Mayıs 2015, 03:21:43
printf(...) fonksiyonlarının kısıtlanmış versiyonu kütüphane içinde var olabilir. Kısıtlanmış versiyonda floating point çevirimler olmadığı için daha az yer kaplar. Belki kısıtlı sürümü kullanabileceğin bir derleyici yönergesi vardır.
değerli hocam önerinizle denediğim kod %6dan, %18lere çıktı. bu normaldir değilmi?
Alıntı yapılan: Klein - 24 Mayıs 2015, 03:21:43
printf(...) fonksiyonlarının kısıtlanmış versiyonu kütüphane içinde var olabilir. Kısıtlanmış versiyonda floating point çevirimler olmadığı için daha az yer kaplar. Belki kısıtlı sürümü kullanabileceğin bir derleyici yönergesi vardır.
aklımada karpuz kabuğu düştü haliyle.yukarıdakini halletmiş olsam float point yapmak istesem nasıl göndereceğim?
%6 ile %18 arasınaki %10'luk fark kaç Kilobyte program belleğini ifade ediyor?
printf(...) fonksiyonlarını kullanırken %6 , kısıtlı versiyon kullanınca mı %18 oldu?
integer için itoa(...) ve float için ftoa(...) fonksiyonlarını deneyebilirsiniz. printf(...) fonksiyonlarından daha az yer kaplaması muhtemel.
Alıntı yapılan: Klein - 24 Mayıs 2015, 16:49:54
%6 ile %18 arasınaki %10'luk fark kaç Kilobyte program belleğini ifade ediyor?
printf(...) fonksiyonlarını kullanırken %6 , kısıtlı versiyon kullanınca mı %18 oldu?
integer için itoa(...) ve float için ftoa(...) fonksiyonlarını deneyebilirsiniz. printf(...) fonksiyonlarından daha az yer kaplaması muhtemel.
kullanımlarım hep kısıtlı hocam.normal gönderim (tx) yaparken Program Space yazan yer %6 iken printf ile %18lere çıktı. bu çok problem değilse printf'li gönderim tarzını hep kullanabilirim. eğer çok yer kaplamışsa başka alternatif yollar varsa denemeliyim.
printf için kullanılan %12 sizin için sorun değilse. Yani programın geri kalanı %82'lik kısma sığacaksa sorun olmaz. %12 sizin ipinizde kaç KByte hafıza bölgesine denk gelir bilmiyorum. ama gözüme ok büyük görünmedi. Bence sorun yok. Eğer programın ilerleyen aşamalarınds yer sıkıntısı yaşarsanız, o zaman kodu kısaltmayı düşünürsünüz.
hocam kısıtlı ve kısıtlı olmayan XC ürünlerinin farkını açık açık nereden karşılaştırabiliriz?
En önemli fark, ram ve flash kullanımı. Derledikten sonra, ürettiği dosyanın boyutunu vs gösteriyor, ordan karşılaştırabilirsiniz.
-
karşılaştırmayı bir yerde açıkça incelemek gerekir buna free olanıda dahil.
http://www.microchip.com/pagehandler/en_us/devtools/mplabxc/ (http://www.microchip.com/pagehandler/en_us/devtools/mplabxc/)