uyku modu

Başlatan onurinci, 21 Şubat 2016, 02:31:37

onurinci

hocam selam..

16F876 MCU 10 adet giriş mevcut,10 adet'te çıkış mevcut Case mantığında basılmış switch aktif oluyor,enerji kesilsede son konumunu koruyor,buraya kadar güç bela halledebildim,fakat ben bunu bir telsiz alıcısına anten seçici diye yapmıştım,alıcıya bağlayınca önemli bir sorun  ile karşılaştım,4MHz kristali ekranladım,devreyi metal kafes içine aldım ne yaptımsa alıcıya bir sürü parazit yaptı,kristali yerinden çıkardığım an her şey sütliman,sleep komutuyla uyuttum ama bir daha uyanmadı,kısacası bundan sonra yapılması gerekenlerden bi haberim,ilginize mazharım saygılar,hiç bir acelem yoktur,dilediğniz zaman bir göz atarsanız sevinirim...
simulasyon ektedir...

otansev

#1
Selam hocam
Cihaz topraklaman varmı yoksa acilen cihazı topraklaman gerek ilk olarak sonrasında cihaz kasasını incele bazı telsiz kasaları maalesef plastik oluyor ve etrafa RF saçıntısı yayıyor.Kasa plastik ise basitçe folyo ile ekranlama yapabilirsin.Tabiki bunları yaptığın devrede parazit filtreleme önlemlerini aldığını varsayarak yazıyorum konu ile ilgili yazılar var sitede incelersen çok faydalı bilgiler var.Son olarak pic devrenin besleme girişine toroid filtre kullanmanı tavsiye ederim.
kolay gelsin.
73 de TA1AMO Umit
TA1MK

ete

Programa ve devreye baktım. Program 16F876A için yazılmış gözüküyor devrede 16F877A kullanılmış. Hangisi doğru onu bilemiyorum ama ya programı 877A ya çevir yada devreyi 876A ya çevir bence.

Sigorta ayarlarını aşağıdaki gibi verirsende sonucu pek değiştirmesede daha iyi olur. Aynı ayarlar 877A içinde kullanılabilir.
@ DEVICE PIC16F876A, XT_OSC, WDT_OFF, PWRT_ON, BOD_OFF, LVP_OFF, CPD_OFF , WRT_OFF , DEBUG_OFF, PROTECT_OFF

Ayrıca değişken tanımlamalarından sonra 300 ms lik bir gecikme ekle programa.

Bunların dışındakiler de değişecek bir şey yok gözüküyor. Basit bir program ve dahada iyileştirmek için bir şey yapmak gerekmez.
Senin parazit sorunun tamamen donanım sorunu. İşin besleme kısmı ile alakalı olsa gerek. Mümkün olduğunca telsiz ile pic devresini bir birinden izole etmen gerekiyor.

Ete

onurinci

Hocam selam
MCU lar nasıl karışmış dikkat edemedim, aslı 16F876A idi ,bende bu devrenin orijinali mevcut ebay'dan arkadaş kendine temin etmiş,aynı işlemci var onun devresi kusursuz çalışıyor 0 parazit,ikisinide otopsi masasına yatırdık ve bir fark gördük,orijinal devrede ancak butonların herhangi birine basıldığında kristal osilatör uyanıyor,işlem biter bitmez hemen uyuyor kristal ,mpasm de sleep komutu da araştırmalarıma göre aynı işi yapıyormuş,kesme yada uyandırmadan zerre anlamadığım için sormuştum hocam...

ete

Her işlemci uyku moduna sokulabilir. Bu modda işlemci mümkün olan en düşük performans ile çalışır ve mikroamper dolayında güç harcar. Elbette bu özellik sana yardımcı olabilir.

Basic te kullanılabilir 2 tür uyku modu vardır.
1. SLEEP 10 dedinizmi işlemci uykuya girer ve 10 sn uykuda kalarak kendi kendine uyanır.
2. @ SLEEP dedinizmi işlemci uykuya girer ancak bir kesme oluşursa uykudan uyanır. Senin arkadaşın sisteminde bu çeşit kullanım sözkonusu.

Ete

onurinci

#5
hocam port değişikliği kesmesini açtım ,WDT on yaptım ,tuş cevap süresi beş misli uzadı ,isis'te MCU kullanım kapasitesi %22 idi %10'a düştü buda MCU'nun hala uyumadığını gösteriyor galiba

@ DEVICE PIC16F876A, WDT_ON, PWRT_ON, PROTECT_OFF, XT_OSC
DEFINE OSC 4

TRISA= %00000000 : PORTA= 0
TRISB= %11111111 : PORTB= 0
TRISC= %00000011 : PORTC= 0
TRISD= %00000000 : PORTD= 0

CMCON= 7 : ADCON1= 7 : OPTION_REG.7= 0

Durum  var Byte
Value  VAR BYTE
Change VAR BIT
'-------------------------------------------------------------------------------
      READ 10,Value
IF Value= 255 THEN Value= 0

INTCON=%10001000 ' port degisiklik kesmesi açildi        4

ON INTERRUPT GOTO Wake_up
durum=PORTB

Start:

'-------------------------------------------------------------------------------   
IF PORTB.0= 0 THEN
Value= 0      ' Band 1
Change= 1
ENDIF
'-------------------------------------------------------------------------------
IF PORTB.1= 0 THEN
Value= 1      ' Band 2
Change= 1
ENDIF
'-------------------------------------------------------------------------------
   IF PORTB.2= 0 THEN
Value= 2      ' Band 3
Change= 1
ENDIF
'-------------------------------------------------------------------------------
    IF PORTB.3= 0 THEN
Value= 3      ' Band 4
Change= 1
ENDIF
'-------------------------------------------------------------------------------
     IF PORTB.4= 0 THEN
Value= 4      ' Band 5
Change= 1
ENDIF
'-------------------------------------------------------------------------------
      IF PORTB.5= 0 THEN
Value= 5      ' Band 6
Change= 1
ENDIF
'-------------------------------------------------------------------------------
       IF PORTB.6= 0 THEN
Value= 6      ' Band 7
Change= 1
ENDIF
'-------------------------------------------------------------------------------
        IF PORTB.7= 0 THEN
Value= 7      ' Band 8
Change= 1
ENDIF
'-------------------------------------------------------------------------------
         IF PORTC.0= 0 THEN
Value= 8      ' Band 9
Change= 1
ENDIF
'-------------------------------------------------------------------------------
          IF PORTC.1= 0 THEN
Value= 9      ' General Covarege
Change= 1
ENDIF
'-------------------------------------------------------------------------------
SELECT CASE Value
    CASE 0  :  PORTC= %00000100  :  PORTD= %00000000
    CASE 1  :  PORTC= %00001000  :  PORTD= %00000000
    CASE 2  :  PORTC= %00010000  :  PORTD= %00000000
    CASE 3  :  PORTC= %00100000  :  PORTD= %00000000
    CASE 4  :  PORTC= %01000000  :  PORTD= %00000000
    CASE 5  :  PORTC= %10000000  :  PORTD= %00000000
    CASE 6  :  PORTD= %00000001  :  PORTC= %00000000
    CASE 7  :  PORTD= %00000010  :  PORTC= %00000000
    CASE 8  :  PORTD= %00000100  :  PORTC= %00000000
    CASE 9  :  PORTD= %00001000  :  PORTC= %00000000


END SELECT

'-------------------------------------------------------------------------------
IF Change= 1 THEN
      WRITE 10,Value : PAUSE 30
Change= 0
ENDIF
'-------------------------------------------------------------------------------
@ SLEEP   
      GOTO Start
DISABLE     
Wake_up:
    DURUM=PORTB
    INTCON.0= 0
    RESUME
    ENABLE     
END

ete

Yazdıklarını düzelttim. Verdiğin koda bak ve onu tekrar dene.
Eksiklerin şunlar;
INTCON=%10000000 yerine INTCON=%10001000 yazılmalı ancak böyle değişiklik kesmesi açılır.

Kesme oluşması için port bir değişkene başlangıçta ve kesme içinde aktarılmalı. Bu nedenle DURUM isimli bir değişken tanımladım. START dan önce DURUM=PORTB komutunu ekledim.
Ayrıca Kesmeden çıkmadan evvel Durum=PORTB komutunu ekledim.

Ete

onurinci

#7
hocam intcon 10001000  açtığımda isis Stack error deyip donup kalıyor,o yüzden onu kaldırmıştım,ekrandan seç yaparak derlediğim kod'ta stack overflow yapıyor ,bir şeyi atladımmı acaba..


hocam çok özür dilerim MCU 16F877 olacaktı ben nedense 16F876A demişim,ona göre derledim isiste yine çalışmadı..yani çalışmam gereken MCU 16F877A..

ete

Wake_up: satırından evvel DISABLE yaz ve öyle derleyip çalıştır. Bu komut ekisk olduğu için stack hatası veriyor.
Yukarıdaki kodu da düzeltiyorum oradan da bakabilirsin.

Ete

onurinci

hocam Stack hatası dediğiniz gibi kalktı ,butonlara tepki bazen 3 ila dört saniye oluyor,birde İsis güç harcamasını hala %12 olarak kullanıyor hala uyumadı galiba.aklıma hiçbir şey gelmiyor,@Sleep mpasm komutu olduğu için acaba derlerken mpasm'yimi açsam birde WDT on durumunda..

ete

Unuttuğumuz bir şey varki oda WDT_ON olmalı Uyku sistemi onun üzerinden çalışıyor. Başkada eklenecek bir şey yok.
Simulasyondaki güç kullanım yüzdesi seni yanıltmasın. O başka bir şey simulasyon pic uykuda da olsa onu çalıştırıp kontroller yapıyor buda ona işlemci kullandırıyor. Bu nedenle gerçek devrede kontrol etmek en iyisidir.
Bende deniyorum ve %6 gösteriyor. Tamamen PC nin işlemci hızı ve önbelleğine bağlı bir şey.

Ete

onurinci

hocam selam , dediğiniz gibi asıl devreye yükleyip deneyeceğim,ilginize teşekkür ederim..

Powered by EzPortal