Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: Ugur2006 - 05 Eylül 2006, 22:21:54

Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 05 Eylül 2006, 22:21:54
Arkadaslar bugün bir tane 16F628 aldim ve ilk denme icin su Kodu yazdim.
PIC16F628'i aynen PIC16F84 gibi standart bagladim.
yanliz ekstra Kristal ve kondonsatorleri kullanmadim dahili RC kullanmak istedigim icin.
Ve su Kodu yazdim:
#fuses XT,NOWDT, NOPROTECT
#include <16F628.h>
#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)
#byte PortA=5
#byte portB=6
#bit  led1=0x06.4
#bit  led2=0x06.5

void main()
{
SET_TRIS_A(0b00000);
SET_TRIS_B(0b11001111);
PortA=PortB=0;
while(true)
{
output_high(PIN_B4);
output_low(PIN_B5);
delay_ms(250);

output_low(PIN_B4);
output_high(PIN_B5);
delay_ms(250);
}
}


Ama malesef bu Kod ISIS'deki denememde calismasina ragmen gercek Board üstü denememde calismadi.
Acaba dahili RC osilatoru kullanacagimi Kod icerisinde herhangi bir Komut ile belirtmem gereklimi?
Cünkü dedigim gibiPIC16F628'in 15. ve 16. ayaklarina Kondonsatör ve 4 MHZ'lik kristal baglamadim.

Bir ikinci sorumda su:
Bu Kod icinde ben PortA bitlerini digital I/O olarak kullanmak istersem Kod icierisinde bunu nasil belirtmeliyim.
PIC16F628 ögrenmeye calisiyorum.
Not:16F628 , 16F84'den daha ucuz.Hayret değilmi?
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: ibrsel - 05 Eylül 2006, 22:37:02
sevigili Ugur2006;
C den pek anlamam ama,RC osilatör kullanmak istediğini yazmışsın.Bunun için programından kristalini XT olarak tanıttığın yeri iptal et.Komut ile nasıl RC tipi osilatör tanıtacağını bilmiyor isen mikro denetleyicini programla esnasında   programlayıcın bu ayarı yapmana olanak sağlayacaktır.Basic te Port A yı digital giriş çıkış kullanmak için "Cmcon=7" satırını programın başına ekliyorduk.Formu biraz inceler isen C içinde gerekli bilgiye ulaşırsın..
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 05 Eylül 2006, 22:50:45
Kullandigim yazilimda PIC16F628 icin ossilator secenekleri var.
Bunlar:
ERCLK
ERIO
IRCCLK
IRCIO
EXTCLK
LP
XT
HS

Bu seceneklerin icinde RC yok.Hngisini secmem gerek?
CCS Forumu icinde Cmcon=7 arattim ama bu konu hakkinda bilgi bulamadim.
herkes bu Cmcon=7 satiri yaz diye mesaj yazilmis fakat nereye yazilmamais.
Main funksiyonu icinemi?
yoksa PIC dosyasini incule ettigimiz en üst kismami?
Her ikisinide denedim amam Program hata veriyor.Kullandigim CCS editörünün helpinede baktim bilgi verilmemems.
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: ibrsel - 05 Eylül 2006, 23:03:49
IRCIO seçeneğini seçer isen mikro denetleyici kendi dahili osilatörünü kullanacaktır,dolayısı ile haricen XT osc. bağlamana gerek kalmaz..
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ziya - 05 Eylül 2006, 23:11:10
CCS kullanıyorsan cmcon = 7 yapmana gerek kalmıyor. Derleyici senin yerine bunu gizlice yapıyor.

Harici kristal kullanmadan yazdığım çizgi izleyen robot programını aşağıya ekliyorum. Belki işine yarar.
#include <16F628.h>
#fuses NOWDT,NOPROTECT,NOLVP, INTRC_IO, NOBROWNOUT
#use delay(clock=4000000)

#use fast_io(A)
#use fast_io(B)

#byte prt_a = 5
#byte prt_b = 6

Boolean calistir = true;
unsigned int16 timer = 0x0000;

/*
#bit saggoz = prt_a.1 #bit solgoz = prt_a.0 #bit sag_i = prt_b.3
#bit sag_g = prt_b.4 #bit sol_i = prt_b.2 #bit sol_g = prt_b.1 */

struct {
       int bos   : 1; // b0
       int sol_g : 1;
       int sol_i : 1;
       int sag_i : 1;
       int sag_g : 1;
       int hizarttir : 1;
       int kaydet : 1; // b6-b7
       int hizazalt  : 1;
      } motor;
struct {
       int sol : 1;
       int sag : 1;
       int solled : 1;
       int sagled : 1;
       int satir : 4   ;  // b4-b7
      } goz;

#byte goz   = 5
#byte motor = 6

#INT_TIMER1
isr()
{
if(calistir)
 {
  set_timer1(timer);
  if(!goz.sol && !goz.sag)
   {
    prt_b = prt_b & 0xE1;
   }
  else
   {
    if(goz.sol && goz.sag)
      {
       motor.sol_i = 1;
       motor.sag_i = 1;
       motor.sol_g = 0;
       motor.sag_g = 0;
      }
    if(!goz.sol)
      {
       motor.sol_i = 0;
       motor.sag_i = 1;
       motor.sol_g = 0;
       motor.sag_g = 0;
      }
    if(!goz.sag)
      {
       motor.sol_i = 1;
       motor.sag_i = 0;
       motor.sol_g = 0;
       motor.sag_g = 0;
      }
   }
 }
else
  {
   prt_b = prt_b & 0xE1;
   set_timer1(0xFF00-timer);
  }

 calistir = ! calistir;
}

#rom  0x2100={00, 00} // ilk timer değeri

main()
{
port_b_pullups(TRUE);
set_tris_a(0xf3);
set_tris_b(0xE1);

*(&timer+1) = read_eeprom (0);
*(&timer  ) = read_eeprom (1);

setup_timer_1 ( T1_INTERNAL ); //| T1_DIV_BY_1 );
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
while (1)
{
 if(!motor.hizarttir)
  {
   if(timer >= 0x00FF)
    {
     timer -= 0x00FF;
     delay_ms(100);
    }
  }

 if(!motor.hizazalt)
  {
   if(timer <= 0xFF00)
    {
     timer += 0x00FF;
     delay_ms(100);
    }
  }

 if(!motor.kaydet)
  {
   write_eeprom ( 0 , *(&timer+1) );
   write_eeprom ( 1 , *(&timer  ) );
  }

 if(!goz.sag) goz.sagled = 1; else goz.sagled = 0;
 if(!goz.sol) goz.solled = 1; else goz.solled = 0;
 // kontrol();
}
}
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 05 Eylül 2006, 23:12:59
Alıntı yapılan: "ibrsel"IRCIO seçeneğini seçer isen mikro denetleyici kendi dahili osilatörünü kullanacaktır,dolayısı ile haricen XT osc. bağlamana gerek kalmaz..
Tesekkürler.


Ayrica CMCON=7
komutununda nasil verilmesi gerektigini bir Ingiliz Boardindan ögrendim.
Bilmeyenler icin;

#byte CMCON = 0x1F   // 0x1F adresi degiskene ataniyor.
void main()
{
CMCON = 7;                //  
}


@Ziya
Verdigin Kod gercekten güzel.Icinden ögrenecegim bayagi güzel noktalar var.Tesekkür ederim.
Ve ayreten demissinki
Alıntı YapCCS kullanıyorsan cmcon = 7 yapmana gerek kalmıyor. Derleyici senin yerine bunu gizlice yapıyor.

Yani ben CCS de hic bir sey yapmadan PortA cikislarini kullandigimda bu Digital I/O olarak mi kullanmis oluyorum.
Birde bu PortaA nin Digital Io veya Analog olmasi ne demek oluyor.
Analog I/O olarak ne zaman lazim oluyor?
Digital olarak ne zaman?
Bu durum PortB icin gecerli değilmi?
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: ibrsel - 05 Eylül 2006, 23:37:37
Bazı mikro denetleyicilerin Analog sinyal işleme özellikleri vardır.(Sıcaklık,gerilim,basınç gibi sinyaller analog sinyallerdir).Pic 16F628 inde A portunun A0,A1,A2,A3 nolu uçları analog sinyal işleme özelliğine sahiptir.Eğer kullandığın yazılımda sen bu uçları digital giriş çıkış olarak tanımlamaz isen 16F628 için bu uçlar Analog olarak ayarlanır.(Pic Basic için böyle.C için birşey diyemem)
Analog olarak ayarlanan uçtan digital bilgi işleyemezsin;Yani A0 portuna led bağlayıp bu ledi yakıp söndürmek istersen bunu yapamazsın.Çünkü ledi yakıp söndürmek için bu ucu Lojik 1 ve Lojik 0 yapman gerekir ki bu da digital bir bilgidir,Ama yazılımında sen A portunu digital giriş çıkış ayarlamadığın için ledin yanıp söndüğünü göremeyeceksin..
Umarım anlatabilmişimdir..
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: ibrsel - 05 Eylül 2006, 23:39:37
Ayrıca;16F628 için PortB sadece digital giriş çıkış olarak kullanılır.Bu portu analog giriş için kullanamazsın..Bununla ilgili daha ayrıntılı bilgi için 16f628 in PDF sini incelemeni öneririm..İnternetten ve forum dan rahatlıkla bulabilirsin..
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 06 Eylül 2006, 00:47:33
@ibersel,
verdigin cok degerli bilgiler icin cok tesekkür ederim.
Son bir sorum olacak.
PIC16F628'de USART olarak kullanmak demek RS232 ile seri haberlesmeyi PIC'in RB1(RX)  ve RB2(TX) bitleri ile yapmak demek mi oluyor?
Yani ben PIC16F628'in bu uclarini kullanarak RE232 ile seri haberlesme yapiyorusam UART mi kurmus oluyorum?
Birde ben PIC16F84 ile seri haberlesme yaparken RS232 ile INVERT komutunuda koda ekliyordum.
Fakat PIC16F628 de yukardaki belirttigim bitlerle yani RB1(RX)  ve RB2(TX) ile RS232 arasinda baglanti kurmak icin yazdigim su kodda Derleyici bana INVERT tanimlamamsini kullandirmiyor.
#include <16F628.h>
#fuses nowdt,nolvp,intrc_io,put,nomclr,noprotect
#use delay(clock=4000000)
#use rs232(baud=9600,rcv=PIN_B1,xmit=PIN_B2,parity=N,bits=8)

#use fast_io(A)
#use standard_io(B)
#byte PortA=5
#byte portB=6

void main()
{
char x;
int gelen;
SET_TRIS_A(0b00000);
SET_TRIS_B(0b11000110);
PortA=PortB=0;

Printf("1 veya 2 Giriniz\n\r");

//gelen=getch();

for(;;)
{
gelen=getch();
switch (gelen)
{
case '1':output_high(PIN_B4);output_low(PIN_B5);break;
case '2':output_high(PIN_B5);output_low(PIN_B4);break;
}
}
}



yani su satiri
#use rs232(baud=9600,rcv=PIN_B1,xmit=PIN_B2,parity=N,bits=8)
su sekilde yazdigimda
#use rs232(baud=9600,rcv=PIN_B1,xmit=PIN_B2,parity=N,bits=8,invert)
derleyici INVERTI bu USART tanimlamada kullanamiyacagimi söylüyor.
Acaba neden?
Konfigration olarak INVERT kullanmadigim zamanda PIC'den gelen verideki karekterler yanlis görünüyor.
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: ibrsel - 06 Eylül 2006, 09:30:02
@Ugur2006;
Pic 16F628 in RB1 ve RB2 pinleri donanımsal olarak seri haberleşmeyi desteklemektedir.[RB1(RX),RB2(TX) ]
   Ama yazılımında sen illaki bu uçları kullanmak zorunda değilsin.B portunun herhangi bir ucundan Seri bilgi gönderip başka bir ucundanda seri bir bilgi alabilirsin.
   Ayrıca bilgi okuma esnasında verinin yalnış alındığını söylüyorsun,bunun birkaç nedeni olabilir;
  Seri haberleşme yaptığın cihazlarının arasındaki mesafe..Eğer bu mesafe uzun ise MAX232 modeli bir RS232 dönüştürücü kullanmanı tavsiye ederim..
  Ayrıca 9600 baud da haberleşme yapıyor isen mutlaka XT osc kullanmalısın..Çünkü daha önceki sorunda RC osc yi kullanmayı sormuştun.RC osc ile yapacağın seri haberleşmede bilgi kaybın olabilir.Çünkü Pic in iç osilatörü ortam sıcaklığından,parazitlerden vb. gibi şeylerden etkilenebilir ve seri iletişimde 9600 baud da veri gönderimini etkiler.
 Son olarak  Pic C bilmediğim için göndereceğin veriyi nasıl invert edeceğini bilmiyorum,fakat senin için küçük bir araştırma yapabilirim.

  İyi çalışmalar..
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: ibrsel - 06 Eylül 2006, 09:37:12
#use rs232(baud=9600,rcv=PIN_B1,xmit=PIN_B2,parity=N,bits=8,invert)

diye bir komut satırı yazmışsın.bunu aşağıdaki şekilde bir denermisin
#use rs232(baud=9600,rcv=PIN_B1,xmit=PIN_B2,parity=T,bits=8 )
Basicte tersleme işlemi için seri iletişim modunu "N" yapıyorduk,senin yazdığın kodda "paritiy=N" yazıyordu,bunu "T" yaparsan belki terslemiş olursun..Tam bir cevap değil ama belki C  de böyledir.bir dene..
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: respected - 06 Eylül 2006, 14:11:42
parity olarak N,E, O yaılabilir. T yazılmaz
N: none
O: Odd
E: Even
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 06 Eylül 2006, 21:10:25
@ibersel,
Alıntı Yap
Ayrıca 9600 baud da haberleşme yapıyor isen mutlaka XT osc kullanmalısın..Çünkü daha önceki sorunda RC osc yi kullanmayı sormuştun.RC osc ile yapacağın seri haberleşmede bilgi kaybın olabilir.Çünkü Pic in iç osilatörü ortam sıcaklığından,parazitlerden vb. gibi şeylerden etkilenebilir ve seri iletişimde 9600 baud da veri gönderimini etkiler.
demissin.
Ben o zaman hangi Baud hizi kullanayim?
Hangisini tavsiye dersin dahili RC osilatorü kullanmak istedigim zaman?

@respected
Alıntı Yap
parity olarak N,E, O yaılabilir. T yazılmaz
N: none
O: Odd
E: Even
Yukarda belirttigim gibi su an PIC'den gelen String karekterleri karmasik .
asagidaki gibi üc sekildede denedim fayda etmedi.Karekterleri karmasik olarak aliyorum.
parity=N
parity=O
parity=E

PIC16F84 ilede ayni sorunla karsilasmistim INVERT ifadesini ekledigimde sorun düzelmisti.
Ama PIC16F628'de nasil olacak bu is?
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: ibrsel - 06 Eylül 2006, 21:33:03
Bana kalırsa seri iletişimde mutlaka XT osc kulanmalısın(kararlılık açısından).Edindiğim tercübe bunu gösteriyor..Ama yinede RC osc kullanacağım diyorsan birşey diyemem,bunuda ancak kendi denemelerinle bulabilirsin..
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 06 Eylül 2006, 21:48:33
Su an Devreye tekrar harici Osilatorü ekledim.
ve kodda su degisikligi yaptim.
#fuses XT,NOWDT,NOPROTECT,PUT, NOBROWNOUT,NOLVP
Ama hala su basit denemede dahi Terminal Programina PIC'den gelen karekterler karmasik olarak  geliyor.
#include <16f628.h>
#fuses XT,NOWDT,NOPROTECT,PUT, NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_B2,rcv=PIN_B1,parity=N,bits=8 )

void main()
{
 while(1)
      {
       printf("\r\nBu bir deneme yazidir");
       delay_ms(500);
      }
}



Görüldügü gii basit bir deneme ama hala sonuc alamdim.Karekterler su sekilde
ºjÚy½¯ÑÛjÚú»ªª*ªúkÔZjºjÚy½¯EÛj
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: ibrsel - 06 Eylül 2006, 22:14:50
http://www.hemenpaylas.com/download/1510863/RS232.rar.html

Burada senin için basicte yazdığım küçük bir program var.Bir incele..Dediğim gibi C den pek anlamadığım için çok fazla yardımcı olamıyorum..Umarım bu program biraz işini görür..
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 06 Eylül 2006, 22:39:42
sağol tesekkürler deneyecegim.
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 06 Eylül 2006, 23:25:15
Sonunda 16F628 ilede sorunu cözdüm.
16F628'de Portlari O/I icin kullandigim USE_FAST_IO();  komutlari su sekilde iken PIC ile serial iletisimi kuramadim.

#include <16f628.h>
#fuses XT,NOWDT,NOPROTECT,PUT, NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600,rcv=PIN_A1,xmit=PIN_A0,parity=N,bits=8,INVERT )


#use fast_io(A)
#use fast_io(B)
#byte PortA=5
#byte portB=6

void main()
{
char x;
int gelen;
SET_TRIS_A(0b00011);
SET_TRIS_B(0b11001111);
PortA=PortB=0;

Printf("1 veya 2 Giriniz\n\r");

//gelen=getch();
for(;;)
{
gelen=getch();
switch (gelen)
{
case '1':output_high(PIN_B4);output_low(PIN_B5);break;
case '2':output_high(PIN_B5);output_low(PIN_B4);break;
}
}
}


Su komutlari ;
#use fast_io(A)
#use fast_io(B)
#byte PortA=5
#byte portB=6


kaldirip Kodu su hale getirince Serial Port ile iletisimi kurdum.
#include <16f628.h>
#fuses XT,NOWDT,NOPROTECT,PUT, NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600,rcv=PIN_A1,xmit=PIN_A0,parity=N,bits=8,INVERT )
void main()
{
char x;
int gelen;

Printf("1 veya 2 Giriniz\n\r");


//gelen=getch();
for(;;)
{
gelen=getch();
switch (gelen)
{
case '1':output_high(PIN_B4);output_low(PIN_B5);break;
case '2':output_high(PIN_B5);output_low(PIN_B4);break;
}
}
}


Acaba yukarda ilk kodda verdigim örnekte ben Kodda yanlis birseymi kullandimda
#USE_FAST_IO();  komutu ile PIC arasinda serial iletisimi kuramadim?
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ziya - 06 Eylül 2006, 23:43:33
Alıntı yapılan: "Ugur2006"#use fast_io(B)
...
SET_TRIS_A(0b00011);
SET_TRIS_B(0b11001111); // Bu satırda TX pini olan rb_2 çıkış olacak.

Yani
SET_TRIS_B(0b11001011);...
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 07 Eylül 2006, 00:25:33
@Ziya,
Hocam yani sonuc olarak yazindan sunu anladim.
Serial Iletisim kullanacagim zaman,
PIC16F628'e ait olan TX(RB2)  ve RX(RB1) bitlerini kullanmiyor olsamda bu bitlerin Giris ve Cikis olmasina dikkat etmeliyim yani öylemi?
Yukardaki örnekte ben bu Bitleri değil baska bitleri RX ve TX olarak kullandim.
Buna ragmen;
RB2(TX)  Cikis
RB1(RX)  Giris olmali diyorsun.
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ziya - 07 Eylül 2006, 08:59:19
Görmemişim. Şimdi söyleyecek söz bulamıyorum. Kusura bakma. Elinde traktör varken öküzle tarla sürmeye benzemiş seninki. Keşke 16F84'e devam etseydin.
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Ugur2006 - 07 Eylül 2006, 19:28:51
Alıntı yapılan: "Ziya"Görmemişim. Şimdi söyleyecek söz bulamıyorum. Kusura bakma. Elinde traktör varken öküzle tarla sürmeye benzemiş seninki. Keşke 16F84'e devam etseydin.

Hocam valla anlayamadim ne kast ettiginizi !!
While döngüsünden cikamiyorum adli baslikta sorun yasadigim bir Kod'un 16F84'de olamiyacagini 16F628 ile devam etsem daha iyi olacagini söylemistin.
Alıntı Yap16F84 ile bu işi yapamazsın. Aradaki delayler nedeniyle bilgiyi okuyamazsın. Onun yerine 16F628 kullan. İçerisinde donanım uart motoru var. Kendi kendine gönderir alır. Güdümlü füzeler gibi "at ve unut" !
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: Digimensch - 09 Eylül 2006, 16:08:05
PIC16F84 Traktör , PIC16F628 Öküzmü oluyor?
Yani PIC16F84 dahami avantajli PIC628'e göre?
Sundan soruyorum bendePIC16f84 ile birseyler yapmaya calistim artik  PIC16F628'e gecmeyi düsünüyordum.
Başlık: 16F628 ile ilk denemem ama olmadi.
Gönderen: XX_CİHAN_XX - 09 Eylül 2006, 16:56:14
Arkadaşlar artık 16f84 mü kaldı?
İki entegrede aynı ayak yapısına ve aynı fiyata sahipken neden her yönden üstün olan 16f628 i değil 16f84 ü kullanıyorsunuz merak ediyorum.