12 DC voltla calısan dimmer

Başlatan cenkishan, 27 Eylül 2007, 21:24:23

cenkishan

slm arkadaslar 12v dc voltaj ile  7 adet spot lambanın ısıgını ayarlayacak dimmer  yapıyorum.pic ile bir devre tasarladık ama eksikleri var.acaba daha once  bu isle ugrasan yada elinde ornek devre olan varmı.devre butonlu olacak basılı tutuldugu surece ısık parlayacak son parlak seviyesine gelindiginde basa donecek.BOYLE BİR CALISMA YAPAN VARMI YADA ORNEK BİR DEVREYE RASTLAYAN devre tasarlandı ama tam oldu demeden once daha gelismis bir devreye gore degerlendirmek isterim. :roll:  :roll:
SAYGILARIMLA
Bir bit olsam dolaşsam C de byte byte

Cetinal

kullandığın dili bilmiorum ama senin için pwm kullanmak uygundur

pwm dalga yı butona göre kontrol edip işlemi tamamlarsın

cenkishan

yorumun icin sagol arkadasım kullandıgım dil assembler su anda isiste devrem calısıyor her porta iki transistor ve cıkına uygun zener ile voltajı kısıp lambayı yaktım.pwm ile de bi deneyim bakalım.
PWM ile yapılmıs ısık azaltma veya arttırma ile ilgili Assembler ornek kod varmı paylasabilirmisiniz ZAMAN kazanma acısından iyi olurdu.foruma baktım
Bir bit olsam dolaşsam C de byte byte

Cetinal

asm kullanmadğım için örnek kod filan yok elimde ama acil ise şu yöntemle de olabilir

pin0 =1;
gecikme zamanı=x;
pin0=0;
gecikme zamanı=y;

eğer butona basılırsa {
x++;
y--;


bu şekilde de parlaklık azaltılıp arttırılabilir tabi bu ipucunu artık asm ye çevirirsiniz

aslan_korhan

Bu arada lambaları sürmek için transistör değilde MOSFET ( Örneğin IRFZ44 ) kullanırsan çok daha iyi olur.
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

arslan74

Merhaba,

PIC 12F675 için yazdığım dimmer devresi. 12F675 PWM olmadığı için yazılımsal pwm le yaptım.

hi-techte tazılmış örnek kod:

#define	XTAL_FREQ	4MHZ
#include <pic.h>
#include "dimmer.h"
#include "delay.h"


//__IDLOC(0105);
__CONFIG(INTIO & WDTDIS & PROTECT & MCLRDIS & PWRTEN & BORDIS );


static	bit	PULS  @ (unsigned)& GPIO*8+5;	// use this bit to PWM

#define	IN	1
#define	OUT	0

#define ON		0
#define OFF		1

#define DOWN	0
#define UP		1

#define	TMR0_VAL  248		// 0.5MS = 134 DELAY CODE.

#define	PWM_VAL	 30


unsigned char PWM_FLAG;
unsigned char delay;
unsigned char delay_pwm;
unsigned char delay_time;


void
main(void)
{

unsigned char pwm_mode= 10;
unsigned char mode = DOWN;


	OSCCAL = _READ_OSCCAL_DATA();

	GPIO =   0b00100000;
	TRISIO = 0b00000000;
	
	CMCON = 0x07;		// Disable analog pins on TRISIO.
	ANSEL = 0;
	
	OPTION = 0b00000001;
	INTCON = 0b00100000;
	
// --------------------------------------------------
// TMRO 0.1 ms OLARAK AYARLANDI.

	TMR0 = TMR0_VAL;

	T0IF = 0;		// Interupt TMR0 erlauben 
	GIE = 1;		 // Interupt generell erlauben 

	delay_pwm = PWM_VAL;
	delay_time = 10;
	delay = 10;
	pwm_mode = 10;


//	Ana Döngü.
	while(1){
		DelayMs(7);
		
		if (mode == DOWN)
			pwm_mode--;
		else
			pwm_mode++;
		
		
		if (pwm_mode == 1)
			mode = UP;
		else if (pwm_mode == 30)
			mode = DOWN;
			
					
		switch (pwm_mode){		
			case 30: delay_time = 30; break;
			case 29: delay_time = 29; break;
			case 28: delay_time = 28; break;
			case 27: delay_time = 27; break;
			case 26: delay_time = 26; break;
			case 25: delay_time = 25; break;
			case 24: delay_time = 24; break;
			case 23: delay_time = 23; break;
			case 22: delay_time = 22; break;
			case 21: delay_time = 21; break;
			case 20: delay_time = 20; break;
			case 19: delay_time = 19; break;
			case 18: delay_time = 18; break;
			case 17: delay_time = 17; break;
			case 16: delay_time = 16; break;
			case 15: delay_time = 15; break;
			case 14: delay_time = 14; break;
			case 13: delay_time = 13; break;
			case 12: delay_time = 12; break;
			case 11: delay_time = 11; break;
			case 10: delay_time = 10; break;
			case 9: delay_time = 9; break;
			case 8: delay_time = 8; break;
			case 7:	delay_time = 7; break;
			case 6: delay_time = 6; break;
			case 5: delay_time = 5; break;
			case 4:	delay_time = 4; break;
			case 3:	delay_time = 3; break;
			case 2: delay_time = 2; break;
			case 1:	delay_time = 1; break;
			case 0:	delay_time = 0;
		}



	}

}




static void interrupt
isr(void)				// Here be interrupt function - the name is unimportant.
{
	if(T0IF) {				// timer interrupt
		TMR0 = TMR0_VAL;
		
		if (!delay_time){
			PULS = OFF;
			PWM_FLAG = IN;		
		}
		
		else if (delay_time == 30){
			PULS = ON;
			PWM_FLAG = OUT;		
			
		}
		
		else if ( PWM_FLAG == OUT ){
			PULS = ON;
			delay = delay_time;
			PWM_FLAG = IN;
		}
		
		else {
			if (!delay--){
				PULS = OFF;
				delay = delay_time;
			}
			if ( !delay_pwm-- ){
				PULS = OFF;
				PWM_FLAG = OUT;
				delay = delay_time;
				delay_pwm = PWM_VAL;
			}
		}
		
		T0IF = 0;			// clear the interrupt flag
	}


}


Buda hex kod:

:10000000830100308A003828A00003088301AB0078
:100010000B1D3228F83083128100A408031D12281A
:1000200085161F2824081E3A031D19288512A101D0
:100030003128A108031D222885122408A200A1014D
:10004000A10A3128A203220F282885162408A2001D
:10005000A303230F31288516A1012408A2001E3016
:10006000A3000B1183122B088300A00E200E0900A1
:10007000213084002A30412083015B2B040680015B
:0A008000840A0406031D3E28003424
:10063A008312A7000430A8001930A900A90B232BA4
:10064A00A80B212BA70B1F2B08008312A500322B06
:10065A000B30A600A603260F2F2B8312A503250F06
:10066A002D2B080005308312A500422B0B30A60063
:10067A0000000000A603260F3F2BA503250F3B2BE6
:10068A0008008312A500562B0A30A600532B00003F
:10069A00000000000E30A700A70B512BA603260F5F
:1006AA004C2B8312A503250F492B08000A3083120D
:1006BA00A600A5018312FF2383169000203083121F
:1006CA0085008316850107308312990083169F01DE
:1006DA008101810A20308B00F830831281000B11CE
:1006EA008B171E30A3000A30A400A200A600073010
:1006FA001D23A508031D832BA603842BA60A260BFC
:10070A00892BA501A50ACF2B26081E3A031DCF2B3C
:10071A00A501CF2B1E30C82B1D30C82B1C30C82B6F
:10072A001B30C82B1A30C82B1930C82B1830C82BCD
:10073A001730C82B1630C82B1530C82B1430C82BCD
:10074A001330C82B1230C82B1130C82B1030C82BCD
:10075A000F30C82B0E30C82B0D30C82B0C30C82BCD
:10076A000B30C82B0A30C82B0930C82B0830C82BCD
:10077A000730C82B0630C82B0530C82B0430C82BCD
:10078A000330C82B0230A4007C2BA401A40A7C2BC2
:10079A00A4017C2B2608AA00E13E03187C2B1F3EED
:1007AA00031C7C2B0030AA0203308A00E0302A079F
:1007BA0003188A0A8200CD2BCA2BC72BC52BC32B41
:1007CA00C12BBF2BBD2BBB2BB92BB72BB52BB32BF7
:1007DA00B12BAF2BAD2BAB2BA92BA72BA52BA32B67
:1007EA00A12B9F2B9D2B9B2B992B972B952B932BD7
:0407FA00912B8F2B85
:02400E00043F6D
:104200002000440065007300690067006E002C0008
:104210002000200048006100730061006E00200053
:1042200020004100720073006C0061006E002000ED
:10423000200020002000200020002000200020007E
:10424000560065007200200031002E003000300062
:10425000200020002000200020002000200020005E
:104260005000650072006600650063007400200065
:1042700045006C0065006B00740072006F006E00FA
:10428000200020002000200020002000200020002E
:10429000540065006C003A003000320031003200FA
:1042A00035003900300033003700390032002E006D
:1042B00020002000200020002000200020002000FE
:1042C000300037002F00300035002F00300036005E
:00000001FF



Selamlar

cenkishan

Alıntı yapılan: "RoMeO123"asm kullanmadğım için örnek kod filan yok elimde ama acil ise şu yöntemle de olabilir

pin0 =1;
gecikme zamanı=x;
pin0=0;
gecikme zamanı=y;

eğer butona basılırsa {
x++;
y--;


bu şekilde de parlaklık azaltılıp arttırılabilir tabi bu ipucunu artık asm ye çevirirsiniz
zaten bu yontemle yaptım arkadasım.zaman gecislerinle oynayıp yaptım.
ACTIGIM KONUYA yazdıgınız mesajlar icin teşekkür ederim.ilk mesajımda da yazdıgım gibi kodumu ve bu konudaki ilk devremi bu konuyu acmadan tasarlamıstım.simdi iki farklı daha devre olusturduk.kodu yazmak 10 dakikamı almadı cok basit.ogrenmek istedigim daha once tasarlanmıs ornek devreye bir goz atmaktı.LAMBALARI surus tipi onemli benim icin.butun yaptıgım yazılımlarda assemblerden baska dil kullanmıyordum.ama hitech hosuma gitti sagol arslan arkadasım kodların benim  icin hitech ogrenme acısından yararlı olacak.
Bir bit olsam dolaşsam C de byte byte

arslan74

Merhaba,

Sana projenin bütün kodlarını gönderiyorum.

http://rapidshare.com/files/58938779/led_dimmer.rar.html

içinde proteus simulasyonuda var.

Alıntı Yapbutun yaptıgım yazılımlarda assemblerden baska dil kullanmıyordum.ama hitech hosuma gitti sagol arslan arkadasım kodların benim icin hitech ogrenme acısından yararlı olacak.

Eğer C dili iyi biliyorsan, hi-techle cok güzel projeler hazırlayabilirsiniz.
C, ASM gibi hantal bir değildir. Size cok büyük ufuklar acacaktır. ASM de Kod yazmak tam bir cin işkencesi.

Eğer bu işi profesyonel yapmak iştiyorsan mutlaka C diline gecmeni öneririm. Tabi Ansi-C diline uyumlu olmasına dikkat et.

Selamlar

cenkishan

sagol arslan74 emeğin icin ama suan daha agırlıklı asm ile yazıyorum işkenceye devam..asm ile cok yazdıgım icin bu iskenceden zevk alıyorum.adım adım hitech c'ye gececegim kodlar cok yararlı olacak..dimmer devresini kurdum isiste simulasyonunu yaptım.degisik surme yontemleri deneyerek bir tanesinde karar kıldım.zaten kodlar basit.kodlarınıda yazımsal pwm olarak yapmıstım.tek buton ile calısıyor.ve her basısta farklı ısık siddeti vererek ısık yayıyor.f
1 kere bastın 1. kademe
2 kere bastın 2. kademe ...
gibi
simdi ben bunları nerden kaldıyssa yani enson hangi ısık siddetinde kaldıysa ordan devam etmesini istiyorum.pic epromuna kayıt ediyorum okuyorumda.
SORUN;nerde kaldıgını okumak icin eepromun kodu basta olması gerekiyor.eepromu sırasıyla okumam gerekli old.  icinde hep ilk yapılan kayıttaki led yanıyor acıp kapayınca.ilk kayıtlı olanı silip ikiye atlattıgımdada hep ikinci deki deger yanıp kalıyor acıp kapayınca bana kapatırken en son hangi aktifse o ledden devam etmesi gerekiyor.hem adc li bir programla ugrasmak hemde arada bu is geldi.belki yontem cok kolay olabilir suan aklıma gelmedi.belki bu mesajı yazdıktan sonra sabah ise giderken aklıma gelir.nasıl bir calısma diyagramı gerektigi.yazılımla cok ugrastıgımda bazen önümde duran basit yontemi goremiyorum aradan zaman geciyo aklıma geliyo.. sizce nasıl bir yol izlenmeli deneyimlerinizi paylasırmısınız.
Bir bit olsam dolaşsam C de byte byte

arslan74

Merhaba,

Alıntı Yap
SORUN;nerde kaldıgını okumak icin eepromun kodu basta olması gerekiyor.eepromu sırasıyla okumam gerekli old. icinde hep ilk yapılan kayıttaki led yanıyor acıp kapayınca.ilk kayıtlı olanı silip ikiye atlattıgımdada hep ikinci deki deger yanıp kalıyor acıp kapayınca bana kapatırken en son hangi aktifse o ledden devam etmesi gerekiyor.hem adc li bir programla ugrasmak hemde arada bu is geldi.belki yontem cok kolay olabilir suan aklıma gelmedi.belki bu mesajı yazdıktan sonra sabah ise giderken aklıma gelir.nasıl bir calısma diyagramı gerektigi.yazılımla cok ugrastıgımda bazen önümde duran basit yontemi goremiyorum aradan zaman geciyo aklıma geliyo.. sizce nasıl bir yol izlenmeli deneyimlerinizi paylasırmısınız.

anlatmanından fazla bir şey anlamadım. ancak anladığım kadarıyla. En yapılan işlemi hafızasında tutmak isityorsun, sonra sistem tekrar acıldığında kaldığı yerden devam etmesini isityorsun. Bu basit bir işleme benziyor.

Şimdi hangi konumda olduğun nasıl belirlediğine bağlı. Eğer bu değişteni bir bytelik bir değer olarak sakliyorsan. Her acılışta belirlediğin adreski eepromdan değeri okuyub bu değişkene atarsın. Sonra bu değişken değere göre işlem yaparsın.

Bir başka konuma gectiğinde bu değişken değeri ona göre ayarlarsın ve bu değişken değeride eeprom hafızasına yazarsın.

Bu sayede her acılışta nerde kaldığını bilmiş olacak.

Başarılar

mell

Alıntı yapılan: "cenkishan"sagol arslan74 emeğin icin ama suan daha agırlıklı asm ile yazıyorum işkenceye devam..asm ile cok yazdıgım icin bu iskenceden zevk alıyorum.adım adım hitech c'ye gececegim kodlar cok yararlı olacak..dimmer devresini kurdum isiste simulasyonunu yaptım.degisik surme yontemleri deneyerek bir tanesinde karar kıldım.zaten kodlar basit.kodlarınıda yazımsal pwm olarak yapmıstım.tek buton ile calısıyor.ve her basısta farklı ısık siddeti vererek ısık yayıyor.f
1 kere bastın 1. kademe
2 kere bastın 2. kademe ...
gibi
simdi ben bunları nerden kaldıyssa yani enson hangi ısık siddetinde kaldıysa ordan devam etmesini istiyorum.pic epromuna kayıt ediyorum okuyorumda.
SORUN;nerde kaldıgını okumak icin eepromun kodu basta olması gerekiyor.eepromu sırasıyla okumam gerekli old.  icinde hep ilk yapılan kayıttaki led yanıyor acıp kapayınca.ilk kayıtlı olanı silip ikiye atlattıgımdada hep ikinci deki deger yanıp kalıyor acıp kapayınca bana kapatırken en son hangi aktifse o ledden devam etmesi gerekiyor.hem adc li bir programla ugrasmak hemde arada bu is geldi.belki yontem cok kolay olabilir suan aklıma gelmedi.belki bu mesajı yazdıktan sonra sabah ise giderken aklıma gelir.nasıl bir calısma diyagramı gerektigi.yazılımla cok ugrastıgımda bazen önümde duran basit yontemi goremiyorum aradan zaman geciyo aklıma geliyo.. sizce nasıl bir yol izlenmeli deneyimlerinizi paylasırmısınız.


selam dostum yaptığın devreiçin tebrikler peki onu bizimle paylaşabilirmisin benim elimdede yaptıgın devrenin aynısının 220V olanı var banada dc12 yada 24v çalışanı lazım yardımcı olursan sevinirim şimdiden teşekkürler..

debi

Alıntı yapılan: "RoMeO123"asm kullanmadğım için örnek kod filan yok elimde ama acil ise şu yöntemle de olabilir

pin0 =1;
gecikme zamanı=x;
pin0=0;
gecikme zamanı=y;

eğer butona basılırsa {
x++;
y--;


bu şekilde de parlaklık azaltılıp arttırılabilir tabi bu ipucunu artık asm ye çevirirsiniz


pin0 =1;
gecikme zamanı=x;
pin0=0;
gecikme zamanı=y-x;

x=0 için çıkış gerilimi 0 olmuyor arkadaşlar..  Değişkene değer atayarak yaptığımda çıkış 0 olmuyor. Fakat direk olarak değer verdiğimde çıkışta 0 görüyorum... Bu sorun neden kaynaklanıyor olabilir?