avatar_elektro77

12F675 UYKU MODU

Başlatan elektro77, 01 Ekim 2020, 22:47:25

elektro77

Kolay gelsin...
Aşağıdaki kodlarla  bir vericiden 8 bitlik tek bir datayı alıcıya 5 saniye aralıklarla göndermek ve her 5 saniyelik aralıktada 12f675 i pil tüketmemesi açısından uykuya sokmak istiyorum. (Kodlarda sistemi uykudan çıkarmak için giriş değişikliği kesmesi veya port değişiklik kesmesi kullanabileceğim bir buton yoktur.)
Aynı zamanda vericinin beslemesini sağlayan bir smd mosfet için bir pin daha var. Bu pinide her uyanışta aktif ve her uykuda pasif etmem gerekli.
Bu yapılabilir mi? Evet ise sleep modu kodları nasıl olmalıdır?
Saygılarımla
Kodlar aşağıdadır:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON &_MCLRE_OFF & _BODEN_OFF & _CP_ON
DEFINE OSCCAL_1K 1 
DEFINE OSC 4                                       
TRISIO=%00000000
GPIO  =%00000000
'-------------------------
OPTION_REG.7=1 'pullup dirençler aktif  '1 ise devrede değil
CMCON = 7
ANSEL = 0 
'------------------------------------------------------------------------------
'SYMBOL CIKIS=GPIO.5 'DATA ÇIKIŞ PİNİ
symbol txaktif=GPIO.4 'verici beslemesi aktif etme pini
txaktif=0
BILGI VAR BYTE	
BILGI=0
'------------------------------------------------------------------------------
PAUSE 200

BASLA:
'@sleep
TXAKTIF=1'  VERİCİ ÇALIŞTIRILDI
pause 200  'vericinin hazır olması için verilen süre
BILGI=1
GOSUB GONDER
TXAKTIF=0'  VERİCİ KAPATILDI
'pause 4800



GOTO BASLA

GONDER:
SEROUT2 GPIO.5,396,["U","M","I","T",BILGI]
SEROUT2 GPIO.5,396,["U","M","I","T",BILGI]
RETURN
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Sleep komutunu @ Sleep şeklinde kullanırsam ASM modunda uykuya sokarsın işlemciyi ve uyandırmak için mutlaka bir harici kesme yaratılması yada reset edilmesi gerekir.
Ancak BAsic de de direk (Sleep sn) şeklinde komut var. Sleep 5 şeklinde kullanırsan sistem 5 sn müddetle o satırda uykuya girer ve 5 sn sonra uyanır. Bu sistem geri planda çalışan WDT sayacı kullanılarak çalışıyor. Bu komut OSC frekansından etkilenir SN peryodu yaklaşık 4 Mhz OSC frekansı için geçerlidir. Değişik frekanslarda süre değişir test edip uygun değer vermek gerekir.
Sen 4 Mhz ile çalıştığına göre sorun yok.

Ete

elektro77

#2
Alıntı yapılan: ete - 02 Ekim 2020, 08:41:56Sleep komutunu @ Sleep şeklinde kullanırsam ASM modunda uykuya sokarsın işlemciyi ve uyandırmak için mutlaka bir harici kesme yaratılması yada reset edilmesi gerekir.
Ancak BAsic de de direk (Sleep sn) şeklinde komut var. Sleep 5 şeklinde kullanırsan sistem 5 sn müddetle o satırda uykuya girer ve 5 sn sonra uyanır. Bu sistem geri planda çalışan WDT sayacı kullanılarak çalışıyor. Bu komut OSC frekansından etkilenir SN peryodu yaklaşık 4 Mhz OSC frekansı için geçerlidir. Değişik frekanslarda süre değişir test edip uygun değer vermek gerekir.
Sen 4 Mhz ile çalıştığına göre sorun yok.

Ete

Teşekkürler hocam.
'Sleep xxx' komutunun alabileceği en yüksek değer nedir?(ekleme;sleep xx komutunun 16 bit olduğunu öğrendim)
 
Ve bu komut ile gerçekte mcu nun çektiği akım ­nA seviyesine düşüyormu? sonuçta arka planda bir sayaç çalışıyor.
(Ekleme:12F675
Low Power Features:
• Standby Current:
- 1 nA @ 2.0V, typical
• Operating Current:
- 8.5μA @ 32 kHz, 2.0V, typical
- 100μA @ 1 MHz, 2.0V, typical
• Watchdog Timer Current
- 300 nA @ 2.0V, typical
• Timer1 oscillator current:
- 4 μA @ 32 kHz, 2.0V, typical)
 
Ek olarak kodların çalışma frekansını düşürürsem mcu nun daha az akım çekmesini sağlayabilirmiyim.
Örneğin 'define osc x' komutunun alabileceği en küçük değer nedir.
Bu durumdada serout2 komut seti frekansa göre ayarlanmalı mıdır?.
Saygılarımla
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#3
Yukardaki mesajımda sorduğum sorularımı biraz datasheet araştırması ile nerdeyse kendim cevapladım.
(Ete hocam kızmıştır datasheet okumuyorsunuz diye :) )
Fakat cevabını bulamadığım iki sorum kaldı
1-12F675 i khz bandında çalıştırmak için 'define osc' komutu nasıl yazılmalıdır?
2-Kodlar Khz bandında çalışıldığında serout2 komutu baudrate oranı düşürülmelimidir?
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Kendi dahili OSC si 4Mhz başka seçeneği yok. Ama haricen düşük değerli kristal bağlarsanız mesela 32Khz o zaman ;
_FOSC_LP             EQU  H'3FF8'; LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_LP_OSC              EQU  H'3FF8'; LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
seçeneklerinden birini kullanmanız gerekecek.
Bu kristalin kondansatörleri ise 68-100pf aralığında olmalı. Data sheet 53. sayfada açıklanmış bunlar.
32Khz de Serout komutunun çalışıp çalışmayacağından emin değilim. Elbette baud rate'i temsil eden rakam bu hıza göre hesaplanıp verilmelidir. Ama çok düşük bir hız dediğim gibi emin değilim. Hiç bu hızlarda çalışmadım çünki.
Ete

elektro77

#5
Alıntı yapılan: ete - 02 Ekim 2020, 10:52:03Kendi dahili OSC si 4Mhz başka seçeneği yok. Ama haricen düşük değerli kristal bağlarsanız mesela 32Khz o zaman ;
_FOSC_LP             EQU  H'3FF8'; LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
_LP_OSC              EQU  H'3FF8'; LP oscillator: Low power crystal on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN
seçeneklerinden birini kullanmanız gerekecek.
Bu kristalin kondansatörleri ise 68-100pf aralığında olmalı. Data sheet 53. sayfada açıklanmış bunlar.
32Khz de Serout komutunun çalışıp çalışmayacağından emin değilim. Elbette baud rate'i temsil eden rakam bu hıza göre hesaplanıp verilmelidir. Ama çok düşük bir hız dediğim gibi emin değilim. Hiç bu hızlarda çalışmadım çünki.
Ete

O zaman tek çare devreyi gerçekte yapıp denemek. ISIS te çalışması gerçekte çalışacağı anlamına gelir mi bilmiyorum? Emin değilim.
32khz bir kristal bulursam gerçekte deneyip sonucu bildiririm. Denemeyi en düşük baud rate oranından başlayarak yapacağım.
Fakat 32Khz de aynı formül geçerlimidir. (1.000.000/baudrate)-20=?   buradaki 1 milyon nedir.? 1Mhz deki oranmıdır?
 12f675i smd kılıf kullanıp program yüklemek için ıcsp giriş özellikli bir pcb kurmayı,picte ıcsp için kullanılan pinleri ise sadece programlama için kulanıp, kalan pinleri de iş için kullanmayı planlıyordum.
Hem icsp ve hemde de o pinleri iş için kullanma devresi şeması nasıl olmalıdır ondanda tam emin değilim aslında.
Kristal kullanımı ise bu iş için kullandığım, ıcsp de kullanılmayan, boşta kalan gpio.4 ve gpıo.5 pinlerini elimden alıyor.

Bu konuda da yardım ederseniz sevinirim hocam.
Resim:12f675 icsp kullanımı

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

32 Khz de aynı formül geçerlidir. O formül OSC frekansından bağımsızdır. Ayarlamayı Define OSC xx komutu yapacaktır. Sen ne vereceksinde onu yapacak onu bilemiyorum.
Sürekli uç noktalardasın hep imkansızları deniyorsun ne olacak senin bu halin bilemiyorum.!!!!!
ICSP kullanımında temel fikir Pic ICSP pinleri daima ICSP soketine direk bağlı olmalıdır. Aynı pinler devreyede bağlı ise o pinler devreden en az 4K7 direnç ile izole edilmelidir.
Hepsi bukadar basit değilmi.

Ete

elektro77

#7
Alıntı yapılan: ete - 02 Ekim 2020, 17:10:1132 Khz de aynı formül geçerlidir. O formül OSC frekansından bağımsızdır. Ayarlamayı Define OSC xx komutu yapacaktır. Sen ne vereceksinde onu yapacak onu bilemiyorum.
Ete
Evet 'Define OSC XX' oraya ne yazacağız hocam. Şu olabilirmi 'define osc 4000000' veya 'define osc 32000'(ek:denedim olmadı.Pbp kabul etmedi)
Peki hocam 32Khz den kastı ne datashetteki.
Low Power Features:
• Standby Current:
- 1 nA @ 2.0V, typical
• Operating Current:
- 8.5μA @ 32 kHz, 2.0V, typical
- 100μA @ 1 MHz, 2.0V, typical
• Watchdog Timer Current
- 300 nA @ 2.0V, typical
• Timer1 oscillator current:
- 4 μA @ 32 kHz, 2.0V, typical)

Hocam amacım tamamen pilden maksimum süre ile yararlanmak. Olmadı 4 Mhz yapıcam. Çözümü yoksa. 1 Mhz de mi yapamıyoruz.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Ne yazacağını bende bilmiyorum. Hiç böyle bir deneyimim olmadı. OSC komutu genelde MHZ cinsiden değerleri kabul ediyor. Data sheet ASM diline göre düzenlenmiştir.
Dahili OSC sadece 4Mhz de çalışıyor. Başka alternatifi yok.
Sen bağla 32Khz kristali. OSC komutunu koymasanda sistem o frekansa göre çalışır.
Bu konuda başka yorum yapmayacağım. Bilmediğim konular çünki.
Ete

MB_77

#9
bu mesaj tarafımdan silinmiştir.

elektro77

#10
Bu konuyu yeniden ele almam biraz uzun sürdü.
Aşağıdaki kodlarla 12F675  _FOSC_LP ayarı ile hiç kristal kullanmadan 32Khz de çalışıyor.
Aslında 'define osc 4' gibi, kodlarla tanımlayabildiğim bir değer olmadığı için 32Khz olduğunu zannediyorum.
Yaklaşık gecikmeleri ise aşağıdaki gibi hesapladım. Gerçekte de aynen bu değerlerde çalışıyor. Fakat VDD voltajı değiştikçe bu sürelerdede biraz oynama oluyor. Vdd +5.000 voltta iken sleep 1 değeri yaklaşık 2 saniye gecikme yaratırken, VDD +2.000 volt iken bu süre yaklaşık 3.5 saniyeye çıkıyor. Yani 12F675 datasheet inin 84. ve 85. sayfalarındaki voltaj ve frekans ilişkisi grafiklerini iyi incelemek gerekiyor.
Test esnasında VDD +2.000V iken aşağıdaki değerler ortaya çıkıyor;
1-pause 10 '32Khz de yaklaşık 1 sn lik gecikme yaratıyor
2-sleep 1  '32Khz de yaklaşık 3 sn lik uyuma sağlıyor. watchdog timer ı kullanır
3-sleep 10 '32Khz de yaklaşık 19 sn lik uyuma sağlıyor. watchdog timer ı kullanır
-32Khz dahili OCS de Çekilen akımlar ise şöyle;
  ' VDD +2.005 volt iken-sleep moduna girdiğinde çekilen akım +0.7µA (pause komutunda çekilen akım ise 13.6µA)
  ' VDD +2.509 volt iken-sleep moduna girdiğinde çekilen akım +1.5µA
  ' VDD +3.005 volt iken-sleep moduna girdiğinde çekilen akım +2.9µA
  ' VDD +3.510 volt iken-sleep moduna girdiğinde çekilen akım +5.2µA
  ' VDD +4.005 volt iken-sleep moduna girdiğinde çekilen akım +8.0µA
  ' VDD +4.505 volt iken-sleep moduna girdiğinde çekilen akım +18.6µA
  ' VDD +5.000 volt iken-sleep moduna girdiğinde çekilen akım +28.2µA
  ' VDD +5.500 volt iken-sleep moduna girdiğinde çekilen akım +39.2µA

4Mhz dahili OCS de Çekilen akımlar ise 32Khz ile neredeyse tıpatıp aynı. Yani picin datasheetinde yazdığı gibi 32Khz dahili osc kullanmanın  çekilen akımda çok büyük bir düşüş sağlayan bariz bir faydası olmuyor. Yani Picin batarya ile kullanımılarında, 4 Mhz dahili osc ile de sağlanabilecek en uygun şartlarda sayılır.

Ek olarak,test esnasında şöyle bir durum oluşuyor: Uyku modunda olan Picin üzerine parmak koyulduğunda
çekilen akımlarda biraz düşme oluyor. Fakat picin üzerine gnd ye bağlı bir faraday kafesi geçirilip kafesin üzerine parmak koyulduğunda etkilenmiyor.
'_FOSC_LP ' 32Khz için dahili osc ayarı
@ __config _FOSC_LP & _WDT_ON & _PWRTE_ON &_MCLRE_OFF & _BODEN_OFF & _CP_ON 
'@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON &_MCLRE_OFF & _BODEN_OFF & _CP_ON  
DEFINE OSCCAL_1K 1
'DEFINE OSC 4                                      
TRISIO=%00000000
GPIO  =%00000000
'-------------------------
OPTION_REG.7=1 '0 ise pullup dirençler aktif,  1 ise devrede değil
CMCON = 7
ANSEL = 0      'adc ler iptal. Tüm pinler digital giriş veya çıkış 
'------------------------------------------------------------------------------
SYMBOL led=GPIO.0 
'------------------------------------------------------------------------------
BASLA:
'pause 10 '32Khz de 1 sn lik gecikme değeri
'sleep 1  '32Khz de 3 sn lik uyuma değeri watchdog timer ı kullanır
led=1
pause 100  
led=0
sleep 10 '32Khz de yaklaşık 19 saniye gecikme sağlıyor

GOTO BASLA
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

Powered by EzPortal