18F4620 ADC kullandığım zaman devrenin çalışması bozuluyor.

Başlatan M.A.A, 02 Şubat 2016, 19:07:41

M.A.A

Merhaba Arkadaşlar

Gerçek devre üzerinde çalışıyorum. Şebeke gerilimini aşağıdaki gibi ölçüyorum. 8 mhz dahili osilotor kullanıyorum. Devre şemam aşağıdaki gibi. Ana çevrimde ADC ölçümü yapmadan ekrana yazılar bastırıyorum, ana döngüde hesaplar yaptırıyorum, 1 saat çalışıyor sorun yok. Ama ana döngüye ADC ölçümü koyup, ekrana değerler bastırırken başta herşey normal oluyor, yaklaşık 1 dk sonra ölçü aleti ile kart girişimden NÖTR faz arasını ölçtüğüm zaman ekran karışıyor, sonra yazılar tamamen gidiyor. Bu şekilde 10 dk beklersem pic programer pici görmez oluyor. ( yeni yazılım atamıyorum), elektrikten çekip bir süre bekleyince her şey normale dönüyor.

Sorun neden kaynaklı olabilir.

Devre:

http://hizliresim.com/PPJmLO

Ana çevrime koyduğum ACD kodu :

For x = 0 To 250 Step 1
    ADCON0=%00001101  'AN3
    ADCON0.1=1  'A/D başlat
    bitmediT:
    If ADCON0.1=1 Then bitmediT
    SAYI.Byte0= ADRESL
    SAYI.Byte1= ADRESH
    D_T[x] = SAYI
   
    DelayUS 40
   
Next

ete

Hazır ADCIN diy ebir komut var iken neden böyle bir yola girdin anlamış değilim.
Amacın macera aramak ise aradığını bulmuşsun anlaşılan.
Hazır komut kullanmadan ADC ölçümü yapmanın bir şekli usulu var.
Sırası ile aşağıdaki işlemlerin yerine getirilmesi gerekir.
1. Önce ölçüm yapılacak olan ADC pini Analog pin olarak ayarlanması gerekir. Enbaşta bu pin giriş olarak ayarlanır ve pin analog hale getirilir. Kodun tamamını vermediğin için bunları yapmış farzediyorum.

2. Sonra ADC modülü için gerekli ayarlamalar yapılır. Bunlar;
    - ADC çevrim CLK seçimi yapılır
    - Voltaj Referansı seçilir (ADCON1 Registeri ile)
    - Ölçüm yapılacak ADC kanalı seçilir ADCON0 /5-2 bitleri ile
    - Ölçüm sonucu formatı seçilir (Sağa yaslı veya sola yaslı, (ADCON2.7 biti 1 yapılarak)
    - Sonra Çevrim zamanı belirlenir (ADCON2/5-3 bitleri)
    - Sonra ADC modül aktif hale getirilir (ADCON0.0 biti HIGH yapılarak)
3. SOnra Çevrim süresi kadar bekleme yapılır (Mesela pauseus 20) Bu bekleme ile kondansatör şarj edilmiş olur.
4. SOnra ADCON0.1biti HIGH yapılarak çevrim başlatılır.
5. Sonra Çevrimin sona ermesi takip edilir. Bunu başlıca belirteci ADCON0.1 registerinin LOW olmasıdır. Çevrim sürdüğü müddetçe bu bit HIGH da kalır vebitince Otomatikman LOW olur. Kısaca bu bitin LOW olması beklenir.
6. Çevrim sona erince de ADRESH ve ADRESL registerlerinden 10 bitlik ölçüm sonucu alınır ve bir başka değişkene eşitlenir.
Hepsi bu kadar.
Bu açıklamaya uygun olarak döngünü yeniden düzenle. Yol yakınken birde ADCIN komutunu dene . Ana konfigürasyonlar hariç bu saydıklarımın hepsini otomatik olarak kendi yapmaktadır komut.

Bu işlemler için programın baş tarafında;
ADCON2=%10111001
ADCON1=%00001011
ADCON0=%00001100
değerlerini registerlere ver.

Sonra ölçüm yaparken;
ADCON0.0=1     'modülü aktif hale getirdik
PAUSEUS 20       'belirlediğimiz 20 Tad süresine uygun bekleme yapıyoruz
ADCON0.1=1      'çevrimi başlattık
WHILE ADCON0.1=1:Wend  'çevrimin sona ermesini bekledik
HAM.Byte0=ADRESL  'çevrim sonucunu aldık
HAM.Byte1=ADRESH
şeklinde ölçüm sonucunu al.
Burada yalnızca AN3 den ökçüm yaptığını varsayıyorum. Zira örneğin o şekilde.

Ete

M.A.A

Hocam öncelikle teşekkür ederim.
İlk ASM de öğrendiğim için Hazır Komutlara daha alışamadım. Bu yöntemle (yanlış olduğunu anlamış oldum) daha önce bir sürü devre ve ölçüm yaptım (18F4520 ile) , 2 senedir çalışıyor. Problemi buraya yazmadan önce hazır komut kullanarak da ölçüm yaptım sonuç değişmedi. En son sizin verdiğiniz kod ile yaptım, sonuç gene aynı. Atladığım başka birşey var galiba.

Son Kod:



Symbol TMR0ON = T0CON.7 ' Timer0 On/Off Control bit
Symbol T08Bit = T0CON.6 ' Timer0 8-bit/16-bit Control bit
Symbol T0CS = T0CON.5 ' Timer0 Clock Source Select bit
Symbol T0SE = T0CON.4 ' Timer0 Source Edge Select bit
Symbol PSA = T0CON.3 ' Timer0 Prescaler Assignment bit
Symbol T0PS2 = T0CON.2 ' \
Symbol T0PS1 = T0CON.1 ' Timer0 Prescaler Select bits
Symbol T0PS0 = T0CON.0 ' /
Symbol RD16 = T1CON.7 ' 16-bit Read/Write Mode Enable bit
Symbol T1CKPS1 = T1CON.5 ' \ Timer1 Input Clock Prescale Select bits
Symbol T1CKPS0 = T1CON.4 ' /
Symbol T1OSCEN = T1CON.3 ' Timer1 Oscillator Enable bit
Symbol T1SYNC = T1CON.2 ' Timer1 External Clock Input Sync Select bit
Symbol TMR1CS = T1CON.1 ' Timer1 Clock Source Select bit
Symbol TMR1ON = T1CON.0 ' Timer1 On bit
Symbol GIE = INTCON.7 ' Global Interrupt Enable bit
Symbol PEIE = INTCON.6 ' \
Symbol GIEL = INTCON.6 ' / Peripheral Interrupt Enable bit
Symbol TMR0IE = INTCON.5 ' Timer0 Overflow Interrupt Enable bit
Symbol TMR0IF = INTCON.2 ' Timer0 Overflow Interrupt Flag bit
Symbol TMR0IP = INTCON2.2 ' Timer0 Overflow Interrupt Priority bit
Symbol TMR1IF = PIR1.0 ' Timer1 Overflow Interrupt Flag bit
Symbol TMR1IE = PIE1.0 ' Timer1 Overflow Interrupt Enable bit
Symbol TMR1IP = IPR1.0 ' Timer1 Overflow Interrupt Priority bit
Symbol IPEN = RCON.7 ' Interrupt Priority Enable bit

Device = 18F4620

OSCCON = %01110000     'Internal 8 MHz clock select
Xtal=8

Config_Start
    OSC = INTIO67 ; Internal oscillator block, port function on RA6 and RA7    'HS
    PWRT = OFF ; PWRT disabled
    BOREN = OFF ; Brown-out Reset disabled in hardware and software
    BORV = 0 ; Maximum setting
    WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit)
    MCLRE = OFF ; RE3 input pin enabled; MCLR disabled
    PBADEN = OFF ; PORTB<4:0> pins are configured as digital I/O on Reset
    LVP = OFF ; Single-Supply ICSP disabled
    CP0 = On ; Block 0 (000800-001FFFh) code-protected
    CP1 = On ; Block 1 (002000-003FFFh) code-protected
    CP2 = On ; Block 2 (004000-005FFFh) code-protected
    CP3 = On ; Block 3 (006000-007FFFh) code-protected
    CPB = On ; Boot block (000000-0007FFh) code-protected
    WRTD = OFF ; Data EEPROM not write-protected
Config_End

'LCD TANIMLAMALARI,,,,,,,,,,,,,,,,,,,,
Declare LCD_Type Alphanumeric        '
Declare LCD_DTPin PORTD.4            '
Declare LCD_ENPin PORTB.7      'e    '
Declare LCD_RSPin PORTB.6     'rs    '
Declare LCD_Interface 4              '
Declare LCD_Lines 4                  '
''''''''''''''''''''''''''''''''''''''

Symbol SLED=PORTC.1

Symbol TVOLT=PORTA.3
   
Output SLED

Input TVOLT


PORTA =0
PORTB =0
PORTC =0
PORTD =0
PORTE =0

Dim SAYI1 As Float
Dim SAYI2 As Float
Dim SAYI3 As Float
Dim SAYI4 As Dword
Dim SAYI5 As Dword
Dim SAYI6 As Dword
Dim SAYI7 As Dword

Dim SAYI As Word
Dim D_T[255] As Word
Dim x As Byte

CMCON=07h 'KOMPARATORLER KAPALI
ADCON2=%10111001
ADCON1=%00001011
ADCON0=%00001100


DelayMS 1000



ANAPRO:
SAYI2=0
SAYI4=0
SAYI5=0

SLED=1

For x = 0 To 250 Step 1

    ADCON0.0=1     'modülü aktif hale getirdik
    DelayUS 20       'belirlediğimiz 20 Tad süresine uygun bekleme yapıyoruz
    ADCON0.1=1      'çevrimi başlattık
    While ADCON0.1=1:Wend  'çevrimin sona ermesini bekledik
    SAYI.Byte0=ADRESL  'çevrim sonucunu aldık
    SAYI.Byte1=ADRESH
    D_T[x]=SAYI
    DelayUS 40
   
Next


For x = 0 To 214 Step 1

    SAYI1= (D_T[x]/10)-3276,7
    SAYI4= Abs SAYI1
     SAYI4=SAYI4*SAYI4
    SAYI5=SAYI5+SAYI4
Next
SAYI6=SAYI5/215
SAYI=Sqr SAYI6 
SAYI7=SAYI*4100  '0,1652758 '0,419147
SAYI7=SAYI7
SLED=0

Print At 1,1,Dec SAYI5
Print At 2,1,Dec SAYI6
Print At 3,1,Dec SAYI
Print At 4,1,Dec SAYI7


DelayMS 1000

GoTo ANAPRO


End
   
     

Hattuşa

yardımcı olalım diyecem ama protonda yazılmış kodlar ancak çoğu yeri anlamadım.
ayrıca devreyi isisde denemiyormusunuz? kodun nerde hata yaptığını kontrol etmiyormusunuz?
mesela tris girişleri tanımlanmamış, her ne kadar ADC configler tanımlansa da tris yazmaçlarında pinin giriş mi çıkışmı olduğu belirtilmemiş, ayrıca bazı declarasyonlarda eksik var gibi gözüküyor. bir isis şeması eklenmiş olsaydı ve adc işlemlerinizi anlamış olsaydık bizde bir kod yazıp simülasyonda çalıştığını gösterirdik.

F®T

Hiç ellemesen herşey yolunda oluyor ise, ölçüm esnasında problarda oluşan parazit sistemi etkiliyor olabilir.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

M.A.A

Devrenin farklı katmanlarını teker teker isiste deneyip parça parça kurdum. İsiste denedim, sorunsuz olarak TRUE RMS ölçüm yaptım, sonucu aldım. Yarın İSİS te denediğim ölçüm kısmını buraya ekleyeyim. (diğer bilgisayarda çünkü)
ADC yi kullanmadığım zaman her hangi bir bozulma yaşamadım. ADC yi kullandığım zaman bozulma yaşıyorum, elektriği kesip bir süre bekleyince düzeliyor. (sanki devre deşarj oluyormuş gibi). Bu bağlantı şeklinde şebeke nötrü 1k ile GND bağlı olduğu için parazit olma ihtimalini denemek için 1k yi söküp ADC pine başka bir sinyal bağlayıp ölçeceğim.

Input TVOLT   'bu kısımda giriş olarak ayarlıyorum.


M.A.A

Sorunumla ilgili epey bi deneme yaptım ( gerçek devre üzerinde). ADC kullanmasam bile bazı durumlarda 4x20 LCD ekran da görüntü gidiyor. Aynı devreye 2x16 LCD taktığım zaman aynı durumları denediğim halde bozulma olmadı.  4x20 lcd nin markası Winstar, 2x16 nin ki JHD, başka marka 4x20 alıp denemeyi düşünüyorum.

İlyas KAYA

Nötr'ün 1k ile GND ye bağlı olduğunu yazmışsınız. Bence yanlış. Bir de diyot ile bağlamayı deneyin.
Diyot ile sadece (-) alternanslar GND ile birleşecektir.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

M.A.A

2,5 V ofseti vermek için onu yaptım, ilk yazımda şema resmi var. Ona baktınız mı ?

Powered by EzPortal