Erdem
Paylaşımcı üye
- Katılım
- 14 Ocak 2013
- Mesajlar
- 713
- Puanları
- 106
PIC 16F877A µ denetleyicisi ile acemi işi kara şimşek.
Hakikisinde herhalde bu işi darbe süresinin değişimi ile ("PWM") yapıyorlardır diye tahmin ediyorum. Örneğin ortada koyu yanan bir ışık var. Onun hemen yanındakiler gittikçe daha az yanıyor. Böylece koyu renkli ışık bir sağa bir sola hareket ediyor.
Ama hem elimdeki dirençler farklı farklı olduğu için, hem de fazla vakit kaybetmemek için uğraşmadım.
Bir de şans eseri gözüme ilişti. Fi tarihinde bunu D dili ve paralel port kullanarak yapmışım.
Aynı uygulamanın iki farklı dille nasıl yazılabileceğini kıyaslamak isteyenler olabileceğini düşünerek bu örneği de ekliyorum.
C:
#include <pic.h>
#ifndef _XTAL_FREQ
// Saat frekansı 16 Mhz
#define _XTAL_FREQ 16000000
#endif
__CONFIG (FOSC_HS & WDTE_OFF & LVP_OFF & CPD_OFF & CP_OFF);
char yanan = 3;
char sagamiGidiyoruz = 0;
int main()
{
TRISB = 0; // PORTB çıkış
while(1)
{
/* PORTB'yi düşük yap */
PORTB = 0;
/* 33 ms bekle */
__delay_ms(33);
PORTB = yanan;
/* 33 ms bekle */
__delay_ms(33);
if (yanan >= 0xC0) // b 1100 0000
sagamiGidiyoruz = 1;
if (yanan <= 0x03) // b 0000 0011
sagamiGidiyoruz = 0;
if (sagamiGidiyoruz)
{
yanan >>= 1;
}
else
{
yanan <<= 1;
}
}
}
Ama hem elimdeki dirençler farklı farklı olduğu için, hem de fazla vakit kaybetmemek için uğraşmadım.
Bir de şans eseri gözüme ilişti. Fi tarihinde bunu D dili ve paralel port kullanarak yapmışım.
Aynı uygulamanın iki farklı dille nasıl yazılabileceğini kıyaslamak isteyenler olabileceğini düşünerek bu örneği de ekliyorum.
C-like:
import std.stdio;
import giriscikis;
import core.thread;
immutable ushort beklemeSüresi = 200;
void karaŞimşek(T0, T1)(T0 adres, ref T1 veri)
{
yaz (adres, veri);
Thread.sleep(dur!"msecs"(beklemeSüresi));
}
void main()
{
version (linux)
{
/*
paralel portun adresi
*/
const uint adres = 0x0378;
/*
göndereceğimiz veriler
*/
ubyte veriler[6] = [0b0001,
0b0010,
0b0100,
0b1000,
0b0100,
0b0010];
/*
Linux'ta paralel porta erişmek için yönetici haklarını alıyoruz
*/
erişimhakları(adres, 1, 1);
}
version (Windows)
{
/*
paralel portun adresi
*/
ushort adres = 0x0378;
/*
göndereceğimiz veriler
*/
ushort veriler[6] = [0b0001,
0b0010,
0b0100,
0b1000,
0b0100,
0b0010];
}
while (true) {
for (int i = 0; i != veriler.length; ++i) {
version (linux)
{
karaŞimşek!(uint, ubyte)(adres, veriler[i]);
}
version (Windows)
{
karaŞimşek!(short, short)(adres, veriler[i]);
}
}
}
}
Son düzenleme: