16f1938 çalışma sırasında durması

Başlatan aRci, 10 Ocak 2023, 11:50:56

aRci

Merhaba;
Yapmakta olduğum projede pic birden sebepsiz yere çalışmayı durduruyor. Sistemde gsm ile kumanda için bir proje ve genelde sms alınca sistem duruyor. projede sonsuz döngü girecek bir yapı yok ya döngü sayısı yada timer kesmeye bağlı zaman gecikmesi ile döngülerdeki zamanlama sınırlanıyor. ayrıca sürekli timer1 e bağlı bir pals veren led var ki kilitlendiğinde led sürekli sönük kalıyor.

Aşağıda projenin ilk sayfası bulunuyor. sigorta ayarları bu sayfa haricinde başka sayfalarda kullanılmadı. proje aslında 18f26k20 için yapmıştım ama maliyet ve malzeme temini konusunda sıkıntılı olunca 16f1938 de şansımı deniyorum. tüm sigorta ayarlarını datasheet e bakarak yapmaya çalıştım atladığım kısımlar varsa diye buradan yazıyorum.

sistemde 3 kesme bulunuyor timer1 ile zamalamaları ayarlarken uart ile sim800c ile haberleşme yapıyorum. son olarakda portb.0 ilede lora modülünün aux çıkışana bağlı bu sayede veri gelirken sistem kesmeye gitmesini sağlıyor.

dahili 32mhz ve 5v ile devre besleniyor. Mclr aktif osc pininde buzzer bağlı.


asm
 __CONFIG    _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _FCMEN_ON
 __CONFIG    _CONFIG2, _LVP_OFF & _STVREN_OFF & _PLLEN_ON
endasm
   
    OSCCON = %11110000      '8*4 mhz internal clock, PLL on
    OSCTUNE= %01000000
    define OSC 32
    
    INTCON=%11000000
    PIE1= %00100001
    PIR1= %00000000
    RCSTA= %10010000
    TXSTA= %00100100
    LCDCON.7 = 0
    option_reg.7=0
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////Analoglar///////////////////////////////      
    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           = %10100000
    'ADCON2           = %10111001
    Symbol ADIF      = PIR1.6      'ADC okuma bitti kesme bayrağı      
    Define  ADC_BITS     10   ' Set number of bits in result
    Define  ADC_CLOCK    32    ' Set clock source Fosc/4
    Define  ADC_SAMPLEUS 50   ' Set sampling time in uS
'///////////////////////////////////////////////////////////////////////////////  
'////////////////////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 IOCE      = 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 IOCF      = INTCON.0    'RB7-4 harici Kesme Bayrağı Okutarak Sıfırla
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
    Symbol RCIE      = PIE1.5      'EUSART alma kesmesi              
    Symbol RCIF      = PIR1.5      'EUsart Kesme Bayrağı             
    'Symbol RCIP      = IPR1.5      'EUsart ALma Kesintisi Öncelik    
    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 FERR      = RCSTA.2 
'///////////////////////////////////////////////////////////////////////////////
'///////////////////////////////////////////////////////////////////////////////
    T1CON = %00110001
    Symbol TMR1ON     = T1CON.0    'TMR1 Etkinleştir = 1
    Symbol TMR1E      = PIE1.0     'TMR1 Kesme izni
    Symbol TMR1F      = PIR1.0
    TMR1H=$63:TMR1L=$C2
'===============================================================================
'===============================================================================
    INT0             = 0  'INT0 kesme açık =1
    PEIE             = 1  'Çevresel Kesmeler Aktif                                                                                
    SPEN             = 1  'Seri Bağlantı Noktası Etkin = 1
    CREN             = 0  'Sürekli veri alma etkin = 1
    CREN             = 1
    RCIE             = 1  'EUsart Alma Kesmesi Aktif  = 1
    IOCBP            = %00000000 'yükselen kenar değişim kesmesi için pin seçimi
    IOCBN            = %00000001 'düşen kenar değişim kesmesi için pin seçimi
    IOCE             = 1  'RB değişim kesmesi Aktif = 1
    GIE              = 1  'Tüm kesmeler açık
'===============================================================================
'===============================================================================

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 51  ' 9600 Baud @ 32MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 51  ' 9600 Baud @ 32MHz, 0,16%


'RCSTA = $90   ' Enable serial port & continuous receive
'TXSTA = $24   ' Enable transmit, BRGH = 1
'SPBRG = 130   ' 9600 Baud @ 64MHz, -0,02%
'SPBRGH = 6
'BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
     pause 100
'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////  
    ANSELA            = %00000011
    ANSELB            = 0
    
    'AnselH.3           = 0
    
    TRISA            = %00000011
    TRISB            = %11110001  'B portu giriş yapıldı
    TRISC            = %10000000  'C portu 3 giriş/4'ü çıkış yapıldı
    'TRISD            = %00000000  'D portu çıkış yapıldı
    'TRISE            = %000
    
    Porta            = 0
    portb            = %11110001
    portc            = %11000000
    'portd            = 0
    'porte            = 0
'===============================================================================
'===============================================================================    
    SDA              VAR PORTC.0
    SCL              VAR PORTC.1
    DS1820           var PORTC.2 'okuma bacağı
    symbol Led       =   PORTC.3 'Led
    symbol Bzr       =   PORTA.6 'Buzzer
'===============================================================================
'===============================================================================
    Gelen1           var byte[80]     'Uarttan gelen verileri kaydetmek için
    Gelen2           var byte[80]     'Uarttan gelen verileri kaydetmek için
    'Gelen3           var byte[80]     'Uarttan gelen verileri kaydetmek için
    'Gelen4           var byte[80]     'Uarttan gelen verileri kaydetmek için
    'Gelen5           var byte[80]     'Uarttan gelen verileri kaydetmek için
    
    Giris            var byte          'Mcp giriş verisi
    Cikis            var byte          'Mcp Cıkış verisi
    KstUart          var bit           'Uart kesmesi
    KstGrs           var bit           'Portb.0 kesmesi
    FireBase         var byte          'Firebasden cıkış verisi.
    LoraGdn          var byte          'Lora Cıkış verisi.
    LoraGln          var byte          'Lora gelen verisi.
    Ang0             var word          'Analog0 kanalı değer.
    Ang1             var word          'Analog1 kanalı değer.
    Ang2             var word          'Analog2 kanalı değer.
    Ang3             var word          'Analog3 kanalı değer.
    Prg              var bit           'PLC durum versi. "1"= plc çalışıyor. "0" = Plc Hata verdi.Çalışmayı durdurur.
    Eproom           var byte          'Epprom cihazın adresi
    f                var byte
   
    SimKmt           var word
    Kln              var byte
    
    Eproom           = $A0    'Ae
    KstUart          = 0
    KstGrs           = 0
    
    SistemBkl        var word
'===============================================================================
'===============================================================================
    include          "Ds18B20.bas"
    include          "Ds3231.bas"
    'include          "Tm1638.bas"
    'include          "Mcp23017.bas"
    include          "Lora.bas"
    include          "PicPlc.bas"
    include          "Sim800.bas"
'===============================================================================
'=============================================================================== 
    ON INTERRUPT GOTO KESME 'komut satırını ekle programa (BASLA satırından bir evvele koyabilirsin)
'===============================================================================
'=============================================================================== 
    'Bekle            var word
    Dongu            var word
    Cycle            var byte
    KsmTemp          var byte
    BtnEski          var byte
    BtnSay           var word
    Mode             var bit                                                         
'===============================================================================
'===============================================================================
    pause 500
    f = 0
    SimKmt      = 1
    SimRdy      = 0
    Gosub            PlcReset
    low SimRst:pause 1500:high SimRst
    GsmBkl           = 3
    KstUart          = 0
    while GsmBkl     != 0 
    if KstUart = 1 then Gosub SimCoz:KstUart = 0
    wend
    'hserout ["AT+CPIN=3331",13]
    'GsmBkl = 2:KstUart = 0 :gosub UartBekle

    KstUart          = 0
    SistemBkl        = 0     
   
    AngSet           = 1000
    GrSet            = 30
    DsSet            = 2
'===============================================================================
'=============================================================================== 
    f = 0 
    'Serout2 Ds1820,84,["Test",13]
    isaret="+":derece=10:ondalik = 0
Basla:
    gosub ZAMAN_OKU
    'Gosub Ds18B20
    'Serout2 Ds1820,84,[dec Ang0,13 ]
    if SistemBkl <= 10 and SimKmt.0 = 0 then GsmBkl = 5:hserout ["AT+CCLK?"]:Gosub UartBekle1
    'if SistemBkl >= 10 and SimKmt.0 = 0 then SimKmt.0 = 1
    if SistemBkl >= 20 and SimKmt.1 = 0 and SimKmt.0 = 1 then GsmBkl = 5:hserout ["AT+CSQ"  ]:Gosub UartBekle1
    'if SistemBkl >= 15 and Prg = 0 and SimKmt.2 = 0 then Serout2 NextTx,84,["PicPlc Hata...",13]:gosub SmsGnd: SimKmt.2 = 1
    if SistemBkl >= 25 and SimKmt.15 = 0 and SimKmt.1 = 1 then GsmBkl = 5:hserout ["AT+CBC"  ]:Gosub UartBekle1:SimRdy = 1
    if SistemBkl >= 30 and SimKmt.1 = 0 then low SimRst:GsmBkl = 2:gosub UartBekle:high SimRst:SistemBkl = 301
    if SimKmt.8 = 0 and Dak != OncekiDk and SimKmt.15 = 1 and (Dak = 0 or Dak = 15 or Dak = 30 or Dak = 45) then OncekiDk = Dak: Gosub VeriGonder 
    if SistemBkl > 300 then SistemBkl = 0: SimKmt.1 = 0:SimKmt.15 = 0
    if SMS != 0 then 
        high Bzr:pause 70:Low Bzr:GsmBkl = 5:hserout ["AT+CMGR=",dec SMS]:Gosub UartBekle1
        if KstUart = 1 then Gosub SimCoz
        GsmBkl = 5:Hserout ["AT+CMGD=1,4"]:Gosub UartBekle1
        KstUart = 0
        SMS = 0
    endif
    
    
    if KstUart = 1 then Gosub SimCoz: KstUart = 0
    Dongu = 0
    while dongu < 2000
        Dongu = Dongu + 1
        if OERR = 1 then CREN = 0:CREN = 1
        if FERR = 1 then SPEN = 0:SPEN = 1
        if Prg = 1 then 
           gosub PicPlc
           if Tsn > 1 then low led
        Else
            if (PlcCycle & 15) > 1 then 
            high led
            else 
            low Led
            endif
            if PlcCycle > 500 then High Bzr:pause 30:low Bzr: PlcCycle = 0
        endif
        
        if SimSay = 0 and SimKmt.8 = 1 then SimKmt.8 = 0
        if KstUart = 1 then Gosub SimCoz: KstUart = 0 
        if SimRdy = 1 then Gosub SimBldr
        'if LrGndSay >= 10 then gosub LoraBlg:LrGndSay = 0
    wend
goto basla
'===============================================================================
'===============================================================================
UartBekle1:
hserout [13]
UartBekle:
    KstUart = 0
    dongu = 0
    while KstUart = 0 and GsmBkl != 0 and dongu < 25000
        if OERR = 1 then CREN = 0:CREN = 1
        if FERR = 1 then SPEN = 0:SPEN = 1
        if Prg = 1 then 
           gosub PicPlc
           if Tsn > 1 then low led
        Else
            if (PlcCycle & 15) > 1 then 
                high led
            else 
                low Led
            endif
            if PlcCycle > 500 then High Bzr:pause 30:low Bzr: PlcCycle = 0
        endif 
        if SimSay = 0 and SimKmt.8 = 1 then SimKmt.8 = 0
        Dongu = Dongu + 1
    wend
return
'===============================================================================
'===============================================================================
DISABLE
Kesme:
GIE = 0
'===============================================================================
'Uart kesmesi. Sim800 yada ESP8266 dan gelen veriler alınıyor.
'===============================================================================
if RCIF = 1  then
    hserin 10, Gecc,[str Gelen1\80,str Gelen2\80]
     
    'if SimKmt.3 = 0 then hserin       400, Gecc,[str Gelen\500]
    'if SimKmt.3 = 1 then hserin       400, Gecc,[wait ("Deneme"),str Gelen\500]
Gecc:
    RxTmp     = RCREG
    KstUart   = 1
    RxTmp     = 0
    RCIF      = 0
    'goto Atla1
endif
'===============================================================================
' Portb.4-7 kesmesi.
'===============================================================================
if IOCF = 1 then
'   if Aux = 0 and LoraDrm = 0 then
   
'   Serin2  LoraR,84,50,LoraAtla,[wait("aRci"),LoraGln]
'   pause 50
'   LoraKesti = 1 
   
'   low led
'   endif

   if IOCBF.0 and Aux = 0 and LoraDrm = 0 then 
   'high led
   Serin2  LoraR,84,10,LoraAtla,[wait("aRci"),LoraGln]
   'low led
   endif
LoraAtla:
   KsmTemp = portb
   IOCBF=0
   'INT0IF = 0
   IOCF = 0
endif
'===============================================================================
'Timer kesmesi. zaman sayaçları için
'===============================================================================
if TMR1F = 1 then 
    TMR1F = 0
    TMR1H=$63:TMR1L=$BE
    Tsn = Tsn + 1
     if Tsn >= 25 then 
        for TSn = 0 to 7 
            if z_izin[TSn] = 1 and z_say[TSn] <> 0 then 
            z_say[TSn] = z_say[TSn] -1
            if Z_Say[Tsn] = 0 then zy_rl = zy_rl | (DCD TSn)
            endif
        next TSn
        Tsn = 0
        SistemBkl = SistemBkl + 1
        LrGndSay = LrGndSay + 1
        if SimSay != 0 and SimKmt.8 = 1 then SimSay = SimSay - 1
        if GsmBkl != 0 then GsmBkl = GsmBkl - 1  ' and KstUart = 0
        Led = Prg
        'toggle Led
        'Serout2 Ds1820,84,[dec GsmBkl,13]
    endif
    PlcCycle = PlcCycle + 1
    
endif

Atla1:
'toggle Led
GIE = 1
Resume
enable

Serk@n

Sizin probleminiz farklı olabilir tabi ama başımdan geçen bir olay...

Pcbway'e bir kart siparişi vermiştim. Kristal bağlantısı ile MCU.nun bir çıkış pini kısa devre olmuş. Çizim yaparken yolu çok yakınından geçirmişim. Kristali lehimleyince aralarında irtibat oluşmuş. Oradaki mühendislerin de gözünden kaçmış demek ki. Hâlbuki genelde uyarıyorlardı. Çıkış pinini lojik 1 yapınca MCU programı duruyordu. Arızayı anlamak ve çözmek epeyce bir zamanımı almıştı.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

magic_gun

#2
stack taşması olabilirmi stack undeflow / owerflow sigorta setini on yapıp deneyebilirmisin ?
saygılarımla
m.gun

edit : bu işlemcide pll yi ne zaman on yaptı isem hep anlam veremdgigim sorunlar ile karsılastım , ama kesme kısmını saf asm yazdıgım zaman hiç bir sorunla karsılasmadım , buda beni derleyicilerin kesme rutini icinde stack tasmasını kontrol etmedigini hatırlattı ( C yada B degil genel )  bu yuzden işlemcinin komut cozme veya stack sorunu oldugunu dusunduruyor bunu microchipe  de yazdım
hayal etemeden basaramazsınız
u cnt achieve w/out dreamin

aRci

Merhaba; yanıtlar içi teşekküreler. programı paylaşmayınca çözümde bulmak bana kaldı.Yapmış olduğum değişikliklerden ötürü pic bir noktada kısır döngüye giriyor. bunun sonucunda döngüden çıkamadığından durduğunu tespid ettim. benim kafamı karıştıran şey kısır döngüde iken timer kesmesine hiç gitmiyor oluşu ve bu yüzden kısır döngü ihtimalini başta vermemem bir hataydı. 3-4 gün olayı çözemeyince programın eski yedeğine dönüş yaptım. daha sonra karışık olan kısımları biraz daha düzenleyerek gereksiz olan 1kb kod kısalttım. şimdi herşey yolunda ve tüm fonksiyonları devrede artık biraz mola verme zamanı :)

aRci

Merhaba;
kısa süre önce ds3231 okumasında problem yaşamaya başladım. Hata ise belli belirsiz zamanlarda ds3231 den okunan saat bilgisi 01:01 olarak alıyordum. bu bazen günde 1 kere bazen daha fazla oluyordu. daha önce bu problemle karşılaşmadım tecrübeniz varsa paylaşabilir misiniz.

ds3231 3.3v ile beslemenim pullup dirençleri 5v de bunun ile ilgili olduğunu düşündüm ve pullup ları 3.3v ye bağlayarak da denedim fakat gene aynı problemi yaşadım.

'///////////////////////////////////////////////////////////////////////////////  
'///////////////////////////////////////////////////////////////////////////////
    '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
    OncekiDk         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
    Rtci             var byte
    ZAMAN            var byte[7]
    KAYDIR           var byte
    UST_BIT          var byte
    ALT_BIT          var byte
    TempRegisterFRA  CON $12  'temperature fraction REGISTEr
    TempRegister     var byte    ' variable to hold DS3231 register address to read/write      
    'RtcDerece        var byte            ' Variable for temperature integer from register 11h
    'RtcOndalik       var byte          ' Variable for temperature fraction for register 12h
    'RtcIsaret        var BYTE            ' Variable to hold sign bit  
    Ds1              var byte

Goto Ds3231Gec

'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////
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, [RtcDerece, RtcOndalik]
    
    'RtcOndalik = (RtcOndalik >> 6)   ' Shift <b7:b6> to <b1:b0>
    'RtcOndalik = (RtcOndalik * 25)   ' Fractional portion is in .25 increments. Increment values are 0-3 (.00, .25, .50, .75)
    '
    'RtcIsaret = "-"
    'if Rtcderece.7 = 0 then  RtcIsaret = "+"   ' 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 Rtci=0 to 6
        ZAMAN[Rtci] = ((ZAMAN[Rtci] dig 1) << 4 ) + ZAMAN[Rtci] dig 0
    next Rtci

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

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

RETURN
'///////////////////////////////////////////////////////////////////////////////   
'///////////////////////////////////////////////////////////////////////////////

Ds3231Gec:



enes

Cok sık okuma yapmayla alakalı bı durum gıbı.her ıkı okuma arasına bıraz gecıkme ekleyıp oyle bı dene.

ete

I2C komutunu eksik yada yanlış kullanıyorsun gibi geliyor bana.
Komut formatı ;
I2CRead RTC_SDA,RTC_SCL,$D0,$00,[xxxx]
I2CWrite RTC_SDA,RTC_SCL,$D0,$00,[xxxx]
Senin kusurun okuma için ayrı device adres yazma için ayrı adres kullanmış olman üstelik bu adreslerde ters kullanmışsın.
DS3231 device adres=$D0 yada binary olarak %11010000 olup bu adres aslında yazma adresidir.
Okuma için ilk bit 1 yapılıyor ve okuma adresi $D1 oluyor. Ancak basic bunu otomatik yaptığı için sen okumada da $D0 ve yazmada da $D0 kullanman gerekir.

Okuma ve yazma adresi olarak yanlızca Yazma adresi kullan $D0 olarak. Sorun muhtemelen düzelecektir.

Ete

aRci

Merhaba;
Cevaplar teşekkürler. ete hocam sürekli aynı kodları kullanırım hiç değişiklik yapmadan tavsiyenizi uygulayarak sadece $d0 verisini device adres olarak gönderiyorum. fakat bu hataya ilk defa denk geldim saatin çalışmasında bir problem yok sistemin enerjisini kesip geri açtığımda saatten verileri alabiliyorum ve zaman doğru gösteriyor resetlenmemiş oluyordu. bende donanımsal bir hata yaptım diyerek arayışa girdim ve pullup dirençlerden 24c32 epromun beslemesini 3.3v ye bağladım ama gene aynı hatayı yaşamaktaydım.
enes dediğiniz gibi saat veri okuma sıklığı biraz kısa olmuş aslında sistem çalışması sırasında bir döngü ile zaman gecikmesi uyguluyordum ama bu zaman gecikmesi kodlar ın mikltarı değiştikce zaman gecikmeside değişiyormuş ben yeni farkettim ve gecikmeyi timer1 le yapmaya başladım şimdilik deneme ye başladım devreyi açık bırakacağım bakalım hata verecekmi.
Sonucunu buradan paylaşırım.

aRci

Merhaba;
3 günlük aralıksız çalışma sırasında saat okumada problem yaşamadım yardımlarınız için teşekkürler.

ete

Cihaz adresini ters vermeseydin hiç sorun olmayacak idi. Çünki yazmada bit-0=0 olmalı daima. Okumada ise "1" olmalı. Derleyici okuma yaparken bakıyor ilk bit sıfır ise onu 1 yapıp öyle okuma yapıyor. Yazmada ise tersini yapıyor. Önceden hata olmaması tesadüf olabilir yada hangi şartlar altında hata olmadığına bağlıdır. Doğrusu neyse onu yapmak lazım şu anda da onu yaptın sorun ortadan kalkmış oldu.

Ete

aRci

Merhaba;
İlk kez bu çalışma için kütüphane yapısında projelerimi kısımlara bölerek yapmak istedim.Kod uzadıkca yukarı aşşağı sürüklemek bazen can sıkıcı oluyor.

Fakat bu sefer bu yaptığım daha önce hiç karşılaşmadığım bir şeye sebep oldu. Altta paylaştığım kısımda kesme oluşunca gidilecek olan etiketi belirttiğim satır kütüphanelerin eklenmesinden sonraya yazılı. bu şekilde eğer kütüphanelerde ki işlemler sırasında kesmelerin gerçekleşmediğine tanık oldum. ne timer ne uart kesmesi. bunu ise uart kesmesinde ilk gelen verinin kaçırdığını görünce tespid ettim. haatta uzun süreli bir döngü yaparsanız bu sefer timer kesmesinin çalışmadığına tanıklık ediyoruz kine. buda benim bu konuyu açma sebebime sebep olan hata.

eğer alttaki satırı kütüphanelerin üstüne taşır ve derleme yaparsanız program boyutu büyüyor. hem de çok fazla. mesala şu hali ile derlettiğimde 15900byte olurken kütüphanelerden önceye taşır ve derletirsem 18354byte oluyor buda hayliyle program hafızasını taşırdığı için derlemeyi bitirmiyor.

tespidim den eminim ama size de danışmak isterim çıkarımım doğrumu.

'===============================================================================
'===============================================================================
    include          "Ds3231.bas"
    'include          "Tm1638.bas"
    'include          "Mcp23017.bas"
    include          "Lora.bas"
    include          "Ds18B20.bas"
    include          "Sim800.bas"
    include          "PicPlc.bas"
'===============================================================================
'=============================================================================== 
ON INTERRUPT GOTO KESME 'komut satırını ekle programa (BASLA satırından bir evvele koyabilirsin)
'===============================================================================
'=============================================================================== 

Powered by EzPortal