12F1822 Adc --> RF --> Pwm (yeni başlayanlar için örnek proje)

Başlatan xcyqp09k2, 30 Haziran 2015, 01:13:00

xcyqp09k2

Uygulamada 12F1822 ile analog ölçüm yapıldı, uart ile data gönderildi, alıcı kısımda değişken değerine göre pwm üretildi. Örnek proje olarak buraya eklemek istedim. Takılanlar vardır. Yeni başlayanlardan proton kodlarının bu şekilde kullanımını görmek isteyenler vardır. Proje denenmiştir, hem proteusta hem gerçekte çalışıyor. Eklediğim linkte proteus 8 ve ısıs7 dosyaları  hex, proton dosyaları, 12F1822 ye ait pdf ve pin diagramını gösteren bir de resim mevcuttur. İyi çalışmalar.

https://yadi.sk/d/sGVptEkkhZUvu

Bu pic ile dahili 32 mhz osilatörü kullanmayı denedim ama bir türlü olmadı. Oynamadığım register, denemediğim numara, atmadığım takla kalmadı kendi çapımda . Barsa abilerimizden daha önce bu picde 32 mhz intosc_hs ile kod çalıştıran, kodları paylaşırsa çok sevinirim. Nerede hata yapmışım bakarım. Aşağıda da 32 mhz de çalıştıramadığım ayarlar mevcut. bir fikri olan varsa bekliyorum...

Device = 12F1822

Config1 FOSC_INTOSC, WDTE_OFF,PWRTE_OFF,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_ALL,PLLEN_ON,STVREN_OFF,LVP_ON,BORV_19

Xtal 32

'------------------------- CLOCK -------------------------------
' OPTION_REG.7 = 0  ' WPUEN: Weak Pull-up Enable bit, 0 = Weak pull-ups are enabled by individual WPUx latch values
' OPTION_REG.6 = 0  ' INTEDG: Interrupt Edge Select bit, 0 = Interrupt on falling edge of RB0/INT pin
' OPTION_REG.5 = 0  ' TMR0CS: Timer0 Clock Source Select bit ,  = Internal instruction cycle clock (FOSC/4)
' OPTION_REG.4 = 0  ' TMR0SE: Timer0 Source Edge Select bit, 0 = Increment on low-to-high transition on T0CKI pin
' OPTION_REG.3 = 0  ' PSA: Prescaler Assignment bit, 0 = Prescaler is assigned to the Timer0 module
' OPTION_REG.2 = 0  ' PS<2:0>: Prescaler Rate Select bits, 000 , 1 : 2
' OPTION_REG.1 = 0  ' PS<2:0>: Prescaler Rate Select bits, 000 , 1 : 2
' OPTION_REG.0 = 0  ' PS<2:0>: Prescaler Rate Select bits, 000 , 1 : 2

' OSCCON.7 = 1 ' SPLLEN: Software PLL Enable bit, 1 = 4x PLL Is enabled
' OSCCON.6 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF
' OSCCON.5 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF 
' OSCCON.4 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF 
' OSCCON.3 = 0 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF  
' OSCCON.1 = 0 ' SCS<1:0>: System Clock Select bits, 00 = Clock determined by FOSC<2:0> in Configuration Word 1.
' OSCCON.0 = 0 ' SCS<1:0>: System Clock Select bits, 00 = Clock determined by FOSC<2:0> in Configuration Word 1. 

' OSCTUNE.5 = 0 ' TUN<5:0>: Frequency Tuning bits, 011111 = Maximum frequency
' OSCTUNE.4 = 1 ' TUN<5:0>: Frequency Tuning bits, 011111 = Maximum frequency
' OSCTUNE.3 = 1 ' TUN<5:0>: Frequency Tuning bits, 011111 = Maximum frequency
' OSCTUNE.2 = 1 ' TUN<5:0>: Frequency Tuning bits, 011111 = Maximum frequency
' OSCTUNE.1 = 1 ' TUN<5:0>: Frequency Tuning bits, 011111 = Maximum frequency
' OSCTUNE.0 = 1 ' TUN<5:0>: Frequency Tuning bits, 011111 = Maximum frequency

baran123

"Bu pic ile dahili 32 mhz osilatörü kullanmayı denedim ama bir türlü olmadı."
Datashhet sayfa 65
http://ww1.microchip.com/downloads/en/DeviceDoc/40001413E.pdf

mesaj birleştirme:: 30 Haziran 2015, 01:33:52

bu arada xtal kristal degeri degil mi ? Buna 8 verip pll ile 4 le carparak 32 elde ediliyor diye biliyorum.

xcyqp09k2

Ben de sayfa 62 deki 32 MHz Internal Oscillator Frequency Selection kısmını çok dikkatli okudum. Aşağıda bir not var, ona da dikkat ettim. Datasheet de ne yazıyorsa yaptım ama yine de olmadı... Bir uygulamada hserout[dec, x ]komutunu dec olarak okuyamıyordum mesela. Çok değişik bir karakter okunuyordu. Ne zaman ki  mhz harici osilatör kullandım sorun ortadan kalktı. 4xPLL 32 mhz dahili osilatörün bu piclerde stabil olmama durumu var mıdır acaba? her ayarı yaptım yine olmadı :S   

protonun yüklü olduğu kasörde çeşitli hazır uygulama kodları var. Orada bir örnekte şu şekilde bir PLL kullanımı var. Biz de acaba sadece config ayarlarında değil de bu kodda da mı belirtmeliyiz PLL in açık olacağını ?

Declare PLL_Req = On                    ' Operate at 64MHz
    Declare Optimiser_Level = 2
    Declare Dead_Code_Remove = On

xcyqp09k2

@Baran Ekrem, paylaştığım ayarlar  PLL açık 32 mhz için. Bu ayarlara dokunmuyorum senin dediğin gibi xtal 8 yazıyorum yine olmuyor olmadı :/, pwm sürekli 0 değeriden başlayıp artıp yine sıfıra geliyor böyle gidiyor. anlam veremedim. 32 mhz intosc ile ilgili başka yönerge yok olması lazım bu şekilde.

Maxim

bende bakındım
OSCCON registerlarını kullanmak lazım
32mhz yapmak için nasıl yapılacağını madde madde yazmışlar
denemedim ama olması lazım

DEVICE 12F1822
DECLARE XTAL=8

OSCCON.0=0
OSCCON.1=0
OSCCON.6=1
OSCCON.5=1
OSCCON.4=1
OSCCON.3=0
Declare PLL_Req = On

Config1 FOSC_INTOSC, WDTE_OFF,PWRTE_OFF,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_ALL,PLLEN_ON,STVREN_OFF,LVP_ON,BORV_19

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

xcyqp09k2

Tamam sorunun kaynağı anlaşıldı. Declare Pll_Req True yapmak lazımmış. ben bunu sürekli osccon.7 bitini 1 yaparak yapmaya çalışıyorum. Aslında proton bunu pic in registerine yazması lazım ama niyeyse bu yazdığım kodu sallamıyor. onun yerine Pll aktif yapmak istersek Maxim hocamızın dediği gibi Declare komutunu kullanıp Pll_Req True yapmak lazımmış.

boardda çok sayıda deneme yaptım, ondan sonra anlaşıldı iş.


DEVICE 12F1822
DECLARE XTAL=8

OSCCON.0=0
OSCCON.1=0
OSCCON.6=1
OSCCON.5=1
OSCCON.4=1
OSCCON.3=0
Declare PLL_Req = On

Config1 FOSC_INTOSC, WDTE_OFF,PWRTE_OFF,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_ALL,PLLEN_ON,STVREN_OFF,LVP_ON,BORV_19


@Maxim
burada osccon.7 bitini bilerek mi eklemedin? çünkü o bit 4xPLL i aktif yapma biti. Onun yerine Declare Pll_Req True kullanmışsın. Proton normal yazdığımı register eşitlemelerini algılamıyor olabilir mi hocam? mesela OSCCON.7 = 1 (4xPLL enable). mesela bunu algılayıp ilgili registeri düzeltmiyor. onun yerine illa proton komutu olan pll_req ile yazmak lazım. neden böyle bir fikriniz var mı ?

Çalışan proje kodlarını da ekleyeyim.
---------------------------------------------------------------------------------------------------------------------

VERICI:
Device = 12F1822
Declare Xtal 8

Declare PLL_Req = On
'------------------------- CLOCK -------------------------------
OSCCON.7 = 1 ' SPLLEN: Software PLL Enable bit, 1 = 4x PLL Is enabled
OSCCON.6 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF
OSCCON.5 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF 
OSCCON.4 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF 
OSCCON.3 = 0 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF  
OSCCON.1 = 0 ' SCS<1:0>: System Clock Select bits, 00 = Clock determined by FOSC<2:0> in Configuration Word 1.
OSCCON.0 = 0 ' SCS<1:0>: System Clock Select bits, 00 = Clock determined by FOSC<2:0> in Configuration Word 1.   
'------------------------- CLOCK -------------------------------

Config1 FOSC_INTOSC, WDTE_OFF,PWRTE_OFF,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_ALL,PLLEN_ON,STVREN_OFF,LVP_ON,BORV_19

Declare Hserial_Baud = 9600 ' Set baud rate to 9600
Declare Hserial_RCSTA = %10010000 ' Enable continuous receive
Declare Hserial_TXSTA = %00100000 ' Enable transmit and asynchronous mode
Declare Hserial_Clear = On ' Clear the buffer before receiving

Declare Adin_Res 10
Declare Adin_Tad FRC
Declare Adin_Stime 200

Include "modedefs.bas"

ANSELA.0 = 0  ' digital (Tx)   RA0
ANSELA.1 = 0  ' digital (Rx)   RA1
ANSELA.2 = 1  ' analog  (AN)   RA2
ANSELA.4 = 0  ' digital        RA4
ANSELA.5 = 0  ' digital        RA5

TRISA = %001110

Dim x As Word

basla:

x = ADIn 2
x = x/256
HSerOut ["1010",Dec x,0]

GoTo basla



ALICI:
Device = 12F1822
Declare Xtal 8
Declare PLL_Req = On
'------------------------- CLOCK -------------------------------
OSCCON.7 = 1 ' SPLLEN: Software PLL Enable bit, 1 = 4x PLL Is enabled
OSCCON.6 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF
OSCCON.5 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF 
OSCCON.4 = 1 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF 
OSCCON.3 = 0 ' IRCF<3:0>: Internal Oscillator Frequency Select bits, 8 MHz or 32 MHz HF  
OSCCON.1 = 0 ' SCS<1:0>: System Clock Select bits, 00 = Clock determined by FOSC<2:0> in Configuration Word 1.
OSCCON.0 = 0 ' SCS<1:0>: System Clock Select bits, 00 = Clock determined by FOSC<2:0> in Configuration Word 1.   
'------------------------- CLOCK -------------------------------
Config1 FOSC_INTOSC, WDTE_OFF,PWRTE_OFF,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_OFF,FCMEN_OFF
Config2 WRT_ALL,PLLEN_ON,STVREN_OFF,LVP_ON,BORV_19

Declare Hserial_Baud = 9600 ' Set baud rate to 9600
Declare Hserial_RCSTA = %10010000 ' Enable continuous receive
Declare Hserial_TXSTA = %00100000 ' Enable transmit and asynchronous mode
Declare Hserial_Clear = On ' Clear the buffer before receiving

Declare CCP1_Pin PORTA.2

All_Digital True
    
Include "modedefs.bas"

TRISA = %001010

Dim x As Byte 

basla:

HSerIn [Wait("1010"),Dec x]
HPWM 1, x, 5000
HSerOut [Dec x,13]

GoTo basla



proteus proton ve hex dosyaları da linkte mevcut.

https://yadi.sk/d/kUSFqQTchadgj

baran123

Proton hoşuma gitti böyle bit bit ayarlanması falan XC gibi.Bu arada hangi programlayıcıyı kullanıyorsunuz ? Klon mu orjinal mi ? pk2 mi 3 mü ? ben bu pic'i pickit 2 klon ile programlayamadım.Dat dosyasını değişirmeme rağmen

xcyqp09k2

@Baran Ekrem e hocam işte ayarlayamıyoruz  :) nesi ayarlanıyor. hani algılamıyor osccon.7 =1 komutunu. illa declare pll_req on yazılacak.  :)

klon pickit2 kullanıyorum. zamanında expkits den almıştım. memnunum şuana kadar bir sorun çıkarmadı. genelde icsp den programlıyorum.

pickit2 ile 12F1822 ve 16F1827 programlamada ben de sıkıntı çekmiştim. aşağıda daha önce açılmış bi konuda bu sorun geçiyor.
https://www.picproje.org/index.php/topic,43267.30.html

ben en son halletmiştim . daha sonra protonun temiz kurulumu ve bu picler için yama dosyalarını da yükledim. o link de aşağıda. istersen protonu kaldırıp bu kurumları bir dene ?

https://yadi.sk/d/e2S1S56RgwbTL

baran123

Tamamdır sağ olasın bir deneyeyim.Birde programlayıcının besleme jumperı 3.3 demi olmalı ?

Maxim

datasheet içinde osc bölümünde 32mhz yapmak için madde madde anlatan bir bölüm var
bunu yap, bunu yap sıralı
ben orayı kullandım

osccon.7 için diyorki
eğer config satırında zaten pll=on yaptıysan bu osccon.7 önemli değil
eğer config satırında pll= off ise pll on olacaktır

başka işlemcilerde pll için Declare PLL_Req = On yazmak gerekiyordu onun için onuda ekledim.

baran123

Oha yok artık gördü. ICSP den gördü benim ZIF bozukmuş.Daha önce ICSP de denedim ama olmamıştı.Sağ ol .:D

xcyqp09k2

@Baran Ekrem  ben 5v da kullanıyorum genelde. 3.3v olunca low voltage programming oluyor sanırım.

@Maxim config satırında pll_on iken, osccon.7 bitini kullanmadım ve declare pll_req_true yazmadan algılamıyor. yani configdeki pll_on ayarını da işlemiyor pice. neyse sorun halloldu. declare de kullanırız artık   8)