pic 16f877 ile pic16f74 arasında

Başlatan ruzgar78, 18 Haziran 2014, 10:05:40

ruzgar78

HOCAM SIZIN ISI KONTROL PROGRAMINIZI 16F877 DE DERLİYORUM Bİ SIKINTI YOK FAKAT İŞLEMCİYİ 16F74 SEÇTİĞİM ZAMAN
DERLEME SONUCU  EEPGD-WREN-EECON2-WR HATALARI ALIYORUM VE DOLAYSIYLA DERLEYEMİYORUM. SORUN NE OLABİLİR ACABA

PROGRAM ŞÖYLE ;
@ __config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _BODEN_OFF

OPTION_REG.7=1    'Dahili pull-up lar iptal edildi
ADCON1=7 ' 'ADC GİRİŞLERİ DİGİTAL

DEFINE LCD_DREG      PORTB   'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT      4      'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG   PORTB   'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   2      'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG      PORTB   'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT      3      'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS      4      'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES   2      'LCD Kaç sıra yazabiliyor
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 100
ADCON1=%10001110

PortA=0
TrisA=%000000
PortB=0
TrisB=%00000001
PORTD=0
TRISD=%00000000
PORTC=0
TRISC=%00000000
PortE=0
TrisE=%00000011
; OUTPUT DEĞİŞKENLER
SYMBOL ISI_ROLE = PORTA.0
SYMBOL FAN_ROLE = PORTA.2
SYMBOL GAZ_ROLE = PORTA.3
; INPUT  DEĞİŞKENLER
SYMBOL START = PORTE.0
SYMBOL STOPP = PORTE.1
SYMBOL GAZ = PORTB.0


ILK     VAR     BIT
    Y       VAR     BIT
    ISI1    VAR     BYTE       
    ISI2    VAR     BYTE       
    ALARM1  VAR     BYTE       
    ALARM2  VAR     BYTE       
    Z       VAR     BYTE
    ALRM    VAR     BYTE
    SEC     VAR     BYTE
    EK      VAR     BYTE
    TSET    var     word
    TSEN    var     word
    ALT     VAR     WORD

'-----------------------------
    Busy        VAR BIT         ' Busy Status-Bit
    HAM         VAR   WORD        ' Sensör HAM okuma değeri
    ISI         VAR WORD        ' Hesaplanmış ISI değeri
    Float       VAR WORD        ' Holds remainder for + temp C display
    X           VAR WORD       
    SIGN_BITI   VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
    NEGAT_ISI   CON 1           ' Negatif_Cold = 1
    Deg         CON 223         ' ° işareti
    SIGN        VAR BYTE        '  ISI değeri için  +/-  işaret
    ISARET      VAR BYTE
    TEMP        VAR BYTE         ' Div32 bit hesap için geçici değişken
    Comm_Pin    VAR   PORTA.1



'-----------------------------B A Ş L A N G I Ç ---------------------------     
      PORTB=0:PORTA=0
      CLEAR:TRISA=%00000010:TRISB=%00000001:TRISC=%00000000:TRISD=%00000000:TRISE=%00000011:ADCON1=7:Z=1:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    LCDOUT $FE,1
    PAUSE 500:ISARET="+"
    LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
    LCDOut $FE,$80,"SISTEM ACILIYOR"
    lcdout $FE,$C0,"LUTFEN BEKLEYIN."
       PAUSE 3000

     GOSUB OKU
    IF ALT>400 THEN
       ALT=005:GOSUB YAZ:ENDIF
SEC=0:gosub SENSOROKU:GOSUB EKRAN1 
'-------------------------------------------------------------------------------

BASLA:
  WHILE GAZ=0
  GOSUB SENSOROKU
  IF GAZ=0 THEN GOSUB EKRAN3
  IF  FAN_ROLE=1 AND ISI_ROLE=1 AND Y=1 AND ALRM=1 AND GAZ=0 THEN GOSUB EKRAN2
   WEND

       
        IF (START AND STOPP) = 0 THEN  GOTO IKIBIR
     
        HAM=0   
        GOSUB SENSOROKU
        tsen=ISI
          GOSUB EKRAN1
         
     
     
         
       
   
     
       
'--------------------ISI KONTROL RUTİNİ ----------------------
   
 
      TSET=ALT:TSEN=ISI

       IF Y=0 THEN
            IF TSEN=>TSET THEN
                if SIGN="+" and ISARET="+" then
                    GOSUB AC:GOTO ATLA
                ENDIF
             ENDIF
               
            ;IF SIGN="-" AND ISARET="+" THEN
               ; GOSUB AC:GOTO ATLA
            ENDIF
           
           ; IF TSET=<TSEN THEN
              ; IF sign="-" and isaret="-" then
                  ; GOSUB AC:GOTO ATLA
                ;ENDIF
           ; ENDIF   
      ; ENDIF
                             
       IF Y=1 THEN
       READ 1,EK:PAUSE 10
          IF TSEN<(TSET+EK) THEN
             IF sign="+" and isaret="+" then           
               GOSUB KAPA:GOTO ATLA
             ENDIF   
          ENDIF
         
          ;IF SIGN="+" AND ISARET="-" THEN
             ; GOSUB KAPA:GOTO ATLA
         ; ENDIF
          READ 1,EK:PAUSE 10
          ;IF (TSET-EK)>TSEN THEN
             ;IF sign="-" and isaret="-" then             
                ; GOSUB KAPA:GOTO ATLA
             ;ENDIF
          ;ENDIF     
       ENDIF
       ; GAZ ÇIKIŞI
 
           
ATLA:   Z=1
       pause 50
       ; GAZ
       IF GAZ=0 THEN
       GOSUB GAZZ
       ELSE
       GAZ_ROLE=0
       ENDIF
        GOTO BASLA   
'------------------------------------------------------------------
 
AC:     FAN_ROLE=1:ISI_ROLE=1:Y=1:ALRM=1
       Z=0:ILK=0:PAUSE 200
       
        RETURN

KAPA:   FAN_ROLE=0:ISI_ROLE=0:Y=0:ALRM=0       
        Z=0:ILK=0:PAUSE 200
        RETURN

DURUM:  IF ALRM=0 THEN
           low FAN_ROLE
        ELSE
           HIGH FAN_ROLE
        ENDIF
        Z=0       
        RETURN
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:   

        gosub SENSOROKU
       
         IF  FAN_ROLE=1 AND ISI_ROLE=1 AND Y=1 AND ALRM=1 THEN
         GOSUB EKRAN4
         ELSE
        LCDOUT $FE,$2,"I S I: ",Sign,DEC2 ISI1,",",DEC1 ISI2," ",Deg,"C    "
        lcdout $FE,$C0,"ISI & GAZ NORMAL"
     
        'saat:dakika:saniye şeklinde zamanı yazdı.
       Pause 300
       ENDIF
       
       return
  EKRAN2:   
 
       
        LCDOUT $FE,$2,"GAZ VE ISI       "
        lcdout $FE,$C0,"ALGILANDI       "
       
         
     RETURN
       
     
        EKRAN4:
        GOSUB SENSOROKU
          LCDOUT $FE,$2,"I S I: ",Sign,DEC2 ISI1,",",DEC1 ISI2," ",Deg,"C    "
           lcdout $FE,$C0,"PENCERE ACILDI.."
         
        RETURN
     
       EKRAN3:
       GOSUB SENSOROKU
          LCDOUT $FE,$2,"I S I: ",Sign,DEC2 ISI1,",",DEC1 ISI2," ",Deg,"C    "
           lcdout $FE,$C0,"GAZ ALGILANDI..."
           RETURN
     
'-------------------------------------------------------------------------------       
SECIM:
   
      
RETURN

IKIBIR:
       
        LCDOUT $FE,$C0:
        ALARM1=ALT/10:ALARM2=ALT//10
       LCDOut " S E T: ",isaret,DEC2 ALARM1 , "," , DEC1 ALARM2," ",Deg,"C    "
   
        IF START=0 THEN
           IF isaret="-" THEN
           PAUSE 50
             alt=alt-1
             IF alt=65535 THEN
             PAUSE 50
                alt=1:isaret="+"
             ENDIF   
             GOTO ARACIK
           ENDIF
           PAUSE 50
        ALT=ALT+1 
        ENDIF
       
         
                IF  STOPP=0 THEN
                 WHILE STOPP=0 :WEND
 
            GOTO ARACIK
         ENDIF                 
     GOTO IKIBIR     
RETURN
                 
ARACIK: GOSUB YAZ:PAUSE 10

; GAZ
GAZZ:
GAZ_ROLE=1
                 
RETURN
'------------------------------- İŞLEM START -----------------------------------
SENSOROKU:
           OWOUT  ADCON1, 1, [$CC, $10]' ISI değerini oku
       
           
           
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle  ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
'----------------------ISI HESAP ALT PROGRAMI-----------------------------------         
Hesapla:                 
    Sign  = "+"
    IF SIGN_BITI = NEGAT_ISI THEN
       Sign   = "-" 
       Temp=625*(~HAM+1)
       ISI  = DIV32 1000
       GOTO GEC   
    endif
    TEMP = 625 * (HAM+1)       
    ISI = DIV32 1000         
GEC:
    ISI2 = (ISI //10)
    ISI1=ISI/10
    RETURN

         
OKU:   READ 8,ALT.BYTE0:PAUSE 20:READ 9,ALT.BYTE1:PAUSE 20:READ 10,ISARET:PAUSE 10
       if isaret<>"-" or isaret <>"+" then isaret="+"
       RETURN
       
YAZ:   WRITE 8,ALT.BYTE0:PAUSE 20:WRITE 9,ALT.BYTE1:PAUSE 20:WRITE 10,ISARET:PAUSE 10
       RETURN 
     


ete

Belliki iki işlemci arasında donanım uyumsuzluğu var. 16F74 ilk defa ismini duyduğum bir işlemci.
İkisininde data sheet'ini açıp programda kullanılan özellikleri karşılaştırmak lazım.
Anladığım kadarı ile 16F74 de farklı registerlerin ayarlanması gerekiyor. Şu anda buna bakacak vaktim yok maalesef.
Data sheetleri sen karşılaştır.
Ete

ruzgar78


onurinci

Hocamın programı eeprom'a bazı değerler kaydediyor.
F74 ise içinde eeprom barındırmayan daha ucuz bir işlemci.bu registeri desteklemediği için
derleyemiyorsunuz.

ruzgar78

Datasheet lerine baktım 16f74 de EEPROM yok flash var flash a nasıl kaydederiz kodları nasıl olamalı bunu araştırıyorum

Powered by EzPortal