Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

PARALEL YAZICIDAN ÇIKTI ALMAK...

Başlatan oyhan, 11 Kasım 2008, 01:54:09

oyhan

Rs232 den aldığım bilgileri bir printera aktarıyorum. Hızım 9600bps. Fakat pc den gelen dataların hepsini göndermeme rağmen sadece 3 satırını yazdırabiliyorum. Kullandığım printer termal mini paralel çalışan bir model. Gelen bilgileri nasıl buffer'a atmalıyım. Dizi oluşturup onun içinemi atmalı yoksa daha yüksek hızlarda da haberleşme ihtimali olduğu için buffer olarak kullanacağım bir Ic mi seçmeliyim. Tampon bir hafızaya ihtiyacım var sanırım. Ne dersiniz?
BİRLİKTEN KUVVET DOĞAR:

F493

selam,

  Bende termal printer projesiyle ugraşıyorum ama bitti, bir bölüm dışında ona döneriz tekrar önce senin soruna gelelim.


 Bir başlangıç ,birde bitiş karakteri belirle.

   #define      STX                 2         //   start of text, text in başı
   #define      ETX                   3         //   End of Text
#define SIZE 80 //80byte'lık dizi

Unsigned char _rcBuf[SIZE];

unsigned char ReceiveDataACK = 0;


void main()
{

while(1){
 
  if(ReceiveDataACK){    //main içinde kontrol ediyoruz eger veri alımı tamamlandıysa  if'in dogru kısmına girer ve verileri ekrana yazar
      printf("%s",_rcBuf);
      ReceiveDataACK = 0;

}

}


return ;
}




void Receive_interrupt()
{
 static int StrIdx = 0;

if ( StrIdx == 0 ){   //   ilk veri mi ?..
       if(ch == (unsigned char)STX) // eger ilk veriyse başlangıç karakterimi diye bakıyoruz
     C[StrIdx++] = ch;
}
        else if( _rcBuf[0] == (unsigned char)STX){ //artık başlangıç karakterini aldıktan sonra veri alınmaya devam edilir
              _rcBuf[StrIdx++] = ch;  // eger bir hata yoksa veri alınır

if(ch == (unsigned char)ETX){//artık verinin sonlandırıcı karakteri geldi
                     
   _rcBuf[StrIdx] = '\0'; //alma işlemi bittiginde dizi sonuna NULL karakteri ekleniyor


esen kalın.
StrIdx = 0;  

ReceiveDataACK = 1;
}
                     

}


Bu örnek benim kendi protokolümden sadece bir kesit ( C18 )


Benim sıkıntımda hazır bir donamımım var ve 18f452 kullanıyorum 1 adet com var onunlada pc ile haberleşiyorum ancak printer ilede haberleşmek istiyorum .Oda com ile çalışıyor.

sen nasıl yapıyorsun bunu.yoksa aynı anda kullanmıyormusun pc ile printer'ı Ben araya swich falan yaptım ama tabiki cambazlık oluyor geçerli bir  yöntem bulmalıyız.

Klein

Söylediklerinden anladığım kadarı ile :
Sen veriyi gönderiyorsun ama yazıcının tamponu yetersiz kalıyor. Yazıcı tamponu dolduğında  büyük ihtimallle Xoff bilgisi gönderiyordur. ve tampon boşaldığında ise Xon bilgisi geliyordur. eğer bu bilgiler gelmiyorsa donanımdan RTS/CTS bağlantıları kullanılıyor demektir. Yapman gereken şey RTS/CTS donanımına bakarak veya yazıcıdan gelen XOFF/XON bilgisine bakarak göndermeyi bu bilgilere göre ayarlamak olmalı.
Yani yazıcıdan XOFF geldiğinde sen de PC ye XOFF göndererek PC den veri gönderimini bekletmelisin. Aynı şekilde yazıcıdan XON geldiğinde PC ye XON göndererek aktarımı tekrar başlatmalısın.

oyhan

Selam
Bufferda kallandık ama yine sonuç pek ii değil.
Şuanda  paralel portlu bu mini termal printera (24 kolon) yazmaya çalışıyorum.
Bilgileri yazıyor aslında ama belli bir yerden sonra yazmıyor yada bozuyor. Interrupt ile biligileri aşağıdaki gibi topluyorum. Baskıda yapmaya başlıyor ancak belli bir süre sonra duruyor. Arada veride kayıplar oluyor. Pc ye bağlanınca mesela
"c:\>copy x.txt lpt1" komutu ile dosyanın içeriği düzgün bir şekilde yazılıyor eksiksiz. Yazdığım program ile  printerın busy işereti takip ederek cts üzürinden pc yi rs232 portundan veri göndermesini engelliyorum. Ancak yinede bir sorun var.

#include <18F4520.h>
#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES HS                    	//High speed Osc (> 4mhz)
#FUSES NOPROTECT             	//Code not protected from reading
//#FUSES NOOSCSEN              	//Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT            	//No brownout reset
//#FUSES BORV20                	//Brownout reset at 2.0V
#FUSES PUT                   	//Power Up Timer
#FUSES STVREN                	//Stack full/underflow will cause reset
#FUSES NODEBUG               	//No Debug mode for ICD
#FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES WRT                   	//Program Memory Write Protected
#FUSES WRTD                  	//Data EEPROM write protected
#FUSES WRTB                  	//Boot block write protected
#FUSES WRTC                  	//configuration registers write protected
#FUSES NOCPD                 	//No EE protection
#FUSES NOCPB                 	//No Boot Block code protection
#FUSES NOEBTR                	//Memory not protected from table reads
#FUSES NOEBTRB               	//Boot block not protected from table reads

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#BYTE PORD = 0x0F83
int1 yaz=0;
char  array[96];   // BUFFER 
int  x=0;
int  y=0;

int giris=0;

#int_RDA
RDA_isr()
{ array[x]=getch();
  if (x<96) {x++;}
  if (x==96) {(output_high(PIN_C2));yaz=1;}
}

// PIN_C2 rts cts için low ile 232 den dolayı inver high çıkıyor.
// PIN_A0 strobe
// PIN_A1 busy sinyali

void main()
{  setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_oscillator(False);
   SET_TRIS_d( 0x00 ); SET_TRIS_C( 0b10000010 );
   SET_TRIS_A( 0b10000110 );
   output_d(0x00);
   output_high(PIN_A0);
   output_d(0x00);Delay_Ms(1000);  //test için sadece
   output_d(0xFF);Delay_Ms(1000);  //test için sadece
   output_d(0x00);Delay_Ms(1000); //test için sadece
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

while (True)
  {
    
    if (input(PIN_A1)) {output_high(PIN_C2);} //BUSY GELİYORSA CTS DEAKTİF ET
    if (!input(PIN_A1))  {output_low(PIN_C2);}//BUSY GELMİİYORSA CTS AKTİF ET

    if (yaz)
       {for (y=0; y<96; ++y)
            { PORD =array[y];          //bufferı data çıkışlarına portd ye aktarıyorum...             
             output_low(PIN_A0);
             delay_us( 2 );
             output_high(PIN_A0);
             delay_ms(10); // her karakter için 10ms test için baskı süresi bıraktım.

            }
            yaz=0; x=0; output_low(PIN_C2); //iş bitimi yaz değişkeni resetlendi x 0 landı ve rts cts e giden uç 232 çıkışı için bilgisayardan veri alacak konuma getirildi.
       }
    }
}
BİRLİKTEN KUVVET DOĞAR:

F493

selam,

 Mini termal printer dediginiz ufak ,çıplak yani sadece sürücüsü ve mekanik kısmı olan herhangi bir kutunun içinde olmayan şekildemi.Bende zamanında aynı sıkıntıları yaşadım ve 1 adet

http://maxim.tradeindia.com/Exporters_Suppliers/Exporter13974.202950/Samsung-Bixolon-Thermal-Kiosk-Printer-STP-131.html

bundan aldım ve sorun çözüldü yani sorun birazda mekanik ..Bu konuda biraz bilgi verirseniz daha iyi olur.

esen kalın.

oyhan

Yada şöyle diyeyim ozaman paralel portu olan printera yazdırmak için çalışıyorum. Termal tarafı kafanızı karıştırmasın. Dot matrix de olabilir.
BİRLİKTEN KUVVET DOĞAR:

z

Seri printerlerin setup menusunde handshake ayarlari bulunur.

Burada, No handshake,  DTR-DSR, CTS-RTS, Xon-Xoff gibi secenekler var.

Sendeki yazicida da bu tup ayarlar olabilir. Oncelikle bunu kontrol etmelisin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

oyhan

Başlığada yazdım aslında kullanmak istediğim ve kontrol etmek istediğim printer paralel portlu. seri çıkışı olan bir sitemden bilgi toplayıp paralel portlu printera yazdırmak istiyorum ve bunun için uğraşıyorum.
BİRLİKTEN KUVVET DOĞAR:

EOS

Olasılık -1 : Paralel yazıcıda STR sinyali (Pin-1) son gönderilen 8-bit veriyi yazıcıya gönderir.Eğer tasarımda latch,buffer entegresi(74hc573,74hc373) kullandıysan ve bu entegrenin yükleme (LD pin) ile Yazıcının STR sinyali aynı ise, veri çıkışa yüklenmeden yazıcı bozuk veri alacaktır...sürekli veri gönderiminde bazı veriler kaybolacaktır...

Bu sorunu bir ürünümüzde yaşamıştık,,,STR ve LD sinyallerini ayrı ayrı kontrol ederek sorun çözüldü ..önce LD ile buffer veri yükleniyor kısa bir gecikme ile STR sinyali ve veri yazıcıya gönderiliyor...

oyhan

74hc573,74hc373 yada 74244 gibi buffer entegreleri kullanmadım. Direkt işlemci ile printerı sürmek sorun olurmu peki? Ara ara meydana gelen kayıplar bundan olabilirmi?
BİRLİKTEN KUVVET DOĞAR:

EOS

olasılık - 2        8-bit veri yolu ,yazıcı haricinde başka bir işlemde kullanılıyormu ( LCD v.b )
veri gönderiminde karışıklık olabilir.

oyhan

Şuanda tek iş yazıcıya veri göndermek..

Sanırım seri porttan gelen verilerde kayıp oluyor. Orda hardware kontrol yapıyorum. DSR pasif edildiğinde pc  göndermeyi kesiyor fakat Sinyalin üretildiği andan sonra bir kaç byte lık kaçma olurmu?
BİRLİKTEN KUVVET DOĞAR: