16F1827 program gecikmeli çalışıyor ???

Başlatan xcyqp09k2, 25 Mayıs 2015, 18:34:09

xcyqp09k2

kodlarımı şemamı bütün dosyalarımı ve videomu aşağıdaki linklerde bulabilirsiniz...

16F1827 ile ilgili sorun yaşayan benden başka bir kaç arkadaş daha  var forumda. Benim durumu açıklayayım. 16F1827 kullanarak verici ve alıcı devre var. verici devre adc ölçümü yapıyor ardından değeri 256 ile bölerek 1024 skalasına göre boyutlandırıyor ve daha sonra da serout komutuyla gönderiyor. Alıcı devre de serin komutuyla gelen bilgiyi alıyor bu değere göre PWM komutunu kullanarak bir pwm çıktısı oluşturarak ledi yakıyor. olay bundan ibaret. özetlersek verici devrede analog ve seri veri işlemleri yapılıyor alıcı devrede ise pwm ve yine seri veri işlemleri yapılıyor.

sorunum ise şu. ben verici kısımdaki potu çevirdikten sonra karşı alıcı devre pwm değerini anında lede yansıtmıyor. sabit bir süre var o süre boyunca eski pwm değerini veriyor. yani ben potu değiştirip analog veriyi güncellediğimde hep sürekli belli bir geçikme ile karşı taraftaki alıcı devre pwm yi sağlıyabiliyor. ayrıca yeni pwm değerini lede vermeden önce sanki reset aatar gibi led çok kısa bir süre sönüyor. buna çok benzeyen bir sorunu yaşayan arkadaş daha önce forumda yine yazmış. benim sorunum da arkadaşınkine çok benziyor. sanırım sorunumuz stack taşması denen şey ama tabi işin iç yüzünü bilemediğimden yorum yapmıyorum. yorumu sizlere bırakıyorum. yardımlarınız için şimdiden teşekkürler.
ayrıca arkadaşın sorunu da şu  https://www.picproje.org/index.php/topic,59226.0.html


VERİCİ:

Device = 16F1827

Config1 FOSC_INTOSC,WDTE_OFF,PWRTE_ON,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_ON,FCMEN_On
Config2 WRT_ALL,PLLEN_ON,STVREN_ON,LVP_OFF,BORV_19,LVP_OFF
    
    
Include "modedefs.bas" 
Xtal 32
OSCCON= %11110000   'PLL enabled, Internal


ANSELA = %00001111
ANSELB = %00000000

TRISA = %11111111
TRISB = %00000000
PORTA = 0
PORTB = 0



Dim x As Word
Dim y As Word

        



basla:

x = ADIn 0
DelayMS 200

x = x/256


SerOut PORTB.5,396, [x]
DelayMS 10



GoTo basla





ALICI:

Device = 16F1827

Config1 FOSC_INTOSC,WDTE_OFF,PWRTE_ON,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_ON,FCMEN_On
Config2 WRT_ALL,PLLEN_ON,STVREN_ON,LVP_OFF,BORV_19,LVP_OFF
    
    
Include "modedefs.bas" 
Xtal 32
OSCCON= %11110000   'PLL enabled, Internal



Declare CCP3_Pin PORTA.3
ANSELA =%00000000
ANSELB =%00000000

TRISA = %00100000
TRISB = %11111111
PORTA = 0
PORTB = 0


Dim x As Word



basla:

SerIn PORTB.1,396,[x]
DelayMS 50

 

PWM PORTA.3, x, 10000


GoTo basla



isis proton hex dosyaları...
https://yadi.sk/d/TjkwpJXLgrnWs 


sorunumu sesli, görüntülü anlatımım...
(    https://www.youtube.com/watch?v=467qX23kEAw       )

F.T

Bu işlemci bir alem.protonda ayrı bir alem.Bende çok uğraştım bu işlemci ile.Stack taşması konusunu açmıştım.Sagolası RaMU hoca noktayı koydu.Proton hatası çıkttı.Şu dikkate alınmayan diğer register ayarları ile ilgilide işlemci ne kadarda opsiyonel default ayarlarını kullanıyorsada ben yinde bu registerleri kullanmıyorum demek için sorun olabilecek registerleri kendime göre kapatıyorum.Benim çalışmamda görebilirsin.Tüm registerler yok ama yinede dediğim gibi kafamı kurcalayanları işledim.Şu projeni proteuse 7.0 formatında kaydedip eklersen bende biraz kurcalayayım.Belki bi numaralar olur.Fakat bu işlemci fonksiyonları fazla olduğu için hakim olma konusunda sıkıntı yaşadığımı düşünüyorum.Ayrıca proton hatalarıda daha büyük sıkıntı oluşturuyor.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

RaMu

Datasheet 5.2.2.6 bölümünde
dahili osilatörü 32MHz ayarlamak için
gereken şartlar anlatılmış,
öncelikle programda bu şartlar sağlanmış mı kontrol etmekte fayda var.

En azından int_osc kullanarak sadece belli süre
led yakıp söndüren bir program denemek faydalı olur.

Alıntı Yap
5.2.2.6 32 MHz Internal Oscillator
Frequency Selection
The Internal Oscillator Block can be used with the 4X
PLL associated with the External Oscillator Block to
produce a 32 MHz internal system clock source. The
following settings are required to use the 32 MHz internal
clock source:
• The FOSC bits in Configuration Word 1 must be
set to use the INTOSC source as the device system
clock (FOSC<2:0> = 100).
• The SCS bits in the OSCCON register must be
cleared to use the clock determined by
FOSC<2:0> in Configuration Word 1
(SCS<1:0> = 00).
• The IRCF bits in the OSCCON register must be
set to the 8 MHz HFINTOSC set to use
(IRCF<3:0> = 1110).
• The SPLLEN bit in the OSCCON register must be
set to enable the 4xPLL, or the PLLEN bit of the
Configuration Word 2 must be programmed to a
'1'.

Note: When using the PLLEN bit of the
Configuration Word 2, the 4xPLL cannot
be disabled by software and the 8 MHz
HFINTOSC option will no longer be
available.

The 4xPLL is not available for use with the internal
oscillator when the SCS bits of the OSCCON register
are set to '1x'. The SCS bits must be set to '00' to use
the 4xPLL with the internal oscillator.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

xcyqp09k2

@BİLİRSHOP  dediğini dikkate alıp düzeltme yaptım teşekkürler.

@F.T Allah razı ola kardeş. yazını okudum protondan demişsiniz. sanırım artık pickit2 yerine avrisp ve proton yerine de atmel studio kullanarak avr ye geçme vakti geldi. Zira benm projelerimde sürekli adc, pwm ve uart özelliklerinin bir arada bulunduğu MCU ya ihtiyacım oluyor. atmel bu yönden çok iyi. çoğu MCU sunda 3 er 4 er tane pwm ve adc mevcut.ekstra uart usart rtc falan da mevcut çalışma voltaj  aralıkları da ortalama olarak geniş denebilir. buna ayrıca atmelin ve microchipin sitelerinden benzer yapıya sahip mcu seçme bölümünden bakılabilir. Lakin proton artık işime yaramıyor gibi. neredeyse herşeyi elle register yazarak hallediyorum.

@RaMu  inan ki 4 5 tane tam senin dediğin gibi led yakmalı söndürmeli 32 mhz li 20 mhz li falan örnek denedim. sorun yok. onlar çalışıyor takır takır. hatta şu bahsettiğiim kodlardan serin serout komutun çıkarıp sadece ADC ve PWM koyduğum zaman da hiç sıkıntı yok. osilatör ayarlarıyla da data sheetten baya oynadım pll olayının farkındayım. hepsini baya register girerek yapıyorum. Yani sonuç olarak bu pic te serin serout ve adc pwm bi rada kullanamadım bir türlü.


F.T

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Maxim

giden ve gelen seri dataya bakabileceğiniz bir logic analyzer varmı?

RaMu

verici kodlarında
basla:

x = ADIn 0
DelayMS 200

x = x/256

niye 200 milisaniye bekliyorsun?


Alıcı kodlarında
Dim x .As Word
.
.
.
PWM PORTA.3, x, 10000

pwm e word değer girilebiliyor mu?

Birde ben basic bilmiyorum.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

mehmet

XC8 de bu şekilde çalıştırıyorum.
_XTAL_FREQ 32000000
Config ayarlarında PLL kapalı ayarlıyorum, FOSC = INTRC...

    OSCCONbits.IRCF = 0b1110;
    OSCCONbits.SPLLEN = 0b1;
    __delay_ms(1000);
    while (!OSCSTATbits.PLLR);
    while (!OSCSTATbits.HFIOFR);

Ancak harici 8MHz kristal bağlanırsa PLL çabuk oturuyor...
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

#8
@F.T hserin hserout komutunu kullanınca RCSTA ve RXSTA registerlerleriyle oynamak ayarlarını yapmak gerekiyor. Musait olur olmaz o şekilde de bir deneyeceğim. zaten önceden de hserin hseroutla denemelerim vardı da tam hatırlayamadım sorunlar neydi. bir ara şöyle yazın 1 haftamı oturup şu pici çözmek niyetindeyim. çok güzel pic namıssız. ama bilemediğim detaylar var sanırım.

@RaMu ben girebildim hocam. daha önce bir projede de girdiğimi hatırlıyorum. bence sorun yok. sonucta değişken word olsa da içindeki değer 1024 ü geçmesse sıkıntı olmaz diye bilgisizce bir mantık yürütüyorum şuan ama net bir bilgim yok. 2 projede denedim oldu. bu içindeki değer olayını da zaten vericide ayarlıyorum. orda max 1024 olacak şekilde matematik işlemleri yaptırıp öyle gönderiyorum. alıcıda direk ne alıyorsa onu veriyor.

bu arada 200 ms gerçekten çok. değiştridim onları Us seviyesine aldım.

@Maxim malesef hocam yok.

@mehmet hocam çalışıyor mu yani ? configlerde mi sıkıntı var ? bu pic e bi bakılması lazım ya. çok güzel bi pic ama kullanımı zor galiba. adc pwm serin serout aynı anda çalıştıramadım bi  türlü

mehmet

Çalışan projeden kopyaladım. Analog ve
dijital bilgi okuyup dijital çıkış yaptım.
Ancak seri bilgi ile çalışmadım. 32MHz.
çalıştığını ölçüp gözlemleyebiliyorum.

Bildiğim kadarıyla Proton+ kendi ayarlıyor.
Register ayarı yapmanıza gerek yok diye
hatırlıyorum. Sadece hız olarak 32MHz
belirtiliyor. 
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

#10
@F.T
@RaMu
@Maxim
@mehmet

denediklerim;

-32 mhz pll açık       FOSC_ INTOSC
-16 mhz pll kapalı    FOSC_ INTOSC
-20 mhz                  FOSC_HS ardından Xtal 20

en üstteki proteusta çalışıyor ama gerçekdevrede çalışmıyor
ordadaki yine aynı proteusta çalışıp devrede çalışmıyor
alttaki proteusta adc için süre yetersiz uyarısı veriyor. gerçekte de çalışmıyor.

sonuç olarak aşağıdaki kodları proteus 8.1 de çalıştırabildim. ama devrede çalışmıyor. az daha itelersek sanki olacak bu iş. ufak bir yeri atlıyorum heralde. Aşağıdaki kodlar yukarda ortada diye bahsettiğim pll kapalı 16 mhz intosc ile proteusta çalışan kodlar. ula eskiden hiç olmassa breadboardda çalışıyordu şimdi o da yok  ;D

VERİCİ:
Device = 16F1827

Config1 FOSC_INTOSC,WDTE_OFF,PWRTE_ON,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_ON,FCMEN_ON
Config2 WRT_ALL,PLLEN_OFF,STVREN_OFF,LVP_OFF,BORV_19
' configuration Word 1 registerindeki FOSC<2:0> e göre dahili intosc  secili, PLL kapalı
      
Include "modedefs.bas" 
OSCCON =%01111000 ' PLL kapalı, 16 Mhz intosc
Xtal 16   ' belirtirsem iyi olur dedim yine 16 mhz

ANSELA = %00001111
ANSELB = %00000000

TRISA = %11111111
TRISB = %00000000

PORTA = 0
PORTB = 0

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

Dim x As Word

basla:

x = ADIn 0
DelayUS 50
x = x/256

HSerOut [x]

GoTo basla



ALICI:
Device = 16F1827

Config1 FOSC_INTOSC,WDTE_OFF,PWRTE_ON,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_ON,FCMEN_ON
Config2 WRT_ALL,PLLEN_OFF,STVREN_OFF,LVP_OFF,BORV_19
' configuration Word 1 registerindeki FOSC<2:0> e göre dahili intosc  secili, PLL kapalı
        
Include "modedefs.bas" 
OSCCON =%01111000 ' PLL kapalı, 16 Mhz intosc
Xtal 16     ' belirtirsem iyi olur dedim yine 16 mhz

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 CCP3_Pin PORTA.3

TRISA = %00100000
TRISB = %11111111

PORTA = 0
PORTB = 0

Dim x As Word

basla:

HSerIn [x] 

HPWM 3, x, 10000

GoTo basla

mehmet

Verdiğim örnekte konfigürasyon
ayarlarında pll kapalı olacak.  Pll yazılımla
açılıyor.
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"

OG

Ben alttaki şekli ile kullanıyorum PLL 32MHz, yanlız deklarasyon ve değişken tanımlamalardan sonra delayms 1000 gibi bekletme yapıyorum PLL kilitlenmesine süre tanımak için

Device = 16F1827

Declare Reminders Off
@ CONFIG_REQ = 0 ; Override Compiler's configuration settings
Asm-
__Config _Config1, 0x0F1C ;FOSC_INTOSC & WDTE_ON & PWRTE_ON & MCLRE_OFF & CP_ON & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF 
__Config _Config2, 0x1DFF ;WRT_OFF & PLLEN_ON & STVREN_OFF & BORV_LO & LVP_OFF 
Endasm-
Declare Reminders On

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

Declare Xtal = 32
Declare All_Digital = True
OSCCON =%11110000       '' 32 MHz internal
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ferit06


@xcyqp09k2;
"alttaki proteusta adc için süre yetersiz uyarısı veriyor. gerçekte de çalışmıyor."

demişsiniz ama ADCON1 için herhangi bir ayar yapmamışsınız.

32 MHz kullanımda ADCON1 de ADCS bitleri 010 veya 110 olarak ayarlamalısınız. Bu bitler adc çevrim için kullanılacak süreyi belirler. ADCON1 de ayrıca sonucun  sağa/sola dayalı elde edilmesini ve adc çevrim için referans gerilimin belirlenmesi gerekir.

xcyqp09k2

@mehmet evet pll kapalı olunca 8 mhz ye düşüyor. açıksa 4 le çarpılıp 32 mhz elde ediliyor.

@OG normalde 32 mhz de led yakıp söndürebiliyorum hocam. hatta adc okuyup pwm bile çalıştırıyorum yalnız seri iletişimle işler karışıyor. bekleme süresinde sıkıntı yok sanırım. ben o beklemesiz de adc pwm gibi işlemleri yapabiliyorum. sanırım sorun registerlerin çakışması gibi birşey. normalde çalışan pic hserin kullanınca neden çalışmaz anlam veremiyorum.

@ferit06 düzeltp tekrar ekliyorum. bu kodlar da proteusta sorunsuz çalışmasına rağmen boardda çalışmıyor. pickit2 nin değil harici stabil 5V kaynak kullanıyorum yine de yok. bağlantılar doğru. herşey doğru. bir de birazdan düşük frekanslarda deniyicem. intosc 4 mhz gibi...


VERİCİ:

Device = 16F1827

Config1 FOSC_HS,WDTE_OFF,PWRTE_ON,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_ON,FCMEN_ON
Config2 WRT_ALL,PLLEN_OFF,STVREN_OFF,LVP_OFF,BORV_19
' PLL kapalı
'FOSC_HS harici yüksek hız kristal osilatör 20 mhz 
      
Include "modedefs.bas" 
Xtal 20

TRISA = %11111111
TRISB = %00000000

ANSELA = %00001111
ANSELB = %00000000


'****    ADCON0   *******
ADCON0.6 = 0  ' 
ADCON0.5 = 0  '
ADCON0.4 = 0  ' analog select AN0 analog giriş
ADCON0.3 = 0  '
ADCON0.2 = 0  '

ADCON0.0 = 1  ' ADC enabled


'****    ADCON1   *******

ADCON1.7 = 0  ' sola yaslı. left justified

ADCON1.7 = 1  '
ADCON1.7 = 0  ' ADC clock kaynağı FOSC_64
ADCON1.7 = 0  '

ADCON1.7 = 0  ' VREF- is connected to VSS

ADCON1.7 = 0  '            
ADCON1.7 = 0  ' 00 = VREF+ is connected To VDD


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_Stime 200

Dim x As Word

PORTA = 0
PORTB = 0

basla:

x = ADIn 0
DelayUS 50
x = x/256

HSerOut [x]

GoTo basla



ALICI:

Device = 16F1827

Config1 FOSC_HS,WDTE_OFF,PWRTE_ON,MCLRE_OFF,CP_OFF,CPD_OFF,BOREN_OFF,CLKOUTEN_OFF,IESO_ON,FCMEN_ON
Config2 WRT_ALL,PLLEN_OFF,STVREN_OFF,LVP_OFF,BORV_19
' PLL kapalı
'FOSC_HS harici yüksek hız kristal osilatör 20 mhz 
        
Include "modedefs.bas" 
Xtal 20

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 CCP3_Pin PORTA.3

TRISA = %00100000
TRISB = %11111111

PORTA = 0
PORTB = 0

Dim x As Word

basla:

HSerIn [x] 

HPWM 3, x, 10000

GoTo basla