Aynı anda üç for next ve çıkış işlemi

Başlatan OG, 07 Ekim 2005, 22:27:37

OG

Arkadaşlar aşağıdaki kod da for next ile elde edilmiş değişkeni 1 pin den çıkış almak mümkün. Benzer şekilde aynı anda 2 değişkeni daha ayrı ayrı for next işlem yaptırıp onların değerlerini de başka 2 ayrı pinden almam mümkünmüdür? Yani 3 ayrı pwm e benzer çıkış elde etmek istiyorum.

Proton code:
DEVICE = 12F629

CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_OFF, MCLRE_ON, BODEN_ON, CP_OFF 

OUTPUT 2

LOW 2

DIM fade AS WORD 

Main:

DELAYMS 500

FOR fade = 1 TO 1024 STEP 1

GPIO.2 = 1
DELAYUS fade
GPIO.2 = 0
DELAYUS 1025 - fade

NEXT

FOR fade = 1024 TO 1 STEP - 1

GPIO.2 = 1
DELAYUS fade
GPIO.2 = 0
DELAYUS 1025 - fade

NEXT

GOTO Main

END


PBP code:
OUTPUT 2

Low 2

fade VAR WORD 

Main:

Pause 500

For fade = 1 to 1024 STEP 1

GPIO.2 = 1
PauseUS fade
GPIO.2 = 0
PauseUS 1025 - fade

Next

For fade = 1024 to 1 STEP - 1

GPIO.2 = 1
PauseUS fade
GPIO.2 = 0
PauseUS 1025 - fade

NEXT

Goto Main

END
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mhk

16f628 için sana bir pwm kodu yazayım. Hatta dışardan değerini değiştirebiliyorsun.
define osc 20

@ device HS_OSC
@ device pwrt_on & MCLR_OFF
@ device WDT_OFF
@ device protect_on & cpd_on

cmcon=7

TRISA = %11100111
TRISB = %00011111
porta=0
portb=0        
'************* GİRİŞ ÇIKIŞ TANIMLAMALARI ************
volume1 var portb.5
volume2 var portb.6
balance var porta.3
bas var portb.7
tiz var porta.4
bilgi var porta

'********************* Değişken tanımlamaları **********
zaman1 var byte
zaman2 var byte
zaman3 var byte
zaman4 var byte
zaman5 var byte
giris var byte
deger var byte
yazgec var byte

'******** DEĞİŞKEN İLK DEĞERLER ************
yazgec=0
porta=0:portb=0
bilgi=0
giris=0
zaman1=0:zaman2=0:zaman3=0:zaman4=0:zaman5=128

tmr0=0
option_reg=%10000100
pause 500
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
'///////////////// ANA PROGRAM \\\\\\\\\\\\\\\\\
basla:
if tmr0>=zaman1 then volume1=0
if tmr0>=zaman2 then volume2=0
if tmr0>=zaman3 then bas=0
if tmr0>=zaman4 then tiz=0
if tmr0>=zaman5 then balance=0

if tmr0<10 then 
            portb=255:porta=255
endif
giris=portb & %00011111
if bilgi=0  then basla
if bilgi=1 then zaman1=giris << 3
if bilgi=2 then zaman2=giris << 3
if bilgi=3 then zaman3=giris << 3
if bilgi=4 then zaman4=giris << 3
if bilgi=5 then zaman5=giris << 3

goto basla
End


Burda bilgi seçme ucu , giriş te gelen bilgi anlamındadır. 16f628 de pin sayısı max 16 olduğu için ben girişi 5 pinle diğer br deyişle 5 bit çözünürlükle 32 farklı şekilde yapmıştım. Bilgi seçme ucu demiştim. Bu uç ile dışardan verdiğin bilgi seçme ucu ile değiştireceğin değerleri giriyorsun. sanırım program bir çok şeyi anlatacaktır. Beş farklı pwm için kullanılıyor bu program.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

OG

@mhk

Teşekkür ederim, kodları anlamaya calışıyorum. Diğer taraftan 8 bit değer alabilse idi daha bir güzel olurdu. 8 bit için 877 ye falan uyarlanabilirmi?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

OG

@mhk

Şu bölüm eksikmi?

'************* GİRİŞ ÇIKIŞ TANIMLAMALARI ************ 
volume1 var portb.5 
volume2 var portb.6 
balance var porta.3 
bas var portb.7 
tiz var porta.4    
bilgi var porta   <----Porta pin tanımlı değilmi?


Birde vakit bulursan kodun çalışması hakkında küçük açıklama yapabilirmisin?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mhk

Biraz karışık oldu biliyorum. Burda bilgi ile tanımlanmış olan seçme uçlarıdır. Yani hangi pwm değeri ayarlanmak isteniyorsa onu seçmek içindir. Sevgili OG bilgi var porta yazarken porta'nın ilk 3 bitini kulandığım için böyle yaptım. Yani programı gereksiz gecikmelerden önlemek için minimum kodla yazmak zorundaydım ve böyle oldu.  Programın çalışmasına gelince , tmr0 zamanlayıcısını çalıştırıyorsunuz.  Normal de 10dan küçükse çıkışlar 1 oluyor. zaman1 2 yada diğerlerinin ayarlandığını düşünecek olursak,ilgili değere ulaşıldığında çıkışları 0 yapar. Bu kodları bir sistemin ses kontrolünde kullanmıştım. PWM 'i hatırlayacak olursak, frekansı sabit doluluk oranını artırıp azaltıyorduk. Burda frekans sabitlemesini tmr0 doluluk boşluk ayarlarını ise zaman1, zaman2 ve diğer değişkenlerin aldığı değerler gerçekleştiriyor.  
      Diğer soruna gelince 8 bit değer alabilir. Burda kullanılan zaman1,2,3,4,5 değişkenlerini 0-255 arası değer verdiğinde 8 bit olmuş olur. Dikkat edersen benim verdiğim örnekte zaman1,2,3,4,5 değişkenleri giriş değişkeni üzerinden 3 defa sola kaydırılmış durumda uda 8 ile çarpma anlamındadır. Ben sistmemde 32 değişik ses noktası kullandığım için böyle yaptım. Eğer giriş değişkenlerini olduğu gibi zaman1,2,3,4,5 değişkenlerine aktarırsan 8 bir yapmış olursun. Diğer bir nokta giriş değişkeni portb üzerinden 5 bit alıyor. 16F628 de port azlığı nedeni ile böyle oldu. 16F877 de giris=portb yazarak ve tüm portb yi giriş olrak kullandığında 8 bit yapmış olursun. Hatta biraz daha ileri giderek tmr1 sayıcısını kullanarak 16 bit pwm bile teoride mümkün.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

OG

Sevgili üstadım tam çözmeye çalışıyorum olayı. Biraz başını ağrıtacağım gibi. Yardımların için sağol.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mhk

en az 6 adet 16 bitlik pwm yaptığında bizimle paylaş tamam mı ;)  Kolay gelsin.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

OG

Buyur üstat, port sayısı kadar pwm.

Örnek:
8 çıkışlı port için (PortB) 8 adet değişkenler;
a, b, c, d, e, f, g, h

PWM_cozunurluk: Örnek=255

m= İlgili porta çıkış verecek değişken


a var BYTE
b var BYTE
c var BYTE
d var BYTE
e var BYTE
f var BYTE
g var BYTE
h var BYTE
m var WORD
i VAR WORD
TRISB=0

a=0
b=0
c=0
d=0
e=0
f=0
g=0
h=0
m=0


basla:
a=255
b=127
c=64
d=32
e=16
f=8
g=4
h=2

PORTB=0      
For i = 1 TO 255  
       
m=0 

IF a>0 Then 
m=m+1 
a=a-1 
EndIF 

IF b>0 Then 
m=m+2 
b=b-1 
EndIF 

IF c>0 Then 
m=m+4 
c=c-1 
EndIF 

IF d>0 Then 
m=m+8 
d=d-1 
EndIF 

IF e>0 Then 
m=m+16 
e=e-1 
EndIF 

IF f>0 Then 
m=m+32 
f=f-1 
EndIF 

IF g>0 Then 
m=m+64 
g=g-1 
EndIF 

IF h>0 Then 
m=m+128 
h=h-1 
EndIF 
             
PORTB=m 
Next i 

GOTO basla

END


Proteusda denedim 20MHz de calışınca 150Hz gibi bir frekansla pwm gorunuyor.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

mhk

Eğer osiloskop ile ölçme şansın olabilirse ve düzgün bir pwm sinyali alabiliyorsan neden olmasın? Bu arada dışardan veri alma işleminide gerçekleştirebilirse ne kadar hoş olur. ;)
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana