MCSP'de bir error

Başlatan ilker_32, 04 Mart 2007, 01:14:31

ilker_32

kusura bakmayın arkadaşlar bir sorunum var. Kodda çözemediğim bir tane error var. yardımcı olursanız sevinirim. Ben Micro code stdio kullanıyorum.  :?:

KONTROLLEDYAK: ;hatanın gözüktüğü yer.

PİC BASİC PRO kodları
;***********************************************
ADCON1 = 7
DEFINE OSC 10
DEFINE I2C_SLOW 1
DEFINE HSER_BAUD 2400      
TRISA = %11111100              
TRISC = %11111011
TRISD = %00000011            
TrisB = 0
TrisE = $ff
PortA = 0
PortB = 0
PortC = 0
PORTD = 0
PortE = 0      
I2C_SDA var PortC.4
I2C_SCL var PortC.3

;**************************************------------
buff_1  var byte[1400]
BUFF    VAR BYTE  
BUFFDEGER   VAR BYTE

SCSay       VAR BYTE
AnaSay      VAR WORD
HizSay      VAR BYTE
ISay        VAR WORD
BBYTE       VAR BYTE
WWORD       VAR BYTE

EEBISay     VAR word

GelenBYTE   var byte

RRR         var word
XX          var word
TT          VAR WORD
yukle       VAR BYTE

;************butun degıskenlerı sıfırla*******************
clear  

GOSUB EEPROMOKU

;*********************************************************
GOSTER:

   for AnaSay = 0 to 1400                    
       for HizSay = 0 to 1                  
           FOR SCSay = 0 TO 6              
               select case SCSay
               CASE 0
                   BUFFDEGER = %10000000
                   GOSUB GOSTERALT
               CASE 1
                   BUFFDEGER = %01000000
                   GOSUB GOSTERALT
               CASE 2
                   BUFFDEGER = %00100000
                   GOSUB GOSTERALT
               CASE 3
                   BUFFDEGER = %00010000
                   GOSUB GOSTERALT
               CASE 4
                   BUFFDEGER = %00001000
                   GOSUB GOSTERALT
               CASE 5
                   BUFFDEGER = %00000100
                   GOSUB GOSTERALT
               CASE 6
                   BUFFDEGER = %00000010
                   GOSUB GOSTERALT
               END SELECT
           NEXT    ; FOR 3
       next    ; FOR 2
   next    ; FOR 1
return

;************************************************
GOSTERALT:
   PortB = %00000000              
   PortA.0 = 0                  
   For  ISay = AnaSay to (59 + AnaSay)
       BUFF = Buff_1[ISay]
       if SCSay = 0 then
           PortA.0 = BUFF.0  
       ENDIF
       if SCSay = 1 then
           PortA.0 = BUFF.1  
       ENDIF
       if SCSay = 2 then
           PortA.0 = BUFF.2  
       ENDIF
       if SCSay = 3 then
           PortA.0 = BUFF.3
       ENDIF
       if SCSay = 4 then
           PortA.0 = BUFF.4
       ENDIF
       if SCSay = 5 then
           PortA.0 = BUFF.5
       ENDIF
       if SCSay = 6 then
           PortA.0 = BUFF.6
       ENDIF                  
       PortA.1 = 1                          
       PortA.1 = 0                                                                      
   next
   PortB = BUFFDEGER
   pauseus 1500
   PortB = %00000000
   if PortC.0 = 0 then
       Gosub KONTROLLEDYAK
       EEBISay = 0;  
       GOSub COMPORTOKU
   endif
return    

;*******************************************************************************
COMPORTOKU:
   hserin [GelenBYTE]
       if GelenBYTE="A" THEN
           Gosub KONTROLLEDYAK
           gosub EEPROMOKU
       ENDIF
       gosub EEPROMYAZ
       EEBISay = EEBISay + 1
goto COMPORTOKU


;*******************************************************************************
EEPROMOKU:
   Gosub KONTROLLEDYAK
   for ISay = 0 to 1400
       i2cread I2C_SDA, I2C_SCL, $A0, ISay, [BBYTE]
       BBYTE = BBYTE ^ %11111111
       buff_1[ISay] = BBYTE
   next
   Gosub KONTROLLEDYAK
GOSUB GOSTER  

;*******************************************************************************
EEPROMYAZ:
   i2cwrite I2C_SDA, I2C_SCL, $A0, EEBISay, [GelenBYTE]
   KONTROLLEDYAK_K  
return

;*******************************************************************************
KONTROLLEDYAK: ;hatanın gözüktüğü yer.
      high portC.2
      pause 1000
      LOW PORTC.2
return  

KONTROLLEDYAK_K:
       high portC.2
       pause 10
       LOW PORTC.2
return

ete

Aslında programda iki adet hata var,
Birincisi;
EEPROMYAZ:
i2cwrite I2C_SDA, I2C_SCL, $A0, EEBISay, [GelenBYTE]
KONTROLLEDYAK_K
return

konumunda Yalnızca      KONTROLLEDYAK_K   şeklinde bir ifade kullanmışsın.
Program bunu etiket (Label) olarak algılıyor ve senin hata var dedğin yerdede aynı etiket olduğu için iki yerde aynı isimli etiket kullanıyorsun diye seni uyarıyor.
Sanırım yukarıdaki ifadenin başına Gosub gibi bir şey eklemen gerek.

İkinci hata ise dizi değişkeni kapasitesini çok fazla aşmış olman.
buff_1 var byte[1400]     ifadesi şayet 16F877 kullanıyor isen 96 adedi geçemez. Bu işlemcinin sınırıdır. 18F452 kullanırsan kapasiten 1488 adede kadar çıkabilir.
Bu sınır tek bir değişken için verilmiştir. Bu yüzden gerekirse bu dizi değişkenini parçalı olarak kullanman gerekir. Yada program mantığını değiştirmen gerekir.

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

ilker_32

sağol Ete hocam olayı çözdüm. :lol: