seri gelen yazıyı harflerine ayırmak

Başlatan i-rot, 07 Mayıs 2008, 22:49:46

i-rot

öncelikle herkese merhaba .
ilginiz için teşekkürler

sorunum şöyle bişey seri porttan aldığım veriyi ekrana yazdırırken sorun yaşıyorum.yani "A" harfine bastığımda (hyper terminalde) bütün ekranda A çıkıyor.
;portb.7 led
'1 vcc   
'2 sclk  portb. 2
'3 sda   portb. 3
'4 d/!c  portb. 4
'5 !cs   gnd
'6 gnd
'7 Vout  
'8 !rst  portb.  5
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_off
@ DEVICE pic16F877, PROTECT_OFF
'@ DEVICE pic16F628A, MCLR_On  'mclr  pini cıkıs olarakta kullanılan piclerde off yapılır.
@ DEVICE pic16F877, HS_OSC
'Include "Modedefs.Bas" 
'TRISC=0
'TRISD=0
'TRISE=0
'TRISA=0                   
'TRISB=0
OPTION_REG.7=1              'PULL UP DİRENÇLERİNİN HEPSİ İPTAL
'adcon1=7                   'tum bacaklar dıgıtal ,ad converterler kapatılır
PORTA=0
PORTB=0
TRISA=%00000001
TRISB=%00000001
      INTCON=%10010000    ;kesmeler aktif
      on interrupt goto kesme
      high portb.6   ;-------------ledi sil                    ' 
      DEFINE OSC 4  'siz oscıllatoru ne kullanacaksanız buradan ayarlayın
  
      DC          VAR PortB.4
      DTA         VAR PortB.3
      RST         VAR PortB.5
      CLK         VAR PortB.2
      buRak       var byte
      i           var byte
      d           var byte
      gelen       var byte [9]
      Chr         VAR Byte
      BitMap      VAR Word
      CharCount   VAR Byte
      PosX        VAR Byte
      PosY        VAR Byte
      Column      VAR Byte [6]
      LCDstr      VAR Byte [14]
      LcdData     VAR Byte
      kolon       var WORD
  
  PAUSE 100        'lcd hazırlanır 
  GOSUB LCD_INIT
  PAUSE 100
  GOSUB LCD_Clear   'butun satırlara sıfır yazılır yani silinir
  
Start:
high portc.0 ;asıl yazdırma sub ı
  PAUSE 500        'lcd hazırlanır 
  GOSUB LCD_INIT
  PAUSE 500
  GOSUB LCD_Clear   'butun satırlara sıfır yazılır yani silinir
pause 10
    for i=0 to 32;32 idi
        read i,gelen[i]
        pause 10
    next 

;SERIN2 Portb.0, 3313, [gelen]
pause 10 
serout2 portc.6,3313,[gelen]
SEROUT2 PORTC.6,3313,["<-VERI"]
PAUSE 10

;-----------------------------
 
    PosX=0:PosY=3:GOSUB LCD_GotoXY
  FOR Chr=0 TO 13
  
      LCDstr(Chr)=geLEN
  NEXT Chr
  GOSUB LCD_Stringout
  ;-----------------------------------------------
   FOR chr=0 TO 13
  LcdData=gelen(chr)
  GOSUB KOLON_YAZ
  HIGH DC
  SHIFTOUT DTA,CLK,1,[Column(0),Column(1),Column(2),Column(3),Column(4),Column(5)]
  NEXT chr
  pause 100
  ;---------------------------------------------------------
   SHIFTOUT DTA,CLK,1,[gelen]
Loop:
  PAUSE 2000
  LOW DC        'lcdye komut gondermek ıcın 0 yapılmalıdır
 ; LcdData= %00001101:GOSUB LCD_ByteOut     ' Invert  yani siyahlar beyaz beyazlar sıyah olur
  ;PAUSE 2000
  'LcdData= %00001000:GOSUB LCD_ByteOut     ' Blank
  'PAUSE 2000
  LcdData= %00001100:GOSUB LCD_ByteOut     ' Normal
  GOTO loop
  
LCD_Init:

  LOW RST :pause 20 : HIGH RST : LOW DC  ' RESET LCD
  
  LcdData= $21: GOSUB LCD_ByteOut        ' LCD EXTENDED COMMANDS  standart lcd acılıs komutları eger datasheet incelenırse degisik ayarlar uygulanabilir
  LcdData= $d1: GOSUB LCD_ByteOut        ' SET LCD Vop (CONTRAST)  bu deger bazı kaynaklarda c8 olarak yazılmakta eger lcd hıc bır tepkı vermezse bu degerle oynanabılır ama banım denedıgımbutun lcdler d1 de calıstı
  LcdData= $06: GOSUB LCD_ByteOut        ' SET TEMP COEFFICENT
  LcdData= $13: GOSUB LCD_ByteOut        ' LCD BIAS MODE
  LcdData= $20: GOSUB LCD_ByteOut        ' LCD STANDARD COMMANDS
  LcdData= $0c: GOSUB LCD_ByteOut        ' LCD IN NORMAL MODE
RETURN
  
LCD_ByteOut:'lcd ye data gondermek ıcın kullanılır eger tek satır karakter gondereceksek yanı karakterın tek satırınıgondereceksek dc yi hıgh yaparak kullanabılırız
  SHIFTOUT DTA,CLK,1,[LcdData]
RETURN
  
LCD_StringOut: ' lcdye harf karakter gondermek ıcın kullanıyoruz
  FOR CharCount=0 TO 13
  LcdData=LCDstr(CharCount)
  GOSUB KOLON_YAZ
  HIGH DC
  SHIFTOUT DTA,CLK,1,[Column(0),Column(1),Column(2),Column(3),Column(4),Column(5)]
  NEXT CharCount
RETURN
  

  
LCD_Clear:  ;lcdyi tamamen sıfırlamak için temizlemek
  PosX=0:PosY=0:GOSUB LCD_GotoXY
  HIGH DC
  FOR Chr=1 TO 252
      LcdData=0:GOSUB LCD_ByteOut
      LcdData=0:GOSUB LCD_ByteOut
  NEXT Chr
RETURN
  
LCD_GotoXY:
  LOW DC                    ;lcd pozisyonu belirlemek için
  LcdData= %01000000 |PosY' : 
  GOSUB LCD_ByteOut
  POSX=POSX*6
  LcdData=%10000000 |PosX'  :
  GOSUB LCD_ByteOut
RETURN
 KOLON_YAZ: 'harf caselerı burada olusturuldu 
 SELECT CASE lcdData
 
 
case "A"'65   $7F,$09,$09,$09,$7F,$00,
 
     COLUMN(0)=$7E
     COLUMN(1)=$11
     COLUMN(2)=$11
     COLUMN(3)=$11
     COLUMN(4)=$7E
     COLUMN(5)=$00
    
    
 case "B"'65
     COLUMN(0)=$7F
     COLUMN(1)=$49
     COLUMN(2)=$49
     COLUMN(3)=$49
     COLUMN(4)=$36
     COLUMN(5)=$00
      
  case "C"

     COLUMN(0)=$3E
     COLUMN(1)=$41
     COLUMN(2)=$41
     COLUMN(3)=$41
     COLUMN(4)=$22
     COLUMN(5)=$00
 
    
 case 199'"Ç"
     COLUMN(0)=$1E
     COLUMN(1)=$21
     COLUMN(2)=$61
     COLUMN(3)=$21
     COLUMN(4)=$12
     COLUMN(5)=$00 
  case "D"'65
     COLUMN(0)=$7F
     COLUMN(1)=$41
     COLUMN(2)=$41
     COLUMN(3)=$22
     COLUMN(4)=$1C
     COLUMN(5)=$00
   
  case "E"'65
     COLUMN(0)=$7F
     COLUMN(1)=$49
     COLUMN(2)=$49
     COLUMN(3)=$49
     COLUMN(4)=$41
     COLUMN(5)=$00
   
  case "F"'65
     COLUMN(0)=$7F
     COLUMN(1)=$09
     COLUMN(2)=$09
     COLUMN(3)=$09
     COLUMN(4)=$01
     COLUMN(5)=$00
   
 case "G"'65
     COLUMN(0)=$3E
     COLUMN(1)=$41
     COLUMN(2)=$49
     COLUMN(3)=$49
     COLUMN(4)=$7A
     COLUMN(5)=$00

    
     case 208'"Ğ"'65
     COLUMN(0)=$7E
     COLUMN(1)=$43
     COLUMN(2)=$53
     COLUMN(3)=$53
     COLUMN(4)=$72
     COLUMN(5)=$00


    
     case "H"'65
     COLUMN(0)=$7F
     COLUMN(1)=$08
     COLUMN(2)=$08
     COLUMN(3)=$08
     COLUMN(4)=$7F
     COLUMN(5)=$00

    
     case "I"'65
     COLUMN(0)=$00
     COLUMN(1)=$41
     COLUMN(2)=$7F
     COLUMN(3)=$41
     COLUMN(4)=$00
     COLUMN(5)=$00

    
     case 221'"İ"
     COLUMN(0)=$00
     COLUMN(1)=$44
     COLUMN(2)=$7D
     COLUMN(3)=$44
     COLUMN(4)=$00
     COLUMN(5)=$00

     case "J"'65
     COLUMN(0)=$20
     COLUMN(1)=$40
     COLUMN(2)=$41
     COLUMN(3)=$3F
     COLUMN(4)=$01
     COLUMN(5)=$00

    
     case "K"'65
     COLUMN(0)=$7F
     COLUMN(1)=$08
     COLUMN(2)=$14
     COLUMN(3)=$22
     COLUMN(4)=$41
     COLUMN(5)=$00

    
     case "L"'65
     COLUMN(0)=$7F
     COLUMN(1)=$40
     COLUMN(2)=$40
     COLUMN(3)=$40
     COLUMN(4)=$40
     COLUMN(5)=$00

    
     case "M"'65
     COLUMN(0)=$7F
     COLUMN(1)=$02
     COLUMN(2)=$0C
     COLUMN(3)=$02
     COLUMN(4)=$7F
     COLUMN(5)=$00

    
     case "N"'65
     COLUMN(0)=$7F
     COLUMN(1)=$04
     COLUMN(2)=$08
     COLUMN(3)=$10
     COLUMN(4)=$7F
     COLUMN(5)=$00

     case "O"'65
     COLUMN(0)=$3E
     COLUMN(1)=$41
     COLUMN(2)=$41
     COLUMN(3)=$41
     COLUMN(4)=$3E
     COLUMN(5)=$00

    
     case 214'"Ö" $3C,$43,$42,$43,$3C,$00
     COLUMN(0)=$3C
     COLUMN(1)=$43
     COLUMN(2)=$42
     COLUMN(3)=$43
     COLUMN(4)=$3C
     COLUMN(5)=$00

     case "P"'65
     COLUMN(0)=$7F
     COLUMN(1)=$09
     COLUMN(2)=$09
     COLUMN(3)=$09
     COLUMN(4)=$06
     COLUMN(5)=$00

    
     case "R"'65
     COLUMN(0)=$7F
     COLUMN(1)=$09
     COLUMN(2)=$19
     COLUMN(3)=$29
     COLUMN(4)=$46
     COLUMN(5)=$00

    
     case "S"'65
     COLUMN(0)=$46
     COLUMN(1)=$49
     COLUMN(2)=$49
     COLUMN(3)=$49
     COLUMN(4)=$31
     COLUMN(5)=$00

     case 222'"Ş"$22,$65,$65,$25,$19,$00
     COLUMN(0)=$22
     COLUMN(1)=$65
     COLUMN(2)=$65
     COLUMN(3)=$25
     COLUMN(4)=$19
     COLUMN(5)=$00

    
     case "T"'65
     COLUMN(0)=$01
     COLUMN(1)=$01
     COLUMN(2)=$7F
     COLUMN(3)=$01
     COLUMN(4)=$01
     COLUMN(5)=$00
     
     case "U"'65
     COLUMN(0)=$3F
     COLUMN(1)=$40
     COLUMN(2)=$40
     COLUMN(3)=$40
     COLUMN(4)=$3F
     COLUMN(5)=$00
     
     case 220'"Ü"  $3D,$40,$40,$40,$3D,$00
     COLUMN(0)=$3D
     COLUMN(1)=$40
     COLUMN(2)=$40
     COLUMN(3)=$40
     COLUMN(4)=$3D
     COLUMN(5)=$00

    
     case "V"'65
     COLUMN(0)=$1F
     COLUMN(1)=$20
     COLUMN(2)=$40
     COLUMN(3)=$20
     COLUMN(4)=$1F
     COLUMN(5)=$00
     

    
     case "W"'65
     COLUMN(0)=$3F
     COLUMN(1)=$40
     COLUMN(2)=$38
     COLUMN(3)=$40
     COLUMN(4)=$3F
     COLUMN(5)=$00



     case "Y"' $07,$08,$70,$08,$07,$00
          
     COLUMN(0)=$07
     COLUMN(1)=$08
     COLUMN(2)=$70
     COLUMN(3)=$08
     COLUMN(4)=$07
     COLUMN(5)=$00    
     case "Z"'65
          
     COLUMN(0)=$61
     COLUMN(1)=$51
     COLUMN(2)=$49
     COLUMN(3)=$45
     COLUMN(4)=$43
     COLUMN(5)=$00

    
     case "0"'65
     COLUMN(0)=$3E
     COLUMN(1)=$51
     COLUMN(2)=$49
     COLUMN(3)=$45
     COLUMN(4)=$3E
     COLUMN(5)=$00

    
     case "1"'65
     COLUMN(0)=$00
     COLUMN(1)=$42
     COLUMN(2)=$7F
     COLUMN(3)=$40
     COLUMN(4)=$00
     COLUMN(5)=$00
 
    
     case "2"'65
     COLUMN(0)=$42
     COLUMN(1)=$61
     COLUMN(2)=$51
     COLUMN(3)=$49
     COLUMN(4)=$46
     COLUMN(5)=$00

    
     case "3"'65
     COLUMN(0)=$21
     COLUMN(1)=$41
     COLUMN(2)=$45
     COLUMN(3)=$4B
     COLUMN(4)=$31
     COLUMN(5)=$00

    
     case "4"'65
     COLUMN(0)=$18
     COLUMN(1)=$14
     COLUMN(2)=$12
     COLUMN(3)=$7F
     COLUMN(4)=$10
     COLUMN(5)=$00

    
     case "5"'65
     COLUMN(0)=$27
     COLUMN(1)=$45
     COLUMN(2)=$45
     COLUMN(3)=$45
     COLUMN(4)=$39
     COLUMN(5)=$00

    
     case "6"'65
     COLUMN(0)=$3C
     COLUMN(1)=$4A
     COLUMN(2)=$49
     COLUMN(3)=$49
     COLUMN(4)=$30
     COLUMN(5)=$00

    
     case "7"'65
     COLUMN(0)=$01
     COLUMN(1)=$71
     COLUMN(2)=$09
     COLUMN(3)=$05
     COLUMN(4)=$03
     COLUMN(5)=$00

    
    case "8"'65
    COLUMN(0)=$36
     COLUMN(1)=$49
     COLUMN(2)=$49
     COLUMN(3)=$49
     COLUMN(4)=$36
     COLUMN(5)=$00

    
    case "9"'65
    COLUMN(0)=$06
     COLUMN(1)=$49
     COLUMN(2)=$49
     COLUMN(3)=$49
     COLUMN(4)=$3E
     COLUMN(5)=$00

    
     case " "'65
     COLUMN(0)=$00
     COLUMN(1)=$00
     COLUMN(2)=$00
     COLUMN(3)=$00
     COLUMN(4)=$00
     COLUMN(5)=$00

    
     case "+"'65
     COLUMN(0)=$08
     COLUMN(1)=$08
     COLUMN(2)=$3E
     COLUMN(3)=$08
     COLUMN(4)=$08
     COLUMN(5)=$00    
     
     case "-"'65
     COLUMN(0)=$08
     COLUMN(1)=$08
     COLUMN(2)=$08
     COLUMN(3)=$08
     COLUMN(4)=$08
     COLUMN(5)=$00

    
     case "."
     COLUMN(0)=$00
     COLUMN(1)=$00
     COLUMN(2)=$60
     COLUMN(3)=$60
     COLUMN(4)=$00
     COLUMN(5)=$00

     case "*"
     COLUMN(0)=$14
     COLUMN(1)=$08
     COLUMN(2)=$3E
     COLUMN(3)=$08
     COLUMN(4)=$14
     COLUMN(5)=$00

    
     case ":"
     COLUMN(0)=$00
     COLUMN(1)=$36
     COLUMN(2)=$36
     COLUMN(3)=$00
     COLUMN(4)=$00
     COLUMN(5)=$00

    end select
    return


disable
kesme :                                                                                 ;
high portb.7
SERIN2 Portb.0, 3313, [gelen] 
pause 10
low portb.7
SERIN2 Portb.0, 3313, [gelen] 
 
;serin2 portb.0, 3313, [wait ("A","A"), buRak]

   for i=0 to 32;32 idi
     write i,gelen[i]
    pause 10
next
    Pause 10
high portb.7
  PAUSE 1        'lcd hazırlanır 
  GOSUB LCD_INIT
 PAUSE 1
  GOSUB LCD_Clear   'butun satırlara sıfır yazılır yani silinir       
INTCON.1=0  'RB0/INT Bayrağı (flag) silindi.
low portb.7
       Resume      'geldiğin yere dön.
                                                                            ;                                                                                                             
ENABLE    'kesmeler yeniden aktif.  
  
  end
  
  


aklıma şöyle bir yöntem geldi ancak gerekli örneklerden bulamadım
;SERIN2 Portb.0, 3313, [gelen[0],gelen[1],gelen[2],gelen[3],gelen[4],gelen[5],gelen[6],gelen[7],gelen[8]]
gelen veriyi harf harf alıp bir subda birleştirerek ekrana yazdırmak

sizce doğru yoldamıyım?

örnek verebilirmisiniz.

teşekkürler

alpaslan

i-rot

Bu kod bu iş için hem de PICBASIC ile biraz fazla gibi geldi bana. LCD olarak ne kullandın? Nokia 3310 mu? Sorununu anlamadım.

Yapmak istediğin işin kabaca da olsa bağlantılarını koysan ve istediğin sistemi açıklasan daha iyi olur.

i-rot

@alpaslan
https://www.picproje.org/index.php/topic,19079&highlight=3310

bu başlıktaki projeyi geliştiriyorum.

led matrix kayan yazı projelerinden esinlendim ancak tıkandım.seri iletişimi sağladım ancak tek harf gönderebiliyorum.veri gelince kesmeye gidiyor eproma yazıyor.kesme bitince start labeline gidiyor eproma yazılan veriyi okuyor ve karakter tablosuna uygun karşılığı alıyor ekrana yazdırıyor.umarım açık bir dilkullanmışımdır.
ilginiz için teşekkürler

alpaslan

Bu linkdeki uygulama mantığı belki yardımcı olur....

http://www.techdesign.be/projects/012/012.htm

i-rot

sağol hocam daha önceden incelemiştim orayı

şöyle bir kod yazdım ancak gene banamısın demedi.formatında hatamı yaptım acaba?
for i=0 to 32
    PosX=i:PosY=1:GOSUB LCD_GotoXY
 
  LcdData=gelen[i]
  GOSUB KOLON_YAZ
  HIGH DC
  SHIFTOUT DTA,CLK,1,[Column(0),Column(1),Column(2),Column(3),Column(4),Column(5)]
  PAUSE 10
  next




buda kesme içerisindeki veri alma komutu


SERIN2 Portb.0, 3313,100,start,[wait("R","F"), str gelen\32\"."]


bu arada debugin komutunun serin komutundan farkı ne bunuda açıklarsanız sevinirim.
serin gibi kullanabiliyormuyuz?

Lütfi AYYILDIZ

@ i-rot eğer karakterleri tek tek ekrana göndermek istiyorsanız GOSUB LCD_Stringout satırını NEXT döngüsünün içerisine almanız gerekir.
PosX=0:PosY=3:GOSUB LCD_GotoXY 
  FOR Chr=0 TO 13 
  
      LCDstr(Chr)=geLEN 
GOSUB LCD_Stringout
  NEXT Chr

Ayrıca donanım kesmesini kullanmak için HSERIN ve HSEROUT komutlarını kullanmanız gerekir. Diğer bir ayrıntı kesme içerisinde gosub ile alt program çağırmada. Ben kesme içerisinde gosub ile çalışırken hep hata alıyorum yani program dallanmıyor veya hata veriyor. Şuan işyeri bilgisayarından yazdığım için size kaynak kod gönderemiyorum seri kesme uygulaması için ama forumda bulabilirdiniz.

i-rot

teşekkürler hocam cevabınız için.

dediğiniz gibi kesmede takılıyor şimdi farkettim.
kesme olunca gosub demek saçma bi fikir dediğiniz gibi.kesme olduğunda zaten herişi bırakıp kesmeye gidiyor kesmede başka bir işi çağırırsak mantıken o işi yapmayacak.yapamadığı için kesmedende çıkamayacaktır.ben hemen orayı düzenleyim.çok teşekkürler.