16F1827 yeni nesil pic.

Başlatan F®T, 30 Aralık 2014, 19:21:59

BİDİL

Çıkış almayı başardım.595 sürmeye çalışıyorum. 628A ile yaptığım devre üzerinde derece yapmak için tercih ettim bu entegreyi. Portb den tek tek çıkış aldım ama SHIFTOUT komutunu çalıştıramıyorum.Isı değişkenine 18 sayısını tanımladım ama displayde hareket yok. Programın çalıştığından emin olmak için boş bir pinde led yakıp söndürüyorum.Anlam veremedim açıkçası.
DEFINE OSC 8

ASM
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
  __config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _LVP_OFF & _STVREN_OFF
ENDASM
PORTB=0:PORTA=0
TRISA=0:TRISB=0

OSCCON=%01110010
;CCP1CON = %00111010    'PLL enabled, Internal RC-8MHz
INTCON.7=0
ADCON0 = %00000000      'select channel AN0, ADC off
ADCON1 = %00000000      'Internal Frc, Left justified, Ext. ref.
OPTION_REG.7=1 'PULL-UP LAR PASİF
ANSELA=0       'TÜM PORTA DİJİTAL PİN OLACAK
ANSELB=0       'TÜM PORTA DİJİTAL PİN OLACAK                     
CM1CON0=0      'KOMPARATORLER KAPATILACAK
CM2CON0=0      'KOMPARATORLER KAPATILACAK
DACCON0.7=0
RCSTA=0
FVRCON.7=0
SRCON0.7=0
           
ISI      VAR BYTE
index    VAR BYTE
X        VAR WORD 
SAYI     VAR BYTE

SYMBOL  DTA=PortB.0
SYMBOL  CLK=PORTB.1
SYMBOL LED=PORTB.6

ISI=18

BASLA:
       HIGH LED
       X= (ISI DIG 1):GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 5:LOW PORTB.2
       
       X= (ISI DIG 0):GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.3:PAUSEUS 5:LOW PORTB.3
             
       X=10:GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 5:LOW PORTB.4
             
       X=11:GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.5:PAUSEUS 5:LOW PORTB.5
       PAUSE 500
       LOW LED
       PAUSE 500
GOTO BASLA

AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN

BİDİL

portb.0 nin sürekli high olması normalmi? yoksa çakışan bir özellikmi var?

F®T

SRCON0=0
SRCON1=0

bunlarıda bir ekleyip bakarmısın.Nedense dediğin gibi portb.0 bir pozisyonunda kalıyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

BİDİL

#63
595'in clock input  ile data input'un yerlerini değiştirdim düzeldi. Teşekkür ederim. 628a da bu değişikliğe ihtiyaç duymadan çalışıyor çok ilginç.

F®T

Bu entegre baya bir özelliklere sahip zaptetmek zor oluyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

BİDİL

Hocam bu entegrede baya tecrübeniz var işin sonuna geldim sanırım adc konusunda yardımcı olursanız sevinirim. Lm35  AN1 e girdim dereceyi gösterebilirmiyim diye, baya yol aldım ancak ölçüm yapamadım. Eksikler neler bakarsanız sevirim.
DEFINE OSC 8

ASM
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
  __config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _LVP_OFF & _STVREN_OFF
ENDASM
PORTB=0:PORTA=0
TRISA=%00000010:TRISB=0

OSCCON=%01110010
;CCP1CON = %00111010    'PLL enabled, Internal RC-8MHz
INTCON.7=0

DEFINE ADC_BITS 10' Set number of bits in result (8, 10 or 12)
DEFINE ADC_CLOCK 3 ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds             
ANSELA = %00000010           ' AN1 on Port A analog
ANSELB = %00000000           ' Digital inputs
ADCON0 = %00000111      'select channel AN0, ADC off
ADCON1 = %01110000      'Internal Frc, Left justified, Ext. ref.
ADCON1 =%10010000      '10 bit okuma,fosc32,vref- vss,vref+ vdd

;FVRCON =0              'voltaj referanslarını iptal ediyoruz                     


DACCON0=0   
OPTION_REG.7=1 'PULL-UP LAR PASİF
;ANSELA=0       'TÜM PORTA DİJİTAL PİN OLACAK
;ANSELB=0       'TÜM PORTA DİJİTAL PİN OLACAK                     
CM1CON0=0      'KOMPARATORLER KAPATILACAK
CM2CON0=0      'KOMPARATORLER KAPATILACAK
DACCON0.7=0
RCSTA=0
;FVRCON.7=0
SRCON0.7=0
WPUB=0
           
HAM      VAR     WORD           
ISI      VAR     WORD
ONDA VAR WORD
index    var     BYTE
X        VAR WORD 
SAYI     VAR BYTE
TOPLAM VAR WORD
I VAR BYTE

SYMBOL  DTA=PortB.1
SYMBOL  CLK=PORTB.0


SET:
GOSUB ISIOLC
GOSUB BASLA
GOTO SET

BASLA:

       X= (ISI DIG 1):GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 5:LOW PORTB.2
       
       X= (ISI DIG 0):GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.3:PAUSEUS 5:LOW PORTB.3
             
       X=10:GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 5:LOW PORTB.4
             
       X=11:GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.5:PAUSEUS 5:LOW PORTB.5

GOTO BASLA

AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN

ISIOLC:
TOPLAM=0
FOR I=1 TO 10
ADCIN 1,HAM
TOPLAM=TOPLAM+HAM
NEXT I
HAM=TOPLAM/10
ISI=(Ham*/256)/125
ONDA=ISI//10
RETURN

F®T

TRISA =%00000010:PORTA=0 
TRISB =%00000000:PORTB=0   
ANSELA=%00000010     
ANSELB=%00000000     
ADCON0=%01111111
ADCON1=%11110011
PIE1=0
PIR1=0
MDCON = 0
CM1CON0=0
CM2CON0=0
CM1CON1=0
CM2CON1=0
CPSCON0=0
APFCON0=0         
FVRCON =0                               
DACCON0=0             
DACCON1=0
SRCON0=0                   
SRCON1=0             
MDCON=0               
MDSRC=0                               
MDCARH=0             
MDCARL=0
WPUB=0   


ben bu ayarlarla ölçüyorum.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

BİDİL

Hocam 16f1827'nin Adcon1 registerinde yer alan bilgilerle aşağıdaki kodlar aynı anlam taşımıyormu? Bu entegrede bu komutlara gerek varmı?
DEFINE ADC_BITS 10 'A/D çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 1 'Clock kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 100 'Şarj zamanı mikro saniye cinsinden.

F®T

Mantıken aynı işi yapıyor ama ben yinede  kullanıyorum.Birisini kullanmak yeterli olmalı ama tam olarak bilmiyorum.ETE hocam bu konuyu aydınlatırsa seviniriz.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

BİDİL

#69
hocam başınızı ağrıtıyorum kusura bakmayın lütfen. Adc için kullandığınız kodlarda Adcon1 registeının 0ve1 bitlerinde pozitif voltaj referensını FVR modülünü referans göstermişsiniz ancak FVR modülünü kapatmışsınız. Pek işin içinden çıkamadım aydınlatırsanız sevinirim. ADC olayını çözemedim bu pic de.

BİDİL

Adc konusunda pek başarılı olamadım hocam ne yapsam olmadı.Pes etmedim ama yıldım bu entegreden ???. Fenada olmadı aslında baya birşeyler öğrendim mesela datasheetinde hangi regıster kaçıncı sayfada hepsini ezbere biliyorum artık  ;D :'( güleyimmi ağlayayımmı bilemdim.

DEFINE OSC 4
ASM
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
  __config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _LVP_OFF & _STVREN_OFF
ENDASM

OSCCON = %01101010          '4 mhz internal clock, PLL off



DEFINE ADC_BITS 10 ' 10 bit A/D Conversion
DEFINE ADC_CLOCK 4
DEFINE ADC_SAMPLEUS 50 ' 50 uS A/D sample time

TRISA = %00000010           'RA0 input, all others output
TRISB = %00000000


ANSELA =%00000010      ' AN2 on PortA.2 analog
ANSELB =%00000000      ' Digital inputs
ADCON0=%00000101
ADCON1=%11100000          'right justified, clock = fosc/64, neg ref = Vss, pos ref = FVR
FVRCON = 0
DACCON0 = 0
DACCON1 = 0
INTCON = 0
CM1CON1 = 0

HAM      VAR     WORD           
ISI      VAR     WORD
ONDA VAR WORD
index    var     BYTE
X        VAR WORD 
SAYI     VAR BYTE
TOPLAM VAR WORD
I VAR BYTE

SYMBOL  DTA=PortB.1
SYMBOL  CLK=PORTB.0


BASLA:
TOPLAM=0
FOR I=1 TO 10
ADCIN 1,HAM
TOPLAM=TOPLAM+HAM
NEXT I
HAM=TOPLAM/10
ISI=(Ham*/256)/125
ONDA=ISI//10

       X= (ISI DIG 1):GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 5:LOW PORTB.2
       
       X= (ISI DIG 0):GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.3:PAUSEUS 5:LOW PORTB.3
             
       X=10:GOSUB AL
       ;X= (ISI DIG 3):GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 5:LOW PORTB.4
             
       X=11:GOSUB AL
       ;X= (ISI DIG 2):GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.5:PAUSEUS 5:LOW PORTB.5
       PAUSE 200
GOTO BASLA

AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN

END

ete

#71
Data sheet'i okumak yetmiyor bazende yorumlamak gerekiyor.

Programın başından itibaren incelemeye başlarsak;
OSCCON = %01101010 şeklinde değer verilmiş bir OSCCON registeri var. bit1  sistem CLK select bit demiş adam. Siz 1 vermişsiniz bu sistem CLK olarak TMR1 seçilecek anlamına geliyor. Halbuki 0rada
00 = Clock determined by FOSC<2:0> in Configuration Word 1. şeklinde bir seçim yapılmalı idi.
Doğrusu OSCCON = %01101000 olacak.

ADC işlemlerinde 4Mhz çalışma frekansında genelde ADC CLK seçimi için OSC/8 terih edilir. Data Sheet Tablo 16-1 de zaten uyumlu seçim değerleri gösterilmiştir. Siz CLK 4 yan OSC/4  seçmişsiniz yanlış değil ancak daha iyisi CLK 1 olmalı.
Birde Define komutlarındaki ADC CLK seçimi ile ADCON1  registerindeki bir biri ile uyumlu olmalıdır aksi halde bir diğerini bozar.
Bu iş ya define komutkarı ile yapılmalı yada ADCON1 registeri ile yapılmalıdır.

Acquistation time yada örnekleme zamanı dediğimiz şey yine data sheet 149 cu sayfada hesaplanmıştır. Buna göre süre 4,42 us olarak bulunmuştur. Buna uygun olarak süre define komutunda 50us değil 5us alınması daha uygun olacaktır.

ADCON0 registerinin yaptığı işi Basic derleyicisi hallettiği için ona değer vermemek gerekiyor. Onu siliyoruz programdan.
ADCON1 registerine de  ADCON1=%10010000 şeklinde değer veriyoruz. Böylece define komutu ile paralel bir seçim yapmış olacağız.

Bu işlemcide Special Event Trigger diye bir brim var (CCPx/ECCPx) şayet bu trigger set edilirse sistem sizin ADC seçimlerinize bakmaksızın TMR1 is sıfırlayarak arada bir ADC ölçümü alıyormuş Bunu engellemek için CCP1CON=0 ve CCP2CON=0 vermek gerekiyor. Yada en azından 226 cı sayfada yer alan  (bit 3-0 CCPxM<3:0>: ECCPx Mode Select bits)  compare mod special event trigger set edilmemelidir.
Bunların dışında pek başka bir şey göremedim.

Düzeltilmiş program aşağıdadır. Deneyin bakalım sonuç ne olacak.

Ete

DEFINE OSC 4
ASM
  __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
  __config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _LVP_OFF & _STVREN_OFF
ENDASM

OSCCON = %01101000          '4 mhz internal clock, PLL off


DEFINE ADC_BITS 10 ' 10 bit A/D Conversion
DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 5 ' 5 uS A/D sample time

TRISA = %00000010           'RA1 input, all others output
TRISB = %00000000


ANSELA =%00000010      ' AN1 on PortA.1 analog
ANSELB =%00000000      ' Digital inputs
'ADCON0=%00000101
ADCON1=%10010000          'right justified, clock = fosc/8, neg ref = Vss, pos ref = vdd
FVRCON = 0
DACCON0 = 0
DACCON1 = 0
INTCON = 0
CM1CON1 = 0
CCP1CON=0
CCP2CON=0

HAM      VAR     WORD           
ISI      VAR     WORD
ONDA     VAR     WORD
index    var     BYTE
X        VAR     WORD 
SAYI     VAR     BYTE
TOPLAM   VAR     WORD
I        VAR     BYTE

SYMBOL  DTA=PortB.1
SYMBOL  CLK=PORTB.0


BASLA:
TOPLAM=0
FOR I=1 TO 10
ADCIN 1,HAM
TOPLAM=TOPLAM+HAM
NEXT I
HAM=TOPLAM/10
ISI=(Ham*/256)/125
ONDA=ISI//10

       X= (ISI DIG 1):GOSUB AL
       SHIFTOUT DTA,CLK,1,[SAYI]
       HIGH PORTB.2:PAUSEUS 5:LOW PORTB.2
       
       X= (ISI DIG 0):GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.3:PAUSEUS 5:LOW PORTB.3
             
       X=10:GOSUB AL
       ;X= (ISI DIG 3):GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.4:PAUSEUS 5:LOW PORTB.4
             
       X=11:GOSUB AL
       ;X= (ISI DIG 2):GOSUB AL
       SHIFTOUT  DTA,CLK,1,[SAYI]
       HIGH PORTB.5:PAUSEUS 5:LOW PORTB.5
       PAUSE 200
GOTO BASLA

AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN

END





BİDİL

Maalesef sonuç alamadım hocam .LM35 5 voltu ile gnd sini picin 5 voltuna ve gng sine bağlıyorum out pinini porta.1 (An1) veriyorum ekran sürekli 00. An1 den lm35 in out çıkışını ayırıp elimle bu porta değdiğimde birkaç değer gösteriyor. Porta.0 da da denedim sonuç aynı. Birde LM 35 değiştirmeyi deneyeceğim şimdi.
Saygılar.

ete

(Ham*/256)/125 işleminden ne elde etmeyi planlıyorsun acaba?
Ham */256 şeklindeki bir ifade bence yanlış. Zira */ operatörü zaten yanındaki sayı ile çarpılıp 256 ya bölünmesini sağlıyor.
Sonuçta (Ham*/256)/125 şeklindeki eşitlik ile ham/125 aynı şey olur. Zira HAm değeri 256 ile çarpıp 256 ya bölüyorsun. Sonra kalanı tekrar 125'e bölüyorsun orada. Bu durumda Lm35  derece başına 0,1V üreteceğine göre  125 derece sıcaklığa kadar hesaplayacağın ISI değeri hep sıfır olacaktır. Bence program doğru çalışıyor ama formülün yanlış.

Ondalık kısım word olarak tanımlanmış buda yanlış Byte olsa yeterli olurdu.

Doğru formül aşağıdaki şekilde olmalı bununla bir denersen sonucu göreceksin muhtemelen.

ISI=(Ham*/12431)/10

Ete

BİDİL

#74
Adc ölçüm yapıyormuş demek hocam.  :) verdiğiniz hesapta adc pininde 0.24 volt varken 52 derece gibi büyük bir rakam çıkıyor. gerçi okuduya yeter.

Powered by EzPortal