Picproje Elektronik Sitesi

DERLEYİCİLER => Proton+ => Konuyu başlatan: djmalan - 21 Eylül 2014, 11:56:04

Başlık: LCD ve Interrupt
Gönderen: djmalan - 21 Eylül 2014, 11:56:04
Proton da Karakter LCD ile çalışırken Lcd ye yazma sırasında interrupt olursa bazen ,hatalı karakterler oluşuyor.
LCD ye yazmadan önce GIE=0 yapmazsam sorun düzelmiyor.Bu konuda önerisi veya deneyimi  olan arkadaşlar lütfen paylaşsınlar.
Timer0 interrupt kullandım softwarepwm için 100-400hz arası 10ma led yaktım.Ama dutycycle 0 ikende yaptı,belliki çıkıştan kaynaklanmıyor.
Başka diller ile yazarkende oluyormu?
Saygılar...
Başlık: Ynt: LCD ve Interrupt
Gönderen: Maxim - 21 Eylül 2014, 12:25:07
sorunlu kodu proteus üzerinde görmek lazım
Başlık: Ynt: LCD ve Interrupt
Gönderen: Kabil ATICI - 21 Eylül 2014, 13:07:41
Kesme içinde yapılan işlem ile normal program akışında aynı değişkenler kullanılması durumunda bu tür hatalar olabilir.

Birçok program kesme geldiğinde başta WREG gibi registerlerin yedeğini alır ve kesme sonunda yerine koyar, eğer bu yapılmazsa, normal program akışında hatanın olması kaçılınmaz. Bazı dillerde bu işlemi kendiniz yapmanız gerekir, bazılarında programın kendisi otomatik yapar.
Aynı şekilde kullanılan değişkenler için de aynı durum geçerlidir.

Yoksa bildiğim kadar LCD zamanlamaları kritik değildir. Başlangıç kodlamaları hariç.
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 23 Eylül 2014, 07:48:16
Sayın maxim;Belli bir kod için özel olarak yapmıyor.Lcd ye yazıldığı sırada interrupt rutinine program giderse olan bir olay ,tabi herzaman karakterler bozulmuyor ama ,bazen alakasız karakterler görüntüye takılıyor.Lcd ye yazdırırken ,interrupt geçici olarak kapatılırsa sorun çözülüyor...Kodu ve proteus dosyasını nereye göndereyim?

Sayın anbar7;Context Save ve context Restore komutları ile Wreg ve diğer gerekli olan registerlerin yedeğinin alınıp sonra tekrardan yüklendiğini varsayıyorum,zaten üretilen asm dosyada da görülüyor.Dışarda değiştirdiği bir registeri ,interrupt içinde sadece okuyor fakat lcd işini dışarıda yapıyor.
Ayrıca dışarıda değeri değiştirilen ve interrupt içinde okunan 16 bitlik register lar içinde ,register içeriği değiştirilme sırasında interrupt ı geçici olarak durduruyorum.

Kafama takılan acaba derleyici hatası olabilirmi sorusu.Çünki benzer başka bir sorun bazen ;
Elektrik kesildiği sırada kendi kendine  yazma rutinine gidip bellekteki bilgilerden birini değiştirmesi(hep aynı hücre dğişiyor).Brown out reset enable yaptım +yazma rutini öncesi biraz gecikme ekledim falan düzeldi görünüyor ama ,yine güvenemiyorum.
Başlık: Ynt: LCD ve Interrupt
Gönderen: Maxim - 23 Eylül 2014, 08:55:20
internette bir yere yükleyin ve linki buraya koyunki isteyen herkes bakabilsin.
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 23 Eylül 2014, 12:54:28
Internet e yükleme işlerinden pek anlamıyorum,e-posta falan ile yollayım:).Siz yüklersiniz bu arada bende öğrenmiş olurum...
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 25 Eylül 2014, 14:51:15


Sayın Maxim, Dosyaları e-posta  adresinize yolladım...
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 25 Eylül 2014, 21:40:50
Device=18F252
Config_Start
    OSC = HSPLL        ' Oscillator Selection HS
    OSCS = Off          ' Osc. Switch Enable Disabled
    PWRT = On          ' Power-up Timer Enabled
    BOR = Off          ' Brown-out Reset Disabled
    BORV = 45          ' Brown-out Voltage 4.5V
    WDT = Off          ' Watchdog Timer Disabled
    WDTPS = 128        ' Watchdog Postscaler 1:128
    CCP2MUX = Off       ' CCP2 MUX Disable (RC1)
    STVR = Off          ' Stack Overflow Reset Disabled
    LVP = Off          ' Low Voltage ICSP Disabled
    Debug = Off        ' Background Debugger Enable Disabled
    CP0 = On          ' Code Protection Block 0 Enable
    CP1 = On          ' Code Protection Block 1 Enable
    CP2 = On          ' Code Protection Block 2 Enable
    CP3 = On          ' Code Protection Block 3 Enable
    CPB = On          ' Boot Block Code Protection Disabled
    CPD = Off          ' Data EEPROM Code Protection Disabled
    WRT0 = Off        ' Write Protection Block 0 Disabled
    WRT1 = Off          ' Write Protection Block 1Disabled
    WRT2 = Off          ' Write Protection Block 2 Disabled
    WRT3 = Off          ' Write Protection Block 3 Disabled
    WRTB = Off          ' Boot Block Write Protection Disabled
    WRTC = Off          ' Configuration Register Write Protection Disabled
    WRTD = Off          ' Data EEPROM Write Protection Disabled
    EBTR0 = Off        ' Table Read Protection Block 0 Disabled
    EBTR1 = Off        ' Table Read Protection Block 1 Disabled
    EBTR2 = Off        ' Table Read Protection Block 2 Disabled
    EBTR3 = Off        ' Table Read Protection Block 3 Disabled
    EBTRB = Off        ' Boot Block Table Read Protection Disabled
Config_End
'Declare PLL_Req = On
Xtal 40
All_Digital TRUE
Declare LCD_RSPin PORTC.5
Declare LCD_ENPin PORTC.4
Declare LCD_DTPin PORTC.0
Declare LCD_Interface 4
Declare LCD_Lines 2
Declare LCD_CommandUs 5000'65535
Declare LCD_DataUs 255
T0CON=%11001111 :T1CON=0:T2CON=0:T3CON=0 :WDTCON.2=1  :INTCON=0:INTCON2=0:INTCON3=0  :RCON.7=0
PIE2=0:PIE1=0:IPR1=0:SSPCON1=0:CCP1CON=0  :CCP2CON=0 
TRISA=%010000 :TRISB=%11110000 :TRISC=%10000000 :PORTA=%010000 :PORTB=$FF:PORTC=%10000000
Dim dmx_new [8] As Byte:Dim oto_new[8] As Byte:Dim lednew[4] As Byte:Dim ledval[4] As Byte
Dim rednew,greennew,bluenew,whitenew,redval,greenval,blueval,whiteval,rainbow As Byte
Dim renkler,renksay1,renksay,red,green,blue,master,masternew,loop,rainbowon,dmx_ch,a,look As Byte
Dim dmxadres As Word:Dim dmx_cnt As Word:Dim degerler As Word :Dim renk As Word
Dim intcount,frameOK,stuation,oldstuation,BtnVar,strobenew,strobeval,strobeacik,values As Byte
Dim BOS As Byte:Dim dmxvar As Byte:Dim dmxgo As Byte:Dim dmxcnt As Word:Dim aa As Word
Symbol GIE=INTCON.7 :Symbol TMR0IE=INTCON.5   :Symbol TMR0IF=INTCON.2
Symbol FERR=RCSTA.2 :Symbol OERR=RCSTA.1 :Symbol CREN=RCSTA.4 :Symbol RCIF=PIR1.5
Symbol TUSMenu=PORTB.7 :Symbol TUSSec=PORTB.5 :Symbol TUSileri=PORTB.6 :Symbol TUSgeri=PORTB.4
Symbol R=PORTA.0    :Symbol G=PORTA.1    :Symbol B=PORTA.2  :Symbol W=PORTA.3 :Symbol L=PORTB.3
:R=1 :G=1 :B=1   :W=1     :L=0
Cls:DelayMS 500
degerler=0:BtnVar=0 :renk=0
For loop=0 To 7
    dmx_new[loop]=0 :oto_new[loop]=0
Next
dmx_cnt=0:frameOK=0

TMR0IF=0  :TMR0IE=1     :renkler=0 :GIE=1 
On_Hardware_Interrupt GoTo KESME
   
GoTo BASLA

KESME:
Context Save   
    TMR0IF=0         :TMR0L=180
    If intcount=0 Then
    R=1 :G=1 :B=1   :W=1   
       ledval[0]=lednew[0]:ledval[1]=lednew[1]:ledval[2]=lednew[2]
      GoSub LOAD :GoSub RENGARENK    :GoSub CAKAR   
      GoSub MASTERP 
    Else 
    If ledval[0]=intcount Then R=0
    If ledval[1]=intcount Then G=0
    If ledval[2]=intcount Then B=0
    If ledval[3]=intcount Then W=0
    EndIf
    GoSub DMXRECEIVE   
dmxrout:     
    Dec intcount           
    Context Restore
    Resume
'111111111111111111111111111111111111111111111111111111111111111111111111111111

'BURASI CALISTIRILINCA SORUN COZULUYOR
DURDUR:
    'GIE=0:R=1:G=1:B=1:W=1
Return       
'22222222222222222222222222222222222222222222222222222222222222222222222222222222222






DMXRECEIVE:
'BURASI HENÜZ YAPILMADI DÝKKATE ALINMASIN ,Sadece Deneme amaçlý     
     If RCIF=1 Then
        If dmx_ch>7 Then dmx_ch=0
        dmx_ch=dmx_ch+1
        dmx_new [dmx_ch]=RCREG
     EndIf
'BURASI HENÜZ YAPILMADI DÝKKATE ALINMASIN ,Sadece Deneme amaçlý


Return       
'33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
EKRAN:           
Select stuation
Case 0 
    Print At 1,1,"MASTER  "   :GoSub delay1:Print At 2,1,"ch1: ",Dec3 oto_new[0]:Return
Case 1 
    Print At 1,1,"STROBE  "   :GoSub delay1:Print At 2,1,"ch2: ",Dec3 oto_new[1]:Return
Case 2 
    Print At 1,1,"RED     "   :GoSub delay1:Print At 2,1,"ch3: ",Dec3 oto_new[2]:Return
Case 3 
    Print At 1,1,"GREEN   "   :GoSub delay1:Print At 2,1,"ch4: ",Dec3 oto_new[3]:Return
Case 4 
    Print At 1,1,"BLUE    "   :GoSub delay1:Print At 2,1,"ch5: ",Dec3 oto_new[4]:Return
Case 5               
    Print At 1,1,"WHITE   "   :GoSub delay1:Print At 2,1,"ch6: ",Dec3 oto_new[5]:Return
Case 6 
    Print At 1,1,"RAINBOW "   :GoSub delay1:Print At 2,1,"ch7: ",Dec3 oto_new[6]:Return
Case 7 
    Print At 1,1,"RB.SPEED "  :GoSub delay1:Print At 2,1,"ch8: ",Dec3 oto_new[7]:Return
Case 8
    Print At 1,1,"ADRESS  "   :GoSub delay1:Print At 2,1,Dec3 dmxadres,"->",Dec3 dmxadres+8:Return
Case 9
    Print At 2,1,"adr: ",Dec3 dmxadres  :GoSub delay1:Print At 1,1,"DMX  LED" :Return
Case 10 
    Print At 2,1,"adr: ",Dec3 dmxadres   :GoSub delay1:Print At 1,1,"OTOMATiK" :Return   
End Select
EKRAN1:           
Select stuation
Case 0 
    Print At 2,6,Dec3 oto_new[0]:Return
Case 1 
    Print At 2,6,Dec3 oto_new[1]:Return
Case 2
    Print At 2,6,Dec3 oto_new[2]:Return
Case 3 
    Print At 2,6,Dec3 oto_new[3]:Return
Case 4 
    Print At 2,6,Dec3 oto_new[4]:Return
Case 5               
    Print At 2,6,Dec3 oto_new[5]:Return
Case 6 
    Print At 2,6,Dec3 oto_new[6]:Return
Case 7 
    Print At 2,6,Dec3 oto_new[7]:Return
Case 8
    Print At 2,1,Dec3 dmxadres:Print At 2,6,Dec3 dmxadres+8:Return   
End Select
'444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
DEGERYUKLE:
     If stuation<8 Then
        degerler=oto_new[stuation]
     Else If stuation==8 Then
        GIE=0:degerler=dmxadres :GIE=1'önlem alýndý
     EndIf
     Return
'555555555555555555555555555555555555555555555555555555555555555555555555555555555555555       
DEGERYENILE:
     If stuation=1 Then
        If degerler=1 Then degerler=8
        If degerler<8 Then degerler=0
        If degerler>256 Then degerler=0
        If degerler>255 Then degerler=255
        oto_new[stuation]=degerler
     Else If stuation=6 Then
        GoSub rainbowyenile       
     Else If stuation=8 Then
        If degerler>504 Then degerler=1
        If degerler<1 Then degerler=504
        GIE=0:dmxadres=degerler:GIE=1'önlem alýndý
     Else   
        If degerler>256 Then degerler=0
        If degerler>255 Then degerler=255
        oto_new[stuation]=degerler   
     EndIf
     Return
rainbowyenile:     
        If degerler>5 Then degerler=0
        If degerler>4 Then degerler=4
        Select degerler
        Case 0
            values=0
        Case 1
            values=8
        Case 2
            values=104
        Case 3
            values=184
        Case 4
            values=248   
        EndSelect       
        oto_new[stuation]=degerler
Return             
'6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666   
delay1:
    DelayMS 10:Return
'7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
RENGARENK:     
    If  rainbowon<8 Then
            rainbow=0 :renk=0   :renkler=0
'BURASI HENÜZ YAPILMADI DÝKKATE ALINMASIN ,Sadece Deneme amaçlý
    EndIf
Return
'8888888888888888888888888888888888888888888888888888888888888888888888888888888888888
CAKAR:
    If strobenew<8 Then
        strobenew=0 :strobeacik=0 
'BURASI HENÜZ YAPILMADI DÝKKATE ALINMASIN ,Sadece Deneme amaçlý
    EndIf     
Return
'999999999999999999999999999999999999999999999999999999999999999999999999999999999   
OKU:
     
    For loop = 0 To 7
    oto_new[loop] = ERead loop+30
    Next
    stuation = ERead 38 :dmxadres.LowByte = ERead 39  :dmxadres.HighByte = ERead 40   

Return
'100000000000000000000000000000000000000000000000000000000000000000000000000000000
YAZ:
    L=1
    DelayMS 100
    R=1:G=1:B=1:W=1:GIE=0 
    For loop = 0 To 7
    EWrite loop+30, [oto_new[loop]]
    Next
    EWrite 38, [stuation,dmxadres]
    L=0:GIE=1
Return
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
LOAD:
If stuation=9 Or stuation=8 Then
      master=dmx_new[0]:strobenew=dmx_new[1]:lednew[0]=dmx_new[2]:lednew[1]=dmx_new[3]
      lednew[2]=dmx_new[4]:lednew[3]=dmx_new[5]:rainbowon=dmx_new[6]:renksay=dmx_new[7]
    Else
      master=oto_new[0]:strobenew=oto_new[1]:lednew[0]=oto_new[2]:lednew[1]=oto_new[3]
      lednew[2]=oto_new[4]:lednew[3]=oto_new[5]:rainbowon=values:renksay=oto_new[7]
    EndIf
Return   
'LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
   
BASLA:
     GoSub OKU
     If    stuation>10 Then stuation=10
     GoSub DEGERYUKLE :GoSub rainbowyenile   :GoSub EKRAN :PORTA.5=0 :L=1:DelayMS 1000
While 1=1
KEYmenu:
    If TUSMenu==0 Then
        GoSub delay1   
      If TUSMenu==0 Then
            If stuation<9 Then
              stuation=oldstuation  :GoSub DURDUR:GoSub EKRAN :GoSub YAZ
            Else
              oldstuation=stuation  :stuation=8 :L=1:GoSub DEGERYUKLE
              GoSub DURDUR:GoSub EKRAN:GIE=1   
            EndIf
          GoSub delay1   
        While TUSMenu==0 
        Wend
        GoSub delay1
      EndIf   
    EndIf
KEYsec:
    If TUSsec==0 Then
        GoSub delay1
      If TUSsec==0 Then
        If stuation<9 Then
          Inc stuation   
          If stuation>8 Then stuation=0   
          GoSub DEGERYUKLE 
        Else If stuation<>10 Then
          stuation=10 :GoSub YAZ
        Else If stuation<>9 Then
          stuation=9 :GoSub YAZ
        EndIf       
        GoSub DURDUR:GoSub EKRAN    :GIE=1
        While TUSsec==0
        Wend
        GoSub delay1
      EndIf
    EndIf
If stuation<9 Then     
KEYileri:   
    If TUSileri==0 Then
        GoSub delay1
      If TUSileri==0 Then
        degerler=degerler+1    :GoSub DEGERYENILE
        GoSub DURDUR :GoSub EKRAN1    :GIE=1 :GoSub delay1
        While TUSileri==0
        Inc BtnVar
        If BtnVar>10 Then
        Dec BtnVar  :degerler=degerler+1  :GoSub DEGERYENILE
        GoSub DURDUR :GoSub EKRAN1:GIE=1  :GoSub delay1
        EndIf
        GoSub delay1
        Wend       
      EndIf
    EndIf
    BtnVar=0
KEYgeri:   
    If TUSgeri==0 Then
        GoSub delay1
      If TUSgeri==0 Then
        degerler=degerler-1    :GoSub DEGERYENILE   
        GoSub DURDUR:GoSub EKRAN1  :GIE=1 :GoSub delay1
        While TUSgeri==0
        Inc BtnVar
        If BtnVar>10 Then
        Dec BtnVar  :degerler=degerler-1   :GoSub DEGERYENILE
        GoSub DURDUR  :GoSub EKRAN1 :GIE=1 :GoSub delay1
        EndIf
        GoSub delay1
        Wend       
      EndIf
    EndIf   
    BtnVar=0
Else
        If TUSileri=1 Then
        L=0
        Else
        L=1
        EndIf
EndIf       
Wend
MASTERP:
'SONRA YAPILACAK ,REZERVE BOLGE  TABLO KULLANIMA ACILINCA IYICE SAPITIYOR
ledval[0]=lednew[0]:ledval[1]=lednew[1]:ledval[2]=lednew[2]:ledval[3]=lednew[3]

aa=master*lednew[0]:aa=master*lednew[0]:aa=master*lednew[0]:aa=master*lednew[0]

'a=LookUp look,[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,_
'27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,_
'59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,_
'89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,_
'113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,_
'137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,_
'161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,_
'185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,_
'209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,_
'232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254]
'If look=255 Then a=255

'SONRA YAPILACAK ,REZERVE BOLGE
Return
'MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM           
        End

en sonunda bunu eklemeyi becerebildim.:)
Başlık: Ynt: LCD ve Interrupt
Gönderen: Maxim - 26 Eylül 2014, 07:42:58
proton programlıyor ama 8 tane hata veriyor

ilk defa böyle bir tanımlama gördüm
Dim renkler,renksay1,renksay,red,green,blue,master,masternew,loop,rainbowon,dmx_ch,a,look As Byte

böyle olması gerekmezmi?

Dim renkler As Byte
Dim renksay1 As Byte
Dim renksay As Byte
Dim red As Byte
Dim green As Byte
Dim blue As Byte
Dim master As Byte
Dim masternew As Byte
Dim loop As Byte
Dim rainbowon As Byte
Dim dmx_ch As Byte
Dim a As Byte
Dim look As Byte


biraz baktım, çok zamanım yok
ama dediğim gibi dolu yazılım hatası var
interrupt hatalı, hardware int yapılmış ama tasarımı software interrupt gibi
ayrıca, int içerisinden 5-6 yere dallanma yapılmış zaten hat orada kopuyor sanırım.

birde lcd ekran karışması proteusta da meydana geliyormu ?
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 26 Eylül 2014, 14:39:41
Değişkenleri o şekilde tanımlamamın nedeni sayfayı kolay takip edebilmek yani yazımı az yer tutuyor,otomatik olarak byte olarak tanınıyor Proton sadece uyarı veriyor.
Alıntı YapWARNING[LINE47]:Missing AS type_Keyword.Defaulting to an unsigned Byte variable!
WARNING[LINE48]:Missing AS type_Keyword.Defaulting to an unsigned Byte variable!
WARNING[LINE48]:Missing AS type_Keyword.Defaulting to an unsigned Byte variable!
Başkada bir hata mesajı yok benimkinde.3374 program byte ve 84 variable byte uzunluğunda gözüküyor.
Proteustada hata veriyor.DURDUR etiketindekiler çalıştırılınca hata vermiyor.Tabloyu kullanırsam açılıştada eksik yazılar çıkıyor.
Goto kullanma alışkanlığımdan kurtulmak için interrupt içindede gosub kullandım.16 serisi kullanırken gosub kullanmam,18 serisi nasıl olsa31 katman diye rahatça
gosub kullanıyorum.Sanki interrupt dan sonra yanlış yerlere gidiyor,bank değiştirme ,PCL,FSR falan sanki yanılıyor gibi bir his var içimde.Üst seviye dil kullanmamdaki amaç
bunlarla uğraşmamak aslında ,yoksa LCD için bir defa kütüphane oluşturulur herzaman kullanır.

Alıntı Yapinterrupt hatalı, hardware int yapılmış ama tasarımı software interrupt gibi
Doğru şekli nasıldır hocam.
Başlık: Ynt: LCD ve Interrupt
Gönderen: ferit06 - 26 Eylül 2014, 15:36:49
kesmeye gittiğinizde kesme içerisinde yeni gelecek kesmeleri durdurmanız gerekir.
hardware interruptlarda iki yöntem var;

yeni işlemcilerde otomatik context save olayı var

kesme:
INTCON.7=0                   ' Global interrupt disable
....
....
retfie


şeklinde,
otomatik context save yapamayan işlemciler için

kesme:
Context Save

INTCON.7=0                   ' Global interrupt disable
.....   
               
Context Restore 
   

şeklinde olmalıdır.
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 26 Eylül 2014, 17:13:21
Alıntı Yapkesmeye gittiğinizde kesme içerisinde yeni gelecek kesmeleri durdurmanız gerekir.
TMRL0 yeniden yüklendiği için ,başkada bir kesme kaynağı aktif olmadığı için INTCON.7=0  yapma gereği duymadım,zaten kesmeden çıkmadan tekrar kesme gelirse bir anlamı kalmaz pwm frekansı bozulurr.O yüzden nasıl olsa zaman dolmadan çıkıyorum diye boşu boşuna INTCON.diye7=0 zaman harcamak istemedim.
Contex save ve restore zaten yaptım.
Onun dışında
KESME:
    Context Save   
    TMR0IF=0         :TMR0L=180
    If intcount=0 Then
    R=1 :G=1 :B=1   :W=1   
       ledval[0]=lednew[0]:ledval[1]=lednew[1]:ledval[2]=lednew[2]
      GoSub LOAD :GoSub RENGARENK    :GoSub CAKAR   
      GoSub MASTERP 
    Else 
    If ledval[0]=intcount Then R=0
    If ledval[1]=intcount Then G=0
    If ledval[2]=intcount Then B=0
    If ledval[3]=intcount Then W=0
    EndIf
    GoSub DMXRECEIVE   
dmxrout:     
    Dec intcount           
    Context Restore
    Resume


Interrupt içinde çok fazla iş yapmak hatamıdır?
Hata ise bunun ölçüsü nedir?
Program boyutu çoğaldığı zaman proton ile hep sorun yaşadım (genel anlamda).
Kesmeden sonra genelde bişeyler oluyor,Program counter yanlış adrese gidiyo sanki ,ama nedenini bulamıyorum!
Başlık: Ynt: LCD ve Interrupt
Gönderen: Maxim - 26 Eylül 2014, 18:59:49
bu kodu denermisin?
bende proteusta karışma zaten olmuyordu

osc frekansını 10mhz yaptım, dolayıs ile proteustaki işlemcide 10mhz olacak


Device=18F252
Declare Xtal=10
'Declare PLL_Req = On

Config_Start
    OSC = HS
    OSCS = Off          ' Osc. Switch Enable Disabled
    PWRT = On          ' Power-up Timer Enabled
    BOR = Off          ' Brown-out Reset Disabled
    BORV = 45          ' Brown-out Voltage 4.5V
    WDT = Off          ' Watchdog Timer Disabled
    WDTPS = 128        ' Watchdog Postscaler 1:128
    CCP2MUX = Off       ' CCP2 MUX Disable (RC1)
    STVR = Off          ' Stack Overflow Reset Disabled
    LVP = Off          ' Low Voltage ICSP Disabled
    Debug = Off        ' Background Debugger Enable Disabled
    Cp0 = On          ' Code Protection Block 0 Enable
    CP1 = On          ' Code Protection Block 1 Enable
    CP2 = On          ' Code Protection Block 2 Enable
    CP3 = On          ' Code Protection Block 3 Enable
    CPB = On          ' Boot Block Code Protection Disabled
    CPD = Off          ' Data EEPROM Code Protection Disabled
    WRT0 = Off        ' Write Protection Block 0 Disabled
    WRT1 = Off          ' Write Protection Block 1Disabled
    WRT2 = Off          ' Write Protection Block 2 Disabled
    WRT3 = Off          ' Write Protection Block 3 Disabled
    WRTB = Off          ' Boot Block Write Protection Disabled
    WRTC = Off          ' Configuration Register Write Protection Disabled
    WRTD = Off          ' Data EEPROM Write Protection Disabled
    EBTR0 = Off        ' Table Read Protection Block 0 Disabled
    EBTR1 = Off        ' Table Read Protection Block 1 Disabled
    EBTR2 = Off        ' Table Read Protection Block 2 Disabled
    EBTR3 = Off        ' Table Read Protection Block 3 Disabled
    EBTRB = Off        ' Boot Block Table Read Protection Disabled
Config_End


All_Digital TRUE

Declare LCD_RSPin PORTC.5
Declare LCD_ENPin PORTC.4
Declare LCD_DTPin PORTC.0
Declare LCD_Interface 4
Declare LCD_Lines 2


T0CON=%11001111 :T1CON=0:T2CON=0:T3CON=0 :WDTCON.2=1  :INTCON=0:INTCON2=0:INTCON3=0  :RCON.7=0
PIE2=0:PIE1=0:IPR1=0:SSPCON1=0:CCP1CON=0  :CCP2CON=0 
TRISA=%010000 :TRISB=%11110000 :TRISC=%10000000 :PORTA=%010000 :PORTB=$FF:PORTC=%10000000

Dim dmx_new [8] As Byte
Dim oto_new[8] As Byte
Dim lednew[4] As Byte
Dim ledval[4] As Byte

Dim rednew As Byte
Dim greennew As Byte
Dim bluenew As Byte
Dim whitenew As Byte
Dim redval As Byte
Dim greenval As Byte
Dim blueval As Byte
Dim whiteval As Byte
Dim rainbow As Byte


Dim renkler As Byte
Dim renksay1 As Byte
Dim renksay As Byte
Dim red As Byte
Dim green As Byte
Dim blue As Byte
Dim master As Byte
Dim masternew As Byte
Dim loop As Byte
Dim rainbowon As Byte
Dim dmx_ch As Byte
Dim a As Byte
Dim look As Byte


Dim dmxadres As Word
Dim dmx_cnt As Word
Dim degerler As Word
Dim renk As Word

Dim intcount As Byte
Dim frameOK As Byte
Dim stuation As Byte
Dim oldstuation As Byte
Dim BtnVar As Byte
Dim strobenew As Byte
Dim strobeval As Byte
Dim strobeacik As Byte
Dim values As Byte

Dim BOS As Byte
Dim dmxvar As Byte
Dim dmxgo As Byte
Dim dmxcnt As Word
Dim aa As Word

Symbol GIE=INTCON.7
Symbol TMR0IE=INTCON.5
Symbol TMR0IF=INTCON.2

Symbol FERR=RCSTA.2
Symbol OERR=RCSTA.1
Symbol CREN=RCSTA.4
Symbol RCIF=PIR1.5
Symbol TUSMenu=PORTB.7
Symbol TUSSec=PORTB.5
Symbol TUSileri=PORTB.6
Symbol TUSgeri=PORTB.4
Symbol R=PORTA.0
Symbol G=PORTA.1
Symbol B=PORTA.2
Symbol W=PORTA.3
Symbol L=PORTB.3

R=1
G=1
B=1
W=1
L=0


Cls
DelayMS 500

degerler=0:BtnVar=0 :renk=0

For loop=0 To 7
dmx_new[loop]=0 :oto_new[loop]=0
Next
dmx_cnt=0:frameOK=0

TMR0IF=0  :TMR0IE=1     :renkler=0 ':GIE=1
While GIE=1 : GIE=0 : Wend 
On_Hardware_Interrupt GoTo KESME
TMR0IE=1
GIE=1
   
GoTo BASLA

KESME:
Context Save   
    TMR0IF=0         :TMR0L=180
    If intcount=0 Then
    R=1 :G=1 :B=1   :W=1   
     ledval[0]=lednew[0]:ledval[1]=lednew[1]:ledval[2]=lednew[2]
     
     'gosub LOAD
    If stuation=9 Or stuation=8 Then
      master=dmx_new[0]
      strobenew=dmx_new[1]
      lednew[0]=dmx_new[2]
      lednew[1]=dmx_new[3]
      lednew[2]=dmx_new[4]
      lednew[3]=dmx_new[5]
      rainbowon=dmx_new[6]
      renksay=dmx_new[7]
    Else
      master=oto_new[0]
      strobenew=oto_new[1]
      lednew[0]=oto_new[2]
      lednew[1]=oto_new[3]
      lednew[2]=oto_new[4]
      lednew[3]=oto_new[5]
      rainbowon=values
      renksay=oto_new[7]
    EndIf
     
     'goSub RENGARENK
     If  rainbowon<8 Then
     rainbow=0 :renk=0   :renkler=0
     'BURASI HENÜZ YAPILMADI DİKKATE ALINMASIN ,Sadece Deneme amaçlı
    EndIf
     
     
     'GoSub CAKAR   
     If strobenew<8 Then
     strobenew=0 :strobeacik=0 
    'BURASI HENÜZ YAPILMADI DİKKATE ALINMASIN ,Sadece Deneme amaçlı
     EndIf 
     
     
     'GoSub MASTERP
     'SONRA YAPILACAK ,REZERVE BOLGE  TABLO KULLANIMA ACILINCA IYICE SAPITIYOR
ledval[0]=lednew[0]:ledval[1]=lednew[1]:ledval[2]=lednew[2]:ledval[3]=lednew[3]

aa=master*lednew[0]:aa=master*lednew[0]:aa=master*lednew[0]:aa=master*lednew[0]

'a=LookUp look,[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,_
'27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,_
'59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,_
'89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,_
'113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,_
'137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,_
'161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,_
'185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,_
'209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,_
'232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254]
'If look=255 Then a=255

'SONRA YAPILACAK ,REZERVE BOLGE
     
    Else 
    If ledval[0]=intcount Then R=0
    If ledval[1]=intcount Then G=0
    If ledval[2]=intcount Then B=0
    If ledval[3]=intcount Then W=0
    EndIf
   
   
    'GoSub DMXRECEIVE   
     'BURASI HENÜZ YAPILMADI DİKKATE ALINMASIN ,Sadece Deneme amaçlı     
     If RCIF=1 Then
        If dmx_ch>7 Then dmx_ch=0
        dmx_ch=dmx_ch+1
        dmx_new [dmx_ch]=RCREG
     EndIf
    'BURASI HENÜZ YAPILMADI DİKKATE ALINMASIN ,Sadece Deneme amaçlı


dmxrout:     
    Dec intcount           
    Context Restore

'111111111111111111111111111111111111111111111111111111111111111111111111111111

'BURASI CALISTIRILINCA SORUN COZULUYOR
DURDUR:
    'GIE=0:R=1:G=1:B=1:W=1
Return       



EKRAN:           
Select stuation
Case 0 
    Print At 1,1,"MASTER  "   :GoSub delay1:Print At 2,1,"ch1: ",Dec3 oto_new[0]:Return
Case 1 
    Print At 1,1,"STROBE  "   :GoSub delay1:Print At 2,1,"ch2: ",Dec3 oto_new[1]:Return
Case 2 
    Print At 1,1,"RED     "   :GoSub delay1:Print At 2,1,"ch3: ",Dec3 oto_new[2]:Return
Case 3 
    Print At 1,1,"GREEN   "   :GoSub delay1:Print At 2,1,"ch4: ",Dec3 oto_new[3]:Return
Case 4 
    Print At 1,1,"BLUE    "   :GoSub delay1:Print At 2,1,"ch5: ",Dec3 oto_new[4]:Return
Case 5               
    Print At 1,1,"WHITE   "   :GoSub delay1:Print At 2,1,"ch6: ",Dec3 oto_new[5]:Return
Case 6 
    Print At 1,1,"RAINBOW "   :GoSub delay1:Print At 2,1,"ch7: ",Dec3 oto_new[6]:Return
Case 7 
    Print At 1,1,"RB.SPEED "  :GoSub delay1:Print At 2,1,"ch8: ",Dec3 oto_new[7]:Return
Case 8
    Print At 1,1,"ADRESS  "   :GoSub delay1:Print At 2,1,Dec3 dmxadres,"->",Dec3 dmxadres+8:Return
Case 9
    Print At 2,1,"adr: ",Dec3 dmxadres  :GoSub delay1:Print At 1,1,"DMX  LED" :Return
Case 10 
    Print At 2,1,"adr: ",Dec3 dmxadres   :GoSub delay1:Print At 1,1,"OTOMATiK" :Return   
End Select

EKRAN1:           
Select stuation
Case 0 
    Print At 2,6,Dec3 oto_new[0]:Return
Case 1 
    Print At 2,6,Dec3 oto_new[1]:Return
Case 2
    Print At 2,6,Dec3 oto_new[2]:Return
Case 3 
    Print At 2,6,Dec3 oto_new[3]:Return
Case 4 
    Print At 2,6,Dec3 oto_new[4]:Return
Case 5               
    Print At 2,6,Dec3 oto_new[5]:Return
Case 6 
    Print At 2,6,Dec3 oto_new[6]:Return
Case 7 
    Print At 2,6,Dec3 oto_new[7]:Return
Case 8
    Print At 2,1,Dec3 dmxadres:Print At 2,6,Dec3 dmxadres+8:Return   
End Select
'444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
DEGERYUKLE:
     If stuation<8 Then
        degerler=oto_new[stuation]
     Else If stuation==8 Then
        GIE=0:degerler=dmxadres :GIE=1'önlem alındı
     EndIf
     Return
'555555555555555555555555555555555555555555555555555555555555555555555555555555555555555       
DEGERYENILE:
     If stuation=1 Then
        If degerler=1 Then degerler=8
        If degerler<8 Then degerler=0
        If degerler>256 Then degerler=0
        If degerler>255 Then degerler=255
        oto_new[stuation]=degerler
     Else If stuation=6 Then
        GoSub rainbowyenile       
     Else If stuation=8 Then
        If degerler>504 Then degerler=1
        If degerler<1 Then degerler=504
        GIE=0:dmxadres=degerler:GIE=1'önlem alındı
     Else   
        If degerler>256 Then degerler=0
        If degerler>255 Then degerler=255
        oto_new[stuation]=degerler   
     EndIf
     Return

rainbowyenile:     
        If degerler>5 Then degerler=0
        If degerler>4 Then degerler=4
        Select degerler
        Case 0
            values=0
        Case 1
            values=8
        Case 2
            values=104
        Case 3
            values=184
        Case 4
            values=248   
        EndSelect       
        oto_new[stuation]=degerler
Return             
'6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666   

delay1:
    DelayMS 10:Return
'7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777



'999999999999999999999999999999999999999999999999999999999999999999999999999999999   
OKU:
     
    For loop = 0 To 7
    oto_new[loop] = ERead loop+30
    Next
    stuation = ERead 38 :dmxadres.LowByte = ERead 39  :dmxadres.HighByte = ERead 40   

Return
'100000000000000000000000000000000000000000000000000000000000000000000000000000000
YAZ:
    L=1
    DelayMS 100
    R=1:G=1:B=1:W=1:GIE=0 
    For loop = 0 To 7
    EWrite loop+30, [oto_new[loop]]
    Next
    EWrite 38, [stuation,dmxadres]
    L=0:GIE=1
Return


   
BASLA:
     GoSub OKU
     If    stuation>10 Then stuation=10
     GoSub DEGERYUKLE :GoSub rainbowyenile   :GoSub EKRAN :PORTA.5=0 :L=1:DelayMS 1000

While 1=1
KEYmenu:
    If TUSMenu==0 Then
        GoSub delay1   
      If TUSMenu==0 Then
            If stuation<9 Then
              stuation=oldstuation  :GoSub DURDUR:GoSub EKRAN :GoSub YAZ
            Else
              oldstuation=stuation  :stuation=8 :L=1:GoSub DEGERYUKLE
              GoSub DURDUR:GoSub EKRAN:GIE=1   
            EndIf
          GoSub delay1   
        While TUSMenu==0 
        Wend
        GoSub delay1
      EndIf   
    EndIf
KEYsec:
    If TUSSec==0 Then
        GoSub delay1
      If TUSSec==0 Then
        If stuation<9 Then
          Inc stuation   
          If stuation>8 Then stuation=0   
          GoSub DEGERYUKLE 
        Else If stuation<>10 Then
          stuation=10 :GoSub YAZ
        Else If stuation<>9 Then
          stuation=9 :GoSub YAZ
        EndIf       
        GoSub DURDUR:GoSub EKRAN    :GIE=1
        While TUSSec==0
        Wend
        GoSub delay1
      EndIf
    EndIf
If stuation<9 Then     
KEYileri:   
    If TUSileri==0 Then
        GoSub delay1
      If TUSileri==0 Then
        degerler=degerler+1    :GoSub DEGERYENILE
        GoSub DURDUR :GoSub EKRAN1    :GIE=1 :GoSub delay1
        While TUSileri==0
        Inc BtnVar
        If BtnVar>10 Then
        Dec BtnVar  :degerler=degerler+1  :GoSub DEGERYENILE
        GoSub DURDUR :GoSub EKRAN1:GIE=1  :GoSub delay1
        EndIf
        GoSub delay1
        Wend       
      EndIf
    EndIf
    BtnVar=0
KEYgeri:   
    If TUSgeri==0 Then
        GoSub delay1
      If TUSgeri==0 Then
        degerler=degerler-1    :GoSub DEGERYENILE   
        GoSub DURDUR:GoSub EKRAN1  :GIE=1 :GoSub delay1
        While TUSgeri==0
        Inc BtnVar
        If BtnVar>10 Then
        Dec BtnVar  :degerler=degerler-1   :GoSub DEGERYENILE
        GoSub DURDUR  :GoSub EKRAN1 :GIE=1 :GoSub delay1
        EndIf
        GoSub delay1
        Wend       
      EndIf
    EndIf   
    BtnVar=0
Else
        If TUSileri=1 Then
        L=0
        Else
        L=1
        EndIf
EndIf       
Wend

GoTo BASLA
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 26 Eylül 2014, 19:04:30
1 soru daha;Interrupt içinde proton Bank değişimi ve Program counter üzerinde tam hakimiyet kurabiliyormu?
Bu soruyu neden sorduğumuda hemen söyleyim;biraz önce interrupt'ın içindeki gosub ile erişilen bölümleri sayfada daha yukarı taşıdım ve proteus ta henüz hata vermedi.
Device=18F252
Config_Start
    OSC = HSPLL        ' Oscillator Selection HS
    OSCS = Off          ' Osc. Switch Enable Disabled
    PWRT = On          ' Power-up Timer Enabled
    BOR = Off          ' Brown-out Reset Disabled
    BORV = 45          ' Brown-out Voltage 4.5V
    WDT = Off          ' Watchdog Timer Disabled
    WDTPS = 128        ' Watchdog Postscaler 1:128
    CCP2MUX = Off       ' CCP2 MUX Disable (RC1)
    STVR = Off          ' Stack Overflow Reset Disabled
    LVP = Off          ' Low Voltage ICSP Disabled
    Debug = Off        ' Background Debugger Enable Disabled
    CP0 = On          ' Code Protection Block 0 Enable
    CP1 = On          ' Code Protection Block 1 Enable
    CP2 = On          ' Code Protection Block 2 Enable
    CP3 = On          ' Code Protection Block 3 Enable
    CPB = On          ' Boot Block Code Protection Disabled
    CPD = Off          ' Data EEPROM Code Protection Disabled
    WRT0 = Off        ' Write Protection Block 0 Disabled
    WRT1 = Off          ' Write Protection Block 1Disabled
    WRT2 = Off          ' Write Protection Block 2 Disabled
    WRT3 = Off          ' Write Protection Block 3 Disabled
    WRTB = Off          ' Boot Block Write Protection Disabled
    WRTC = Off          ' Configuration Register Write Protection Disabled
    WRTD = Off          ' Data EEPROM Write Protection Disabled
    EBTR0 = Off        ' Table Read Protection Block 0 Disabled
    EBTR1 = Off        ' Table Read Protection Block 1 Disabled
    EBTR2 = Off        ' Table Read Protection Block 2 Disabled
    EBTR3 = Off        ' Table Read Protection Block 3 Disabled
    EBTRB = Off        ' Boot Block Table Read Protection Disabled
Config_End
'Declare PLL_Req = On
Xtal 40
All_Digital TRUE
Declare LCD_RSPin PORTC.5
Declare LCD_ENPin PORTC.4
Declare LCD_DTPin PORTC.0
Declare LCD_Interface 4
Declare LCD_Lines 2
Declare LCD_CommandUs 5000'65535
Declare LCD_DataUs 255
T0CON=%11001111 :T1CON=0:T2CON=0:T3CON=0 :WDTCON.2=1  :INTCON=0:INTCON2=0:INTCON3=0  :RCON.7=0
PIE2=0:PIE1=0:IPR1=0:SSPCON1=0:CCP1CON=0  :CCP2CON=0 
TRISA=%010000 :TRISB=%11110000 :TRISC=%10000000 :PORTA=%010000 :PORTB=$FF:PORTC=%10000000
Dim dmx_new [8] As Byte:Dim oto_new[8] As Byte:Dim lednew[4] As Byte:Dim ledval[4] As Byte
Dim rednew,greennew,bluenew,whitenew,redval,greenval,blueval,whiteval,rainbow As Byte
Dim renkler,renksay1,renksay,red,green,blue,master,masternew,loop,rainbowon,dmx_ch,a,look As Byte
Dim dmxadres As Word:Dim dmx_cnt As Word:Dim degerler As Word :Dim renk As Word
Dim intcount,frameOK,stuation,oldstuation,BtnVar,strobenew,strobeval,strobeacik,values As Byte
Dim BOS As Byte:Dim dmxvar As Byte:Dim dmxgo As Byte:Dim dmxcnt As Word:Dim aa As Word
Symbol GIE=INTCON.7 :Symbol TMR0IE=INTCON.5   :Symbol TMR0IF=INTCON.2
Symbol FERR=RCSTA.2 :Symbol OERR=RCSTA.1 :Symbol CREN=RCSTA.4 :Symbol RCIF=PIR1.5
Symbol TUSMenu=PORTB.7 :Symbol TUSSec=PORTB.5 :Symbol TUSileri=PORTB.6 :Symbol TUSgeri=PORTB.4
Symbol R=PORTA.0    :Symbol G=PORTA.1    :Symbol B=PORTA.2  :Symbol W=PORTA.3 :Symbol L=PORTB.3
:R=1 :G=1 :B=1   :W=1     :L=0
Cls:DelayMS 500
degerler=0:BtnVar=0 :renk=0
For loop=0 To 7
    dmx_new[loop]=0 :oto_new[loop]=0
Next
dmx_cnt=0:frameOK=0

TMR0IF=0  :TMR0IE=1     :renkler=0 :GIE=1 
On_Hardware_Interrupt GoTo KESME
   
GoTo BASLA

KESME:
Context Save   
    TMR0IF=0   :GIE=0      :TMR0L=180
    If intcount=0 Then
    R=1 :G=1 :B=1   :W=1   
       ledval[0]=lednew[0]:ledval[1]=lednew[1]:ledval[2]=lednew[2]
      GoSub LOAD :GoSub RENGARENK    :GoSub CAKAR   
'      GoSub MASTERP 
    Else 
    If ledval[0]=intcount Then R=0
    If ledval[1]=intcount Then G=0
    If ledval[2]=intcount Then B=0
    If ledval[3]=intcount Then W=0
    EndIf
    GoSub DMXRECEIVE   
dmxrout:     
    Dec intcount           
    Context Restore
    Resume
'111111111111111111111111111111111111111111111111111111111111111111111111111111

'BURASI CALISTIRILINCA SORUN COZULUYOR
DURDUR:
    'GIE=0:R=1:G=1:B=1:W=1
Return       
'22222222222222222222222222222222222222222222222222222222222222222222222222222222222

DMXRECEIVE:
'BURASI HENÜZ YAPILMADI DÝKKATE ALINMASIN ,Sadece Deneme amaçlý     
     If RCIF=1 Then
        If dmx_ch>7 Then dmx_ch=0
        dmx_ch=dmx_ch+1
        dmx_new [dmx_ch]=RCREG
     EndIf
'BURASI HENÜZ YAPILMADI DÝKKATE ALINMASIN ,Sadece Deneme amaçlý


Return       
'33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
LOAD:
If stuation=9 Or stuation=8 Then
      master=dmx_new[0]:strobenew=dmx_new[1]:lednew[0]=dmx_new[2]:lednew[1]=dmx_new[3]
      lednew[2]=dmx_new[4]:lednew[3]=dmx_new[5]:rainbowon=dmx_new[6]:renksay=dmx_new[7]
    Else
      master=oto_new[0]:strobenew=oto_new[1]:lednew[0]=oto_new[2]:lednew[1]=oto_new[3]
      lednew[2]=oto_new[4]:lednew[3]=oto_new[5]:rainbowon=values:renksay=oto_new[7]
    EndIf
Return
'7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777
RENGARENK:     
    If  rainbowon<8 Then
            rainbow=0 :renk=0   :renkler=0
'BURASI HENÜZ YAPILMADI DÝKKATE ALINMASIN ,Sadece Deneme amaçlý
    EndIf
Return
'8888888888888888888888888888888888888888888888888888888888888888888888888888888888888
CAKAR:
    If strobenew<8 Then
        strobenew=0 :strobeacik=0 
'BURASI HENÜZ YAPILMADI DÝKKATE ALINMASIN ,Sadece Deneme amaçlý
    EndIf     
Return
MASTERP:
'SONRA YAPILACAK ,REZERVE BOLGE  TABLO KULLANIMA ACILINCA IYICE SAPITIYOR
ledval[0]=lednew[0]:ledval[1]=lednew[1]:ledval[2]=lednew[2]:ledval[3]=lednew[3]

aa=master*lednew[0]:aa=master*lednew[0]:aa=master*lednew[0]:aa=master*lednew[0]

a=LookUp look,[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,_
27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,_
59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,_
89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,_
113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,_
137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,_
161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,_
185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,_
209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,_
232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254]
If look=255 Then a=255

'SONRA YAPILACAK ,REZERVE BOLGE
Return
'444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
DEGERYUKLE:
     If stuation<8 Then
        degerler=oto_new[stuation]
     Else If stuation==8 Then
        GIE=0:degerler=dmxadres :GIE=1'önlem alýndý
     EndIf
     Return
'555555555555555555555555555555555555555555555555555555555555555555555555555555555555555       
DEGERYENILE:
     If stuation=1 Then
        If degerler=1 Then degerler=8
        If degerler<8 Then degerler=0
        If degerler>256 Then degerler=0
        If degerler>255 Then degerler=255
        oto_new[stuation]=degerler
     Else If stuation=6 Then
        GoSub rainbowyenile       
     Else If stuation=8 Then
        If degerler>504 Then degerler=1
        If degerler<1 Then degerler=504
        GIE=0:dmxadres=degerler:GIE=1'önlem alýndý
     Else   
        If degerler>256 Then degerler=0
        If degerler>255 Then degerler=255
        oto_new[stuation]=degerler   
     EndIf
     Return
rainbowyenile:     
        If degerler>5 Then degerler=0
        If degerler>4 Then degerler=4
        Select degerler
        Case 0
            values=0
        Case 1
            values=8
        Case 2
            values=104
        Case 3
            values=184
        Case 4
            values=248   
        EndSelect       
        oto_new[stuation]=degerler
Return             
'6666666666666666666666666666666666666666666666666666666666666666666666666666666666666666   
delay1:
    DelayMS 10:Return

'999999999999999999999999999999999999999999999999999999999999999999999999999999999   
OKU:
     
    For loop = 0 To 7
    oto_new[loop] = ERead loop+30
    Next
    stuation = ERead 38 :dmxadres.LowByte = ERead 39  :dmxadres.HighByte = ERead 40   

Return
'100000000000000000000000000000000000000000000000000000000000000000000000000000000
YAZ:
    L=1
    DelayMS 100
    R=1:G=1:B=1:W=1:GIE=0 
    For loop = 0 To 7
    EWrite loop+30, [oto_new[loop]]
    Next
    EWrite 38, [stuation,dmxadres]
    L=0:GIE=1
Return
'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ
EKRAN:           
Select stuation
Case 0 
    Print At 1,1,"MASTER  "   :GoSub delay1:Print At 2,1,"ch1: ",Dec3 oto_new[0]:Return
Case 1 
    Print At 1,1,"STROBE  "   :GoSub delay1:Print At 2,1,"ch2: ",Dec3 oto_new[1]:Return
Case 2 
    Print At 1,1,"RED     "   :GoSub delay1:Print At 2,1,"ch3: ",Dec3 oto_new[2]:Return
Case 3 
    Print At 1,1,"GREEN   "   :GoSub delay1:Print At 2,1,"ch4: ",Dec3 oto_new[3]:Return
Case 4 
    Print At 1,1,"BLUE    "   :GoSub delay1:Print At 2,1,"ch5: ",Dec3 oto_new[4]:Return
Case 5               
    Print At 1,1,"WHITE   "   :GoSub delay1:Print At 2,1,"ch6: ",Dec3 oto_new[5]:Return
Case 6 
    Print At 1,1,"RAINBOW "   :GoSub delay1:Print At 2,1,"ch7: ",Dec3 oto_new[6]:Return
Case 7 
    Print At 1,1,"RB.SPEED "  :GoSub delay1:Print At 2,1,"ch8: ",Dec3 oto_new[7]:Return
Case 8
    Print At 1,1,"ADRESS  "   :GoSub delay1:Print At 2,1,Dec3 dmxadres,"->",Dec3 dmxadres+8:Return
Case 9
    Print At 2,1,"adr: ",Dec3 dmxadres  :GoSub delay1:Print At 1,1,"DMX  LED" :Return
Case 10 
    Print At 2,1,"adr: ",Dec3 dmxadres   :GoSub delay1:Print At 1,1,"OTOMATiK" :Return   
End Select
EKRAN1:           
Select stuation
Case 0 
    Print At 2,6,Dec3 oto_new[0]:Return
Case 1 
    Print At 2,6,Dec3 oto_new[1]:Return
Case 2
    Print At 2,6,Dec3 oto_new[2]:Return
Case 3 
    Print At 2,6,Dec3 oto_new[3]:Return
Case 4 
    Print At 2,6,Dec3 oto_new[4]:Return
Case 5               
    Print At 2,6,Dec3 oto_new[5]:Return
Case 6 
    Print At 2,6,Dec3 oto_new[6]:Return
Case 7 
    Print At 2,6,Dec3 oto_new[7]:Return
Case 8
    Print At 2,1,Dec3 dmxadres:Print At 2,6,Dec3 dmxadres+8:Return   
End Select   
'LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
   
BASLA:
     GoSub OKU
     If    stuation>10 Then stuation=10
     GoSub DEGERYUKLE :GoSub rainbowyenile   :GoSub EKRAN :PORTA.5=0 :L=1:DelayMS 1000
While 1=1
KEYmenu:
    If TUSMenu==0 Then
        GoSub delay1   
      If TUSMenu==0 Then
            If stuation<9 Then
              stuation=oldstuation  :GoSub DURDUR:GoSub EKRAN :GoSub YAZ
            Else
              oldstuation=stuation  :stuation=8 :L=1:GoSub DEGERYUKLE
              GoSub DURDUR:GoSub EKRAN:GIE=1   
            EndIf
          GoSub delay1   
        While TUSMenu==0 
        Wend
        GoSub delay1
      EndIf   
    EndIf
KEYsec:
    If TUSsec==0 Then
        GoSub delay1
      If TUSsec==0 Then
        If stuation<9 Then
          Inc stuation   
          If stuation>8 Then stuation=0   
          GoSub DEGERYUKLE 
        Else If stuation<>10 Then
          stuation=10 :GoSub YAZ
        Else If stuation<>9 Then
          stuation=9 :GoSub YAZ
        EndIf       
        GoSub DURDUR:GoSub EKRAN    :GIE=1
        While TUSsec==0
        Wend
        GoSub delay1
      EndIf
    EndIf
If stuation<9 Then     
KEYileri:   
    If TUSileri==0 Then
        GoSub delay1
      If TUSileri==0 Then
        degerler=degerler+1    :GoSub DEGERYENILE
        GoSub DURDUR :GoSub EKRAN1    :GIE=1 :GoSub delay1
        While TUSileri==0
        Inc BtnVar
        If BtnVar>10 Then
        Dec BtnVar  :degerler=degerler+1  :GoSub DEGERYENILE
        GoSub DURDUR :GoSub EKRAN1:GIE=1  :GoSub delay1
        EndIf
        GoSub delay1
        Wend       
      EndIf
    EndIf
    BtnVar=0
KEYgeri:   
    If TUSgeri==0 Then
        GoSub delay1
      If TUSgeri==0 Then
        degerler=degerler-1    :GoSub DEGERYENILE   
        GoSub DURDUR:GoSub EKRAN1  :GIE=1 :GoSub delay1
        While TUSgeri==0
        Inc BtnVar
        If BtnVar>10 Then
        Dec BtnVar  :degerler=degerler-1   :GoSub DEGERYENILE
        GoSub DURDUR  :GoSub EKRAN1 :GIE=1 :GoSub delay1
        EndIf
        GoSub delay1
        Wend       
      EndIf
    EndIf   
    BtnVar=0
Else
        If TUSileri=1 Then
        L=0
        Else
        L=1
        EndIf
EndIf       
Wend

'MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM           
        End


mesaj birleştirme:: 27 Eylül 2014, 19:14:29

Maxim hocam sizinkindede sorun yok.Biraz önceki mesajım da bahsettiğim gibi yapıncada sorun olmuyor ,tablo bile açık üstelik.Proton'un Program counter'ı doğru yönetemediği konusundaki kuşkularım iyice arttı,bu arada.
Başlık: Ynt: LCD ve Interrupt
Gönderen: Maxim - 27 Eylül 2014, 00:49:08
programın ilk haliyle derleyicinin verdiği hatalar
hata veriyordu ama derliyordu da.

(http://i58.tinypic.com/33tjkpf.jpg)
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 27 Eylül 2014, 11:44:23
İşte içimdeki kötü his  buydu;SFR ile ilgili uyarıları maalesef benimkinde vermiyor,o yüzden de hatalı işlem yaptığında kıvranıp duruyorum acaba neden diye.Beninkinde sadece üstteki 3 satırı uyarı olarak veriyor.Bu özelliği nerden açabiliriz acaba?
Başlık: Ynt: LCD ve Interrupt
Gönderen: Maxim - 27 Eylül 2014, 12:05:10
bende 3.5.6.7 yüklü ondandır
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 28 Eylül 2014, 11:31:38

0 1139 Available RAM: 240 [bytes], Available ROM: 4096 [bytes] 
0 126 All files Preprocessed in 15 ms 
0 122 Compilation Started Led_pro1.c
151 123 Compiled Successfully Led_pro1.c
0 127 All files Compiled in 47 ms

15 1511 IRP bit must be set manually for indirect access to 'string0' variable Led_pro1.c
0 1511 IRP bit must be set manually for indirect access to '?lstr15_Led_pro1' variable Led_pro1.c
0 1511 IRP bit must be set manually for indirect access to '?lstr19_Led_pro1' variable Led_pro1.c
0 1511 IRP bit must be set manually for indirect access to '?lstr20_Led_pro1' variable Led_pro1.c
0 1511 IRP bit must be set manually for indirect access to '?lstr21_Led_pro1' variable Led_pro1.c
0 1511 IRP bit must be set manually for indirect access to '?lstr22_Led_pro1' variable Led_pro1.c
0 1144 Used RAM (bytes): 228 (95%)  Free RAM (bytes): 12 (5%) Used RAM (bytes): 228 (95%)  Free RAM (bytes): 12 (5%)
0 1144 Used ROM (program words): 1428 (35%)  Free ROM (program words): 2668 (65%) Used ROM (program words): 1428 (35%)  Free ROM (program words): 2668 (65%)

Bu programa ilk microC de başlamıştım(daha interrupt falan bölümünü kullanmadan),sonra yukarıda yaptığı namussuzluk yüzünden tekrar protonda baştan yazmaya başlamıştım.
Program boyutu kısalınca bu tür hatalar vermiyor.demekki farklı sayfalar arası geçerken ,bazı işleri bize bırakıyor.Bu tür işlemleri kendisi düzgün şekilde yapan bir derleyici varmıdır,varsa hangisi acaba ,hocam?
Başlık: Ynt: LCD ve Interrupt
Gönderen: djmalan - 29 Eylül 2014, 23:51:52
Interrup içinde GOTO ve GOSUB kullanılmaması gerekiyormuş ,help dosyası sahife302...
STATUS, PCLATH, BSR, FSR0L\H, FSR1L\H, WREG  registerleri otomatik kopyalıyormuş(context save),yani MikroC gibi hasta ruhlu değilmiş(IRP).