PIC 16F877A ile kara şimşek

Erdem⁣

Paylaşımcı üye
Katılım
14 Ocak 2013
Mesajlar
713
Puanları
106
PIC 16F877A µ denetleyicisi ile acemi işi kara şimşek.
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;
        }
    }
}
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-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:
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 ış

Kondansatör ile yapabilirsin.
 

Forum istatistikleri

Konular
129,867
Mesajlar
930,872
Kullanıcılar
452,732
Son üye
erencok

Yeni konular

Geri
Üst