Derleyememe sorunu

Başlatan onurinci, 18 Temmuz 2021, 01:04:43

onurinci

hocam 10 sene evvel bunu derlemişim ve HEX elde etmişim,şimdi 2.60 kullanıcısıyım.
DB= 3150 - ( 5  ( 2550 - ( vol_l  10 ) ) )
ve
dB= ( 5  ( 2550 - ( vol_l  10 ) ) ) - 3150
satırlarına yanlış yazılım hatası veriyor.

@ Device PIC16F628A,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT,LVP_OFF
Define OSC 4

DEFINE LCD_DREG PORTA           ' Set LCD Data port
DEFINE LCD_DBIT 0               ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTA          ' Set LCD Register Select port
DEFINE LCD_RSBIT 4              ' Set LCD Register Select bit
DEFINE LCD_EREG PORTB           ' Set LCD Enable port
DEFINE LCD_EBIT 0               ' Set LCD Enable bit
DEFINE LCD_BITS 4               ' Set LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2              ' Set number of lines on LCD
DEFINE LCD_COMMANDUS 2000       ' Set command delay time in us    
DEFINE LCD_DATAUS 100           ' Set data delay time 100 us
DEFINE SHIFT_PAUSEUS 2000       ' Slow clock by an additional 2000 us       
DEFINE BUTTON_PAUSE 100         ' Set button debounce delay to 100ms      

I       CON 254                 ' Control Byte
CLR     CON    		        ' Clear the display
LINE_1  CON 128                 ' Point to beginning of line 1
LINE_2  CON 192                 ' Point to beginning of line 2
LINE_3  CON 148                 ' Point to beginning of line 3
LINE_4  CON 212                 ' Point to beginning of line 4
CGRAM   CON 64                  ' Point to Cgram within LCD
SHIFT_L CON	24                  ' Shift display left
SHIFT_R CON	28                  ' Shift display right

TRISA= $00                     ' PortA as Outputs
TRISB= $0E                     ' RB0 & RB4-RB7 Outputs, RB1-RB3 Inputs
OPTION_REG.7= 0                ' Enable PortB pull-ups
INTCON  $00                    ' Disable interrups, and clear INT flags

V_UP   VAR BYTE 
V_UP= 0                       ' Volume up Bvar, initialized to zero 
V_DOWN VAR BYTE 
V_DOWN= 0                     ' Volume down Bvar, initialized to zero
V_MUTE VAR BYTE
V_MUTE= 0                     ' Mute on/off Bvar, initialized to zero

VOL   VAR WORD         
VOL_R VAR VOL.BYTE0
VOL_R= 55                     ' Left channel data byte
VOL_L VAR VOL.BYTE1
VOL_L  55                     ' Right channel data byte

UP_BUT   VAR PORTB.1            ' Volume up button 
DOWN_BUT VAR PORTB.2            ' Volume down button 
MUTE_BUT VAR PORTB.3            ' Mute button

MUTE VAR PORTB.4 : low MUTE     ' Mute pin, turned on, to prevent pop-up noise
CS   VAR PORTB.5 : high CS      ' Chip select pin
SDI  VAR PORTB.6 : high SDI     ' Data out pin
SCLK VAR PORTB.7 : high SCLK    ' Clock out pin
      
dB_SIGN VAR BIT                 ' Decible sign
dB      VAR WORD                ' dB variable
dB10    VAR BYTE                ' 1st dB digit
dB1     VAR BYTE                ' 2nd dB digit
FLAG    VAR BIT                 ' General variable

      GoSub SHIFT               ' Send data to PGA2310
      GoSub DB_VALUE            ' Calculate decible equivalent
      LCDOUT  "   Welcome !!"
      pause 1500                ' Pause 1 second
      high MUTE                 ' Turn mute off
      GoSub dB_LCD              ' Show volume Ddecible value, then mute state                 
      gosub MUTE_LCD            ' Show mute status on LCD

VOLUME :
    Button UP_BUT, 0, 254, 127, V_UP, 1, VOL_UP         ' Volum up button
    Button DOWN_BUT, 0, 254, 127, V_DOWN, 1, VOL_DOWN   ' Volum down button
    Button MUTE_BUT, 0, 255, 0, V_MUTE, 1, MUTE_CON     ' Mute button
    GoTo VOLUME

VOL_UP :
 IF ( VOL_L == 255 ) Then MAX_LIMIT      ' Check if volume is at max level         
VOL_L= VOL_L + 1               ' Increment VOL_L
VOL_R= vol_R + 1               ' Increment VOL_R                         
    GoSub SHIFT                     ' Send data to PGA2310
    GoSub DB_VALUE                  ' Calculate decible vale 
    GoSub dB_LCD                    ' Show volume Ddecible value, then mute state 
    gosub MUTE_LCD                  ' Show mute status on LCD
    GoTo VOLUME                     ' Return to to check buttons if any presed
  
VOL_DOWN :
 IF ( VOL_L == 1 )  Then MIN_LIMIT  ' Check if volume is at min level           
VOL_L= VOL_L - 1                   ' Decrement VOL_L
VOL_R= VOL_R - 1                   ' Decrement VOL_R
    GoSub SHIFT                     ' Send data to PGA2310            
    GoSub DB_VALUE                  ' Calculate decible vale  
    GoSub dB_LCD                    ' Show volume Ddecible value, then mute state
    gosub MUTE_LCD                  ' Show mute status on LCD
    GoTo VOLUME                     ' Return to to check buttons if any presed

MUTE_CON :
    Toggle MUTE                     ' Flip mute pin output
    gosub MUTE_LCD                  ' Show mute status on LCD 
    GoTo VOLUME                     ' Return to to check buttons if any presed

SHIFT :
    low CS                          ' Activate the PGA2310 to receive data
    pauseus 100                     ' Pause 100 micro second
    ShiftOut SDI, SCLK, 5, [ VOL\16 ]       ' Shift volume data out to PGA2310
    high CS                         ' De-activate the PGA2310 to receive data
    PAUSEUS 100                     ' Pause 100 micro second 
    high SDI                        ' Turn SDI pin to high
    Return                          ' Return from where you came

dB_VALUE :                      ' Calculations for decible equivalent values
 IF ( VOL_L >= 192 ) Then 
DB_SIGN = 1
DB= 3150 - ( 5  ( 2550 - ( vol_l  10 ) ) )
DB10= DB / 100
dB1= DB // 100
DB1= DB1 / 10
 Else 
DB_SIGN= 0
dB= ( 5  ( 2550 - ( vol_l  10 ) ) ) - 3150 
DB10= DB / 100
dB1= DB // 100 
DB1= DB1 / 10
 EndIF
    Return 

dB_LCD :                        ' Show volume on the LCD
FLAG= 1
 if ( db10 == 0 ) AND ( DB1 == 0 ) THEN                     
    LCDOut I, clr, " Volume ", DEC DB10, " dB"', DEC VOL_L
FLAG= 0 
 ENDIF 
 IF ( flag == 1 ) and ( DB_SIGN == 1 ) Then
    LCDOut I, clr, " Volume ", DEC DB10, ".",  DEC DB1, " dB"', DEC VOL_L
 ENDIF 
 IF ( flag == 1 ) and ( DB_SIGN == 0 ) Then                         
    LCDOut I, clr, " Volume -", DEC DB10, ".",  DEC DB1, " dB"', DEC VOL_L
 ENDIF      
    Return  
 
MUTE_LCD :                      ' This lable is just to show mute state                      
 IF MUTE == 1 Then               ' without showing volume decible value
    LCDOut i, line_2, " Mute OFF"   ' Show mute status on LCD
 Else                            ' Else :)
    LCDOut i, line_2, " Mute ON "   ' Show mute status on LCD 
 EndIF                           ' End IF statement
    Return                          ' Return from where you came

MAX_LIMIT :
    LCDOut I, CLR, " Max volume !!!"    ' Show that its max volume now
    GoSub MUTE_LCD                  ' Show mute status
    GoTo volume                     ' Return to to check buttons if any presed

MIN_LIMIT :
    LCDOut i, clr, " Min volume !!!"    ' Show that its min volume now
    GoSub MUTE_LCD                  ' Show mute status
    GoTo volume                     ' Return to to check buttons if any presed                 

End

ete

#1
Şayet bu yazılanları 10 sene önce de aynı şekilde yazmış isen o zamanda hata vermesi gerekirdi.
DB= 3150 - ( 5  ( 2550 - ( vol_l  10 ) ) ) satırına bakalım.
Bu satırdaki 5 rakamının bu formülde hiç bir işlevi yok. Matamatiksel ifade olarak 5 rakamı kendisinden sonraki elemanlarla çarpılacak anlamına gelir. Ancak Basic derleyicisi açısından hiç bir anlamı yok ve derleyici ne yapacağını bilemediğinden hata verir. Bu satırı;
DB= 3150 - ( 5 * ( 2550 - ( vol_l  10 ) ) )
şeklinde yazaıp yeniden derlemeye çalış.
Benzer şekilde diğer satırı da;
dB= ( 5 * ( 2550 - ( vol_l  10 ) ) ) - 3150
şeklinde yazıp dene.
Ancak hala bazı olumsuz durum mevcut.
Vol_l 10  ne demek oluyor. Ortada bir işlen işareti yok bir değişken ismi yok. Nedir ben bile bir anlam veremedim.
Değişken tanımlama kısmına bakıyorum  VOL_L  55  şeklinde bir satır var. Bu nedir belli değil. Bildiğim kurallara uymuyor. Sanki arada eşittir işareti silinmiş gibi gözüküyor.

Bütün bunların düzeltilmesi gerekir.
Ete
not : arasında işaret olmayanları çarpılacak anlamında kullanıp yeniden düzenledim ve sorunsuzca derlendiğini gördüm aşağıdaki şekilde.
@ Device PIC16F628A,WDT_OFF,PWRT_ON,PROTECT_OFF, CPD_OFF,MCLR_OFF,BOD_OFF,INTRC_OSC_NOCLKOUT,LVP_OFF

Define OSC 4

DEFINE LCD_DREG PORTA           ' Set LCD Data port
DEFINE LCD_DBIT 0               ' Set starting Data bit (0 or 4) if 4-bit bus
DEFINE LCD_RSREG PORTA          ' Set LCD Register Select port
DEFINE LCD_RSBIT 4              ' Set LCD Register Select bit
DEFINE LCD_EREG PORTB           ' Set LCD Enable port
DEFINE LCD_EBIT 0               ' Set LCD Enable bit
DEFINE LCD_BITS 4               ' Set LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2              ' Set number of lines on LCD
DEFINE LCD_COMMANDUS 2000       ' Set command delay time in us    
DEFINE LCD_DATAUS 100           ' Set data delay time 100 us
DEFINE SHIFT_PAUSEUS 2000       ' Slow clock by an additional 2000 us       
DEFINE BUTTON_PAUSE 100         ' Set button debounce delay to 100ms      

I       CON 254                 ' Control Byte
CLR     CON 1   		        ' Clear the display
LINE_1  CON 128                 ' Point to beginning of line 1
LINE_2  CON 192                 ' Point to beginning of line 2
LINE_3  CON 148                 ' Point to beginning of line 3
LINE_4  CON 212                 ' Point to beginning of line 4
CGRAM   CON 64                  ' Point to Cgram within LCD
SHIFT_L CON	24                  ' Shift display left
SHIFT_R CON	28                  ' Shift display right

TRISA= $00                     ' PortA as Outputs
TRISB= $0E                     ' RB0 & RB4-RB7 Outputs, RB1-RB3 Inputs
OPTION_REG.7= 0                ' Enable PortB pull-ups
INTCON =0                    ' Disable interrups, and clear INT flags

V_UP   VAR BYTE 
V_UP= 0                       ' Volume up Bvar, initialized to zero 
V_DOWN VAR BYTE 
V_DOWN= 0                     ' Volume down Bvar, initialized to zero
V_MUTE VAR BYTE
V_MUTE= 0                     ' Mute on/off Bvar, initialized to zero

VOL   VAR WORD         
VOL_R VAR VOL.BYTE0
VOL_R= 55                     ' Left channel data byte
VOL_L VAR VOL.BYTE1
VOL_L= 55                     ' Right channel data byte

UP_BUT   VAR PORTB.1            ' Volume up button 
DOWN_BUT VAR PORTB.2            ' Volume down button 
MUTE_BUT VAR PORTB.3            ' Mute button

MUTE VAR PORTB.4 : low MUTE     ' Mute pin, turned on, to prevent pop-up noise
CS   VAR PORTB.5 : high CS      ' Chip select pin
SDI  VAR PORTB.6 : high SDI     ' Data out pin
SCLK VAR PORTB.7 : high SCLK    ' Clock out pin
      
dB_SIGN VAR BIT                 ' Decible sign
dB      VAR WORD                ' dB variable
dB10    VAR BYTE                ' 1st dB digit
dB1     VAR BYTE                ' 2nd dB digit
FLAG    VAR BIT                 ' General variable

      GoSub SHIFT               ' Send data to PGA2310
      GoSub DB_VALUE            ' Calculate decible equivalent
      LCDOUT  "   Welcome !!"
      pause 1500                ' Pause 1 second
      high MUTE                 ' Turn mute off
      GoSub dB_LCD              ' Show volume Ddecible value, then mute state                 
      gosub MUTE_LCD            ' Show mute status on LCD

VOLUME :
    Button UP_BUT, 0, 254, 127, V_UP, 1, VOL_UP         ' Volum up button
    Button DOWN_BUT, 0, 254, 127, V_DOWN, 1, VOL_DOWN   ' Volum down button
    Button MUTE_BUT, 0, 255, 0, V_MUTE, 1, MUTE_CON     ' Mute button
    GoTo VOLUME

VOL_UP :
 IF ( VOL_L == 255 ) Then MAX_LIMIT      ' Check if volume is at max level         
VOL_L= VOL_L + 1               ' Increment VOL_L
VOL_R= vol_R + 1               ' Increment VOL_R                         
    GoSub SHIFT                     ' Send data to PGA2310
    GoSub DB_VALUE                  ' Calculate decible vale 
    GoSub dB_LCD                    ' Show volume Ddecible value, then mute state 
    gosub MUTE_LCD                  ' Show mute status on LCD
    GoTo VOLUME                     ' Return to to check buttons if any presed
  
VOL_DOWN :
 IF ( VOL_L == 1 )  Then MIN_LIMIT  ' Check if volume is at min level           
VOL_L= VOL_L - 1                   ' Decrement VOL_L
VOL_R= VOL_R - 1                   ' Decrement VOL_R
    GoSub SHIFT                     ' Send data to PGA2310            
    GoSub DB_VALUE                  ' Calculate decible vale  
    GoSub dB_LCD                    ' Show volume Ddecible value, then mute state
    gosub MUTE_LCD                  ' Show mute status on LCD
    GoTo VOLUME                     ' Return to to check buttons if any presed

MUTE_CON :
    Toggle MUTE                     ' Flip mute pin output
    gosub MUTE_LCD                  ' Show mute status on LCD 
    GoTo VOLUME                     ' Return to to check buttons if any presed

SHIFT :
    low CS                          ' Activate the PGA2310 to receive data
    pauseus 100                     ' Pause 100 micro second
    ShiftOut SDI, SCLK, 5, [ VOL\16 ]       ' Shift volume data out to PGA2310
    high CS                         ' De-activate the PGA2310 to receive data
    PAUSEUS 100                     ' Pause 100 micro second 
    high SDI                        ' Turn SDI pin to high
    Return                          ' Return from where you came

dB_VALUE :                      ' Calculations for decible equivalent values
 IF ( VOL_L >= 192 ) Then 
DB_SIGN = 1
DB= 3150 - ( 5 * ( 2550 - ( vol_l * 10 ) ) )
DB10= DB / 100
dB1= DB // 100
DB1= DB1 / 10
 Else 
DB_SIGN= 0
dB= ( 5 * ( 2550 - ( vol_l * 10 ) ) ) - 3150 
DB10= DB / 100
dB1= DB // 100 
DB1= DB1 / 10
 EndIF
    Return 

dB_LCD :                        ' Show volume on the LCD
FLAG= 1
 if ( db10 == 0 ) AND ( DB1 == 0 ) THEN                     
    LCDOut I, clr, " Volume ", DEC DB10, " dB"', DEC VOL_L
FLAG= 0 
 ENDIF 
 IF ( flag == 1 ) and ( DB_SIGN == 1 ) Then
    LCDOut I, clr, " Volume ", DEC DB10, ".",  DEC DB1, " dB"', DEC VOL_L
 ENDIF 
 IF ( flag == 1 ) and ( DB_SIGN == 0 ) Then                         
    LCDOut I, clr, " Volume -", DEC DB10, ".",  DEC DB1, " dB"', DEC VOL_L
 ENDIF      
    Return  
 
MUTE_LCD :                      ' This lable is just to show mute state                      
 IF MUTE == 1 Then               ' without showing volume decible value
    LCDOut i, line_2, " Mute OFF"   ' Show mute status on LCD
 Else                            ' Else :)
    LCDOut i, line_2, " Mute ON "   ' Show mute status on LCD 
 EndIF                           ' End IF statement
    Return                          ' Return from where you came

MAX_LIMIT :
    LCDOut I, CLR, " Max volume !!!"    ' Show that its max volume now
    GoSub MUTE_LCD                  ' Show mute status
    GoTo volume                     ' Return to to check buttons if any presed

MIN_LIMIT :
    LCDOut i, clr, " Min volume !!!"    ' Show that its min volume now
    GoSub MUTE_LCD                  ' Show mute status
    GoTo volume                     ' Return to to check buttons if any presed                 

End

onurinci

hocam sağolun çalıştı..sonradan hatırladım,Oshon Software firmasının Demo Basic ile derlemiştim.
simulasyon ektedir..

Powered by EzPortal