Ana Tema => Basic Programlama Komut Kullanımı => Konuyu başlatan: Elektronikprojem - 08 Nisan 2018, 22:53:59
Başlık: 18f25k22 Sorunu
Gönderen: Elektronikprojem - 08 Nisan 2018, 22:53:59
Merhaba. Bu işlemci ile ilk kez çalışıyorum. Datasheete tam hakim olamadım. Programımda tmr0, usart, b0 kesmelerini aynı anda kullanmak istiyorum. İlk yazdığım program aşağıdaki idi.
SYMBOL M2S =PORTB.1 ;------------------------------------------------------------------------------- RPM VAR WORD rpm=0
RPMAYAR VAR WORD READ 0,RPMAYAR.BYTE0 READ 1,RPMAYAR.BYTE1
M2 VAR long READ 30,M2.BYTE0 READ 40,M2.BYTE1 read 50,m2.byte2 read 60,M2.BYTE3
M2ONDA VAR BYTE READ 5,M2ONDA
M2AYAR VAR BYTE READ 6,M2AYAR
M2AYARONDA VAR BYTE READ 7,M2AYARONDA
GELEN VAR BYTE GELEN=0 GELEN2 VAR WORD GELEN2=0 GELEN3 VAR WORD GELEN3=0 GELEN4 VAR WORD GELEN4=0 SAYI VAR BYTE SAYI=0 I VAR BYTE HESAP VAR BYTE HESAP=0 SAYAC Var word SAYAC=0 pause 250 ;------------------------------------------------------------------------------- ACILIS: IF GELEN=61 THEN GELEN=0 HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255] pause 50 HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255] pause 50 HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255] pause 50 HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255] pause 2000 goto basla endIF
goto ACILIS ;------------------------------------------------------------------------------- BASLA: IF HESAP=1 THEN RPM=SAYI*60 HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255] HESAP=0 SAYI=0 ENDIF
IF M2S=0 and RPM>=RPMAYAR THEN WHILE M2S=0 :WEND M2=M2+M2AYAR m2onda=M2ONDA+M2AYARONDA IF M2>999999 THEN M2=0 M2ONDA=0 endIF IF M2ONDA>99 THEN m2=m2+1 M2ONDA=M2ONDA/100 ENDIF HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255] WRITE 30,M2.BYTE0 WRITE 40,M2.BYTE1 WRITE 50,m2.byte2 WRITE 60,M2.BYTE3 :pause 10 WRITE 5,M2ONDA :PAUSE 10 ENDIF
IF GELEN=1 THEN hserout ["AYARLAR"] HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255] PAUSE 10 HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255] PAUSE 10 GOTO AYARLAR ENDIF
IF GELEN=0 THEN HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255] pause 10 HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255] GOTO BASLA endIF GOTO AYARLAR ;------------------------------------------------------------------------------- M2AYARLAR: IF GELEN<100 AND GELEN2<100 THEN M2AYAR=GELEN M2AYARONDA=GELEN2 WRITE 6,M2AYAR :PAUSE 10 WRITE 7,M2AYARONDA :PAUSE 10 GELEN=1 GELEN2=0 HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255] GOTO AYARLAR ENDIF GOTO M2AYARLAR ;------------------------------------------------------------------------------- RPMAYARLAR: IF GELEN=1 THEN RPMAYAR=GELEN2 WRITE 0,RPMAYAR.BYTE0 WRITE 1,RPMAYAR.BYTE1 PAUSE 10 GELEN2=0 HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255] PAUSE 10 GOTO AYARLAR ENDIF GOTO RPMAYARLAR ;-------------------------------------------------------------------------------
DISABLE INT: IF INTCON.1=1 THEN SAYI=SAYI+1 INTCON.1=0 GOTO ATLA ENDIF
IF INTCON.2=1 THEN HESAP=1 INTCON.2=0 'kesme bayrağı sıfırlandı TMR0=3036 'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir. GOTO ATLA ENDIF
Bu programda timer0 ı 16 bit yapıp her 1 saniyede kesmeye gitmesini istedim ama tmr0 daha kısa sürede kesmeye gidiyor.sonrasında ete hocamla konuştuktan sonra programı aşağıdaki şekilde düzenledim.
RPMAYAR VAR WORD READ 0,RPMAYAR.BYTE0 READ 1,RPMAYAR.BYTE1
M2 VAR long READ 30,M2.BYTE0 READ 40,M2.BYTE1 read 50,m2.byte2 read 60,M2.BYTE3
M2ONDA VAR BYTE READ 5,M2ONDA
M2AYAR VAR BYTE READ 6,M2AYAR
M2AYARONDA VAR BYTE READ 7,M2AYARONDA
GELEN VAR BYTE GELEN=0 GELEN2 VAR WORD GELEN2=0 GELEN3 VAR WORD GELEN3=0 GELEN4 VAR WORD GELEN4=0 SAYI VAR BYTE SAYI=0 I VAR BYTE HESAP VAR BYTE HESAP=0 SAYAC Var word SAYAC=0 pause 250 ;------------------------------------------------------------------------------- ACILIS: IF GELEN=61 THEN GELEN=0 HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255] pause 50 HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255] pause 50 HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255] pause 50 HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255] pause 2000 goto basla endIF
goto ACILIS ;------------------------------------------------------------------------------- BASLA: IF HESAP=1 THEN RPM=SAYI*60 HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255] HESAP=0 SAYI=0 ENDIF
IF M2S=0 and RPM>=RPMAYAR THEN WHILE M2S=0 :WEND M2=M2+M2AYAR m2onda=M2ONDA+M2AYARONDA IF M2>999999 THEN M2=0 M2ONDA=0 endIF IF M2ONDA>99 THEN m2=m2+1 M2ONDA=M2ONDA/100 ENDIF HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255] WRITE 30,M2.BYTE0 WRITE 40,M2.BYTE1 WRITE 50,m2.byte2 WRITE 60,M2.BYTE3 :pause 10 WRITE 5,M2ONDA :PAUSE 10 ENDIF
IF GELEN=1 THEN hserout ["AYARLAR"] HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255] PAUSE 10 HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255] PAUSE 10 GOTO AYARLAR ENDIF
IF GELEN=0 THEN HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255] pause 10 HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255] GOTO BASLA endIF GOTO AYARLAR ;------------------------------------------------------------------------------- M2AYARLAR: IF GELEN<100 AND GELEN2<100 THEN M2AYAR=GELEN M2AYARONDA=GELEN2 WRITE 6,M2AYAR :PAUSE 10 WRITE 7,M2AYARONDA :PAUSE 10 GELEN=1 GELEN2=0 HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255] GOTO AYARLAR ENDIF GOTO M2AYARLAR ;------------------------------------------------------------------------------- RPMAYARLAR: IF GELEN=1 THEN RPMAYAR=GELEN2 WRITE 0,RPMAYAR.BYTE0 WRITE 1,RPMAYAR.BYTE1 PAUSE 10 GELEN2=0 HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255] PAUSE 10 GOTO AYARLAR ENDIF GOTO RPMAYARLAR ;-------------------------------------------------------------------------------
DISABLE INT: IF INTCON.1=1 THEN SAYI=SAYI+1 INTCON.1=0 GOTO ATLA ENDIF
IF INTCON.2=1 THEN HESAP=1 INTCON.2=0 'kesme bayrağı sıfırlandı TMR0H=$0B :TMR0L=$DC 'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir. GOTO ATLA ENDIF
Bu kodda da program hiç çalışmıyor. 1 saniyelik kesmeleri oluşturuyor ama İlk açılışta "s61" diye bir bilgi gönderiyorum onu almıyor ki ana döngüye girsin. Rica etsem sigorta ayarlarına ve register ayarlarına bakabilir misiniz?
Başlık: Ynt: 18f25k22 Sorunu
Gönderen: Elektronikprojem - 09 Nisan 2018, 08:22:03
Programı anlaşılması için sadeleştirdim. tmr0 ı 500ms de kesme oluşturacak şekilde ayarladım. Şu an seri porttan veri gönderiyorum 10 tane veri göndersem 5 ini kaçırıyor.
SYMBOL M2S =PORTB.1 ;------------------------------------------------------------------------------- RPM VAR WORD rpm=0
RPMAYAR VAR WORD READ 0,RPMAYAR.BYTE0 READ 1,RPMAYAR.BYTE1
M2 VAR long READ 30,M2.BYTE0 READ 40,M2.BYTE1 read 50,m2.byte2 read 60,M2.BYTE3
M2ONDA VAR BYTE READ 5,M2ONDA
M2AYAR VAR BYTE READ 6,M2AYAR
M2AYARONDA VAR BYTE READ 7,M2AYARONDA
GELEN VAR BYTE GELEN=0 GELEN2 VAR WORD GELEN2=0 GELEN3 VAR WORD GELEN3=0 GELEN4 VAR WORD GELEN4=0 SAYI VAR BYTE SAYI=0 I VAR BYTE HESAP VAR BYTE HESAP=0 SAYAC Var word SAYAC=0 pause 250 ;------------------------------------------------------------------------------- ACILIS: IF GELEN=61 THEN HSEROUT ["VERI GELDI"] GELEN=0 ENDIF GOTO ACILIS ;------------------------------------------------------------------------------- DISABLE INT: IF INTCON.1=1 THEN SAYI=SAYI+1 INTCON.1=0 GOTO ATLA ENDIF
IF INTCON.2=1 THEN HESAP=1 INTCON.2=0 'kesme bayrağı sıfırlandı TMR0H=$85 :TMR0L=$EE 'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir. GOTO ATLA ENDIF
Başlık: Ynt: 18f25k22 Sorunu
Gönderen: ete - 09 Nisan 2018, 09:27:13
Bir işlemci ile çalışırken onun bütün özelliklerine vakıf olmak gerekiyor. Özellikle USART (bu işlemcide EUSART) kesmesi kullanacaksanız nedir ne değildir öğrenmek gerekiyor. Şimdi öncelikle programın kesme kısmına bakıyorum. TMR0 kesmesi, INT kesmesi ve USART kesmesi kullnaılmış. Bunları aktif eden komutlara bakıyorum. Programın başında INTCON=%10110000 komutu verilerek global kesmeler ve INT0 kesmesi ile TMR0 kesmesi açılmış. Peki nerede USART kesmesi aktivasyonu. Ben göremiyorum. Peki seri port dan veri almasını sağlayacak kesme aktif değil ise nasıl veri alacak. Verikaçırması elbette normal. Hatta hepsini kaçırması normal bence.
Programın başında bazı tanımlamalar mevcut. Bunlar; SYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyor SYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bit SYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bit Gerek tanımlama yapılmış ama bu tanımlama programın geri kalanında hiç kullanılmamış. Peki bir kesmeyi aktif etmez isem o kesme çalışırmı? çalışmaz elbette. Peki soruyorum bunları düşünmek çok mu zor? Yani insan kendi kendine soramazmı acaba kesmeyi aktif etmez isem o çalışırmı? Kusura bakmayn bu konu üzerine fazlaca gidiyorum. Çünki bu işlerin mantıksal düşünceye dayandığını anlatmaya çalışıyorum. Ortada bir özellik var. Bu bir anahtara benzer. Mesela bir lambayı yakacaksın. Ortada akü var lamba var ve bir de açma kapatma anahtarı var. Bütün bunları bir devreye yerleştirmiş olmam lambanın yanmasına yeterlimi. Yeterli ancak o anahtarı açmaz isem o lamba yanarmı sonsuza kadar beklesen yanmaz elbette. O halde anahtarı açman gerektiğinide düşüneceksin. Burada da kesmeyi açmayı bileceksin.
Evet demekki asıl hata EUSART kesmesinin aktif edilmemiş olmasıdır. Dİğer bir konuya da değinmek isterim. Bu işlemcide iki EUSART portu mevcut. Dolayısıyla hangisinin kullanılacağı da çok önem kazanıyor. Hangisi kullanılıyor ise ona ait kesme aktif edilmeli. Bu örnekte EUSART-1 kullanılmış (tanımlamalarda) işlemci pinlerinde TX1 ve RX1 pinlerinin kullnılıyor olmasına dikkat etmek gerekiyor.
Diğer bir konu şu, define ile USART tanımlamaları verilmiş ama ardından ne hikmet ise yeniden RCSTA = $90 ' Enable serial port & continuous receive TXSTA = $20 ' Enable transmit, BRGH = 0 SPBRG = 25 ' 9600 Baud @ 16MHz, 0,16% şeklinde satırlar eklenmiş. Bu neden olmuş acaba merak ettim. Define tanımlamaları işi yapmaz ise bunlar yapsın diyemi?. Olamaz elbette. Bilinçsizce yapılan bir hareket maalesef. Bu satırları oradan silmek lazım. Data sheet'e bakınca bu işlemcide USART değilse EUSART (Extended USART yani gelişmiş USART) portunun olduğunu anlarsınız. O halde Define komutları buna uygun olarak verilmelidir. Doğruları aşağıdaki gibi olmalıdır.
Şimdi diyesecksiniz ki bütün bunları en başta bir mesaj ile anlatsam ne olurdu. ? Bu kadar beklemeye yada uzatmaya ne gerek vardı? Bence çok gerek vardı. İnsan yapamadığı şey için uğraş vermeli neden olmadığı konusunda kafa yormalıdır. Bu bilgiyi direk versem bu bilgiiler kesinlikle kafada kalmayacak idi. Ama şimdi iyice öğrendiğini düşünüyorum (umarım)
SOnu olarak işe define komutlarını değiştirerek başla. Ardından ESUART kesmesini aktif et. BASLA satırından evvel bu aktivasyonu yap. Ardından bak bakalım ne oluyor.
Ete
Başlık: Ynt: 18f25k22 Sorunu
Gönderen: Elektronikprojem - 09 Nisan 2018, 12:56:44
Hocam sağolun defalarca inceledim ama aklıma orası hiç gelmedi. Teşekkür ederim.
Başlık: Ynt: 18f25k22 Sorunu
Gönderen: Dtmf - 12 Aralık 2024, 23:14:56
Başlık: Ynt: 18f25k22 Sorunu
Gönderen: ete - 13 Aralık 2024, 08:51:49
"kodlarda ekisimi yazarmısınız " ne anlama geliyor acaba açıklarmısın?
NRF shift komutları ile çalışır ve 64 Mhz bu komutlar için çok hızlıdır. Onu biraz yavaşlatman gerekebilir. Bunun için Basic de ; DEFINE SHIFT_PAUSEUS 50 şeklinde bir komut var. Proton da da benzeri olmalı onu araştır ve deneyerek en uygun pasue değerini bulmaya çalış.
Yukarıdaki tanımlamalarda bir sorun göremedim. Ancak eksik pek çok tanımlama mevcut. Aşağıdaki örneğe bakarak eksikleri tamamlamaya çalış.
Ete
CONFIG FOSC = INTIO67 ; Internal oscillator block
CONFIG PLLCFG = OFF ; Oscillator used directly
CONFIG PRICLKEN = ON ; Primary clock can be disabled by software
CONFIG FCMEN = OFF ; Fail-Safe Clock Monitor disabled
CONFIG IESO = OFF ; Oscillator Switchover mode disabled
CONFIG PWRTEN = OFF ; Power up timer disabled
CONFIG BOREN = SBORDIS ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
CONFIG BORV = 190 ; VBOR set to 1.90 V nominal
CONFIG WDTEN = ON ; WDT is always enabled. SWDTEN bit has no effect
CONFIG WDTPS = 32768 ; 1:32768
CONFIG CCP2MX = PORTC1 ; CCP2 input/output is multiplexed with RC1
CONFIG PBADEN = OFF ; PORTB<5:0> pins are configured as digital I/O on Reset
CONFIG CCP3MX = PORTB5 ; P3A/CCP3 input/output is multiplexed with RB5
CONFIG HFOFST = ON ; HFINTOSC output and ready status are not delayed by the oscillator stable status
CONFIG T3CMX = PORTC0 ; T3CKI is on RC0
CONFIG P2BMX = PORTB5 ; P2B is on RB5
CONFIG MCLRE = INTMCLR ; RE3 input pin enabled; MCLR disabled
CONFIG STVREN = ON ; Stack full/underflow will cause Reset
CONFIG LVP = OFF ; Single-Supply ICSP disabled
CONFIG XINST = OFF ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
CONFIG DEBUG = OFF ; Disabled
CONFIG CP0 = OFF ; Block 0 (000800-001FFFh) not code-protected
CONFIG CP1 = OFF ; Block 1 (002000-003FFFh) not code-protected
CONFIG CP2 = OFF ; Block 2 (004000-005FFFh) not code-protected
CONFIG CP3 = OFF ; Block 3 (006000-007FFFh) not code-protected
CONFIG CPB = OFF ; Boot block (000000-0007FFh) not code-protected
CONFIG CPD = OFF ; Data EEPROM not code-protected
CONFIG WRT0 = OFF ; Block 0 (000800-001FFFh) not write-protected
CONFIG WRT1 = OFF ; Block 1 (002000-003FFFh) not write-protected
CONFIG WRT2 = OFF ; Block 2 (004000-005FFFh) not write-protected
CONFIG WRT3 = OFF ; Block 3 (006000-007FFFh) not write-protected
CONFIG WRTC = OFF ; Configuration registers (300000-3000FFh) not write-protected
CONFIG WRTB = OFF ; Boot Block (000000-0007FFh) not write-protected
CONFIG WRTD = OFF ; Data EEPROM not write-protected
CONFIG EBTR0 = OFF ; Block 0 (000800-001FFFh) not protected from table reads executed in other blocks
CONFIG EBTR1 = OFF ; Block 1 (002000-003FFFh) not protected from table reads executed in other blocks
CONFIG EBTR2 = OFF ; Block 2 (004000-005FFFh) not protected from table reads executed in other blocks
CONFIG EBTR3 = OFF ; Block 3 (006000-007FFFh) not protected from table reads executed in other blocks
CONFIG EBTRB = OFF
Başlık: Ynt: 18f25k22 Sorunu
Gönderen: mehmet - 13 Aralık 2024, 16:46:34