16F628 ile ilk denemem ama olmadi.

Başlatan Ugur2006, 05 Eylül 2006, 22:21:54

Ugur2006

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?

ibrsel

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..

Ugur2006

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.

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..

Ziya

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();
 }
}
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

Ugur2006

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?

ibrsel

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..

ibrsel

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..

Ugur2006

@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.

ibrsel

@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..

ibrsel

#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..

respected

parity olarak N,E, O yaılabilir. T yazılmaz
N: none
O: Odd
E: Even

Ugur2006

@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?

ibrsel

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..

Ugur2006

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