PIC BASIC PRO Öğreniyoruz soru cevapları

Başlatan aster, 19 Mayıs 2005, 17:33:33

ete

Usart kesmesinin açılmasında problem yok.
Muhtemel problemler aşağıdakiler olabilir.
1. HSERIN 3,CIK, şeklinde kullanılan komutta yer alan 3 ms lik değer o kadar bilginin alınması için yeterli değildir. Bu nedenle 3 sayısını en azında önce bir 10 yap sonra haberleşme sağlandıktan sonra yavaş yavaş düşür. Bir yerde kesilecektir zaten. Kesildiği değerin bir fazlasını hatta 2-3 fazlasını vererek bu kısmı geç.

2. Genelde dizi değişkenleri ile işlem yapılınca sorun çıkmaktadır. Bu nedenle dizi değişkenleri yerine sabit değişken kullan. Hesapları yap ve sonunda diziye eşitle. Örnek;

HSERIN 10,CIK,[WAIT("YSMIN"), ESIFIR ,EBIR, EUC, EDORT]
ESIFIR=ESIFIR-16:ESIFIR=ESIFIR*10:E[0]=ESIFIR
EBIR=EBIR-32:E[1]=ESIFIR+EBIR
EUC=EUC-48:EUC=E3*10:E[3]=EUC
EDORT=EDORT-64:EDORT=EUC+EDORT:E[4]=EDORT

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

emrah

#391
10  ile 5 arasına kadar bekleme sürelerini değiştirdim 00:00 olmuyor v bu seferde sıcaklık için kulandıgım santgrad işareti çıkıyor 3 digitte son digitte dakikanın birler basamagı geliyor hocam. yazdıgm saatt programında sorun vardır dıye sizin saat programını ekledim sonuc yine aynı  son denedigm program şu şekilde ;

dizilerin ve bekleme süresinin hatalı oldugunu  sızın dedıgınıze gore yaptıktan sonra farketıım.

daha önce kesmeyi kaldrdım data alımını ana dönguye koydugumda saat ve dakıka dogru şekılde geliyordu fakat anadongude oldugu için saat takılıp kalıyodu. gelen datalarla ilgili problemim yok.

PORTA=0:PORTB=0   
TRISB=%10000010        
TRISA=%11000000  
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
DEFINE OSC 4


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

'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME   
OPTION_REG=%10000101   
INTCON=%11000000  
PIE1.5=1
TMR0=0
CMCON=7  
'----------------------------------------------------------------------------
Comm_Pin    VAR	PortB.0     ' One-wire Data-Pin "DQ" PortB.0 da
Busy        VAR BIT         ' Busy Status-Bit
POZ         VAR BIT
Z           VAR BIT
W           VAR BIT
U           VAR BIT
T           VAR BIT
GOR         VAR BYTE
HAM         VAR	WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD  
Y           VAR BYTE  
SAYI        VAR BYTE   
SIGN_BITI   VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
NEGAT_ISI   CON 1           ' Negatif_Cold = 1
Deg         CON 223         ' ° işareti
SIGN        VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP        VAR BYTE         ' Div32 bit hesap için geçici değişken
SAYAC       VAR BYTE 80
SN          VAR BYTE
DAK         VAR BYTE
SAAT        VAR BYTE
GUN         VAR BYTE
AY          VAR BYTE
YIL         VAR BYTE
MEM         var byte ' 
EKRAN_ZAM   var byte ' 
SUM         VAR BYTE
EKRAN_ISI   VAR BYTE
ONLAR       VAR BYTE
BIRLER      VAR BYTE
ESN         VAR BYTE
OKU VAR BYTE

SAATO VAR BYTE  
SAATB VAR BYTE
DAKO VAR BYTE
DAKB VAR BYTE
'---------------------------------------------
SYMBOL  DTA=PortA.1
SYMBOL  CLK=PORTA.2
symbol  ST=PORTA.3

SYMBOL  RTC_DTA=PORTB.5
SYMBOL  RTC_CLK=PORTB.4
SYMBOL  RTC_RST=PORTB.6

symbol  SEC   =PORTA.6  
SYMBOL  ASAGI =PORTB.7 
SYMBOL  YUKARI=PORTA.7 
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
EKRAN_ZAM=10  'saat EKRANDA KALMA SÜRESİ
EKRAN_ISI=5   'sıcaklık EKRANDA KALMA SÜRESİ BUNLARI DEĞİŞTİREBİLİRSİNİZ.
SUM=EKRAN_ZAM+EKRAN_ISI
IF sec=0 then ZAM_AYAR
ILK:
gosub ekran0
gosub sensoryaz
gosub sensoroku
low RTC_RST
low RTC_CLK 
GOSUB GECIKME
'-----------------------------------------------------------------------------
HIGH PORTA.0 
gosub ZAMAN_OKU:esn=SN
BASLA: 
        GOSUB ZAMAN_OKU
        IF SAYAC=30 THEN LOW PORTA.0
        
        IF Y=SUM THEN Y=0
        IF Y>(EKRAN_ZAM) AND Y<SUM THEN
         if y=(EKRAN_ZAM+1) then GOSUB SENSOROKU
         GOSUB EKRAN1
        ENDIF 
        
        if esn=sn then atla
        Y=Y+1 : ESN=SN : SAYAC=0
        IF Y<=EKRAN_ZAM THEN 
           HIGH PORTA.0
           GOSUB EKRAN0
        ENDIF           
      
ATLA:  if SEC=0 THEN AYAR  'MODE TUŞUNA BASILMIŞ İSE AYAR'A GİT
       
       GOTO BASLA
'-----------------------alt programlar-------------------------------------------       
TEKRAR:
       SHIFTOUT DTA,CLK,1,[SAYI] 
       RETURN
BAK_0:
       GOSUB AL
       IF Z=1 AND W=1 THEN SAYI=0  
       RETURN
BAK_1:
       GOSUB AL
       IF Z=1 AND U=1 THEN SAYI=0             
       RETURN
BAK_2:
       GOSUB AL
       IF Z=1 AND T=1 THEN SAYI=0             
       RETURN
     

EKRAN0:          
        IF SN//2=0 THEN
        HIGH PORTA.0
        ELSE
        LOW PORTA.0
        ENDIF
        
        
        X= DAKB:GOSUB BAK_1:GOSUB TEKRAR
        X= DAKO :GOSUB BAK_1:GOSUB TEKRAR
        u=0
        X= SAATB :GOSUB BAK_0:GOSUB TEKRAR
        X= SAATO:GOSUB BAK_0:GOSUB TEKRAR
        w=0
        
        
        'X= DAK DIG 0:GOSUB BAK_1:GOSUB TEKRAR
        'X= DAK DIG 1 :GOSUB BAK_1:GOSUB TEKRAR
        'u=0
        'X= SAAT DIG 0 :GOSUB BAK_0:GOSUB TEKRAR
        'X= SAAT DIG 1:GOSUB BAK_0:GOSUB TEKRAR
        'w=0
       HIGH st:PAUSEUS 2:LOW st
       RETURN
       
AL:    LOOKUP X,[123,10,103,79,30,93,125,11,127,95,23,113],SAYI :RETURN
     

EKRAN1:LOW PORTA.0
       X=11:GOSUB AL:GOSUB TEKRAR
       X=10:GOSUB AL:GOSUB TEKRAR
       
       x=(ISI DIG 0):GOSUB AL:GOSUB TEKRAR
       x=(ISI DIG 1):GOSUB AL:GOSUB TEKRAR
       HIGH st:PAUSEUS 2:LOW st
       RETURN
       
EKRAN2:IF POZ=0 THEN HIGH PORTA.0
       X= YIL DIG 0:GOSUB BAK_2:GOSUB TEKRAR
       X= YIL DIG 1:GOSUB BAK_2:GOSUB TEKRAR
       T=0
       X= AY DIG 0:GOSUB BAK_1:GOSUB TEKRAR       
       X= AY DIG 1:GOSUB BAK_1:GOSUB TEKRAR 
       U=0      
       X= GUN DIG 0:GOSUB BAK_0:GOSUB TEKRAR
       X= GUN DIG 1:GOSUB BAK_0:GOSUB TEKRAR
       w=0 
       HIGH st:PAUSEUS 2:LOW st    
       RETURN  
       
EKRAN_3: 

        X= SN DIG 0:GOSUB BAK_1:GOSUB TEKRAR
        X= SN DIG 1 :GOSUB BAK_1:GOSUB TEKRAR
        u=0
        SAYI=0:GOSUB TEKRAR
        SAYI=SUM:GOSUB TEKRAR
        w=0
       HIGH st:PAUSEUS 2:LOW st
       RETURN            
'-----------------------------------------------------  
ZAM_AYAR:
        LOW PORTA.0:SN=0:POZ=1:SUM=6 
        SN=EKRAN_ZAM:GOSUB EKRAN_3
        WHILE SEC=0:WEND
        
ZAM_BIR:
        W=1
        IF SEC=0 THEN ZAM_IKI
        IF YUKARI=0 THEN
          IF Z=0 THEN sn=SN+1
          IF SN=31 THEN SN=0       
        ENDIF             
        IF ASAGI=0 THEN
           IF Z=0 THEN SN=SN-1
           IF SN=255 THEN SN=30
        ENDIF
        Z=1-Z
        GOSUB EKRAN_3       
        GOSUB GECIKME
        GOTO ZAM_BIR
        
ZAM_IKI: 
        EKRAN_ZAM=SN:SUM=91
        SN=EKRAN_ISI:GOSUB EKRAN_3
        WHILE SEC=0:WEND
        
ZAM_UC:
        W=1
        IF SEC=0 THEN ZAM_DORT
        IF YUKARI=0 THEN
          IF Z=0 THEN sn=SN+1
          IF SN=31 THEN SN=0       
        ENDIF             
        IF ASAGI=0 THEN
           IF Z=0 THEN SN=SN-1
           IF SN=255 THEN SN=30
        ENDIF
        Z=1-Z
        GOSUB EKRAN_3       
        GOSUB GECIKME
        GOTO ZAM_UC        
        
ZAM_DORT:
         EKRAN_ISI=SN
         SUM=EKRAN_ZAM+EKRAN_ISI
         Z=0:W=0:POZ=0
         GOTO ILK        
AYAR:  
       LOW PORTA.0:SN=0:POZ=1
       gosub ekran0
       WHILE SEC=0:WEND
HOUR:  W=1
       LOW PORTA.0
       IF SEC=0 THEN MINBIR
       IF YUKARI=0 THEN
          IF Z=0 THEN SAAT=SAAT+1
          IF SAAT=24 THEN SAAT=0       
        ENDIF   
        IF ASAGI=0 THEN
           IF Z=0 THEN SAAT=SAAT-1
           IF SAAT=255 THEN SAAT=23
        ENDIF
        Z=1-Z
        GOSUB EKRAN0   
        GOSUB GECIKME
        GOTO HOUR
        
MINBIR: W=0:Z=0
        GOSUB EKRAN0
        WHILE SEC=0
        WEND
        
MINUTE: U=1        
       LOW PORTA.0
       IF SEC=0 THEN ara
        IF YUKARI=0 THEN
           IF Z=0 THEN  DAK=DAK+1
           IF DAK=60 THEN DAK=0
        ENDIF
        IF ASAGI=0 THEN
           IF Z=0 THEN  DAK=DAK-1
           IF DAK=255 THEN DAK=59              
        ENDIF
        Z=Z-1
        GOSUB EKRAN0
        GOSUB GECIKME
        GOTO MINUTE
        
SECBIR: WHILE SEC=0
        WEND
        U=0
GECIKME:
        FOR X=0 TO 3500
        PAUSEUS 5
        NEXT
        RETURN
DELAY:
        FOR X=0 TO 1900
        PAUSEUS 10
        NEXT
        RETURN      

ARA:    W=0:u=0:T=0:Z=0
        GOSUB FLASH
        Gosub EKRAN0
        HIGH PORTA.0
        WHILE SEC=0  
        wend
        MEM=SN:GOSUB TERSCEVIR:SN=SAYI
        MEM=DAK:GOSUB TERSCEVIR:DAK=SAYI
        MEM=SAAT:GOSUB TERSCEVIR:SAAT=SAYI
        MEM=GUN:GOSUB TERSCEVIR:GUN=SAYI
        MEM=AY:GOSUB TERSCEVIR:AY=SAYI
        MEM=YIL:GOSUB TERSCEVIR:YIL=SAYI 
        GOSUB ZAMAN_YAZ
        GOSUB ZAMAN_OKU
        y=0:POZ=0
        goto BASLA
        
FLASH:
      TOGGLE PORTA.0:GOSUB DELAY:TOGGLE PORTA.0:GOSUB DELAY
      TOGGLE PORTA.0:GOSUB DELAY:TOGGLE PORTA.0:GOSUB DELAY
      return 
'-------------------------------------------------------------------------------      
            
              
'----------------ISI SENSÖR OKUMA BÖLÜMÜ --------------------------------
SENSOROKU: 
'-----------------DİKKAT İSİS'de BU SATIR AKTİF EDİLECEK----------------------
'           ham=$0200:Gosub hesapla:return 'NORMAL ÇALIŞMADA BU SATIR SİLİNECEK
'------------------------------------------------------------------------------
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
           
SENSORYAZ:
          OWOUT   COMM_Pin, 1, [$CC, $4E, $00,$00,$31]
          return           
             
Hesapla:                 ' Ham değerden Santigrat derece hesabı
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-"  
       temp=($ffff-ham+1)*625
       ISI  = DIV32 10 
       GOTO GEC   
    endif
    TEMP = 625 * (HAM+1)        ' 
    ISI = DIV32 10          ' Div32 hassas derece hesabı için 32 bit bölme yapıyoruz.
GEC:
    FLOAT = (ISI //1000)/100
    ISI=ISI/1000
    RETURN              

ZAMAN_OKU: 
         high RTC_RST:OUTPUT rtc_dta
         shiftout RTC_DTA, RTC_CLK, 0, [$BF]:INPUT RTC_DTA
         SHIFTIN RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, MEM, YIL, MEM]  'OKU
         MEM=SN:GOSUB CEVIR:SN=SAYI
         MEM=DAK:GOSUB CEVIR:DAK=SAYI
         MEM=SAAT:GOSUB CEVIR:SAAT=SAYI
         MEM=GUN:GOSUB CEVIR:GUN=SAYI
         MEM=AY:GOSUB CEVIR:AY=SAYI
         MEM=YIL:GOSUB CEVIR:YIL=SAYI
         low RTC_RST 
         return

ZAMAN_YAZ:
      
         high  RTC_RST:OUTPUT RTC_DTA 
         SHIFTOUT RTC_DTA, RTC_CLK, 0, [$8E, 0]    'WRT Protek açıldı
         low RTC_RST:PAUSEUS 10 
         high RTC_RST          
         SHIFTOUT  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, 0, YIL, 128]  'YAZ
         low RTC_RST
         PAUSEUS 10
         return
               
CEVIR:
         ONLAR=MEM & %01110000
         ONLAR=ONLAR>>4
         BIRLER=MEM & %00001111
         SAYI=ONLAR*10+BIRLER
         RETURN  

TERSCEVIR:                
         ONLAR=MEM DIG 1
         ONLAR=ONLAR<<4
         BIRLER=MEM DIG 0
         SAYI=ONLAR+BIRLER
         RETURN
         
DISABLE
KESME:

 HSERIN 10,CIK,[WAIT("YSMIN"),SAATO,SAATB,DAKO,DAKB]
'SERIN2 PORTB.3,3,CIK, [WAIT("YSMIN"),E[0],E[1],E[3],E[4]] 
SAATO=SAATO-16
SAATB=SAATB-32
DAKO=DAKO-48
DAKB=DAKB-64

SAATO=SAATO*10
SAATB=SAATO + SAATB
DAKO=DAKO*10
DAKB=DAKO + DAKB
 
OKU=RCREG   
CIK:     
         RESUME
         ENABLE
                  
         
END

ete

Yani sorun çözülmüş gözüküyor. Öyle değilmi?

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

emrah

hocam serı bilgi alımını anadongu içinde yaptıgım zaman ve dogrudan dısplaylarda göster dedigim zaman gösteriyordu fakat serin komutu ana dongude oldugu için saatı cok kasıyordu hatta donuyordu. bunun için USART kesmesını kullandım faka buseferde gelen verileri ekranda göremıyorum malesef sorunum bu hocam.

ete

Simulasyon dahil dosyaları ekle yada yolla bakayım.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah

#395
hocam linktecalısmalarım mevcut. kısaca bahsedıyım.

bilgisayardan alınan saat blgisi rf üzerinden saat kısmına gitmektedir.
saat devresindeki buzzer yerine rf alıcı modül takılı.



ete

Verdiğin link zararlı bir site. Truva atı yükleniyor sürekli. Bu nedenle oradan yükleme yapamam.
Ya bir başka yere yükle yada etepic.com'a üye isen oraya gir konu aç ve ekinde dosyayı siteye yükle.

Ete

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

emrah


emrah

merhaba hocam,

pic basivte değişkenleri tanımlarken yanına yazdıgınız sayılar ne içindir hocam?

DATA VAR BYTE 59      gibi

ete

Değişken tanımlamasınıon yanına yazdığın rakam onun yerleştirileceği adresi belirler.
56 dedinmi o değişken pic in hafızasındaki 56 nolu adrese yerleşir.
Bu şekilde değişkenlere istediğin adresi verebilirsen onları İsis simulasyonunda izleme imkanına kavuşursun.
Bunun için İsisde pause tuşu ile simualsyonu başlatır ve yuklarıda bulunan debug menüsünden "watch window " u seçersin.
- Ekrana küçük bir pencere açılır. Üzrinde sağ tıklarsın.
- Açılan pencerede  "Add Items by Address" seçeneğini seçersin
- Yine bir pencere açılır. Orada yer alan "Name" kısmına değişken adını yazarsın, "Address" kısmına da verdiğin rakamı yazarsın
   Sonra alt kısma atlarsın ve değişken tipini soldan (Data Type) seçersin.  Değişken formatınıda sağdan (Display Format) seçersin.
   Hangi formatı seçersen değişken değerini o formatta izlersin.
Bu tanımlamayı yaptıktan sonra programı normal başlatabilirsin artık. Kaydınıda almayı unutma.
Böylece program çalışırken o değişken veya değişkenlerin program içinde aldığı değerleri izleyebilirsin.

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

emrah


gareven

#401
arkadaşlar benim sorum çok basit

elimde lcd li bir devir sayıcı var ben burada girişime her input geldiğinde değil de 7 kez input geldiğinde sayıcının bir artmasını istiyorum
bunun için yardım edebilir misiniz? basicten pek anlamıyorum ben.
bu arada input girişim porta.0

define lcd_dreg portb
define lcd_dbit 4
define lcd_bits 4
define lcd_rsreg portb
define lcd_rsbit 2
define lcd_ereg portb
define lcd_ebit 3
define lcd_lines 2
define lcd_commandus 2000
define lcd_dataus 40
a var word
son_deger var word
deger var word
hiz var word
hiz_dev var word
devir_sayisi var word
input porta.0
input porta.1

                   

'***********************ANA PROGRM*******************************
PAUSE 100
son_deger = 0
main:

count porta.0,1000,deger

son_deger = son_deger + deger
devir_sayisi = son_deger
hiz = deger * 60
                            
if porta.1=0 then son_deger=0
lcdout $fe,1
lcdout $fe,2
lcdout, "hiz:",dec hiz
lcdout $fe,136," dev/dk"
lcdout $fe,$c0,"dev say:",dec devir_sayisi
 

GoTo main

subram

sorunun pratik çözümü PORTB.0/INT girişinde. portb.0 ı giriş olarak tanımla. kesmeyi kur. her kesme oluştuğunda alt programda kesmeleri say. kesme sayısı 7 olunca  sayıcıyı arttır.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

gareven


subram

Bu yardımı olur umarım
.....
INTCON=           %10010000
OPTION_REG=   %01000000
ON INTERRUPT GoTo Kesme

BASLA:
..
..
..
GOTO BASLA

DISABLE
KESME:
..
..
..
INTCON.1=0
ENABLE
RESUME
END
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz