Seri İletişimle Alınan Verinin Portlara Aktarılması Konusunda Yardım

S.Ahmet

Üye
Katılım
5 Ağu 2011
Mesajlar
9
Puanları
1
Merhaba Arkadaşlar

2 adet 16f877 arasından seri olarak tek yönlü veri gönderiyorum. Alınan veriyi port lardan birine bağlı ledlerde gözlemlemek istiyorum ancak ledlerden yalnızca birinde değişiklik oluyor. Sanırım seriden alınan veri ascii kodunda olduğundan bunun tekrar 8 bite çevrilip porta aktarılması lazım bunu nasıl yapabilir. assembly kullanıyorum

yardım edebilirseniz sevinirim
 
Arkadaşlar ascii kodu ile ilgili saçmalamışım.

Gönderdeiğim 8 bitlik veriyi osiloskopta gözlemleyebiliyorum ancak 2. picte rx bacağından aldığım bu veriyi port b ye doğru olarak gönderemiyorum. Lütfen yardımcı olun
 

veriyi gönderen program

Kod:
list    p=pic16f877

              #include<P16f877.inc>
     s1 equ 0x20
              s2 equ 0x21
     s3 equ 0x22
        
              org     0x00
              goto    basla

basla         clrw                           ;  w registerı temizlendi

              movwf   PORTA           ; PORTA temizlendi

              movwf   PORTB           ; portb temizlendi

             
      ; PORT AYARLARI
              bcf     STATUS,RP0      ; bank0
              bsf     RCSTA,SPEN      ; USART aktif
              bsf   RCSTA,CREN   ; seri alım aktif    
              bsf     STATUS,RP0       ; bank1 e geç
              clrw                            ; w registerı sil
              movlw   0x19              ; BRG değeri 9600 baud @ 4MHz e göre
              movwf   SPBRG           ;              
              movlw   0xA4             ; CSRC/TXEN (dahili clock, 8 bit mode, asenkron iletişim, hızlı seçim)
             movwf   TXSTA                         
dongu       call     gonder            ;SERİPORTA GÖNDERELİM   
           
            goto     dongu         ;tekrar almak için başla

;SERİ GONDERİM ALT PROGRAMI

gonder          bcf     STATUS,RP0      ; bank0 a geç

          movlw  0x01
   movwf TXREG
   call delay
   movlw  0x03
   movwf TXREG
   call delay
   movlw  0x07
   movwf TXREG
   call delay
   movlw  0x0f
   movwf TXREG
   call delay
   movlw  0x1f
   movwf TXREG
   call delay
   movlw  0x3f
   movwf TXREG
   call delay
    movlw  0x7f
   movwf TXREG
   call delay
   movlw  0xff
   movwf TXREG
   call delay
  return
delay:
 movlw 0xff
 movwf s2
 
 movlw 0xff
 movlw s3
g2:
 movlw 0xff
 movwf s1
g1:
 decfsz s1,f
 goto g1 
g3: 
 decfsz s3,f
 goto g3
 decfsz s2,f
 goto g2
 
 return
 END

alıcı



Kod:
list    p=pic16F877

              #include<P16f877.inc>
        
              org     0x00
              goto    basla

basla         clrw                           ;  w registerı temizlendi

              movwf   PORTA           ; PORTA temizlendi

              movwf   PORTB           ; portb temizlendi

             
      ; PORT AYARLARI
              bcf     STATUS,RP0      ; bank0
              bsf     RCSTA,SPEN      ; USART aktif
              bsf   RCSTA,CREN   ; seri alım aktif    
              bsf     STATUS,RP0       ; bank1 e geç
              clrw                            ; w registerı sil
              movwf   TRISB            ; PORTB cıkış olarak ayarlandı
              movlw   0x19              ; BRG değeri 9600 baud @ 4MHz e göre
              movwf   SPBRG           ;              
              movlw   0xA4             ; CSRC/TXEN (dahili clock, 8 bit mode, asenkron iletişim, hızlı seçim)
             movwf   TXSTA                         
dongu       call     alim             ;SERİPORTTANALIM                                

            movwf   PORTB        ;alınan karakteri portb de ascii olarak göster         

            goto     dongu         ;tekrar almak için başla

;SERİ ALIM ALT PROGRAMI

alim          bcf     STATUS,RP0      ; bank0 a geç

alim1        btfss   PIR1,RCIF          ; seri porttan karakter gelfimi testi  

             goto    alim1               ; hayır gelmemiş tekrar

             movf   RCREG,W         ; evet burda karakter geldi,bunu w ye al

             bcf     PIR1,RCIF         ; alım kesmesini tekrar temizle.

             return                 
         END
 
Moderatör tarafında düzenlendi:
Boşuna eziyet çekiyorsun arkadaşım. C kullan. Böylece daha kolay yardım da alabilirsin. İşlemcilerin yeterince büyük bellekleri var. Assembly kullanmanın anlamı yok. Biraz daha kapsamlı program yazsan hiç altından kalkamazsın.

goto alim1 ; hayır gelmemiş tekrar

gelmiş de olabilir ancak framing veya overrun error filan olmuş olabilir. Bunu da kontrol edip seri portu gerekirse aç kapa yaparak resetlemen gerekir. Seri port bağlantıda senkronizasyon sağlayıncaya kadar dikkat edilecek kurallar var.

ayrıca spbrg ye 0x19 yuklemen yeterli değil BRGH da 1 yapılmalı. Sende BRGH=0 kaldıysa baud rate tutmaz hep framing error olur ve seri port kilitlenir.
 
Moderatör tarafında düzenlendi:
hataları denetlemek için programı bu şekilde değiştirdim ancak hala aynı sorun devam ediyor
Kod:
list  p=pic16F877

 #include
org 0x00 
goto basla

basla clrw ; w registerı temizlendi
 movwf PORTA ; PORTA temizlendi 
movwf PORTB ; portb temizlendi ;

 PORT AYARLARI
 bcf STATUS,RP0 ; bank0
 bsf RCSTA,SPEN ; USART aktif 
bsf RCSTA,CREN ; seri alım aktif

 bsf STATUS,RP0 ; bank1 e geç
 clrw ; w registerı sil
 movwf TRISB ; PORTB cıkış olarak ayarland
ı movlw 0x19 ; BRG değeri 9600 baud @ 4MHz e göre
 movwf SPBRG ;
 movlw 0xA4 ; CSRC/TXEN (dahili clock, 8 bit mode, asenkron iletişim, hızlı seçim)
 movwf TXSTA
 
dongu call alim ;SERİPORTTANALIM 
movwf PORTB ;alınan karakteri portb de ascii olarak göster 
goto dongu ;tekrar almak için başla

;SERİ ALIM ALT PROGRAMI

alim bcf STATUS,RP0 ; bank0 a geç

kontrol1 btfss RCSTA,FERR             
 goto kontrol2            
 goto resset

kontrol2 btfss RCSTA,OERR    
 goto alim1     goto resset

alim1 btfss PIR1,RCIF ; seri porttan karakter gelfimi testi
 goto alim1 ; hayır gelmemiş tekrar
 movf RCREG,W ; evet burda karakter geldi,bunu w ye al
 bcf PIR1,RCIF ; alım kesmesini tekrar temizle.
 return 

resset   bcf RCSTA,SPEN ; USART kapa 
bcf RCSTA,CREN ; seri alım kapa
 bsf RCSTA,SPEN ; USART aktif 
bsf RCSTA,CREN ; seri alım aktif
 return 

END
 
Moderatör tarafında düzenlendi:
iyide txta ya a4 atanınca brgh 1 oluyor zaten
 
Birader bu işi düzgün yapmak için adımları sırasıyla uygulaman lazım. Once seri portu açıyım sonra ayarliyayım olmuyor. Bu adımlar sırayla olacak. Bkz Dataseheet

When setting up an Asynchronous Transmission,
follow these steps:

1. Initialize the SPBRG register for the appropriate
baud rate. If a high speed baud rate is desired,
set bit BRGH (Section 10.1).

2. Enable the asynchronous serial port by clearing
bit SYNC and setting bit SPEN.

3. If interrupts are desired, then set enable bit
TXIE.

4. If 9-bit transmission is desired, then set transmit
bit TX9.

5. Enable the transmission by setting bit TXEN,
which will also set bit TXIF.

6. If 9-bit transmission is selected, the ninth bit
should be loaded in bit TX9D.

7. Load data to the TXREG register (starts transmission).
8. If using interrupts, ensure that GIE and PEIE
(bits 7 and 6) of the INTCON register are set.


ALICI TARAFI ICIN

When setting up an Asynchronous Reception, follow
these steps:

1. Initialize the SPBRG register for the appropriate
baud rate. If a high speed baud rate is desired,
set bit BRGH (Section 10.1).

2. Enable the asynchronous serial port by clearing
bit SYNC and setting bit SPEN.

3. If interrupts are desired, then set enable bit
RCIE.

4. If 9-bit reception is desired, then set bit RX9.
5. Enable the reception by setting bit CREN.
6. Flag bit RCIF will be set when reception is complete
and an interrupt will be generated if enable
bit RCIE is set.

7. Read the RCSTA register to get the ninth bit (if
enabled) and determine if any error occurred
during reception.

8. Read the 8-bit received data by reading the
RCREG register.

9. If any error occurred, clear the error by clearing
enable bit CREN.

10. If using interrupts, ensure that GIE and PEIE
(bits 7 and 6) of the INTCON register are set.

 
silvester sabrın için çok sağol :)) Sorun çözüldü dediğin gibi sıralı gitmediğim için hata yapmışım.
 

Forum istatistikleri

Konular
128,815
Mesajlar
920,703
Kullanıcılar
450,907
Son üye
saitdemircigil

Yeni konular

Geri
Üst