Yeni projeler baslatiyorum

Başlatan z, 06 Ekim 2013, 14:41:48

justice_for_all

yazmaya basladim bile hocam ama seri port haberlesmesini yapamadim bir turlu.sanal ortamda calisiyorum ondan olabilirmi.siz tx/rx haberlesmesini test ettiniz degil mi hocam?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

Evet STM32F103lu bir kartla haberlestiriyorum.

Sanal ortamda karsisina da bir cip koyup ona da kod yazmaniz gerekecek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

justice_for_all

hocam virtual terminalden data donderiyorum ama debug yaparak datalari bir turlu alamiyorum.islemci koyarak deniycem bide.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

Virtual Terminal gibi bir kolaylık varsa ikinci bir çiple uğraşmana gerek kalmaması lazım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

justice_for_all

virtual terminalde gonderdigim datalari gorebiliyorum ama virtual terminalden data gonderdigim zaman pic tarafindan alamadim datalari bi turlu.

bide hocam benim anlamadigimbir nokta var.siz bu kartlari iyi guzel yapiyosunuz peki bunlari kim uretcek diger kartlarin yazilimlarini kim yapacak?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

Kartı kim üretir hiç önemli değil. Önemli olan interface'e bir standart getirmek.

Diğer kartların yazılımı da bizi ilgilendirmiyor. Bu ilk kartın (PPJ-04) interface donanımı ve işlemci yazılımı diğer kartları tasarlamak isteyenlere referans olacak sadece.

Eğer yapı tutarsa forumda yakında uygulamalar çoğalır zaten. Bu durumu maddi anlamda değerlendirmek isteyenler de kart üretir.

8 bacaklı bir işlemciye PPJ04 bağlayarak uygulama yapmayı isterim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#171
10 Kbaud 16Mhz.  100.000 baud ile de çalışıyor fakat hata algoritmasını iyileştirmek gerekecek

EEprom yazma okuma haric diger komutlar test edildi.






Ustteki semada Master karta iliskin baglantilar solda gorulmekte. Sagdaki transistor vsler zaten 16F628 cipli devremizde mevcut.

Elimde schotky diyod  olmadigi icin 1N4148 kullandim ve sorunsuz calisiyor.

/* 
 * File:   main.c
 * Author: bulentunalmis
 *
 * Created on October 19, 2013, 3:13 PM
 */

#include <htc.h>    

// Asagidaki 5 satiri PIC162xa.h icine yazdim

// volatile unsigned char	Flag	@ 0x20;
// volatile bit Error      	        @((unsigned)&Flag*8)+7;
// volatile bit Busy            	@((unsigned)&Flag*8)+6;
// volatile bit AdrDedected	        @((unsigned)&Flag*8)+5;
// volatile bit DataSource          @((unsigned)&Flag*8)+4;

#define Key   RA5
#define Duduk RA4
#define Lcd_E RB6
#define Lcd_R RB7
#define Biz 1
#define Master 0
#define Dly 0x20

volatile unsigned char Zaman;
unsigned char Debug, Zurna, Led, Tus, LedScan;
unsigned char MyAdr;

unsigned char Buffer[32];
unsigned char RxDat,TxDat;
signed   char WIndex=-1;
int Z,T;

void Cls(void);
void Lcd_Pos(char, char);
void Lcd_Text();
void Lcd_NewChar();


void Hata()
{
    Error=1; 
    AdrDedected=0; 
    DataSource=Master;
    WIndex=-1; 
    RCIE=0;
}

void interrupt isr(void)
{

    if(INTF)
      {
        INTF=0;
        RCIE=1;		   							// USART Recieve int enable
        RxDat=RCREG; 
        RxDat=RCREG;
        CREN=0; CREN=1; 
        AdrDedected=1;
        WIndex=-1;
	  }

   if(RCIF && RCIE && AdrDedected)   
     {
        if(FERR && OERR) Hata();    			// Iletisim hatasi varsa stop
        else
          {
            if(DataSource==Biz)     			// Bizim data mi geri geldi yoksa ustanin datasi mi?
              {
                DataSource=Master;
                if(RCREG!=TxDat) Hata(); 		               // Bus'a birisi sarkmissa stop
              }
            else                    			               // Usta bir sey yollamis
             {
               if(WIndex==-1)       			// Ilk data adres bilgisidir
                 { 
                   if(RCREG!=MyAdr) 
                     {
    	           AdrDedected=0;			// Adres bize ait değil
          	           DataSource=Master; 
    	           RCIE=0;
                     } 
                   else 					// Adres bize ait
                     { 
                        WIndex=0; 				
                        TxDat=Flag & 0xC0;		               // Mesgul ve Hata durumumuzu bildirelim
	                    TXREG=TxDat;
                        DataSource=Biz;
                     }
                 }
               else
                 {
                   if(WIndex>17) Hata(); 		              // Komut dahil en uzun data treni 17 bytedir.
                   else {RxDat=RCREG; Buffer[WIndex]=RxDat; WIndex++;}
                 }
              }
          }
     }

	if(TMR1IF)
      {
        TMR1H = 0xFE;   // TMR1 = 0xFE0C
        TMR1L = 0x0C;
        TMR1IF = 0;

        if(Zaman) Zaman--; 
        T = (T + 1) & 0x3FF;
        Z = (Z + 1) & 0x3FF; // Z'yi Zurna degiskenine deger attiginda sifirla
        Osc ^= 1;

        switch (Zurna) 
          {
              case 0: { Osc=1; break;}
              case 1: { if (Z & 0x100) Zurna=0; break; }
              case 2: { if (Z & 0x200) Zurna=0; break; }
              case 3: { if (Z & 0x100) Osc=1;   break; }
          }

        if(Osc) Duduk=1; else Duduk=0;
      }      
}


void MiliSec(unsigned char T)
{
	Zaman=T;
    while(Zaman) {asm ("NOP");}
    asm ("NOP");
}

void Lcd_W4(char Dat)
{
unsigned char i;

    PORTA=(PORTA&0xF0)|(Dat&0x0F);
    Lcd_E = 0;
    for(i=0;i<Dly;i++) asm ("NOP");
    Lcd_E = 1;
    for(i=0;i<Dly;i++) asm ("NOP");
    RA0=0; RA1=0; RA2=0; RA3=0;
}

void Lcd_Write(char Dat)
{
	Lcd_W4(Dat>>4);
	Lcd_W4(Dat);
}

void Cls(void)
{
	Lcd_R = 0;
	Lcd_Write(0x01); // Clear Disp
	MiliSec(4);
	Lcd_Write(0x02); // Cursor Home
	MiliSec(4);
}

void Lcd_Msg(const char *s)
{
	Lcd_R = 1;	
	while(*s) Lcd_Write(*s++);
}

char Hex(unsigned char Dat)
{
    Dat&=0x0F;
    Dat+=0x30;
	if (Dat>0x39) Dat+=6;
	return(Dat);
}

void Lcd_Hex(unsigned char Dat)
{
	Lcd_R = 1;	
	Lcd_Write(Hex(Dat>>4));
	Lcd_Write(Hex(Dat));
}

void Lcd_Pos(char X, char Y)
{
	Lcd_R = 0;
	if (Y==0) Lcd_Write(0x80 + X);    
    else Lcd_Write(0xC0 + X);           
	MiliSec(4);
}

void Crs(char Cmd)
{
	Lcd_R = 0;
	Lcd_Write(Cmd); // LCD Komut
}

void Lcd_Init(void)
{
	Lcd_R = 0;	
	MiliSec(20);

	Lcd_W4(0x03); MiliSec(10);
    Lcd_W4(0x03); MiliSec(10);
    Lcd_W4(0x03); MiliSec(10);

    Lcd_W4(0x02); MiliSec(10); // 4 Bit modu

	Lcd_Write(0x28);	// 4 bit modu, 1/16 duty, 5x7 font
	Lcd_Write(0x28);	// 4 bit modu, 1/16 duty, 5x7 font
	Lcd_Write(0x08);	// display off
	Lcd_Write(0x0C);	// display on, blink curson off
	Lcd_Write(0x06);	// entry mode
//	Cls();
}

void Lcd_NewChar()      // Buffer 0'daki verilerle yeni karakter tanimla
{
char i;

	Lcd_R = 0;
	Lcd_Write(0x40 + (Buffer[0] & 0xF) << 3 );
	Lcd_R = 1;
    for(i=1;i<9;i++) Lcd_Write(Buffer[i]);
}

// Xtal frekansimiz 16 Mhz

void Init(void)
{

char i;

    TRISA  = 0b11100000;
    TRISB  = 0b00000111;

    PORTA=0xF0;

    PORTB  = 0x80; for(i=0;i<40;i++) asm ("NOP");

    if (Key==1) MyAdr  = 0x06; else MyAdr=0x04;
    PORTB  = 0x40; for(i=0;i<40;i++) asm ("NOP");

    if (Key==1) MyAdr ++;

    PORTB  = 0xFF; 
    PORTA  = 0xFF; 
    Flag=0;


    for(i=0;i<32;i++) Buffer[i]=0xFF;

    T1CON  = 0b00110101; // Prescale=/8

//  SPBRG  = 3;          // 250 KBaud (BRGH=1)
//  SPBRG  = 4;          // 200 KBaud (BRGH=1)
//  SPBRG  = 9;          // 100 KBaud (BRGH=1)
    SPBRG  = 99;         // 10  KBaud (BRGH=1)

    TXSTA  = 0b00100100; // Usart tranmitter Asyn modunda 8 bit calisacak (BRGH=1)
    RCSTA  = 0b10010000; // Usart receiver   Asyn modunda 8 bit calisacak

    OPTION = 0b10000000; // Pull-Up direcler devre disi
    PIE1   = 0b00000001; // Timer1 Int enable, !!! UART Int disable !!!

    INTCON = 0x00;
    INTCON = 0b11010000; // Interruptlar acildi (RB0 Int Enable)

    Lcd_Init();
    Lcd_Pos(0,0);
    Lcd_Msg("PPJ-");
    Lcd_Hex(MyAdr);

    Zurna=2;
 
    Lcd_Pos(0,0);
    Lcd_Msg("READY ");

}

void Send(char Dat)
{
    while(!TXIF);
    GIE=0;
	TXREG=Dat;
    TxDat=Dat;
    DataSource=Biz;
    GIE=1;
 }

void main()
{
unsigned char i;
volatile int TT;

	Init();
    while(1)
	  {
        while(WIndex!=1)			// Komut gelinceye kadar bekle
          {
            Tus=0;
            RA3=0; RA0=1; if(Key) Tus|=1;
            RA0=0; RA1=1; if(Key) Tus|=2;
            RA1=0; RA2=1; if(Key) Tus|=4;
            RA2=0; RA3=1; if(Key) Tus|=8;

            if(TT!=T)
              {
                LedScan = (LedScan<<1) & 0x0F;
                if(LedScan==0) LedScan=1;
                RB5=0; RB4=0; RB3=0;
                switch (LedScan & Led)
                  { 
                    case 1: { if (!((Led & 0x10) && (T & 0x100))) {RB5=1; RB4=1; RB3=0;}; break;}
                    case 2: { if (!((Led & 0x20) && (T & 0x100))) {RB5=0; RB4=0; RB3=1;}; break;}
                    case 4: { if (!((Led & 0x40) && (T & 0x100))) {RB5=1; RB4=0; RB3=1;}; break;} 
                    case 8: { if (!((Led & 0x80) && (T & 0x100))) {RB5=0; RB4=1; RB3=0;}; break;}
                  } 
                TT=T; 
              } 
           }

        Busy=1;						// Artik mesguluz
        switch(Buffer[0])
          {
             case 0:{
                      Error=0;		// Hata flagini sil
                      Send(0x04);	// 4 tus var
                      Send(0x04);	// 4 led var
                      Send(0x02);	// 2 Satir  Lcd
                      Send(0x10);	// 16 Sutun Lcd
                      Send(0x80);	// 128 Byte EEprom
                      break; 
                    }       
             case 1:{
                      Error=0;		// Tus bilgisi istendiginde Error Flag da silinir.
                      Send(Tus);	// Tuslari bildir
                      break; 
                    }       
             case 2:{
                      while(WIndex<2)if(Error) break;	// Ledleri yak
                      if(!Error) Led=Buffer[1];
                      break;
                    } 
             case 3:{
                      while(WIndex<2)if(Error) break;	// Dudugu ottur
                      if(!Error) {Z=0; Zurna=Buffer[1];}
                      break;
                    } 
             case 4:{									// Ekani temizle
                      GIE=0;
                      Cls();
                      break;
                    } 
             case 5:{									
                      while(WIndex<2)if(Error) break;	// Curson On/Off vs
                      if(!Error) Crs(Buffer[1]);
                      break;
                    } 
             case 6:{									// Kursor pozisyonunu set et
                      while(WIndex<3)if(Error) break;
                      if(!Error) {Lcd_Pos(Buffer[1],Buffer[2]);}
                      break;
                    } 
             case 7:{									// Lcd Text
                      while(WIndex<2)if(Error) break;	// String boyunu bekle
                      while(WIndex<Buffer[1]+2)if(Error) break;	// Stringi bekle
                      if(!Error)
                        {
                          GIE=0; 
                     	  Lcd_R = 1;	
	                      for(i=2;i<Buffer[1]+2;i++) Lcd_Write(Buffer[i]);
                        } 
                      break;
                    }       
             case 8:{									// EEproma verileri yaz
                      while(WIndex<3)if(Error) break;	// Datalarin sayisini ve adresi bekle
                      while(WIndex<Buffer[1]+3)if(Error) break;	// Datalari bekle
                      if(!Error)
                        {
                          while (GIE=1); GIE=0;
                          WREN=1;
                          for(i=3;i<Buffer[1]+3;i++)
                            {
	                          EEADR=Buffer[2];		
                              EEDATA=Buffer[i];
                              EECON2=0x55;
                              EECON2=0xAA;
                              WR=1;
                              GIE=1;
                              while (WR); 
                              Buffer[2];
                            }
                          WREN=0;
                        } 
                      break;
                    }       
             case 9:{
                      while(WIndex<3)if(Error) break;	// Datalarin sayisini ve adresi bekle
                      for(i=3;i<Buffer[1]+3;i++)
                        {
                 	      EEADR=Buffer[2];
                          RD=1;
                          Buffer[i]=EEDATA;
                          Buffer[2]++;
                        }
                      break;
                    }       
           }

        GIE=0;
        for(i=0;i<32;i++) Buffer[i]=0xFF;
        AdrDedected=0; 
        DataSource=Master;
        WIndex=-1; 
        Busy=0;
        RCIE=0;
        GIE=1;
      }
}


Karşı tarafta master islemci olarak STM32F103 kullandım. Deneme amaçlı kodlar asagida. main satirindaki kodlari adim adim calistirdigim icin mevcut hali anlamli. Eger dogrudan run ederseniz duduk,led vs rutinleri hizlica islenir ve sonucunu gozleyecek kadar zaman olmaz.

SystemInit fonksiyonunu ayrica yazip ilave etmeniz gerekecek. (Usart1 kullanıldı, Adres/Data secimi icin PortB B0 pini kullanildi. Baudrate 10 Bin baud )

#define STM32F10X_LD
#include <stm32f10x.h>

#define Retry 5

volatile char Rx, Tus, Sts;

char TusSayisi;
char LedSayisi;
char LCDSatirSayisi;
char LCDSutunSayisi;
char E2RBoyu;
char Err;

char GetRx() // 1 ile geri donulurse isler yolunda demek, 0 ile donulurse hata var
{
volatile static int i;
          
          i=200000; 
          if(!Err)
            {         
              while(!(USART1->SR & 0x20)) { i--; if (!i) break;}
              if (USART1->SR & 0x20) Rx=USART1->DR;
              else (Err=1);
            }  
          return(!Err); 
}

char Send(unsigned char Data)  // 1 ile geri donulurse isler yolunda demek, 0 ile donulurse hata var
{
          if(!Err)
            {         
              while(!(USART1->SR & 0x80));
              USART1->DR=Data;       
              if(GetRx())
                {         
                  if (Rx!=Data) Err=1;
                }          
            }    
          return(!Err);
}

void AdrLine(char Line)
{
          if (Line==0) GPIOB->BRR=1;
          else GPIOB->BSRR=1;
}


void Wait(int T)             // T mikrosaniye bekler
{
volatile int x;
          for(x=0;x<9*T;x++);          
}

/*
          Donanimdan bagimsiz rutinler
*/


char Status(unsigned char Adr)
{
Bekle:
          Err=0;
          AdrLine(0);                   // Adres/Data hattini 0 yap
          Wait(10);                     // 10 mikrosaniye bekle
          
          AdrLine(1);                   // Adres/Data hattini 1 yap
          Wait(100);                    // 100 mikrosaniye bekle
          
          Send(Adr);                    // Adresi yolla    
          if(!Err) GetRx();             // Status bilgisi geldi
          if(Err) goto Bekle;
          return(Rx);
}

char SendAdr(unsigned char Adr) // 1 ile geri donulurse isler yolunda demek, 0 ile donulurse hata var
{
          
Bekle:    while (Status(Adr)&0x40);     // Slave mesgul ise bekle 

          if(Rx & 0x80)
            {
              Err=0;
              AdrLine(0);               // Adres/Data hattini 0 yap
              Wait(10);                 // 10 mikrosaniye bekle
          
              AdrLine(1);               // Adres/Data hattini 1 yap
              Wait(100);                // 100 mikrosaniye bekle
          
              Send(Adr);                // Adresi yolla    
              if(!Err) GetRx(); 
                      
              if(!Err) Send(0x01);      // Hata flagini silmek icin Tus bilgilerini iste 
              if(!Err) GetRx();
              if(!Err) Tus=Rx;
            }     
          if(Err) goto Bekle;            
          return(!Err);
}


char PPJ()
{
          SendAdr(4);
          if(!Err) Send(0x0);
          if(!Err) GetRx();             
          if(!Err) TusSayisi=Rx;
          if(!Err) GetRx();             
          if(!Err) LedSayisi=Rx;
          if(!Err) GetRx();             
          if(!Err) LCDSatirSayisi=Rx;
          if(!Err) GetRx();             
          if(!Err) LCDSutunSayisi=Rx;
          if(!Err) GetRx();             
          if(!Err) E2RBoyu=Rx;
          return(!Err);
}

        
char Keyb()
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              SendAdr(4); 
              if(!Err) Send(0x01);
              if(!Err) GetRx();
              if(!Err) Tus=Rx;
              if(!Err) break;        
            }          
          return(!Err);
}

char Led(char Data)
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              SendAdr(4);
              if(!Err) Send(0x02);
              if(!Err) Send(Data);
              if(!Err) break;        
            }          
          return(!Err);
}
  
char Duduk(char Data)
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              SendAdr(4);
              if(!Err) Send(0x03);
              if(!Err) Send(Data);
              if(!Err) break;        
            }          
          return(!Err);
}

char Cls()
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              SendAdr(4);
              if(!Err) Send(0x04);
              if(!Err) break;        
            }          
          return(!Err);
}

char Lcd_Cursor_Cmd(char Cmd)
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              SendAdr(0x04);
              if(!Err) Send(0x05);
              if(!Err) Send(Cmd);
              if(!Err) break;        
            }          
          return(!Err);
}

char Lcd_CrsOn()
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              Lcd_Cursor_Cmd(0x0E);
              if(!Err) break;        
            }          
                      
          return(!Err);
}

char Lcd_CrsOff()
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              Lcd_Cursor_Cmd(0x0C);
              if(!Err) break;        
            }          
          return(!Err);
}

char Lcd_CrsBlink()
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              Lcd_Cursor_Cmd(0x0F);
              if(!Err) break;        
            }          
          return(!Err);
}

char Lcd_Pos(char x, char y)
{
int i;  
          for(i=0;i<Retry;i++)          
            {
              SendAdr(0x04);
              if(!Err) Send(0x06);
              if(!Err) Send(x);
              if(!Err) Send(y);
              if(!Err) break;        
            }          
          return(!Err);
}


char Lcd_Text(char *s)
{
char *d,j;
int i;  
          for(i=0;i<Retry;i++)          
            {
              Err=0;                        
              SendAdr(0x04);
              if(!Err) Send(0x07);
              d=s;    
              j=0; while(*d){j++;d++;}
              if(!Err) Send(j);
              if(!Err) while(*s)
                {         
                  if(!Err) Send(*s);
                  s++; 
                }
              if(!Err) break;        
            }          
          return(!Err);
}


int main()
{
          Err=0;
          
          AdrLine(1); Wait(1000);
          
          PPJ();
          Duduk(0);
          Duduk(1);
          Duduk(2);
          Duduk(3);
          Duduk(4);
          Duduk(0);
          
          Led(1);
          Led(2);
          Led(4);
          Led(8);
          
          Led(0x11);
          Led(0x33);
          Led(0x77);
          Led(0xff);
          Led(0x00);
          
          
          Lcd_CrsOn();
          Lcd_Pos(0,0);
          Lcd_Text("PPJ-04 Demo");
          
          Lcd_Pos(0,1);
          Lcd_Text("Picproje 2013");
          
//          Cls();
         
          Lcd_CrsOff();
          Lcd_Pos(0,1);
          Lcd_Text("PPJ-04 Demo  ");
          
          Lcd_Pos(0,0);
          Lcd_Text("Picproje 2013");

          while(1);
}


Onemli Not:

Ana kartda deneme icin 72Mhz ARM islemci kullandigim icin rutinlerde intterrupt kullanmama gerek kalmadi. Eger ana kartinizda siradan bir 8 bit PIC islemci kullanacaksaniz haberlesmeyi Usart int rutuni uzerinden gerceklestirmelisiniz. Cunku PPJ-04'e yolladiginiz her data RX-TX hatti birbirine bagli oldugu icin hemen size geri doner. Ustelik PPJ-04 karti derhal status bilgisi yollar.

Bu durumda ana islemci PPJ-04'e bir komut yolladiginda pes pese iki byte data veri alacak demektir. 2. datanin ilk datayi ezmemesi icin kodlamayi iyi yapmalisiniz.  Benzer sorun PPJ-04 islemcisi icin de gecerlidir ve verdigim PIC kodlarinda bu sorun cozulmustur dolayisi ile bu kodlari ana islemcinizde ornek olarak kullanabilirsiniz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

justice_for_all

hocam bende kod yaziyodum da aklima bise geldi bu ppj karti herhangi bir sebepten dolayi kilitlendi diyelim ne olacak?
hadi resetleme isini wdt ile yapariz ama bilgiler kayboldu?

bide lcd satir ve sutun sayisini hex olarak 16 satir ve 2 sutunu yazamadim.

bide tus takiminin bu kartta olmasinin ana karta ne faydasi var?buton nasil kullanilacak orasini kavrayamadim.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

#173
Kodlarini da verdigim PPJ-04 versiyonunda 4 buton var. Ana islemci bu butonlarin konumunu PPj-04 den isteyebiliyor.

Butonlar ve LCD ekrani kullanarak menu sistemi olusturabilirsin. Menulerde gezinmek icin +/- sakla cik vs icin 4 buton yeterli. Ilave olarak 4 ledle ve dudukle uyarilar verebiliyorsun.
Ledleri yakip sondurmek icin dudugu kesik kesik bipletmek icin ana islemci hic yorulmuyor.

Eger kilitlenmelerden korkuyorsan Adr/Data hattini atiyorum 100ms boyunca lowda tutunca slave islemciyi resetleyen duzenek yapabilirsin. Yada watchdog kullanabilirsin.
Fakat LCD yi ana islemcine dogrudan bagladigini varsay. Pek ala ana islemci calismaya devam ederken LCD icindeki kontroller kilitlenebilir. Ekrandaki yazilar ucabilir. Bu durumlar icin ne yapiyorsan PPJ-04 icin de aynini ayapbilirsin.

Verdigim kodlarda karta adres bilgisi gonderdiginde kart derhal 2 bitle durum bilgisini yolluyor. Buna ben resetlendim benimle ilgilen diye bir ucuncu bit daha ilave edilebilir.

Bu arada ilk verdigim kodlarda timer int rutini cok kabarik kodlar iceriyordu. Mesajimi editleyip yeni programi koydum. Bunda timer rutinleri cok daha sade oldu.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

FxDev

Avantajını tam olarak kavrayamadım ama şöyle bir soru sormak istiyorum:

1) Eklenecek kartlar slave olacaksa modbus neden kullanamayız? Sonuçta serial işlemler. Artı güvenlik açısından izolasyon sağlanırsa tadından yenmez mi?
2) Modbus iyice eskidi diyenlere CAN çare olmaz mı? Kısa mesafede 1Megabaudlar donanımsal hata kontrollleri vb... STM'in yeni çıkaracağı STM32F052 serisini bu yüzden dört gözle bekliyorum!
3) LIN + CAN çözümlerinin arabalarda kullanıldığını biliyoruz. Bu yöntem olamaz mı?
4) Fiziksel layer'ı geçtim bu işi bir standartı zaten endüstride vardır bilen yok mudur peki?
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

justice_for_all

yani hocam benim demek istedigim ben ppj den butona basinca ana kart benim butona bastigimi nerden bilecek ki?

diyelimki ben ilk once 1 tusuna bastim sonrada 2 tusuna bastim ana kart sanirim en son basilan tusu istiyor peki benim bastigim 1. tus ne olacak?

ana kart tus bilgisini sorana kadar ben butona basili mi tutmak zorundayim burasini anlayamadim.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

#176
Ana islemci PPJ-04 den bana tus bilgilerini gonder dediginde PPJ-04 (hemen hemen o anki) basili tus bilgilerini gonderiyor.

Sonucta ana karta 8 bitlik bir data gidiyor.

0x00 hic bir tus basili değil.
0x01 1. tus basili
0x02 2 tusu basili
0x03 1 ve 2 tuslari basili
....
0x0F 4 tusun hepsi de basili gibi anlami var.

Ana islemci tuslari ne zaman okumak isterse o zaman tus konumunu ogrenir. Eger tuslarin surekli kontrolu gerekiyorsa atiyorum her 100ms de bir ana islemciden  sorgulama yapabilirsin.


Eger once 1 tusuna bastiysan sonra 2 tusuna bastiysan, ana kart PPJ-04 u sik sik sorgulamiyorsa basilmis olan 1 tusunu kacirabilirsin.

Fakat bunun hic bir onemi yok. 100 ms de birsorgulama ile gayet akici menu sistemi yapabilirsin.

Bir ara bu amacla bir kod yazip video cekeyim.

------

Fxdev'in sorusuna gelince;

Proje oylesine aklima gelen aslinda zaman zaman ihtiyac duydugum bir eksikligi gidermeye yonelik. Avantajlarini ilk mesajimda acikladim. ModBus vs de kullanilabilir. Fakat CAN vs isin icine girdimi slave kartlarda siradan cipleri kullanamaz oluyoruz.

Asli projelerimde sirf PCB kucuk ve basit olsun arzumdan 40 kusur bacakli cipler kullaniyorum bu durumda LCD vs icin cipte bos bacak kalmiyor. Ben de sirf LCD olsun diye buyuk ciplerle tasarim yapmiyor LCD kullanmiyorum.

Fakat artik bu sorun bitti. Lcd kullanmam gerekirse PPJ-04 kullanacagim cunku hic eziyeti yok.

PPJ-04 kullandigin zaman bir anda asagidaki donanimlara hukmedebilir hale geliyorsun.

1 adet LCD
4 adet buton
4 adet led
1 adet buzzer
1 adet e2rom

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

justice_for_all

yani menu kodlari ana kartta olcak siz butonlari okuyup ppj kartinda lcd de gostermesi gerekeni gostereceksiniz. dogru mu anladim hocam ?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

#178
Aynen oyle. Ana kart PPJ-04 den buton bilgisini isteyecek. Diyelimki setup tusuna basilmis. Derhal PPJ-04 kartina LCD de SETUP yazisi cikartcak komutu yollayacak.
Diyelimki +/- tuslarina basildi. Ana islemci bunu sorgu ardindan ogrenince bu kez ekranda Hardware Setup, Fabrika Ayarlari benzeri mesajlar yazdiracak komutlar yollayacak.

Varsayki PPJ-04 kullanmadin da dogrudan ana islemcine LCD, tuslar, ledler, buzzer bagladin. Menu olusturmak icin ne yapiyorsan PPJ-04 icin de aynisini yapacaksin. Sadece istekleri komut olarak bildireceksin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay