avatar_BİDİL

16F877A CMCOM DERLEME HATASI

Başlatan BİDİL, 20 Ekim 2018, 19:15:32

BİDİL

Arkadaşlar merhaba, 16f877a cmcon=7 yaptığımda aşağıdaki görseldeki gibi (CMCON) adında bir error alıyorum. Nerede hata yaptığımı anlayamadım. Derleyicide (Microcode studio) yada INC klasörü ile ilgili bir problem olabilirmi. 64 bit olarak derliyorum.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2018 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 20.10.2018                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

asm
__config _HS_OSC & _WDT_OFF & _PWRTE_OFF & _LVP_OFF & _CP_OFF
endasm

'*******************************OSC AYARLARI************************************
DEFINE OSC 20
ADCON1=7
CMCON=7
'****************************LCD TANIMLAMASI***********************************
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 1 'LCD Enable Bacağı 1. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 2 'LCD RS bacağı 2. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 4 sıra olarak çalışıyor.
DEFINE HSER_TXSTA 20h 'I wonder shall I define as DEFINE HSER_TXSTA 24h???
DEFINE HSER_RCSTA 90h 'same for all
DEFINE HSER_BAUD 9600 'for 2400 Baud rate
DEFINE HSER_BITS 8
DEFINE HSER_EVEN 1
DEFINE HSER_CLROERR 1 'same for all
'****************************PİN TANIMLAMASI***********************************
'0 İSE ÇIKIŞ
'1 İSE GİRİŞ
TRISA=%00001111
TRISB=%00000001
TRISC=%10110111
TRISD=%00000000
TRISE=%00000111
PORTA=%00000000
PORTB=%00000000
PORTE=%00000000
PORTD=%00000000
'**********.i*******************DS1307 PİNLERİ************************************
SDA Var PORTD.1
SCL Var PORTD.0
SYMBOL ENT=PORTE.1
SYMBOL ARTIR=PORTE.0
SYMBOL AZALT=PORTE.2
SYMBOL SES=PORTD.7
SYMBOL DC=PORTB.0
SYMBOL EKRAN=PORTD.2
SYMBOL CLOK=PORTB.3
SYMBOL ROLE1=PORTD.6
SYMBOL ROLE2=PORTD.5
SYMBOL ROLE3=PORTD.4
SYMBOL ROLE4=PORTD.3

SAAT    VAR BYTE 
DAK     VAR BYTE 
SN      VAR BYTE 
ESKISN  VAR BYTE
AYGUN   VAR BYTE
AY      VAR BYTE
YIL     VAR BYTE 
HAFGUN  VAR BYTE
SECOND  VAR BYTE
HOUR    VAR BYTE
MINUTE  VAR BYTE
DAY     VAR BYTE
MONTH   VAR BYTE
WEEK    VAR BYTE
YEAR    VAR BYTE
TEMP    VAR BYTE

X VAR word
hh VAR BYTE 'hours
mm VAR BYTE 'minutes
ss var byte      'seconder
j  VAR BYTE 'day
m  VAR BYTE 'month
a  VAR BYTE 'year
fix VAR WORD 'GPS fix
ORTAKSAAT VAR BYTE                                 
ORTAKDAK  VAR BYTE
FARK             VAR BYTE

KONTROL:

Lcdout $FE, 1
LCDOUT $FE,$C0
Lcdout $FE, 1, " System  opened "
LCDOUT $FE,$C0,"  Please  wait  "
PAUSE 2000
LOW ROLE1
LOW ROLE2
LOW ROLE3
LOW ROLE4
GOSUB EPROM_OKU

IF ORTAKSAAT=255 THEN ORTAKSAAT=00
IF ORTAKDAK=255 THEN ORTAKDAK=00
IF FARK=255 THEN FARK=00

;*******************************************************************************
;***************************     TEST        **********************************
;*******************************************************************************

SETA:
WHILE ENT=0:WEND
GOSUB EKRANSIL
               
AYARLA:
GOSUB ZAMANOKU
IF ENT=0 THEN
        GOSUB EPROOM_YAZ
        gOTO AYARLAR_SIFIR
ENDIF

             FOR X=1 TO 250
             PAUSE 1
             IF DC=0 THEN GOTO KAYIT
             NEXT

IF (SAAT=ORTAKSAAT)AND(DAK=ORTAKDAK) THEN
        Lcdout $FE,1
        LCDOUT $FE,$C0
        Lcdout $FE,1,"Time : ",DEC2 sAAT, ":", DEC2 DAK, ":" , DEC2 SN
        LCDOUT $FE,$C0,"Date : ",DEC2 AYGUN, "/", DEC2 AY, "/" , DEC2 YIL
                    FOR X=1 TO 300
                    PAUSE 1
                    IF DC=0 THEN GOTO KAYIT
                    NEXT
IF (saat=01)AND(DAK=00) AND (SN=30)THEN GOSUB  GPSKAYIT
GOTO AYARLA     

ELSE
        Lcdout $FE,1
        LCDOUT $FE,$C0
        Lcdout $FE,1,"Time : ",DEC2 sAAT, ":", DEC2 DAK, ":" , DEC2 SN
        LCDOUT $FE,$C0,"Clock: ",DEC2 ORTAKSAAT, ":", DEC2 ORTAKDAK, ":" , DEC2 SN       
           
            FOR X=1 TO 3200 
                HIGH CLOK: PAUSEUS 100
                LOW CLOK: PAUSEUS 100
            NEXT
           
        ORTAKDAK=ORTAKDAK+1  ' dakika değeri bir artırılıyor
        IF ORTAKDAK=60 then   'dakika 60 olmuş ise 1 saat süre geçti
            ORTAKDAK=00         ' dakika sıfırlanıyor
            ORTAKSAAT=ORTAKSAAT+1   ' saat değeri bir artırılıyor
        endif
        IF ORTAKSAAT=24 THEN  'saat 24 olmuş ise 1 gün geçti
            ORTAKSAAT=00        'saat sıfırlanıyor               
        ENDIF
                    FOR X=1 TO 500
                    PAUSE 1
                    IF DC=0 THEN GOTO KAYIT
                    NEXT

ENDIF
GOTO AYARLA
;*******************************************************************************
;**************************       KAYIT       **********************************
;*******************************************************************************

KAYIT:
            WRITE 1,ORTAKSAAT :PAUSE 50
            WRITE 2,ORTAKDAK :PAUSE 50
            Lcdout $FE, 1
            Lcdout $FE, 1,"*Power  failure*"
MSISTEMKAPAT1:           
            IF DC=0 THEN GOTO MSISTEMKAPAT1 : PAUSE 500
            IF DC=0 THEN GOTO MSISTEMKAPAT1 : PAUSE 500
            IF DC=0 THEN GOTO MSISTEMKAPAT1 : PAUSE 500
            IF DC=0 THEN GOTO MSISTEMKAPAT1 : PAUSE 500
            IF DC=0 THEN GOTO MSISTEMKAPAT1 : PAUSE 500
goto KONTROL

;*******************************************************************************
;**************************       MENÜ        **********************************
;*******************************************************************************
AYARLAR_SIFIR:
         WHILE ENT=0:WEND
         ;HIGH EKRAN
         GOSUB ZAMANOKU
       
AYARLAR:
         Lcdout $FE,1
         LCDOUT $FE,$C0
         Lcdout $FE, 1,"1)Time  3)Clock"
         LCDOUT $FE,$C0,"2)Dst   4)Exit"
         LCDOUT $FE,$80:LCDOUT $FE,$0F:PAUSE 250
         PAUSE 50
         IF ENT=0 THEN ZAMAN_SAT
         IF AZALT=0 THEN YSU_AYARLARI_SIFIR
         IF ARTIR=0 THEN EXITSET
goto AYARLAR

YSU_AYARLARI_SIFIR:
         WHILE AZALT=0:WEND
         WHILE ARTIR=0:WEND
YSU_AYARLARI:
         LCDOUT $FE,$C0:LCDOUT $FE,$0F:PAUSE 250
         PAUSE 50
         IF AZALT=0 THEN ANALOG_AYARLAR_SIFIR
         IF ARTIR=0 THEN AYARLAR_SIFIR
goto YSU_AYARLARI




ANALOG_AYARLAR_SIFIR:
         WHILE AZALT=0:WEND
         WHILE ARTIR=0:WEND
ANALOG_AYARLAR:
         LCDOUT $FE,$88:LCDOUT $FE,$0F:PAUSE 250
         PAUSE 50
         IF ENT=0 THEN MOTOR_1_SAAT
         IF AZALT=0 THEN EXITSET
         IF ARTIR=0 THEN YSU_AYARLARI_SIFIR
goto ANALOG_AYARLAR

EXITSET:
         WHILE AZALT=0:WEND
EXITI:
         LCDOUT $FE,$C8:LCDOUT $FE,$0F:PAUSE 250
         PAUSE 50
         IF ENT=0 THEN SETA
         IF ARTIR=0 THEN ANALOG_AYARLAR_SIFIR
         IF AZALT=0 THEN AYARLAR_SIFIR
GOTO EXITI

;****************************   MENÜ AYARLARI  *********************************


ZAMAN_EKRAN:
         Lcdout $FE,1
         LCDOUT $FE,$C0
         Lcdout $FE, 1,"Time : ",DEC2 SAAT, ":", DEC2 DAK, " +", DEC2 FARK
         LCDOUT $FE,$C0,"Date : ",DEC2 AYGUN, "/", DEC2 AY, "/" , DEC2 YIL

RETURN

ZAMAN_SAT:
         WHILE ENT=0:WEND
ZAMAN_SAAT:
         GOSUB ZAMAN_EKRAN
         LCDOUT $FE,$88:LCDOUT $FE,$0F:PAUSE 250
         IF ENT=0 THEN ZAMAN_DAKSIFIR
         IF ARTIR=0 THEN
         SAAT=SAAT+1
         IF SAAT>23 THEN SAAT=00
         ENDIF                   
         IF AZALT=0 THEN
         SAAT=SAAT-1
         IF SAAT=255 THEN SAAT=23
         ENDIF
         GOTO ZAMAN_SAAT
         
'---------DAKİKA AYARLAMMA         
ZAMAN_DAKSIFIR:
        WHILE ENT=0:WEND
ZAMAN_DAK:
        GOSUB ZAMAN_EKRAN
         LCDOUT $FE,$8B:LCDOUT $FE,$0F:PAUSE 250
         IF ENT=0 THEN FARK_SAT
         IF ARTIR=0 THEN
           DAK=DAK+1
           IF DAK>59 THEN DAK=00
         ENDIF                   
         IF AZALT=0 THEN
           DAK=DAK-1
           IF DAK=255 THEN DAK=59
         ENDIF         
         GOTO ZAMAN_DAK
         
         
FARK_SAT:
         WHILE ENT=0:WEND
'---------SAAT AYARLAMMA
FARK1:
         GOSUB ZAMAN_EKRAN
         LCDOUT $FE,$8F:LCDOUT $FE,$0F:PAUSE 250
         IF ENT=0 THEN ZAMAN_TARIHSIFIR
         IF ARTIR=0 THEN
         FARK=FARK+1
         IF FARK>5 THEN FARK=00
         ENDIF                   
         IF AZALT=0 THEN
         FARK=FARK-1
         IF FARK=255 THEN FARK=00
         ENDIF
         GOTO FARK1
         
'---------AYGÜN AYARLAMMA         
ZAMAN_TARIHSIFIR:
                 WHILE ENT=0:WEND
ZAMAN_AYGUN:
        GOSUB ZAMAN_EKRAN
         LCDOUT $FE,$C8:LCDOUT $FE,$0F:PAUSE 250
         IF ENT=0 THEN ZAMAN_AYSIFIR     
         IF ARTIR=0 THEN
           AYGUN=AYGUN+1
           IF AYGUN>31 THEN AYGUN=31
         ENDIF                   
         IF AZALT=0 THEN
           AYGUN=AYGUN-1
           IF AYGUN=0 THEN AYGUN=1
         ENDIF         
         GOTO ZAMAN_AYGUN
         
'---------AY AYARLAMMA         
ZAMAN_AYSIFIR:
              WHILE ENT=0:WEND
ZAMAN_AY:

        GOSUB ZAMAN_EKRAN
        LCDOUT $FE,$CB:LCDOUT $FE,$0F:PAUSE 250
        IF ENT=0 THEN ZAMAN_YILSIFIR 
        IF ARTIR=0 THEN
            AY=AY+1
        IF AY>12 THEN AY=12
        ENDIF                   
        IF AZALT=0 THEN
            AY=AY-1
        IF AY=0 THEN AY=1
        ENDIF         
GOTO ZAMAN_AY
         
'---------YIL AYARLAMMA
ZAMAN_YILSIFIR:
        WHILE ENT=0:WEND
ZAMAN_YIL:
        GOSUB ZAMAN_EKRAN
         LCDOUT $FE,$CE:LCDOUT $FE,$0F:PAUSE 250
        IF ENT=0 THEN
        SN=0 
        WRITE 7,FARK :PAUSE 100
        GOSUB ZAMANYAZ
        GOTO GPSEKRANI_1
        ENDIF
        IF ARTIR=0 THEN
            YIL=YIL+1
        IF YIL>99 THEN YIL=99
        ENDIF                   
        IF AZALT=0 THEN
            YIL=YIL-1
        IF YIL=255 THEN YIL=0
        ENDIF         
GOTO ZAMAN_YIL
'---------GPS EKRANI
GPSEKRANI_1:
WHILE ENT=0:WEND
GPSEKRANI:
HSERIN 500,Nogps,[wait("$GPRMC"),wait(","),DEC2 hh,DEC2 mm,DEC2 ss,wait(","),fix]
Lcdout $FE, 1,"   -GPS TIME-   "
LCDOUT $FE,$C0,"Time : ",DEC2 hh, ":", DEC2 mm, ":", DEC2 ss
IF ARTIR=0 AND AZALT=0 THEN gosub GPSKAYIT
IF ENT=0 THEN ZAMAN_BITIR
PAUSE 500
GOTO GPSEKRANI

       
'---------ZAMAN AYARLAMMAYI BİTİR
ZAMAN_BITIR:
       
        SN=0
        GOSUB ZAMANYAZ
        ESKISN=99
        GOSUB ZAMANOKU
        WRITE 7,FARK :PAUSE 100
GOTO AYARLAR   
;*******************************************************************************
;***************************   ANALOG SAAT AYARLARI    *************************
;*******************************************************************************

MOTOR_1_SAAT:
        WHILE ENT=0:WEND
MOTOR_1_SAAT_SET:
        Lcdout $FE,1
        LCDOUT $FE,$C0
        Lcdout $FE, 1,"   FULL CLOCK   "
        LCDOUT $FE,$C0,"CLOCK : ",DEC2 ORTAKSAAT, ":", DEC2 ORTAKDAK
        LCDOUT $FE,$C8:LCDOUT $FE,$0F:PAUSE 250
       
        IF ENT=0 THEN MOTOR_1_DAK
        IF ARTIR=0 THEN
           ORTAKSAAT=ORTAKSAAT+1
           IF ORTAKSAAT>23 THEN ORTAKSAAT=00
        ENDIF                   
        IF AZALT=0 THEN
           ORTAKSAAT=ORTAKSAAT-1
           IF ORTAKSAAT=255 THEN ORTAKSAAT=23
        ENDIF         
GOTO MOTOR_1_SAAT_SET
         
'---------MOTOR 1 DAKİKA SET
MOTOR_1_DAK:
          WHILE ENT=0:WEND
MOTOR_1_DAK_SET:
        Lcdout $FE,1
        LCDOUT $FE,$C0
        Lcdout $FE, 1,"   FULL CLOCK   "
        LCDOUT $FE,$C0,"CLOCK : ",DEC2 ORTAKSAAT, ":", DEC2 ORTAKDAK
        LCDOUT $FE,$CB:LCDOUT $FE,$0F:PAUSE 250
        IF ENT=0 THEN MANUELSET
        IF ARTIR=0 THEN
            ORTAKDAK=ORTAKDAK+1
        IF ORTAKDAK>59 THEN ORTAKDAK=00
        ENDIF                   
        IF AZALT=0 THEN
            ORTAKDAK=ORTAKDAK-1
        IF ORTAKDAK=255 THEN ORTAKDAK=59
        ENDIF         
GOTO MOTOR_1_DAK_SET

MANUELSET:
          WHILE ENT=0:WEND

        Lcdout $FE,1
        LCDOUT $FE,$C0
        Lcdout $FE, 1,"   1st  Clock   "
        LCDOUT $FE,$C0,"Up=1 - Down=1/4"
        PAUSE 10
       
MANUEL:
       
IF ARTIR=0 THEN       
            FOR X=1 TO 3200 
                HIGH CLOK: PAUSEUS 100
                LOW CLOK: PAUSEUS 100
           
            NEXT
ENDIF

IF AZALT=0 THEN       
            FOR X=1 TO 800 
                HIGH CLOK: PAUSEUS 100
                LOW CLOK: PAUSEUS 100
           
            NEXT
ENDIF

IF ENT=0 THEN
gosub EPROOM_YAZ
goto AYARLAR_SIFIR
ENDIF
GOTO MANUEL

EKRANSIL:
        Lcdout $FE, 1
        Lcdout $FE, 1
RETURN
       

;*******************************************************************************
;***************************    EPROOM  AYARLARI  ******************************
;*******************************************************************************

EPROM_OKU:

        READ 1, ORTAKSAAT
        READ 2, ORTAKDAK
        READ 3, FARK

RETURN
'---------EPROM YAZ
EPROOM_YAZ:
        WRITE 1,ORTAKSAAT :PAUSE 100
        WRITE 2,ORTAKDAK :PAUSE 100
        WRITE 3,FARK :PAUSE 100

RETURN
;*******************************************************************************
;*******************************************************************************
;*******************************************************************************
ZAMANOKU:
        I2CRead SDA,SCL,$D0,$00,[SECOND,MINUTE,HOUR,WEEK,DAY,MONTH,YEAR]',TEMP]                 
        sn =((SECOND>>4) & $0F)*10+(SECOND & $0F)
        IF SN=ESKISN THEN RETURN
        dak=((MINUTE>>4) & $0F)*10+(MINUTE & $0F)
        SAAT=((HOUR>>4) & $03)*10+(HOUR & $0F)
        HAFGUN=((WEEK>>4) & $03)*10+(WEEK & $0F)
        AYGUN=((DAY>>4) & $03)*10+(DAY & $0F)
        AY= ((MONTH>>4) & $01)*10+(MONTH & $0F)
        YIL= ((YEAR>>4) & $0F)*10+(YEAR & $0F)         
        ESKISN=sn
RETURN
'---------SAAT KAYDET                       
ZAMANYAZ:
        SECOND =(SN DIG 1)<<4+SN DIG 0
        MINUTE=(DAK DIG 1)<<4+DAK DIG 0
        HOUR=(SAAT DIG 1)<<4+SAAT DIG 0
        WEEK=(HAFGUN DIG 1)<<4+HAFGUN DIG 0       
        DAY=(AYGUN DIG 1)<<4+AYgun DIG 0
        MONTH = (AY DIG 1)<<4 + AY DIG 0
        YEAR =(YIL DIG 1)<<4+YIL DIG 0       
        I2CWrite SDA,SCL,$D0,$00,[SECOND,MINUTE,HOUR,WEEK,DAY,MONTH,YEAR,0]
        PAUSE 10
RETURN
;*******************************************************************************
;**************************         GPS           ******************************
;*******************************************************************************
GPSKAYIT:
            HSERIN 1500,Nogps,[wait("$GPRMC"),wait(","),DEC2 hh,DEC2 mm,DEC2 ss,wait(","),fix]
            ;Lcdout $FE, 1,"   * ERZETA *   "
            ;LCDOUT $FE,$C0,"GMT : ",DEC2 SAAT, ":", DEC2 DAK,":", DEC2 SN
            IF fix="A" THEN
            GOSUB GP_KAYIT
            else
            GOSUB Nofix
            endif

RETURN

GP_KAYIT:
    LCDOut $FE, 1
    LCDOut $FE, 1,"GPS BAGLANDI"
    LCDOut $fe,$c0,"VERI ALINIYOR.."
    Pause 1500
IF hh>23 THEN GOTO AYARLA
IF mm>59 THEN GOTO AYARLA
IF ss>59 THEN GOTO AYARLA
SAAT= hh+FARK
        DAK=mm
        SN=ss
        PAUSE 100
        gosub ZAMANYAZ
    LCDOut $FE, 1
    LCDOut $FE, 1,"GPS BAGLANDI"
    LCDOut $fe,$c0,"SENKRON EDiLDi"
    Pause 1500
RETURN
Nogps:
    LCDOut $FE, 1
    LCDOut $FE, 1,"GPS ALGILANAMADI"
    LCDOut $fe,$c0,"LUTFEN GPS TAKIN"
    Pause 2500
RETURN


Nofix:
     LCDOut $FE, 1
    LCDOut $FE, 1, "GPS BAGLANAMADI"
    LCDOut $fe,$c0," GECERSIZ DATA "
    Pause 2000
RETURN
;*******************************************************************************
;********************   ENERJİ KESİNTİ ALGILAMA  *******************************
;*******************************************************************************

ete

İlk defa böyle bir hata görüyorum. 16F877 ile 16F877A arasındaki fark CMCON (komparatör) dür. 877A da komparatör var diğerinde yoktur. Derlemeden önce yukarıda 16F877A nın seçilmiş olduğundan emin olmanız gerek.
Şayet seçim doğru ve derlemede bu hata çıkmaya devam ediyor ise muhtemelen Basic derleyicide bir sorun olabilir. Yada 16F877A.INC dosyasında nebileyim LIB dosyalarında sorun olabilir. Şayet PBP 2.60 versiyon kullanıyorsanız A-B-C yamalarınıda uygulamış olmanız gerekir. Bu yamaların olmamasıda sorun yaratabilir.
Ete

İlyas KAYA

config ayarlarını silince derliyor. ASM ENDASM olarak değilde şu şekilde deneyin.

bu satırı ;

asm
__config _HS_OSC & _WDT_OFF & _PWRTE_OFF & _LVP_OFF & _CP_OFF
endasm


bununla değiştirin.

#CONFIG
      __config _HS_OSC & _WDT_OFF & _LVP_OFF  & _CP_ON & _PWRTE_OFF
#ENDCONFIG
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Powered by EzPortal