iki pic, hserout, seri iletişim, ledler neden sönmüyor?

Başlatan fryrmnd, 15 Ağustos 2011, 16:26:49

fryrmnd

Merhaba arkadaşlar. Nette atx arx için yazılmış bir programı biraz değişitirip kullandım. Modüller çalışıyor.  Modüller ara sıra gürültü alıyor. Verici tarafta 4 buton var. Her biri için alıcı tarafta 4 led var. Programa göre ledler 1sn yanıp sönmesi lazım. Modüller bağlı iken sönmüyor.Dedim gürültüden mi kablolu bağladım. Gene sönmedi. İsiste denedim. "Processor clock frequency" 1mhz de ledler söndü. 4 mhz yaptım sönmedi. Modüllerdeki gürültü probleminden önce ledler neden sönmez bana anlatabilirmisiniz.
Şemada verici taraf Tx alıcı taraf pic de Rx den irtibatlı. Kodlar şöyle,
Verici:
@ DEVICE pic16F877A  
@ DEVICE pic16F877A, WDT_OFF 
@ DEVICE pic16F877A, PWRT_ON 
@ DEVICE pic16F877A, PROTECT_OFF 
@ DEVICE pic16F877A, XT_OSC
@ DEVICE pic16F877A, BOD_OFF
@ DEVICE pic16F877A, LVP_OFF
@ DEVICE pic16F877A, CPD_OFF

ADCON1=7
CMCON =7                            


OPTION_REG.7 = 1                      ;PORTB Pull-UP lar pasif
DEFINE HSER_RCSTA 90h 
DEFINE HSER_TXSTA 24h 
DEFINE HSER_BAUD 2400 
DEFINE HSER_CLROERR 1 

TRISB = %11110000 
PORTB=0

TRISA =0
PORTA=0

TRISC=0
PORTC=0

TRISD=0
PORTD=0

TRISE=0
PORTE=0

K VAR BYTE 

K = 0 

ANADONGU: 

          IF PORTB.4 = 1 THEN 
            PAUSE 20
            IF PORTB.4=1 THEN
          K.BIT0 = 1 
          HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
          HSEROUT[254,K,192,$98] 
            endif
          ENDIF
           K = 0 

          IF PORTB.5 = 1 THEN 
           PAUSE 20
            IF PORTB.5=1 THEN
          K.BIT1 = 1
          HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
          HSEROUT[254,K,192,$98] 
         
            endif
          ENDIF   
           K = 0 
          
          IF PORTB.6 = 1 THEN 
            PAUSE 20
            IF PORTB.6=1 THEN
          K.BIT2 = 1 
          HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
          HSEROUT[254,K,192,$98] 
            endif
          ENDIF
           K = 0 
          
          IF PORTB.7 = 1 THEN 
           PAUSE 20
            IF PORTB.7=1 THEN
          K.BIT3 = 1 
          HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
          HSEROUT[254,K,192,$98] 
            endif
          ENDIF  
           K = 0 
     
GOTO ANADONGU


Alıcı:
@ DEVICE pic16F877A  
@ DEVICE pic16F877A, WDT_OFF 
@ DEVICE pic16F877A, PWRT_ON 
@ DEVICE pic16F877A, PROTECT_OFF 
@ DEVICE pic16F877A, XT_OSC
@ DEVICE pic16F877A, BOD_OFF
@ DEVICE pic16F877A, LVP_OFF
@ DEVICE pic16F877A, CPD_OFF

ADCON1=7
CMCON = 7 
INTCON=%11000000                           
TRISB =0
PORTB=0

TRISA=0
PORTA=0

TRISC=%10000000
PORTC.0=0
PORTC.1=0
PORTC.2=0
PORTC.3=0
PORTC.4=0
PORTC.5=0
PORTC.6=0

TRISD=0
PORTD=0

TRISE=0
PORTE=0

DEFINE HSER_RCSTA 90h 
DEFINE HSER_TXSTA 24h 
DEFINE HSER_BAUD 2400 
DEFINE HSER_CLROERR 1 

SYMBOL GIE=INTCON.7
SYMBOL PEIE=INTCON.6
SYMBOL RCIE=PIE1.5
SYMBOL RCIF=PIR1.5

SOLILERI VAR PORTB.3 
SOLGERI VAR PORTB.4 
SAGILERI VAR PORTB.5 
SAGGERI VAR PORTB.6 


TEMP var byte
K VAR BYTE 

ERRCHK VAR BYTE
ERRCHK2 VAR BYTE 


ON INTERRUPT GOTO KESME

RCIE=1
PEIE=1
GIE=1

ANADONGU: 

IF ERRCHK = 192 THEN               
 IF ERRCHK2=$98 THEN
   IF K.BIT0 = 1 THEN 
HIGH SOLILERI
PAUSE 1000
LOW SOLILERI 
K.BIT0=0
ENDIF
 
   IF K.BIT1 = 1 THEN  
HIGH SOLGERI  
PAUSE 1000
LOW SOLGERI
K.BIT1=0
ENDIF 

   IF K.BIT2 = 1 THEN 
HIGH SAGILERI
PAUSE 1000
LOW SAGILERI
K.BIT2=0
ENDIF 

  IF K.BIT3 = 1 THEN 
HIGH SAGGERI 
PAUSE 1000
LOW SAGGERI
K.BIT3=0
ENDIF 
ENDIF
ENDIF 

GOTO ANADONGU 


DISABLE
KESME:
GIE=0
TEMP=RCREG

HSERIN [ WAIT(254),K,ERRCHK,ERRCHK2] 

GIE=1

RESUME
ENABLE

fryrmnd


fryrmnd

Sorunu hala çözemedim arkadaşlar. Yardım edebilirmisiniz.

uardal

donanımsal kesme deneyebilirsiniz,kesme bitlerini set etmişsiniz ama donamımsal kesmeyi açmamışsınız.

ON_HARDWARE_INTERRUPT GoTo kesme
Declare FSR_CONTEXT_SAVE = On



kesme:
Context SAVE


GIE=0
PEIE=0
RBIE=0
INTE=0
RXIE=0

komutlar

context restore

fryrmnd

Hocam bunlar değil mi

RCIE=1 (Usart Receieve interrupt enable bit)
PEIE=1(Peripheral interrupt enable bit)
GIE=1

açık gözüküyor zaten.Yanılıyormuyum

uardal

evet bitler doğru ama, donanımsal kesmeyi açmak için aşağıdaki satırları yazman gerekiyor, sen yazılımsal kesme yapmışsın.

ON_HARDWARE_INTERRUPT GoTo kesme
Declare FSR_CONTEXT_SAVE = On


kesme içindede bunları yapmanız gerekiyor.
Context SAVE
RCIE=0 (Usart Receieve interrupt enable bit)
PEIE=0(Peripheral interrupt enable bit)
GIE=0
RCIF=0

komutlar
RCIE=1 (Usart Receieve interrupt enable bit)
PEIE=1(Peripheral interrupt enable bit)
GIE=1


RCIE=1 (Usart Receieve interrupt enable bit)
PEIE=1(Peripheral interrupt enable bit)
GIE=1

context restore

uardal

eğer çözemezseniz çalışan donanımsal kesme örneği gönderebilirim.

iyi çalışmalar

fryrmnd

Sağolunn hocam da pic basicde donanımsal hardware açma gibi bir olay yok diye biliyorum ben

uardal

pardon ben protonda çalışıyorum, bende basicteyken böyle sorunlar olduğu için protona geçtim, sizede tavsiye ederim.

ete

USART parametreleri 1 Mhz çalışma frekansına göre verilmiş.
Üstelik programda da DEFINE OSC x şeklinde çalışma frekansı belirtilmemiş. Bu şekilde hata çıkması normaldir.

Şayet 4 Mhz kristal ile çalışıyor isen programda yer alan;
DEFINE HSER_RCSTA 90h 
DEFINE HSER_TXSTA 24h 
DEFINE HSER_BAUD 2400 
DEFINE HSER_CLROERR 1

komutlarını aşağıdakiler ile değiştir
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


Bu değişikliği her iki programda da yap.
Ayrıca programın baş kısmına
DEFINE OSC 4
komutunuda ilave etmeyi ihmal etme.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

fryrmnd

Yok hocam gene sönmüyor bu led. Register ayarları değilde ana döngüde mi hatam var . Bir zahmet deneyebilirmisiniz. Hata neyden kaynaklanıyor acaba.

verici:
@ DEVICE pic16F877A  
@ DEVICE pic16F877A, WDT_OFF 
@ DEVICE pic16F877A, PWRT_ON 
@ DEVICE pic16F877A, PROTECT_OFF 
@ DEVICE pic16F877A, XT_OSC
@ DEVICE pic16F877A, BOD_OFF
@ DEVICE pic16F877A, LVP_OFF


ADCON1=7
CMCON =7                            


OPTION_REG.7 = 1                    
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
define OSC 4

TRISB = %11110000 
PORTB=0

TRISA =0
PORTA=0

TRISC=0
PORTC=0

TRISD=0
PORTD=0

TRISE=0
PORTE=0

K VAR BYTE 

K = 0 

ANADONGU: 

          IF PORTB.4 = 1 THEN 
           
          K.BIT0 = 1 
          HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
          HSEROUT[254,K,192,$98] 
          
          ENDIF
           K = 0 

          IF PORTB.5 = 1 THEN 
        
          K.BIT1 = 1
          HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
          HSEROUT[254,K,192,$98] 
         
        
          ENDIF   
           K = 0 
          
          IF PORTB.6 = 1 THEN 
        
          K.BIT2 = 1 
          HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
          HSEROUT[254,K,192,$98] 
      
          ENDIF
           K = 0 
          
          IF PORTB.7 = 1 THEN 
      
          K.BIT3 = 1 
          HSEROUT [REP$AA\5,REP$00\5,REP$FF\5]
          HSEROUT[254,K,192,$98] 
          
          ENDIF  
           K = 0 
         
GOTO ANADONGU


alıcı:
@ DEVICE pic16F877A  
@ DEVICE pic16F877A, WDT_OFF 
@ DEVICE pic16F877A, PWRT_ON 
@ DEVICE pic16F877A, PROTECT_OFF 
@ DEVICE pic16F877A, XT_OSC
@ DEVICE pic16F877A, BOD_OFF
@ DEVICE pic16F877A, LVP_OFF



ADCON1=7
CMCON = 7 
INTCON=%11000000                           ;PORTA Dijital 
TRISB =0
PORTB=0

TRISA=0
PORTA=0

TRISC=%10000000
PORTC.0=0
PORTC.1=0
PORTC.2=0
PORTC.3=0
PORTC.4=0
PORTC.5=0
PORTC.6=0

TRISD=0
PORTD=0

TRISE=0
PORTE=0

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
SYMBOL GIE=INTCON.7
SYMBOL PEIE=INTCON.6
SYMBOL RCIE=PIE1.5
SYMBOL RCIF=PIR1.5
define OSC 4

SOLILERI VAR PORTB.4 
SOLGERI VAR PORTB.5
SAGILERI VAR PORTB.6 
SAGGERI VAR PORTB.7


TEMP var byte
K VAR BYTE 

ERRCHK VAR BYTE
ERRCHK2 VAR BYTE 


ON INTERRUPT GOTO KESME

RCIE=1
PEIE=1
GIE=1



ANADONGU: 

IF ERRCHK = 192 THEN                ;Gelen veri doğru formatta ise 
 IF ERRCHK2=$98 THEN
   IF K.BIT0 = 1 THEN 
SOLILERI=1
PAUSE 1000
ENDIF
SOLILERI=0 
K.BIT0=0
 
   IF K.BIT1 = 1 THEN  
SOLGERI=1  
PAUSE 1000
ENDIF 
SOLGERI=0
K.BIT1=0

   IF K.BIT2 = 1 THEN 
SAGILERI=1
PAUSE 1000
ENDIF 
SAGILERI=0
K.BIT2=0

  IF K.BIT3 = 1 THEN 
SAGGERI=1 
PAUSE 1000
ENDIF 
SAGGERI=0
K.BIT3=0
ENDIF
ENDIF 

GOTO ANADONGU 

DISABLE
KESME:
GIE=0
TEMP=RCREG


HSERIN [ WAIT(254),K,ERRCHK,ERRCHK2] 

GIE=1

RESUME
ENABLE


şemada iki 16f877a rx ve tx uçları bağlı. Vericide RB7 pull down lı pine buton bağlı. Alıcıda RB7 de led bağlı.

hexler de aşağıda
verici:

:100000001A28040864000C1E0228990003141528FD
:10001000A400A9080319152824081020A9030A28F8
:10002000840031088A00300882008313031383128E
:10003000640008008316193099002030980083125C
:1000400090309800831607309F0007309C0081177E
:10005000F0308600831286018316850183128501A4
:100060008316870183128701831688018312880112
:100070008316890183128901B80164008A110A126A
:10008000061E672838140530A9000130B000B10100
:10009000AA308A0108200530A9000130B000B10162
:1000A00000308A0108200530A9000130B000B101FC
:1000B000FF308A010820FE308A01022038088A01B8
:1000C0000220C0308A01022098308A010220B80143
:1000D00064008A110A12861E9228B8140530A900FD
:1000E0000130B000B101AA308A0108200530A90012
:1000F0000130B000B10100308A0108200530A900AC
:100100000130B000B101FF308A010820FE308A01C1
:10011000022038088A010220C0308A01022098306B
:100120008A010220B80164008A110A12061FBD2844
:1001300038150530A9000130B000B101AA308A019C
:1001400008200530A9000130B000B10100308A015B
:1001500008200530A9000130B000B101FF308A014C
:100160000820FE308A01022038088A010220C030AF
:100170008A01022098308A010220B80164008A11A5
:100180000A12861FE828B8150530A9000130B00012
:10019000B101AA308A0108200530A9000130B00061
:1001A000B10100308A0108200530A9000130B000FB
:1001B000B101FF308A010820FE308A010220380890
:1001C0008A010220C0308A01022098308A01022070
:0601D000B8018A013D2880
:02400E00313F40
:00000001FF


alıcı:
:020000003528A1
:10000800080098181812181664008C1E08281A0878
:1000180003143028A301A200FF30A207031CA30782
:10002800031C30280330A100DF301C201028A10158
:10003800E83EA000A109FC30031C2528A0070318EE
:100048002228A0076400A10F222820182B28A01C12
:100058002F2800002F28080083130313831264003D
:1000680008008316193099002030980083129030C8
:100078009800831607309F0007309C008312C03019
:100088008B008316860183128601831685018312ED
:1000980085018316803087008312071087100711A7
:1000A80087110712871207138316880183128801A4
:1000B80083168901831289018B178A110A1269280C
:1000C8008B1B08008A110A12F2288A016420831601
:1000D8008C1683128A0164200B178A0164208B17FF
:1000E8008A01642064003808C03C8A110A12031D82
:1000F800EE288A01642064003908983C8A110A12A3
:10010800031DEC288A01642064008A110A123A1C33
:1001180099288A01642006168A0164200330A30006
:10012800E8308A010F208A0164208A0164200612BF
:100138008A0164203A108A01642064008A110A1234
:10014800BA1CB2288A01642086168A01642003300A
:10015800A300E8308A010F208A0164208A01642004
:1001680086128A016420BA108A01642064008A1108
:100178000A123A1DCB288A01642006178A016420D6
:100188000330A300E8308A010F208A0164208A0125
:10019800642006138A0164203A118A0164206400ED
:1001A8008A110A12BA1DE4288A01642086178A0176
:1001B80064200330A300E8308A010F208A016420FC
:1001C8008A01642086138A016420BA118A01642096
:1001D8008A0164208A0164208A0174288B131A0812
:1001E800BB008A010520FE3C8A110A12031DF5286E
:1001F8008A010520BA008A010520B8008A01052075
:06020800B9008B1709008C
:02400E00313F40
:00000001FF