18f4550 EUSART Kesme Hatası

Başlatan aRci, 27 Aralık 2020, 01:34:41

aRci

   Merhaba
   18f4550 ile Esp8266 arası seri haberleşme yapmak istiyorum. Gelen verileri ise kesme ile alıp gelen bilgiye göre cıkışları kontrol edeceğim.
karta ilk enerji verdiğimde esp kendi açılışını yapıyor ve yaklaşık 6sn içinde ilk veriyi gönderiyor sonrasında her 4sn de bir veri atıyor.
   pic ilk açılışta yarım saniye bekledikten sonra başlıyor. ancak usarttan gelen verileri almıyor kesme gerçekleşmiyor.
eğer espyi kapatmadan pic e reset atarsam sorunsuz çalışıyor.
   program altta yardımcı olur musunuz.

   sigorta ayarlarını internette buldum ve aslına bakarsanız tam olarak ne yaptığımı bilmiyorum
   devrede 20mhz kristal bağlı




include "modedefs.bas"

ASM 
  __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
  __CONFIG    _CONFIG1H, _FOSC_HS_1H 
  __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
  __CONFIG    _CONFIG3H, _PBADEN_OFF_3H
  __CONFIG    _CONFIG4L, _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L
ENDASM
DEFINE OSC 20
pause 500
'DEFINE LOADER_USED 1 
'DEFINE RESET_ORG 800h ' For Microchip USB Bootloader
'DEFINE INTERRUPT_ORG 808h ' For Microchip USB Bootloader
'AllDigital 

adcon1=%10001111 
CCP1CON=0 'disable capture/compare
CCP2CON=0
CMCON=7 'disable comparater
'clear
'///////////////////////////////////////////////////////////////////////////////   
'////////////////////portb - TMR - Genel Kesmeler///////////////////////////       
    Symbol GIE     = INTCON.7  'genel kesmeler aktif
    Symbol PEIE    = INTCON.6 'Çevresel kesmeler aktif
    Symbol IPEN    = RCON.7    'Oncelikler aç kapat
    Symbol TMR0E   = INTCON.5  'TMR0 Kesme 
    Symbol INT0    = INTCON.4  'RB0 Kesme Etkinleştir
    Symbol RBIE    = INTCON.3  'RB Değişim Kesme 
    Symbol TMR0IF  = INTCON.2  'TMR0 Taşma Bayrağı Ouyarak Sıfırlanmalı
    Symbol INT0IF  = INTCON.1  'INT0 harici Kesme Bayrağı Okutarak Sıfırla
    Symbol RBIF    = INTCON.0  'RB7-4 harici Kesme Bayrağı Okutarak Sıfırla
'///////////////////////////////////////////////////////////////////////////////
'/////////////////////////portb kesme kenar - pull up açma///////////////////////////////////////
    Symbol RBPU     = INTCON2.7   'Portb Pull-up seçme etkin = 0
    Symbol INTEDG0  = INTCON2.6   'INT0 Kenar Seç  Düşen Kenear = 0 
    Symbol INTEDG1  = INTCON2.5   'INT1 Kenar Seç  Yükselen Kenar = 1
    Symbol INTEDG2  = INTCON2.4   'INT2 Kenar Seç
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
   Symbol RCIE = PIE1.5   'EUSART alma kesmesi
   Symbol RCIF = PIR1.5   'EUsart Kesme Bayrağı
   '

    
    DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
    DEFINE HSER_CLROERR 1 ' Clear overflow automatically
    DEFINE HSER_SPBRG 42  ' 115200 Baud @ 20MHz, 0,94%
    SPBRGH = 0
    BAUDCON.3 = 1         ' Enable 16 bit baudrate generator
    
        
    'DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    'DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
    'DEFINE HSER_SPBRG 25  ' 115200 Baud @ 48MHz, 0,16%
    'DEFINE HSER_CLROERR 1 ' Clear overflow automatically

    'DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    'DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
    'DEFINE HSER_SPBRG 10  ' 115200 Baud @ 20MHz, -1,36%
    'DEFINE HSER_CLROERR 1 ' Clear overflow automatically
    'ADCON1=%10001110
    'adcon1=$02 'left justify A0 and A1
    'CCP1CON=0 'disable capture/compare
    'CCP2CON=0
    'CMCON=7 'disable comparater
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////   
    TRISA=0
    TRISB=%10010001  'B portu giriş yapıldı
    TRISC=%10000000  'C portu 3 giriş/4'ü çıkış yapıldı
    TRISD=%00000000  'D portu çıkış yapıldı
    TRISE=0
    portb=%11110001
    portc = %11000000
    portd = 0
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////     
    SDA              VAR PORTC.0
    SCL              VAR PORTC.1
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////   
    symbol Led       = Portb.1              'Pcb Durum Ledi
    symbol M0        = portb.2
    symbol M1        = portb.3
    E32Rx            var portb.4            'E32-TTL nin TX Ucu Bağlı
    E32Tx            var portb.5            'E32-TTL nin RX Ucu Bağlı
    NexRx            var portb.6            'Nextion Ekran Tx Ucu Bağlı
    NexTx            var portb.7            'Nextion Ekran Rx Ucu Bağlı
    Przt             var byte                
    gonder           var byte
    Giris            var byte
    Cikis            var byte
    chip1            var byte
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
    'Zaman için
    AY      var     byte
    YIL     var     byte
    SN      VAR     BYTE
    DAK     VAR     BYTE
    SAAT    VAR     BYTE
    GUN     VAR     BYTE
    HGUN    VAR     BYTE
    HAFTA   VAR     BYTE
    Temp    var     byte
    MEM     var     byte
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
    ;***************DS3231 için  
    
    DS_OKU             VAR BYTE : DS_OKU = %11010000
    DS_YAZ             VAR BYTE : DS_YAZ = %11010001
    ZAMAN_REG          VAR BYTE : ZAMAN_REG= $00
    i                  var byte
    ZAMAN              var byte[7]
    KAYDIR             var byte
    UST_BIT            var byte
    ALT_BIT            var byte
    'TempRegister CON $11      'temperature integer  REGISTER
    TempRegisterFRA    CON $12   'temperature fraction REGISTEr
    TempRegister       var byte    ' variable to hold DS3231 register address to read/write      
    Derece             var byte            ' Variable for temperature integer from register 11h
    Ondalik            var byte           ' Variable for temperature fraction for register 12h
    Isaret             var BYTE            ' Variable to hold sign bit   
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
    'MCP 23017
    chip1              = $40
    IOGCA              con $00  ' port A output
    IOGCB              con $01  ' port B output
    IOPOLA             con $02 'PortA polarite çevirme
    IOPOLB             con $03 'PortB Polarite çevirme
    IntEnA             con $04 'Porta Kesme İzin
    IntEnB             con $05 'Porta Kesme İzin
    DEFVALA            Con $06 '?
    DEFVALB            Con $07 '?
    INTCONA            con $08
    INTCONB            con $09
    IOCONA             con $0A
    IOCONB             con $0B
    GPPUA              CON $0C
    GPPUB              CON $0D
    INTFA              CON $0E
    INTFB              CON $0F
    INTCAPA            CON $10
    INTCAPB            CON $11
    GPIOA              CON $12
    GPIOB              CON $13
    OLATA              CON $14
    OLATB              CON $15
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
    f          var byte
    f1         var byte
    u          var byte
    u1         var byte
    x          var byte
    x1         var byte
    Kesti      var bit
    McpCh      var bit
    Baslat     var byte
    RxGelen    var byte
    UKomut     var byte
    Gelen      var byte[80]
    Bekle      var word

'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
    RxGelen    = 0 
    Baslat     = 0
    Kesti      = 0    'uart yada timer kesmesi gerçekleşince 1 olur
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
    Aport  con 0 'PortA giriş çıkış ayarlandı
    Bport  con 255   'PortB giriş çıkış ayarlandı
    GOSUB Mcp23017
    TMR0E    = 0 'TMR0 Kesme kapalı
    INT0     = 1 'INT0 kesme açık
    IPEN     = 0 'Kesmelerde Öncelikleri kapat
    PEIE     = 1 'Çevresel Kesmeler Aktif                                                                                 
    RBPU     = 0
    INTEDG0  = 0
    RCIE     = 1   'EUsart Alma Kesmesi Aktif  = 1
    GIE   = 1 'Tüm kesmeler açık
    for f = 0 to 2
    I2CWRITE  SDA, SCL, chip1,[GPIOA,1]:pause 500:I2CWRITE  SDA, SCL, chip1,[GPIOA,128]:pause 500
    next f
    ON INTERRUPT GOTO KESME 'komut satırını ekle programa (BASLA satırından bir evvele koyabilirsin)
basla:
    
    if Kesti = 1 then
       RxGelen = 0
       gosub ZAMAN_OKU
       gosub Coz 
       Kesti = 0
       low Led
    endif
goto basla   
    
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////                                                                  
Coz:                                                                
    u1      = 0
    'hserout ["Coz...",13,str Gelen\30,13]
    
    for U = u1 to 78
        for x = 0 to 3
            lookup x,["Cks="],Temp
            if Gelen [u+x]   = Temp and  x = 3 then
                u1 = u+x+ 2
                Cikis = 0
                for u = u1 to u1+7
                    Cikis = Cikis << 1 + (Gelen[u]-48)
                next u
                I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
                hserout ["PicCks=",34,bin8 cikis, 34,"*1Grs=",bin8 giris, "*2Ter=", Isaret, dec2 derece, ".", dec Ondalik, "*3Saat=", Dec2 Saat, ":", Dec2 Dak, ":", dec2 Sn, "*4",13] 
                UKomut.0 = 1
            endif
            if Gelen [u+x]  <> Temp then x = 3
        next x
        
        for x = 0 to 2
            lookup x,["ON "],Temp
            if Gelen [u+x]   = Temp and  x = 2 then UKomut.5 = 1:McpCh = 1
            if Gelen [u+x]  <> Temp then x = 2
        next x
    
        for x = 0 to 2
            lookup x,["OFF"],Temp
            if Gelen [u+x]   = Temp and  x = 2 then UKomut.6 = 1:McpCh = 1
            if Gelen [u+x]  <> Temp then x = 2
        next x
         
        for x = 0 to 3
            lookup x,["Saat"],Temp
            if Gelen [u+x]   = Temp and  x = 3 then
               u = u + x + 1 
               Saat  = (Gelen [u   ]-48)*10 + (Gelen [u+1 ]-48)
               Dak   = (Gelen [u+2 ]-48)*10 + (Gelen [u+3 ]-48)
               Sn    = 0
               Hafta = (Gelen [u+4 ]-48)
               Gun   = (Gelen [u+5 ]-48)*10 + (Gelen [u+6 ]-48)
               Ay    = (Gelen [u+7 ]-48)*10 + (Gelen [u+8]-48)
               Yil   = (Gelen [u+9]-48)*10 + (Gelen [u+10]-48)
               gosub ZAMAN_YAZ
               UKomut.0 = 1
            endif
            if Gelen [u+x]  <> Temp then x = 3
        next x
          
        
        if Gelen [U]   = "C" and Ukomut.5  = 1 and (Gelen[U+1]-48) <= 9 then cikis = cikis | dcd (Gelen[U+1]-48)
        if Gelen [U]   = "C" and Ukomut.6  = 1 and (Gelen[U+1]-48) <= 9 then cikis = cikis & (255-dcd (Gelen[U+1]-48))
        if UKomut.5 = 1 or UKomut.6 = 1 then I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
    
        GELEN[U] = "*"
    next U
    
UGec: 
RxGelen = 0
return 
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
MCP23017:
    I2CWRITE SDA, SCL, chip1,[IOGCA,Aport]    'A7 giriş olarak ayarlandı
    I2CWRITE SDA, SCL, chip1,[IOPOLA,0]       'Polarite Ayarlandı Ters çevrilmemiş
    I2CWRITE SDA, SCL, chip1,[IntEnA,0]     'Kesme İzin Verilmedi
    I2CWRITE SDA, SCL, chip1,[DEFVALA,0]      'Kesme İzin Verildi.terslenmedi
    I2CWRITE SDA, SCL, chip1,[INTCONA,0]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[IOCONA,%01011000]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[GPPUA,0]      'pRTa.7 PULLU U P AKTİF
    I2CWRITE SDA, SCL, chip1,[INTFA,0]      'kESME bAYRAK
    I2CWRITE SDA, SCL, chip1,[INTCAPA,0]      '?
    'I2CWRITE SDA, SCL, chip1,[GPIOA,0]      'PORT OKUMA
    I2CWRITE SDA, SCL, chip1,[IOGCB,Bport]    'A7 giriş olarak ayarlandı
    I2CWRITE SDA, SCL, chip1,[IOPOLB,255]       'Polarite Ayarlandı Ters çevrilecek mi
    I2CWRITE SDA, SCL, chip1,[IntEnB,255]     'Kesme İzin Verildi
    I2CWRITE SDA, SCL, chip1,[DEFVALB,0]      'Kesme İzin Verildi.terslenmedi
    I2CWRITE SDA, SCL, chip1,[INTCONB,0]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[IOCONB,%01011000]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[GPPUB,255]      'PULLU U P pasıf
    I2CWRITE SDA, SCL, chip1,[INTFB,0]      'kESME bAYRAK
    I2CWRITE SDA, SCL, chip1,[INTCAPB,0]      '?
    'I2CWRITE SDA, SCL, chip1,[GPIOA,0]      'PORT OKUMA
return
'///////////////////////////////////////////////////////////////////////////////     
'///////////////////////////////////////////////////////////////////////////////
ZAMAN_OKU:
    i2cread SDA,SCL,DS_OKU,ZAMAN_REG,[ZAMAN[0],ZAMAN[1],ZAMAN[2],ZAMAN[3],ZAMAN[4],ZAMAN[5],ZAMAN[6]]
    GOSUB BCD_To_Decimal
    sn   =ZAMAN[0]
    DAK  =ZAMAN[1]
    SAAT =ZAMAN[2]
    HAFTA=ZAMAN[3]
    GUN  =ZAMAN[4]
    AY   =ZAMAN[5]
    YIL  =ZAMAN[6]  
    
    TempRegister = $11      ' DS3231 Temperature REgister High Byte (Integer portion)     
    I2Cread SDA,SCL, DS_OKU, TempRegister, [Derece, Ondalik]
    
    Ondalik = (Ondalik >> 6)   ' Shift <b7:b6> to <b1:b0>
    Ondalik = (Ondalik * 25)   ' Fractional portion is in .25 increments. Increment values are 0-3 (.00, .25, .50, .75)
    
    Isaret = "-"
    if derece.7 = 0 then  Isaret = "+"   ' save the sign bit for later
    
    '''If TempSign = 1 then  TempInt = (TempInt XOR $FF) + 1     'Do not use this, the DS3231 uses simple <b7> sign with <b6:b0> as absolute temperature value

RETURN 
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
ZAMAN_YAZ:

    ZAMAN[0]=sn      ' saniye
    ZAMAN[1]=DAK     ' dakika
    ZAMAN[2]=SAAT    ' saat
    ZAMAN[3]=hafta   ' haftanin gunu
    ZAMAN[4]=gun     ' Gün
    ZAMAN[5]=ay      ' ay
    ZAMAN[6]=yil     ' Yil
    
    GOSUB Decimal_To_BCD

    i2cwrite SDA,SCL,DS_YAZ,ZAMAN_REG,[ZAMAN[0],ZAMAN[1],ZAMAN[2],ZAMAN[3],ZAMAN[4],ZAMAN[5],ZAMAN[6],$10]

return  
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
DECIMAL_TO_BCD:

    for i=0 to 6
        ZAMAN[i] = ((ZAMAN[i] dig 1) << 4 ) + ZAMAN[i] dig 0
    next i

RETURN
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
BCD_TO_DECIMAL:

    for i=0 to 6
        ZAMAN[i]   = ((ZAMAN[i] >> 4) *10) + (ZAMAN[i] & %00001111)
    next i

RETURN
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
DISABLE
Kesme:
if INT0IF = 1 then 
         i2cread     SDA,SCL, chip1,INTFB,[f]
         i2cread     SDA,SCL, chip1,GPIOB,[Giris]
         Temp = Portb
endif

if RCIF = 1  then
   Temp = RCREG
   'hserout [temp]
    if Kesti = 0 then
    Gelen[RxGelen] = Temp
    RxGelen = RxGelen + 1
    if RxGelen >= 80 then Rxgelen = 0
    if Temp = 13 then Kesti = 1:high led
    endif
endif


Resume
enable

ete

Detaylı sigorta ayarı istiyor isen aşağıdakini kullanabilirsin.
Bu ayarların ne işlere yaradığını genelde MPASM klasörü içinde yer alan, P18F4550.INC dosyasının içine bakarak görebilirsin.
Bunu hem microcodestudio hemde not defteri ile açabilirsin. Dosyanın sonlarına doğru sigorta ayarlarını göreceksin. Yanlarında her birinin açıklaması vardır.
asm
    __CONFIG _CONFIG1H,_FOSC_HS_1H  & _FCMEN_OFF_1H & _IESO_OFF_1H     
    __CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _VREGEN_OFF_2L
    __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_256_2H
    __CONFIG _CONFIG3H, _CCP2MX_OFF_3H & _PBADEN_OFF_3H & _LPT1OSC_ON_3H & _MCLRE_OFF_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    
    __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H  
    
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR3_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H
endasm
İşe en üst satırı kaldırarak başla. Yani include modedefs.bas komut satırını kaldır. Bir işe yaramadığı gibi boşu boşuna hafızanı tüketiyor sonuçta o bir program ve derleme esnasında pice yükleniyor ama seninle bir alakası bulunmuyor.

Bazı anlamsız tanımlamalar görüyorum. Mesela
TRISB=%10010001  'B portu giriş yapıldı satırı ile TRISB ye bir değer yüklüyorsun. Buna göre PORTB.0, PORTB.4 ve PORTB.7 giriş pini oluyor. Bir kaç satır sonra  portb=%11110001 komutunu veriyorsun ki buda giriş olan pinleri sanki çıkışmış gibi değer yüklemeye çalışıyorsun. Bu son komutta giriş olan pinler için "0" kullanmalısın.

Diğer bir büyük hata ise kesme bayraklarının yanlızca okunarak sıfırlanacağı konusunda sabit bir fikrin olması. Bu kural yanlızca USRT kesme bayrağı için geçerlidir. Diğer bütün kesmeleerin kesme bayrakları direk sıfırlanır. Data sheet'e bakarsan her biri için "Must be cleared in Software" ifadesini göreceksin. Bu dediğimi doğruluyor.
Dolayısıyla INT0 kesme bayrağını;
if INT0IF = 1 then 
         i2cread     SDA,SCL, chip1,INTFB,[f]
         i2cread     SDA,SCL, chip1,GPIOB,[Giris]
         Temp = Portb
endif
komut satırlarında Temp=PortB şeklinde sıfırlamak yerine ki bu sıfırlamıyor. INT0IF=0 şeklinde sıfırlaman gerekiyor. Bu programın çalışmasını etkileyen ve bir kere INT0 kesmesi oluştuktan sonra programın oradan ayrılmamasını sağlayan büyük bir hata. Zira bayrak sıfırlanmadığı için program kesmeden çıkar çıkmaz yeniden INT0 kesmesine girer ve diğer işlevlerini yerine getiremez.
Diğer kesme olan USART kesme bayrağı doğru sıfırlanmış (Temp = RCREG) orada bir değişikliğe gerek yok.
Bu dediklerimi düzeltip yeniden denermisin.

Ete

aRci

Merhaba
Hocam dün geç saate kadar deneme yaptım ve bir formda uart alma hatası na bağlı olarak CREN bitinin resetlenmesine rastladım ve bunu şu şekilde basla etiketine uyguladım

if OERR = 1 then CREN = 0: Pause 1:CREN = 1

sonuç tam istedğim gibi oldu. Şuan analog giriş denemesi için çalışıyorum. verdiğiniz tavsiyeleri de uygulayacağım .

teşekkürler.

ete

Herhalde mevcut durumda hiç INT0 kesmesi oluşmuyor. Yada oluşması için gereken ortam mevcut değil yoksa o program kesinlikle çalışmaz.
Sen yinede dediklerimi uygula .
Ete

aRci

dediklerinizde haklısınız. INT0 a gidince pic sürekli kesmeye gidiyormuş ben EUSART da yaşadığım sorunuz çözünce diğer fonksiyonları denediğimde gördüm ve tavsiyelerinize göre yeniden düzenlemeleri yaptım. Program sağlıklı şekilde çalışmaya başladı.
şimdi ise analog okumaları sim de denedim. bana göre doğru çalışıyor. kart girişi lm2596 ile 4.2 v ye indiriliyor. elimde lipo pillerden yaptığım 3s pil grubu ile besliyorum. analog okuma ile pil seviyesini ölçmek istiyorum. henüz uygulamasını yapmadım ama proteusda oldukca iyi bir sonuc veriyor. artık gerisi yarın.

bu konu ile daha önceden pic ile aküyü burda pilleri :) ortak besleme kullanmayın demişsiniz. regülatör olduğu halde sıkıntı yaparmı.

ASM 
  __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
  __CONFIG    _CONFIG1H, _FOSC_HS_1H 
  __CONFIG    _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _BORV_0_2L & _VREGEN_OFF_2L
  __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
  __CONFIG    _CONFIG3H, _PBADEN_OFF_3H
  __CONFIG    _CONFIG4L, _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L
ENDASM
'ASM 
'  __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
'  __CONFIG    _CONFIG1H, _FOSC_HS_1H 
'  __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
'  __CONFIG    _CONFIG3H, _PBADEN_OFF_3H
'  __CONFIG    _CONFIG4L, _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L
'ENDASM
  
DEFINE OSC 20
pause 500
'DEFINE LOADER_USED 1 
'DEFINE RESET_ORG 800h ' For Microchip USB Bootloader
'DEFINE INTERRUPT_ORG 808h ' For Microchip USB Bootloader
'AllDigital 
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////Analoglar///////////////////////////////      
'adcon1=%10001111 
'CCP1CON=0 'disable capture/compare
'CCP2CON=0
'CMCON=7 'disable comparater

    ADCON0 = %00010100        'AN0 Seçildi
    Symbol GODONE = ADCON0.1  'Dönüştürme Durum Biti Devam ediyor = 1
    Symbol ADONE  = ADCON0.0  'Dönüştürme Modülü Etkin = 1
    
    ADCON1 = %00100110        'AN5 (Porte.0) analog giriş VREF besleme pinlerinden
    ADCON2 = %10111010    
    
'///////////////////////////////////////////////////////////////////////////////  
'////////////////////portb - TMR - Genel Kesmeler///////////////////////////      
    Symbol GIE      = INTCON.7    'genel kesmeler aktif
    Symbol PEIE    = INTCON.6    'Çevresel kesmeler aktif
    Symbol IPEN    = RCON.7      'Oncelikler aç kapat
    Symbol TMR0E    = INTCON.5    'TMR0 Kesme 
    Symbol INT0    = INTCON.4    'RB0 Kesme Etkinleştir
    Symbol RBIE    = INTCON.3    'RB Değişim Kesme 
    Symbol TMR0IF  = INTCON.2    'TMR0 Taşma Bayrağı Ouyarak Sıfırlanmalı
    Symbol INT0IF  = INTCON.1    'INT0 harici Kesme Bayrağı Okutarak Sıfırla
    Symbol RBIF    = INTCON.0    'RB7-4 harici Kesme Bayrağı Okutarak Sıfırla
'///////////////////////////////////////////////////////////////////////////////
'/////////////////////////portb kesme kenar - pull up açma///////////////////////////////////////
    Symbol RBPU    = INTCON2.7  'Portb Pull-up seçme etkin = 0
    Symbol INTEDG0  = INTCON2.6  'INT0 Kenar Seç  Düşen Kenear = 0 
    Symbol INTEDG1  = INTCON2.5  'INT1 Kenar Seç  Yükselen Kenar = 1
    Symbol INTEDG2  = INTCON2.4  'INT2 Kenar Seç
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
    Symbol RCIE    = PIE1.5      'EUSART alma kesmesi
    Symbol RCIF    = PIR1.5      'EUsart Kesme Bayrağı
    Symbol SPEN    = RCSTA.7    'Seri Bağlantı Noktası Etkin = 1
    Symbol CREN    = RCSTA.4    'Sürekli veri alma etkin = 1
    Symbol OERR    = RCSTA.1    'Sürekli veri alma etkin = 1
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
    Symbol TMR0ON  = T0CON.7    'TMR0 Etkinleştir = 1
    Symbol T08BIT  = T0CON.6    '8bit = 1 /16bit = 0 Zamanlayıcı Seç
    Symbol T0CS    = T0CON.5    'Saat Kaynağı T0CKI = 1 / CLKo = 0
    Symbol T0SE    = T0CON.4    'Kenar Seçme Yükselkten alta geçiş = 1
    Symbol PSA      = T0CON.3    'Ön yükleyici Ön ölçekleyiciyi atanmamış = 1  
    Symbol TOPS2    = T0CON.2    'bölme oranı
    Symbol TOPS1    = T0CON.1    'bölme oranı
    Symbol TOPS0    = T0CON.0    'bölme oranı
    
    '111 = 1:256 Prescale value
    '110 = 1:128 Prescale value
    '101 = 1:64 Prescale value
    '100 = 1:32 Prescale value
    '011 = 1:16 Prescale value
    '010 = 1:8 Prescale value
    '001 = 1:4 Prescale value
    '000 = 1:2 Prescale value

        
    DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
    DEFINE HSER_CLROERR 1 ' Clear overflow automatically
    DEFINE HSER_SPBRG 42  ' 115200 Baud @ 20MHz, 0,94%
    SPBRGH          = 0
    BAUDCON.3        = 1        ' Enable 16 bit baudrate generator

'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////  
    TRISA            = 0
    TRISB            = %10010001  'B portu giriş yapıldı
    TRISC            = %10000000  'C portu 3 giriş/4'ü çıkış yapıldı
    TRISD            = %00000000  'D portu çıkış yapıldı
    TRISE            = %001
    
    portb            = %11110001
    portc            = %11000000
    portd            = 0
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////    
    SDA              VAR PORTC.0
    SCL              VAR PORTC.1
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////  
    symbol Led      = Portb.1              'Pcb Durum Ledi
    symbol M0        = portb.2
    symbol M1        = portb.3
    E32Rx            var portb.4            'E32-TTL nin TX Ucu Bağlı
    E32Tx            var portb.5            'E32-TTL nin RX Ucu Bağlı
    NexRx            var portb.6            'Nextion Ekran Tx Ucu Bağlı
    NexTx            var portb.7            'Nextion Ekran Rx Ucu Bağlı
    Przt            var byte                
    gonder          var byte
    Giris            var byte
    Cikis            var byte
    chip1            var byte
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    'Zaman için
    AY      var    byte
    YIL    var    byte
    SN      VAR    BYTE
    DAK    VAR    BYTE
    SAAT    VAR    BYTE
    GUN    VAR    BYTE
    HGUN    VAR    BYTE
    HAFTA  VAR    BYTE
    Temp    var    byte
    MEM    var    byte
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    ;***************DS3231 için  
    
    DS_OKU            VAR BYTE : DS_OKU = %11010000
    DS_YAZ            VAR BYTE : DS_YAZ = %11010001
    ZAMAN_REG          VAR BYTE : ZAMAN_REG= $00
    i                  var byte
    ZAMAN              var byte[7]
    KAYDIR            var byte
    UST_BIT            var byte
    ALT_BIT            var byte
    'TempRegister CON $11      'temperature integer  REGISTER
    TempRegisterFRA    CON $12  'temperature fraction REGISTEr
    TempRegister      var byte    ' variable to hold DS3231 register address to read/write      
    Derece            var byte            ' Variable for temperature integer from register 11h
    Ondalik            var byte          ' Variable for temperature fraction for register 12h
    Isaret            var BYTE            ' Variable to hold sign bit  
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    'MCP 23017
    chip1              = $40
    IOGCA              con $00  ' port A output
    IOGCB              con $01  ' port B output
    IOPOLA            con $02 'PortA polarite çevirme
    IOPOLB            con $03 'PortB Polarite çevirme
    IntEnA            con $04 'Porta Kesme İzin
    IntEnB            con $05 'Porta Kesme İzin
    DEFVALA            Con $06 '?
    DEFVALB            Con $07 '?
    INTCONA            con $08
    INTCONB            con $09
    IOCONA            con $0A
    IOCONB            con $0B
    GPPUA              CON $0C
    GPPUB              CON $0D
    INTFA              CON $0E
    INTFB              CON $0F
    INTCAPA            CON $10
    INTCAPB            CON $11
    GPIOA              CON $12
    GPIOB              CON $13
    OLATA              CON $14
    OLATB              CON $15
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    f          var byte
    f1        var byte
    u          var byte
    u1        var byte
    x          var byte
    x1        var byte
    Kesti      var bit
    McpCh      var bit
    Baslat    var byte
    RxGelen    var byte
    UKomut    var byte
    Gelen      var byte[80]
    Bekle      var word
    Volt      Var word
    mVolt      var byte

'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    RxGelen    = 0 
    Baslat    = 0
    Kesti      = 0    'uart yada timer kesmesi gerçekleşince 1 olur
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    Aport  con 0 'PortA giriş çıkış ayarlandı
    Bport  con 255  'PortB giriş çıkış ayarlandı
    GOSUB Mcp23017
    TMR0E    = 1  'TMR0 Kesme Açık
    INT0    = 1  'INT0 kesme açık
    IPEN    = 0  'Kesmelerde Öncelikleri kapat
    PEIE    = 1  'Çevresel Kesmeler Aktif                                                                                
    RBPU    = 0
    INTEDG0  = 0  'INT0 Kenar Seç  Düşen Kenear = 0 
    RCIE    = 1  'EUsart Alma Kesmesi Aktif  = 1
    SPEN    = 1  'Seri Bağlantı Noktası Etkin = 1
    CREN    = 0  'Sürekli veri alma etkin = 1
    CREN    = 1
    TMR0ON  = 1  'TMR0 Etkinleştir = 1
    T08BIT  = 1  '8bit = 1 /16bit = 0 Zamanlayıcı Seç
    T0CS    = 0  'Saat Kaynağı T0CKI = 1 / CLKo = 0
    T0SE    = 1  'Kenar Seçme Yükselkten alta geçiş = 1
    PSA      = 0  'Ön yükleyici Ön ölçekleyiciyi atanmamış = 1
    TOPS2= 1:TOPS1 = 1:TOPS0 = 1
    GIE      = 1  'Tüm kesmeler açık
    ON INTERRUPT GOTO KESME 'komut satırını ekle programa (BASLA satırından bir evvele koyabilirsin)

basla:
    
    if Kesti = 1 then
      RxGelen = 0
      gosub ZAMAN_OKU
      i2cread  SDA,SCL, chip1,GPIOB,[Giris]
      gosub Coz 
      Kesti = 0
    endif
    
    if Bekle <= 900 then low led
    if Bekle >= 901 then high led
    if Bekle >= 1000 then 
    ADONE  = 1  'Dönüştürme Modülü Etkin = 1
    GODONE = 1
    while GODONE = 1
    pause 1 
    wend
    ADONE  = 0
    Bekle = (((ADRESh*256) + ADRESL) */ 62) '24/1023 =0,0234 * 256
    Volt = Bekle /10
    mVolt = Bekle //10
    hserout ["Analog Deger: ",dec Volt,".",dec mVolt,"V - ", dec Bekle,"-",dec ADRESH,"-",dec ADRESL,13]
    Bekle = 0
    endif
    if OERR = 1 then CREN = 0: Pause 1:CREN = 1
goto basla  
    
Ani:

cikis = 255
I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
Bekle = 0
while Bekle <= 100
wend
cikis = 0
I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
Bekle = 0
while Bekle <= 900
wend


Goto Ani
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////                                                                  
Coz:                                                                
    u1      = 0
    'hserout ["Coz...",13,str Gelen\30,13]
    
    for U = u1 to 78
        for x = 0 to 3
            lookup x,["Cks="],Temp
            if Gelen [u+x]  = Temp and  x = 3 then
                u1 = u+x+ 2
                Cikis = 0
                for u = u1 to u1+7
                    Cikis = Cikis << 1 + (Gelen[u]-48)
                next u
                I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
                hserout ["PicCks=",34,bin8 cikis, 34,"*1Grs=",bin8 giris, "*2Ter=", Isaret, dec2 derece, ".", dec Ondalik, "*3Saat=", Dec2 Saat, ":", Dec2 Dak, ":", dec2 Sn, "*4",13] 
                UKomut.0 = 1
            endif
            if Gelen [u+x]  <> Temp then x = 3
        next x
        
        for x = 0 to 2
            lookup x,["ON "],Temp
            if Gelen [u+x]  = Temp and  x = 2 then UKomut.5 = 1:McpCh = 1
            if Gelen [u+x]  <> Temp then x = 2
        next x
    
        for x = 0 to 2
            lookup x,["OFF"],Temp
            if Gelen [u+x]  = Temp and  x = 2 then UKomut.6 = 1:McpCh = 1
            if Gelen [u+x]  <> Temp then x = 2
        next x
        
        for x = 0 to 3
            lookup x,["Saat"],Temp
            if Gelen [u+x]  = Temp and  x = 3 then
              u = u + x + 1 
              Saat  = (Gelen [u  ]-48)*10 + (Gelen [u+1 ]-48)
              Dak  = (Gelen [u+2 ]-48)*10 + (Gelen [u+3 ]-48)
              Sn    = 0
              Hafta = (Gelen [u+4 ]-48)
              Gun  = (Gelen [u+5 ]-48)*10 + (Gelen [u+6 ]-48)
              Ay    = (Gelen [u+7 ]-48)*10 + (Gelen [u+8]-48)
              Yil  = (Gelen [u+9]-48)*10 + (Gelen [u+10]-48)
              gosub ZAMAN_YAZ
              UKomut.0 = 1
            endif
            if Gelen [u+x]  <> Temp then x = 3
        next x
          
        
        if Gelen [U]  = "C" and Ukomut.5  = 1 and (Gelen[U+1]-48) <= 9 then cikis = cikis | dcd (Gelen[U+1]-48)
        if Gelen [U]  = "C" and Ukomut.6  = 1 and (Gelen[U+1]-48) <= 9 then cikis = cikis & (255-dcd (Gelen[U+1]-48))
        if UKomut.5 = 1 or UKomut.6 = 1 then I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
    
        GELEN[U] = "*"
    next U
    
UGec: 
RxGelen = 0
return 
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
MCP23017:
    I2CWRITE SDA, SCL, chip1,[IOGCA,Aport]    'A7 giriş olarak ayarlandı
    I2CWRITE SDA, SCL, chip1,[IOPOLA,0]      'Polarite Ayarlandı Ters çevrilmemiş
    I2CWRITE SDA, SCL, chip1,[IntEnA,0]    'Kesme İzin Verilmedi
    I2CWRITE SDA, SCL, chip1,[DEFVALA,0]      'Kesme İzin Verildi.terslenmedi
    I2CWRITE SDA, SCL, chip1,[INTCONA,0]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[IOCONA,%01011000]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[GPPUA,0]      'pRTa.7 PULLU U P AKTİF
    I2CWRITE SDA, SCL, chip1,[INTFA,0]      'kESME bAYRAK
    I2CWRITE SDA, SCL, chip1,[INTCAPA,0]      '?
    'I2CWRITE SDA, SCL, chip1,[GPIOA,0]      'PORT OKUMA
    I2CWRITE SDA, SCL, chip1,[IOGCB,Bport]    'A7 giriş olarak ayarlandı
    I2CWRITE SDA, SCL, chip1,[IOPOLB,255]      'Polarite Ayarlandı Ters çevrilecek mi
    I2CWRITE SDA, SCL, chip1,[IntEnB,255]    'Kesme İzin Verildi
    I2CWRITE SDA, SCL, chip1,[DEFVALB,0]      'Kesme İzin Verildi.terslenmedi
    I2CWRITE SDA, SCL, chip1,[INTCONB,0]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[IOCONB,%01011000]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[GPPUB,255]      'PULLU U P pasıf
    I2CWRITE SDA, SCL, chip1,[INTFB,0]      'kESME bAYRAK
    I2CWRITE SDA, SCL, chip1,[INTCAPB,0]      '?
    'I2CWRITE SDA, SCL, chip1,[GPIOA,0]      'PORT OKUMA
return
'///////////////////////////////////////////////////////////////////////////////    
'///////////////////////////////////////////////////////////////////////////////
ZAMAN_OKU:
    i2cread SDA,SCL,DS_OKU,ZAMAN_REG,[ZAMAN[0],ZAMAN[1],ZAMAN[2],ZAMAN[3],ZAMAN[4],ZAMAN[5],ZAMAN[6]]
    GOSUB BCD_To_Decimal
    sn  =ZAMAN[0]
    DAK  =ZAMAN[1]
    SAAT =ZAMAN[2]
    HAFTA=ZAMAN[3]
    GUN  =ZAMAN[4]
    AY  =ZAMAN[5]
    YIL  =ZAMAN[6]  
    
    TempRegister = $11      ' DS3231 Temperature REgister High Byte (Integer portion)    
    I2Cread SDA,SCL, DS_OKU, TempRegister, [Derece, Ondalik]
    
    Ondalik = (Ondalik >> 6)  ' Shift <b7:b6> to <b1:b0>
    Ondalik = (Ondalik * 25)  ' Fractional portion is in .25 increments. Increment values are 0-3 (.00, .25, .50, .75)
    
    Isaret = "-"
    if derece.7 = 0 then  Isaret = "+"  ' save the sign bit for later
    
    '''If TempSign = 1 then  TempInt = (TempInt XOR $FF) + 1    'Do not use this, the DS3231 uses simple <b7> sign with <b6:b0> as absolute temperature value

RETURN 
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
ZAMAN_YAZ:

    ZAMAN[0]=sn      ' saniye
    ZAMAN[1]=DAK    ' dakika
    ZAMAN[2]=SAAT    ' saat
    ZAMAN[3]=hafta  ' haftanin gunu
    ZAMAN[4]=gun    ' Gün
    ZAMAN[5]=ay      ' ay
    ZAMAN[6]=yil    ' Yil
    
    GOSUB Decimal_To_BCD

    i2cwrite SDA,SCL,DS_YAZ,ZAMAN_REG,[ZAMAN[0],ZAMAN[1],ZAMAN[2],ZAMAN[3],ZAMAN[4],ZAMAN[5],ZAMAN[6],$10]

return  
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
DECIMAL_TO_BCD:

    for i=0 to 6
        ZAMAN[i] = ((ZAMAN[i] dig 1) << 4 ) + ZAMAN[i] dig 0
    next i

RETURN
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
BCD_TO_DECIMAL:

    for i=0 to 6
        ZAMAN[i]  = ((ZAMAN[i] >> 4) *10) + (ZAMAN[i] & %00001111)
    next i

RETURN
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
DISABLE
Kesme:

if TMR0IF = 1 then 
  Bekle = Bekle + 1
  TMR0IF = 0
  TMR0 = 235
  'Hserout ["TMR0... ",dec Bekle,13]
endif
if INT0IF = 1 then 
        i2cread    SDA,SCL, chip1,INTFB,[f]
        i2cread    SDA,SCL, chip1,GPIOB,[Giris]
        INT0IF = 0
        'i2cread    SDA,SCL, chip1,GPIOB,[Giris]
        'Hserout ["Buton... ",dec Giris," - ", dec f, 13]
endif

if RCIF = 1  then
    Temp = RCREG
    if Kesti = 0 then
    Gelen[RxGelen] = Temp
    RxGelen = RxGelen + 1
    'if RxGelen >= 80 then Rxgelen = 0
    if Temp = 13 then Kesti = 1
    endif
endif


Resume
enable

aRci

#5
  Merhaba
  Analog ölçümü yapmayı başardım. porte.0 dan okunan voltaj değerini doğru şekilde ölçe biliyorum. başta breadboard üzerinede denedim ve sürekli değişken değer alyordum. bunu düzeltmek için boşa 1 saat harcamışım çünkü oluşan parazit kaynalşıymış. mesala camın önünden araba geçince değerler bir yükseliyor bir düşüyordu.
  neyse delikli plaket ile seri bağlı 10k ve 1k direnc ile gerilim bölücü yaptım 1k dirence 100 nf parelel bağlı. sonuç son derece sabit ölçüm alabilmekteyim.
  Projeyi yapmak isteyenler için son halini paylaşıyorum. ekteki resimlerle proteus da kurulum yapabilirsiniz.
 
  Proje amacına gelirsek. kart üzerinde duran esp den gelen EspCks="00000000" şeklinde gelen bilgiye göre çıkışları yönetmek ayrıca ds3231 den saat ve ısı değerini ve son olarakta battarya volt değerini esp ye göndermek esp tarafında bilgiler firebase gönderek uzaktan takip ve kontrol sağlanıyor.
 
'include "modedefs.bas"
ASM 
  __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
  __CONFIG    _CONFIG1H, _FOSC_HS_1H 
  __CONFIG    _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _BORV_0_2L & _VREGEN_OFF_2L
  __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
  __CONFIG    _CONFIG3H, _PBADEN_OFF_3H
  __CONFIG    _CONFIG4L, _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L
ENDASM
'ASM 
'  __CONFIG    _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
'  __CONFIG    _CONFIG1H, _FOSC_HS_1H 
'  __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_128_2H
'  __CONFIG    _CONFIG3H, _PBADEN_OFF_3H
'  __CONFIG    _CONFIG4L, _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L
'ENDASM
  
DEFINE OSC 20
pause 500
'DEFINE LOADER_USED 1 
'DEFINE RESET_ORG 800h ' For Microchip USB Bootloader
'DEFINE INTERRUPT_ORG 808h ' For Microchip USB Bootloader
'AllDigital 
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////Analoglar///////////////////////////////      
'adcon1=%10001111 
'CCP1CON=0 'disable capture/compare
'CCP2CON=0
'CMCON=7 'disable comparater


    ADCON0 = %00010100        'AN0 Seçildi
    Symbol GODONE = ADCON0.1  'Dönüştürme Durum Biti Devam ediyor = 1
    Symbol ADONE  = ADCON0.0  'Dönüştürme Modülü Etkin = 1
    
    ADCON1 = %00000110        'AN5 (Porte.0) analog giriş VREF besleme pinlerinden
    ADCON2 = %10111010       
    
    
'///////////////////////////////////////////////////////////////////////////////  
'////////////////////portb - TMR - Genel Kesmeler///////////////////////////      
    Symbol GIE      = INTCON.7    'genel kesmeler aktif
    Symbol PEIE    = INTCON.6    'Çevresel kesmeler aktif
    Symbol IPEN    = RCON.7      'Oncelikler aç kapat
    Symbol TMR0E    = INTCON.5    'TMR0 Kesme 
    Symbol INT0    = INTCON.4    'RB0 Kesme Etkinleştir
    Symbol RBIE    = INTCON.3    'RB Değişim Kesme 
    Symbol TMR0IF  = INTCON.2    'TMR0 Taşma Bayrağı Ouyarak Sıfırlanmalı
    Symbol INT0IF  = INTCON.1    'INT0 harici Kesme Bayrağı Okutarak Sıfırla
    Symbol RBIF    = INTCON.0    'RB7-4 harici Kesme Bayrağı Okutarak Sıfırla
'///////////////////////////////////////////////////////////////////////////////
'/////////////////////////portb kesme kenar - pull up açma///////////////////////////////////////
    Symbol RBPU    = INTCON2.7  'Portb Pull-up seçme etkin = 0
    Symbol INTEDG0  = INTCON2.6  'INT0 Kenar Seç  Düşen Kenear = 0 
    Symbol INTEDG1  = INTCON2.5  'INT1 Kenar Seç  Yükselen Kenar = 1
    Symbol INTEDG2  = INTCON2.4  'INT2 Kenar Seç
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
    Symbol RCIE    = PIE1.5      'EUSART alma kesmesi
    Symbol RCIF    = PIR1.5      'EUsart Kesme Bayrağı
    Symbol SPEN    = RCSTA.7    'Seri Bağlantı Noktası Etkin = 1
    Symbol CREN    = RCSTA.4    'Sürekli veri alma etkin = 1
    Symbol OERR    = RCSTA.1    'Sürekli veri alma etkin = 1
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
    Symbol TMR0ON  = T0CON.7    'TMR0 Etkinleştir = 1
    Symbol T08BIT  = T0CON.6    '8bit = 1 /16bit = 0 Zamanlayıcı Seç
    Symbol T0CS    = T0CON.5    'Saat Kaynağı T0CKI = 1 / CLKo = 0
    Symbol T0SE    = T0CON.4    'Kenar Seçme Yükselkten alta geçiş = 1
    Symbol PSA      = T0CON.3    'Ön yükleyici Ön ölçekleyiciyi atanmamış = 1  
    Symbol TOPS2    = T0CON.2    'bölme oranı
    Symbol TOPS1    = T0CON.1    'bölme oranı
    Symbol TOPS0    = T0CON.0    'bölme oranı
    
    '111 = 1:256 Prescale value
    '110 = 1:128 Prescale value
    '101 = 1:64 Prescale value
    '100 = 1:32 Prescale value
    '011 = 1:16 Prescale value
    '010 = 1:8 Prescale value
    '001 = 1:4 Prescale value
    '000 = 1:2 Prescale value

        
    DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
    DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
    DEFINE HSER_CLROERR 1 ' Clear overflow automatically
    DEFINE HSER_SPBRG 42  ' 115200 Baud @ 20MHz, 0,94%
    SPBRGH          = 0
    BAUDCON.3        = 1        ' Enable 16 bit baudrate generator

'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////  
    TRISA            = 0
    TRISB            = %10010001  'B portu giriş yapıldı
    TRISC            = %10000000  'C portu 3 giriş/4'ü çıkış yapıldı
    TRISD            = %00000000  'D portu çıkış yapıldı
    TRISE            = %001
    
    portb            = %11110001
    portc            = %11000000
    portd            = 0
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////    
    SDA              VAR PORTC.0
    SCL              VAR PORTC.1
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////  
    symbol Led      = Portb.1              'Pcb Durum Ledi
    symbol M0        = portb.2
    symbol M1        = portb.3
    E32Rx            var portb.4            'E32-TTL nin TX Ucu Bağlı
    E32Tx            var portb.5            'E32-TTL nin RX Ucu Bağlı
    NexRx            var portb.6            'Nextion Ekran Tx Ucu Bağlı
    NexTx            var portb.7            'Nextion Ekran Rx Ucu Bağlı
    Przt            var byte                
    gonder          var byte
    Giris            var byte
    Cikis            var byte
    chip1            var byte
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    'Zaman için
    AY      var    byte
    YIL    var    byte
    SN      VAR    BYTE
    DAK    VAR    BYTE
    SAAT    VAR    BYTE
    GUN    VAR    BYTE
    HGUN    VAR    BYTE
    HAFTA  VAR    BYTE
    Temp    var    byte
    MEM    var    byte
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    ;***************DS3231 için  
    
    DS_OKU            VAR BYTE : DS_OKU = %11010000
    DS_YAZ            VAR BYTE : DS_YAZ = %11010001
    ZAMAN_REG          VAR BYTE : ZAMAN_REG= $00
    i                  var byte
    ZAMAN              var byte[7]
    KAYDIR            var byte
    UST_BIT            var byte
    ALT_BIT            var byte
    'TempRegister CON $11      'temperature integer  REGISTER
    TempRegisterFRA    CON $12  'temperature fraction REGISTEr
    TempRegister      var byte    ' variable to hold DS3231 register address to read/write      
    Derece            var byte            ' Variable for temperature integer from register 11h
    Ondalik            var byte          ' Variable for temperature fraction for register 12h
    Isaret            var BYTE            ' Variable to hold sign bit  
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    'MCP 23017
    chip1              = $40
    IOGCA              con $00  ' port A output
    IOGCB              con $01  ' port B output
    IOPOLA            con $02 'PortA polarite çevirme
    IOPOLB            con $03 'PortB Polarite çevirme
    IntEnA            con $04 'Porta Kesme İzin
    IntEnB            con $05 'Porta Kesme İzin
    DEFVALA            Con $06 '?
    DEFVALB            Con $07 '?
    INTCONA            con $08
    INTCONB            con $09
    IOCONA            con $0A
    IOCONB            con $0B
    GPPUA              CON $0C
    GPPUB              CON $0D
    INTFA              CON $0E
    INTFB              CON $0F
    INTCAPA            CON $10
    INTCAPB            CON $11
    GPIOA              CON $12
    GPIOB              CON $13
    OLATA              CON $14
    OLATB              CON $15
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    f          var byte
    f1        var byte
    u          var byte
    u1        var byte
    x          var byte
    x1        var byte
    Kesti      var bit
    McpCh      var bit
    Baslat    var byte
    RxGelen    var byte
    UKomut    var byte
    Gelen      var byte[80]
    Bekle      var word
    HamDeger  var word
    Volt      Var word
    mVolt      var byte

'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    RxGelen    = 0 
    Baslat    = 0
    Kesti      = 0    'uart yada timer kesmesi gerçekleşince 1 olur
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    Aport  con 0 'PortA giriş çıkış ayarlandı
    Bport  con 255  'PortB giriş çıkış ayarlandı
    GOSUB Mcp23017
    TMR0E    = 1  'TMR0 Kesme Açık
    INT0    = 1  'INT0 kesme açık
    IPEN    = 0  'Kesmelerde Öncelikleri kapat
    PEIE    = 1  'Çevresel Kesmeler Aktif                                                                                
    RBPU    = 0
    INTEDG0  = 0  'INT0 Kenar Seç  Düşen Kenear = 0 
    RCIE    = 1  'EUsart Alma Kesmesi Aktif  = 1
    SPEN    = 1  'Seri Bağlantı Noktası Etkin = 1
    CREN    = 0  'Sürekli veri alma etkin = 1
    CREN    = 1
    TMR0ON  = 1  'TMR0 Etkinleştir = 1
    T08BIT  = 1  '8bit = 1 /16bit = 0 Zamanlayıcı Seç
    T0CS    = 0  'Saat Kaynağı T0CKI = 1 / CLKo = 0
    T0SE    = 1  'Kenar Seçme Yükselkten alta geçiş = 1
    PSA      = 0  'Ön yükleyici Ön ölçekleyiciyi atanmamış = 1
    TOPS2= 1:TOPS1 = 1:TOPS0 = 1
    GIE      = 1  'Tüm kesmeler açık
    ON INTERRUPT GOTO KESME 'komut satırını ekle programa (BASLA satırından bir evvele koyabilirsin)

basla:
    
    if Kesti = 1 then
      RxGelen = 0
      gosub ZAMAN_OKU
      i2cread  SDA,SCL, chip1,GPIOB,[Giris]
      gosub Coz 
      Kesti = 0
    endif
    
    if Bekle <= 900 then low led
    if Bekle >= 901 then high led
    if Bekle >= 1000 then 
    Hamdeger = 0: f = 0
    while f <= 9
        ADONE  = 1  'Dönüştürme Modülü Etkin = 1
        GODONE = 1
        while GODONE = 1
        pause 1 
        wend
        ADONE  = 0
        f = f + 1
        HamDeger = Hamdeger + ((ADRESh*256) + ADRESL)  '24/1023 =0,0234 * 256
    wend
    HamDeger = HamDeger / 10
    Volt = (HamDeger */  107) /10
    mVolt = (HamDeger */ 107) //10
    'hserout ["Analog Deger: ",dec Volt,".",dec mVolt,"V - ", dec HamDeger,"-",dec ADRESH,"-",dec ADRESL,13]
    Bekle = 0
    endif
    
    if OERR = 1 then CREN = 0: Pause 1:CREN = 1
goto basla  
    
Ani:

cikis = 255
I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
Bekle = 0
while Bekle <= 100
wend
cikis = 0
I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
Bekle = 0
while Bekle <= 900
wend


Goto Ani
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////                                                                  
Coz:                                                                
    u1      = 0
    'hserout ["Coz...",13,str Gelen\30,13]
    
    for U = u1 to 78
        for x = 0 to 3
            lookup x,["Cks="],Temp
            if Gelen [u+x]  = Temp and  x = 3 then
                u1 = u+x+ 2
                Cikis = 0
                for u = u1 to u1+7
                    Cikis = Cikis << 1 + (Gelen[u]-48)
                next u
                I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
                hserout ["PicCks=",34,bin8 cikis, 34,"*1Grs=",bin8 giris, "*2Ter=", Isaret, dec2 derece, ".", dec Ondalik,"-",dec Volt,".",dec mVolt,"V*3Saat=", Dec2 Saat, ":", Dec2 Dak, ":", dec2 Sn, "*4",13] 
                UKomut.0 = 1
            endif
            if Gelen [u+x]  <> Temp then x = 3
        next x
        
        for x = 0 to 2
            lookup x,["ON "],Temp
            if Gelen [u+x]  = Temp and  x = 2 then UKomut.5 = 1:McpCh = 1
            if Gelen [u+x]  <> Temp then x = 2
        next x
    
        for x = 0 to 2
            lookup x,["OFF"],Temp
            if Gelen [u+x]  = Temp and  x = 2 then UKomut.6 = 1:McpCh = 1
            if Gelen [u+x]  <> Temp then x = 2
        next x
        
        for x = 0 to 3
            lookup x,["Saat"],Temp
            if Gelen [u+x]  = Temp and  x = 3 then
              u = u + x + 1 
              Saat  = (Gelen [u  ]-48)*10 + (Gelen [u+1 ]-48)
              Dak  = (Gelen [u+2 ]-48)*10 + (Gelen [u+3 ]-48)
              Sn    = 0
              Hafta = (Gelen [u+4 ]-48)
              Gun  = (Gelen [u+5 ]-48)*10 + (Gelen [u+6 ]-48)
              Ay    = (Gelen [u+7 ]-48)*10 + (Gelen [u+8]-48)
              Yil  = (Gelen [u+9]-48)*10 + (Gelen [u+10]-48)
              gosub ZAMAN_YAZ
              UKomut.0 = 1
            endif
            if Gelen [u+x]  <> Temp then x = 3
        next x
          
        
        if Gelen [U]  = "C" and Ukomut.5  = 1 and (Gelen[U+1]-48) <= 9 then cikis = cikis | dcd (Gelen[U+1]-48)
        if Gelen [U]  = "C" and Ukomut.6  = 1 and (Gelen[U+1]-48) <= 9 then cikis = cikis & (255-dcd (Gelen[U+1]-48))
        if UKomut.5 = 1 or UKomut.6 = 1 then I2CWRITE  SDA, SCL, chip1,[GPIOA,cikis]
    
        GELEN[U] = "*"
    next U
    
UGec: 
RxGelen = 0
return 
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
MCP23017:
    I2CWRITE SDA, SCL, chip1,[IOGCA,Aport]    'A7 giriş olarak ayarlandı
    I2CWRITE SDA, SCL, chip1,[IOPOLA,0]      'Polarite Ayarlandı Ters çevrilmemiş
    I2CWRITE SDA, SCL, chip1,[IntEnA,0]    'Kesme İzin Verilmedi
    I2CWRITE SDA, SCL, chip1,[DEFVALA,0]      'Kesme İzin Verildi.terslenmedi
    I2CWRITE SDA, SCL, chip1,[INTCONA,0]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[IOCONA,%01011000]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[GPPUA,0]      'pRTa.7 PULLU U P AKTİF
    I2CWRITE SDA, SCL, chip1,[INTFA,0]      'kESME bAYRAK
    I2CWRITE SDA, SCL, chip1,[INTCAPA,0]      '?
    'I2CWRITE SDA, SCL, chip1,[GPIOA,0]      'PORT OKUMA
    I2CWRITE SDA, SCL, chip1,[IOGCB,Bport]    'A7 giriş olarak ayarlandı
    I2CWRITE SDA, SCL, chip1,[IOPOLB,255]      'Polarite Ayarlandı Ters çevrilecek mi
    I2CWRITE SDA, SCL, chip1,[IntEnB,255]    'Kesme İzin Verildi
    I2CWRITE SDA, SCL, chip1,[DEFVALB,0]      'Kesme İzin Verildi.terslenmedi
    I2CWRITE SDA, SCL, chip1,[INTCONB,0]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[IOCONB,%01011000]      'Kesme İzin Verildi.önceki durumuna göre
    I2CWRITE SDA, SCL, chip1,[GPPUB,255]      'PULLU U P pasıf
    I2CWRITE SDA, SCL, chip1,[INTFB,0]      'kESME bAYRAK
    I2CWRITE SDA, SCL, chip1,[INTCAPB,0]      '?
    'I2CWRITE SDA, SCL, chip1,[GPIOA,0]      'PORT OKUMA
return
'///////////////////////////////////////////////////////////////////////////////    
'///////////////////////////////////////////////////////////////////////////////
ZAMAN_OKU:
    i2cread SDA,SCL,DS_OKU,ZAMAN_REG,[ZAMAN[0],ZAMAN[1],ZAMAN[2],ZAMAN[3],ZAMAN[4],ZAMAN[5],ZAMAN[6]]
    GOSUB BCD_To_Decimal
    sn  =ZAMAN[0]
    DAK  =ZAMAN[1]
    SAAT =ZAMAN[2]
    HAFTA=ZAMAN[3]
    GUN  =ZAMAN[4]
    AY  =ZAMAN[5]
    YIL  =ZAMAN[6]  
    
    TempRegister = $11      ' DS3231 Temperature REgister High Byte (Integer portion)    
    I2Cread SDA,SCL, DS_OKU, TempRegister, [Derece, Ondalik]
    
    Ondalik = (Ondalik >> 6)  ' Shift <b7:b6> to <b1:b0>
    Ondalik = (Ondalik * 25)  ' Fractional portion is in .25 increments. Increment values are 0-3 (.00, .25, .50, .75)
    
    Isaret = "-"
    if derece.7 = 0 then  Isaret = "+"  ' save the sign bit for later
    
    '''If TempSign = 1 then  TempInt = (TempInt XOR $FF) + 1    'Do not use this, the DS3231 uses simple <b7> sign with <b6:b0> as absolute temperature value

RETURN 
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
ZAMAN_YAZ:

    ZAMAN[0]=sn      ' saniye
    ZAMAN[1]=DAK    ' dakika
    ZAMAN[2]=SAAT    ' saat
    ZAMAN[3]=hafta  ' haftanin gunu
    ZAMAN[4]=gun    ' Gün
    ZAMAN[5]=ay      ' ay
    ZAMAN[6]=yil    ' Yil
    
    GOSUB Decimal_To_BCD

    i2cwrite SDA,SCL,DS_YAZ,ZAMAN_REG,[ZAMAN[0],ZAMAN[1],ZAMAN[2],ZAMAN[3],ZAMAN[4],ZAMAN[5],ZAMAN[6],$10]

return  
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
DECIMAL_TO_BCD:

    for i=0 to 6
        ZAMAN[i] = ((ZAMAN[i] dig 1) << 4 ) + ZAMAN[i] dig 0
    next i

RETURN
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
BCD_TO_DECIMAL:

    for i=0 to 6
        ZAMAN[i]  = ((ZAMAN[i] >> 4) *10) + (ZAMAN[i] & %00001111)
    next i

RETURN
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
DISABLE
Kesme:

if TMR0IF = 1 then 
  Bekle = Bekle + 1
  TMR0IF = 0
  TMR0 = 235
  'Hserout ["TMR0... ",dec Bekle,13]
endif
if INT0IF = 1 then 
        i2cread    SDA,SCL, chip1,INTFB,[f]
        i2cread    SDA,SCL, chip1,GPIOB,[Giris]
        INT0IF = 0
        'i2cread    SDA,SCL, chip1,GPIOB,[Giris]
        'Hserout ["Buton... ",dec Giris," - ", dec f, 13]
endif

if RCIF = 1  then
    Temp = RCREG
    if Kesti = 0 then
    Gelen[RxGelen] = Temp
    RxGelen = RxGelen + 1
    'if RxGelen >= 80 then Rxgelen = 0
    if Temp = 13 then Kesti = 1
    endif
endif


Resume
enable






aRci


Powered by EzPortal