MicroC & PIC16F serisinde page1 de işlem yapmak!

Başlatan MICROCEBEL, 01 Aralık 2007, 15:40:00

MICROCEBEL

Arkadaşlar merhaba,

MicroC ile başım biraz dertte.PIC12C509A yı rf alıcı devremde,PIC16F876 yıda verici devremde kullandım.Fakat verici devremde kontrol daha fazla olduğu için lcd,diğer işlemler vs.Programım 2kbyte'ı aşıyo.Programın belli bir kısmını page1 e taşıdım yani PIC16F876 nın kullanıcıya ayrılmış  h'800' üncü adres sonrasına.Ama ne yaptıysam bu alt programı çağıramıyom.Sadece page 1 kısmındaki alt programı ayrı bir kaynak kütüphanesine taşıyom gene olmuyo bu seferde editör aşağıdaki hatayı veriyor.

C:/Documents and Settings/Burak CEBEL/Desktop/program/transmit/pageup.c:1: error: Can't open include file "lcd_dnm.c"
   #include <lcd_dnm.c>
1 error in preprocessor.

Çok basit ve kısa bir program yazdım bunu size göstereyim bunun üzerinde yorum yaparsanız sevinirim.Sadece advertisement alt programı h'800'üncü adresten başlıyor.Aşağıdaki kod advertisement alt programın ayrı bir kaynak kütüphanesine taşınmamış hali.



unsigned char *text2="MICRO AUTOMATION" ;
unsigned char *text3="WIRELESS"     ;
unsigned char *text4="CNC CONTROLLER"  ;
unsigned char *text9="Data transmit'C'"  absolute 0xA0;

void advertisement (void) org 800{
     Lcd_Custom_Out(1,1,"B");
     Lcd_Custom_Out(2,1,text2);
     Delay_ms(3000);
     Lcd_Custom_Cmd(Lcd_Clear);
     Lcd_Custom_Out(1,5,text3);
     Lcd_Custom_Out(2,2,text4);
     Delay_ms(3000);
     Lcd_Custom_Cmd(Lcd_Clear);
}

void first_adjustment (void) {
     Lcd_Custom_Config(&PORTB,1,2,3,4,&PORTB,7,6,5);
     Lcd_Custom_Cmd(Lcd_Clear);
     Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
}

void port_init (void){
     PORTA=0;
     PORTB=0;
     PORTC=0;
     TRISA=0b00111111;
     ADCON1=0X06;
     TRISB=0b00000001;
     TRISC=0b00000111;
     first_adjustment();
}

void main (void){
     port_init();
//     PCLATH=0b00001000;
     advertisement();
//     PCLATH=0b00000101;
     while(1){
//          control();
          asm{
             NOP
             NOP
             NOP
          }
     }
}


PCLATH'a değer yükleyerekte denedim bir türlü olmuyor.advertisement altprogramındaki org h'800'tanımlamasını kaldırdığımda gayet normal çalışıyor.

Aşağıdaki program advertisement alt programının kaynak dosyasına taşınmış hali.

#include <lcd_dnm.c>

void first_adjustment (void) {
     Lcd_Custom_Config(&PORTB,1,2,3,4,&PORTB,7,6,5);
     Lcd_Custom_Cmd(Lcd_Clear);
     Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
}

void port_init (void){
     PORTA=0;
     PORTB=0;
     PORTC=0;
     TRISA=0b00111111;
     ADCON1=0X06;
     TRISB=0b00000001;
     TRISC=0b00000111;
     first_adjustment();
}

void main (void){
     port_init();
//     PCLATH=0b00001000;
     advertisement();
//     PCLATH=0b00000101;
     while(1){
//          control();
          asm{
             NOP
             NOP
             NOP
          }
     }
}


Aşağıdaki kod advertisement alt programının lcd_dnm.c kaynak kütüphanesine taşınmış hali.

unsigned char *text2="MICRO AUTOMATION" ;
unsigned char *text3="WIRELESS"     ;
unsigned char *text4="CNC CONTROLLER"  ;
unsigned char *text9="Data transmit'C'"  absolute 0xA0;

void advertisement (void) org 800{
     Lcd_Custom_Out(1,1,"B");
     Lcd_Custom_Out(2,1,text2);
     Delay_ms(3000);
     Lcd_Custom_Cmd(Lcd_Clear);
     Lcd_Custom_Out(1,5,text3);
     Lcd_Custom_Out(2,2,text4);
     Delay_ms(3000);
     Lcd_Custom_Cmd(Lcd_Clear);
}


Bu kodlar üzerinde birlikte yorum yapalım ve ben hatamı bulayım arkadaşlar.PIC18 serisinde sayfaya ayırma problemi olmadığı için gayet normal kullanıyodum.Asm dede PIC16 serisinde yaklaşık 8k program yazdım böyle karşılaştığım sorunları gayet kolaylıkla çözüyodum.Ama MicroC de kayaya çarptık :) .Olmadı HitechC ile yazıcam programı.

ahmet2004

Öncelikle şu satır böyle olacak.

void advertisement() org 0x800 {

MICROCEBEL


MICROCEBEL

Arkadaşlar özür dilerim örnek olarak verdiğim kod çalışıyomuş örnek kısa olsun diye vermiştim ama şimdi asıl çalışmayan kodu koyucam buraya onun üzerinde yorum yapın ve bende tabiki.

@Ahmet2004 hocam,

void advertisement (void) org 0x800{
}                                                        
                                                     
void advertisement () org 0x800{
}

her ikiside aynı değilmidir.void zaten boş anlamındadır.Fonksiyonun parametresinin olmadığını gösterir.Benim bildiğim kadarıyla.Eğer arasında bi fark varsa bilgilendirirseniz iyi olur.

MICROCEBEL

Arkadaşlar çalışmayan kod bu.void control (void){} şeklinde tanımladığımda çalışıyor.Ama h'800' adresinden başlatmak istdeiğimde çalışmıyor.Bir türlü anlam veremedim.Yukarıdaki advertisement alt programlı olan gayet güzel çalışıyor ama control alt programını koyduğumda çalışmıyor.Demekki control alt programında sorun var ama ne gözümden kaçmış olabilir.

unsigned char *text2="B & M" ;
unsigned char *text3="MICRO"     ;
unsigned char *text4="CNC CONTROLLER"  ;
unsigned char *text9="Data transmit'A'"  absolute 0xA0;
static unsigned char lcd_help ;
static unsigned short wireless_help1,wireless_help2,wireless_help3 ;


void control (void) org 0x800{

      if(PORTA==0b00111111 && PORTB.F0==1 &&PORTC.F0==1 && PORTC.F1==1 && PORTC.F2==1){
        if(lcd_help==0) {
          Lcd_Custom_Cmd(Lcd_Clear);
          Lcd_Custom_Out(1,1,text2);
          Lcd_Custom_Out(2,1,text3);
          lcd_help=255;
        }
      }
      while(PORTA.F0==0){
              if(lcd_help==255){
                Lcd_Custom_Cmd(Lcd_Clear);
                Lcd_Custom_Out(1,1,text9);
                lcd_help=0;
              }
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('A');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F1==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('B');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F2==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('C');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F3==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('D');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F4==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('E');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F5==0){
             for(wireless_help1=0;wireless_help1<=3;wireless_help1++){                 Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('F');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTB.F0==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('J');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTC.F0==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('G');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTC.F1==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('H');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTC.F2==0){
             for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('I');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
}

void first_adjustment (void) {
     Lcd_Custom_Config(&PORTB,1,2,3,4,&PORTB,7,6,5);
     Lcd_Custom_Cmd(Lcd_Clear);
     Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
     Soft_Uart_Init(PORTC, 5, 4, 2400, 0);
}

void port_init (void){
     PORTA=0;
     PORTB=0;
     PORTC=0;
     TRISA=0b00111111;
     ADCON1=0X06;
     TRISB=0b00000001;
     TRISC=0b00000111;
     first_adjustment();
}

void main (void){
     port_init();
     while(1){
          control();
          asm{
             NOP
             NOP
             NOP
          }
     }
}

ahmet2004


MICROCEBEL

derlediğim zaman hata vermiyor.Ama sadece control alt programını page1 den başlattığım zaman devrede hiç bir tıkırtı yok.org 0x800 ü kaldırıyorum çalışıyor.Bunun nedenini anlamış değilim.

ahmet2004

Şu hexi bir denermisin
Hex...
Proteus Animasyon...
unsigned char *text2 = "B - M";
unsigned char *text3 = "MICRO";
unsigned char *text4 = "CNC CONTROLLER";
unsigned char *text9 = "Data transmit'A'" absolute 0xA0;

static void xxx(void);
void port_init(void);

static unsigned char lcd_help;
static unsigned short wireless_help1,wireless_help2,wireless_help3;



static void xxx(void)
{
      while(PORTA.F0==0){
              if(lcd_help==255){
                Lcd_Custom_Cmd(Lcd_Clear);
                Lcd_Custom_Out(1,1,text9);
                lcd_help=0;
              }
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('A');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F1==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('B');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F2==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('C');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F3==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('D');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F4==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('E');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTA.F5==0){
             for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
               Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('F');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTB.F0==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('J');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTC.F0==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('G');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTC.F1==0){
              for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('H');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
      while(PORTC.F2==0){
             for(wireless_help1=0;wireless_help1<=3;wireless_help1++){
                Soft_Uart_Write(0X55);
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write('I');
              }
              Delay_ms(1);
              for(wireless_help2=0;wireless_help2<=3;wireless_help2++){
                Soft_Uart_Write(0XAA);
              }
              Delay_ms(1);
      }
}

void control (void) org 0x400{
      if(PORTA==0b00111111 && PORTB.F0==1 && PORTC.F0==1 && PORTC.F1==1 && PORTC.F2==1)
      {
        if(lcd_help==0)
        {
          Lcd_Custom_Cmd(Lcd_Clear);
          Lcd_Custom_Out(1,1,text2);
          Lcd_Custom_Out(2,1,text3);
          lcd_help=255;
        }
      }
      xxx();
}

void main(void)
{
     PORTA = 0x00;
     PORTB = 0x00;
     PORTC = 0x00;
     ADCON1 = 0x06;
     TRISA = 0b00111111;
     TRISB = 0b00000001;
     TRISC = 0b00000111;
     Lcd_Custom_Config(&PORTB,1,2,3,4,&PORTB,7,6,5);
     Lcd_Custom_Cmd(Lcd_Clear);
     Lcd_Custom_Cmd(Lcd_CURSOR_OFF);
     Soft_Uart_Init(PORTC, 5, 4, 2400, 0);

     while (1)
     {
          control();
          asm{
             NOP;
             NOP;
             NOP;
          }
     }
}


Kod parçalarını küçük tut sende.Pageleri aşmasın.

MICROCEBEL

hocam linke tıkladığımda dosya silinmiş diyo tekrar yüklerimisiniz.MICROC6.2 versiyonunu kullanıyorum ve kontrol kaleminden arkadaşım indirmiş ondan aldım bana full dedi ama aklıma gelen tek şey acaba full değilmi oldu.Daha önce demo versiyonunu kullanırken uyarı veriyodu ama şimdi kodu gayet güzel bi şekilde derliyo ve uyarı falanda yok.Acaba page0 dan farklı bir page kullandığım içinmi çalışmıyo.Çok acayip bişey derliyo yüklüyo ve çalışmıyo.

MICROCEBEL

hocam sizin verdiğiniz hex kodu gayet güzel çalışıyor.Fakat verdiğiniz aynı c kodları derledim ve proteus üzerinde denedim çalışmadı.Hex kodlarını karşılaştırdım sizin verdiğinizle farklılıklar gördüm.Bunun nedeni editör olabilirmi?Eğer siz microc6.2 nini full versiyonunu kullanıyorsanız nasıl temin ettiniz.Cracklisini kullanıyorum ama işimi görmedi.Buna nasıl çözüm bulabilirim hocam?

ahmet2004

Benim kulandığımda aynı versiyon.

Saçma çalışıyor program zaten.Daha geliştirilmeye ihtiyacı var.

Proje geliştiriyorsanız bu derleyiciyi kullanmayın bence.

Başka bir Derleyiciye geçin.

MICROCEBEL

Ahmet hocam ilginiz için çok sağolun.Zaten microc yi kütüphaneleri için tercih ediyodum çünkü zamandan kazandırır diye düşündüm hep.Ama hitech i daha çok beğendim.Bunların dışında kullanım kolaylığı sağlayan bi editör önerebilirmisiniz hocam.

ahmet2004

En kolay ve en çabuk sonuç alınabilen bence CCS C derleyicisidir.

Sonra bu MikroC geliyor.Bunlar kendi komutlarını hazır sunuyorlar.

ASM alt yapın varsa MikrochipC18-30, Hitech, IAR ansiC

derleyicilerini kullanırsan senin için daha iyi olur.

Bende çünkü bunları öğrenmeye

çalışıyorum. :idea: Fırsat buldukça kendimizi geliştirmek istiyorsak

ANSIC derleyicilerle haşır neşir olmamız lazım diye düşünüyorum.

Kendimiz kütüphane yazıp hazırlamalıyız.Sana çalışmalarında

başarılar dilerim.