Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

SERİ İLETİŞİMDE KESME

Başlatan HEXF2, 02 Ocak 2006, 17:57:10

HEXF2

arkadaşlar CCS'de printf() komutu ile ser veri gönderip gets() gibi bazı komutlar ile de seri veri alabiliyoruz fakat ben bu işlemler olduğu zaman kesme oluşturmak istiyorum yani seri veri geldiği zaman kesme oluşturmak istiyorum CCS'de böyle bir komut göremedim asm ile yazmam gerekecek bunu C'de nasıl hallederiz

Petek

Helpine bakarsan buradayım diyorlar 8)

#INT_AD              Analog to digital conversion complete
#INT_ADOF          Analog to digital conversion timeout
#INT_BUSCOL      Bus collision
#INT_BUTTON       Pushbutton
#INT_CCP1           Capture or Compare on unit 1
#INT_CCP2           Capture or Compare on unit 2
#INT_COMP          Comparator detect
#INT_EEPROM      write complete
#INT_EXT               External interrupt
#INT_EXT1             External interrupt #1
#INT_EXT2             External interrupt #2
#INT_I2C                I2C interrupt (only on 14000)
#INT_LCD              LCD activity
#INT_LOWVOLT     Low voltage detected
#INT_PSP              Parallel Slave Port data in
#INT_RB                Port B any change on B4-B7
#INT_RC                Port C any change on C4-C7
#INT_RDA              RS232 receive data available :idea:
#INT_RTCC            Timer 0 (RTCC) overflow
#INT_SSP              SPI or I2C activity
#INT_TBE              RS232 transmit buffer empty
#INT_TIMER0         Timer 0 (RTCC) overflow
#INT_TIMER1         Timer 1 overflow
#INT_TIMER2         Timer 2 overflow
#INT_TIMER3         Timer 3 overflow
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

HEXF2

Hoca onları biliyorum zaten yani komut dizilimi nasıl olmalı onu anlayamadım misal getch() gibi bir komutla seri veri almak istiyorum şöyle birşey mi yazıcam

[code]

#INT_RDA
void receiver() {

      ............
      ............
}

Yani printf() gets() gibi komutlar kesme oluşturuyor mu onu anlamadım

Petek

Estağfirullah, daha hoca olamadık. Hele şu doktora bitsin ondan sonra belki.

Kesmeleri aktifledikten sonra yazdığın gibi alma interrupt rutini yazacaksın.   Gönderme için de göndermenin tamamlanması durumunda kesme istiyorsan onun için de bir kesme rutini yazmalısın ve kesmesini aktiflemelisin.

getc, putc veya printf kesme oluşturmazlar. Onlar sadece rxreg, txreg içeriğini okuma yada yazma yaparlar. Assemblerda nasılsa öyledir. Cem Yılmaz'ın G.O.R.A. sını seyretmişsen orada bir şey diyor ... (tahta dan sonra)
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

HEXF2

Tahtadan sonra zoruna mı gitti diyor alakayı kuramadım ama neyse belkide kurmak istemedim o önmeli değil şimdi ben bu kesmeleride enable_interrupt()ile aktif edicem ve bir kesme rutini yazıcam kesme geldiğinde ise sanırım getch() gibi bir komutla seri veriyi okuyabilicem peki use232'de TX ve RX pinlerini değiştirebiliyoruz.O zaman nasıl donanım el atıyor işe sanki PBP gibi bişey oluyor gibi geldi bana ya örnek kod varsa koyabilir misin petek başkalarıda faydalanır

Petek

Alıntı Yap...şimdi ben bu kesmeleride enable_interrupt()ile aktif edicem ve bir kesme rutini yazıcam kesme geldiğinde ise sanırım getch() gibi bir komutla seri veriyi okuyabilicem
Evet doğru, kesme rutininde veriyi okuyacaksınız. Yalnız okumadan başka bir işlemi (yani stack tüketen işlemi) kesmeden döndükten sonra yapın.
Alıntı Yappeki use232'de TX ve RX pinlerini değiştirebiliyoruz.O zaman nasıl donanım el atıyor işe sanki PBP gibi bişey oluyor gibi geldi bana ya örnek kod varsa koyabilir misin petek başkalarıda faydalanır
use232 de eğer donanım UART modülünü tanımladıysan zaten kesme işlemi gerçekleşir. Onun haricinde pinleri tanımlarsan bu durumda CCS UART emulasyonu yapar. O zaman da kesme kullanamazsın. Örneği hangi konuda istiyorsun, UART mı, UART kesme mi? İlki CCS nin örneklerinde var. İkincisi için örneklerde var mı bilemiyorum. Yoksa yazmak gerekiyor. İstersen senin yazdığın basit bir şey varsa üzerinde çalışırız. Hemen ISIS üzerinde kolayca görebilirsin sonucu.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

HEXF2

Hoca yazdığım basit birşey yok yazmaya çalışıyorum ama daha olayı çözmeye çalışıyorum use rs232 ile normalde baud ve pinleri ayarlıyor diye biliyorum işi donanıma bırakmak için ayrıca birşey yazmak gerekiyor mu?Hala HELP'i kurcalıyorum tam bişey bulamadım daha evvel deneyen arkadaşlar varsa örnek kod koyarsa sevinirim şu işi çözelim petek bence KESME herşey demek ben bütün programlarımda hep kesmelerle çalışıyorum  böylece sürekli birşeyleri denetlemek zorunda kalmıyorum uyutuyorum PIC'i kesme bekliyorum.CCS'de çok eski sayılmam o yüzden daha çözemediğim bazı şeyler var yardımınızla çözücem inşallah cevaplarınızı bekliyorum

Petek

Alıntı yapılan: "HEXF2"Hoca yazdığım basit birşey yok yazmaya çalışıyorum ama daha olayı çözmeye çalışıyorum use rs232 ile normalde baud ve pinleri ayarlıyor diye biliyorum işi donanıma bırakmak için ayrıca birşey yazmak gerekiyor mu?Hala HELP'i kurcalıyorum tam bişey bulamadım daha evvel deneyen arkadaşlar varsa örnek kod koyarsa sevinirim şu işi çözelim petek bence KESME herşey demek ben bütün programlarımda hep kesmelerle çalışıyorum  böylece sürekli birşeyleri denetlemek zorunda kalmıyorum uyutuyorum PIC'i kesme bekliyorum.CCS'de çok eski sayılmam o yüzden daha çözemediğim bazı şeyler var yardımınızla çözücem inşallah cevaplarınızı bekliyorum
Eski assembler cilerdensen eğer ve kendi rutinimi yazacağım diyorsan Jal in rutinlerinden faydalanmanı tavsiye ederim.  jpic628.jal dosyasının sonlarına doğru uart rutinleri var. Oradan alıp CCS ye aktarabilirsin. Ama CCS de rx ve tx pinlerini donanımdaki ler olarak tanımlarsan hiç sorun yaşamazsın.

#include <16f877.h>
#device ADC=10
#fuses HS,NOPROTECT, NOWDT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=19200, xmit=PIN_c6, rcv=PIN_c7)

#int_rda
void receiver() {
char c;
c=getch();
putc(c);putc(c);putc(c);
} 


main()
{

 enable_interrupts(INT_RDA);
 enable_interrupts(GLOBAL);

while(TRUE)
  {
//   .............
  }
}
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

HEXF2

Ok hoca sağol deniycem hemen

Petek

Denemene gerek yok. Deneyip gönderdim.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

picusta

En son denemeden sonraki "tahta"'dan sonra mi yoksa?
Bu built-in fonksyonlarinin kodunu nerden bulabilirim? Nereyi degisitirdigini? Source kod filan varsa olur.

Petek

Assembler listesine bakmak yeterli.
.................... c=getch();
0035:  BTFSS  0C.5
0036:  GOTO   035
0037:  MOVF   1A,W
0038:  MOVWF  28
.................... putc(c);putc(c);putc(c);
0039:  MOVF   28,W
003A:  BTFSS  0C.4
003B:  GOTO   03A
003C:  MOVWF  19
003D:  MOVF   28,W
003E:  BTFSS  0C.4
003F:  GOTO   03E
0040:  MOVWF  19
0041:  MOVF   28,W
0042:  BTFSS  0C.4
0043:  GOTO   042
0044:  MOVWF  19

...
....................  enable_interrupts(INT_RDA);
0058:  BSF    03.5
0059:  BSF    0C.5
....................  enable_interrupts(GLOBAL);
005A:  MOVLW  C0
005B:  BCF    03.5
005C:  IORWF  0B,F
....................

...
gibi. Bu builtin fonksiyonların listesini CCS veriyor, ama emulasyon yaptığı i2c, uart için vermiyor. Vermemesi çok ta önemli değil. İhtiyacım olduğunda da Jal rutinleri işimi görüyor.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein