Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Daljinsko zakljucavanje otkljucavanje
#44
U prilogu je kod koji je prilagodjen za PIC12F629. Obrati pažnju da je ovo polazni program koji nema dekodiranje IR koda, vec samo prihvata stanje 1-0 na ulaznom pinu kao što si tražio na stranici jedan. U ovom trenutku mislim da je ovo dobar start, jer bi se u slučaju dekodiranja kod malo više zakomplikovao čime bi postao nerazumljiv za praćenje. Predlažem da idemo postepeno:
Code:
// Program RemoteMotorControl.c
// Hardware: PIC12F629, IntOSC, Input on GPIO0, OUTM1 on GPIO1, OUTM2 on GPIO2
// Compiler: XC8

#include "htc.h" // umesto znaka navoda staviti znak za vece i manje

#define ULAZNI_PIN_TRIS     TRISIO0
#define ULAZNI_PIN          GPIO0
#define RELE_1_TRIS         TRISIO1
#define RELE_1_IO           GPIO1
#define RELE_2_TRIS         TRISIO2
#define RELE_2_IO           GPIO2

bit FlipFlopFlag;
bit Debounce;

// Ukoliko je mikrokontroler na 4 MHz (IntOSC) jedna instrukcija traje 4MHz/4 = 1uS, Nop() traje 1 masinsku instrukciju
#define Delay10Us() NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); NOP();

// Kasnjenje u ms, Maksimalna vrednost count moze biti do 255
void DelayMs(unsigned char count)
{
    unsigned char DelayUSecLoop;
    while(count)
    {
        DelayUSecLoop = 100; // 100 x 10uS = 1ms
        while(DelayUSecLoop)
        {
            Delay10Us();
            DelayUSecLoop--;
        }
        count--;
    }
}

// Kasnjenje u sekundama, Maksimalna vrednost count moze biti do 255 sek
void DelayS(unsigned char count)
{
    while(count)
    {
        DelayMs(250);
        DelayMs(250);
        DelayMs(250);
        DelayMs(250);
    }
}

void main(void)
{
    CMCON = 0b00000111;  // Comparatori iskljuceni

    RELE_1_TRIS = 0; // Podesavamo da je RELE 1 pin IZLAZNI
    RELE_2_TRIS = 0; // Podesavamo da je RELE 2 pin IZLAZNI
    ULAZNI_PIN_TRIS = 1; // Podesavamo da ulazni pin bude ulazni pin
    FlipFlopFlag = 0;

    while(1) ////////////////////// GLAVNA PETLJA PROGRAMA
    {
        DelayMs(10); // Cekamo 10mS, jer nema razloga da nam se petlja vrti suvise brzo, dobijamo neku vrstu filtra za digitalni ulaz

        if(ULAZNI_PIN == 0) // Ako detektuje daljinski zahtev, podrazumeva se da je aktivnno stanje na nuli, bolja imunost na smetnje
        {
            if(Debounce == 1) // Da sprecimo lazna okidanja
            {
                Debounce = 0;
                if(FlipFlopFlag == 1)
                {
                    RELE_1_IO = 1;
                    DelayS(1); // Sacekaj 1 sekundu
                }
                else if(FlipFlopFlag == 0)
                {
                    RELE_2_IO = 1;
                    DelayS(1); // Sacekaj 1 sekundu
                }
                RELE_1_IO = 0; // Iskljuci izlaz 1
                RELE_2_IO = 0; // Iskljuci izlaz 2

                FlipFlopFlag ^= 1; // ako je 1 prelazi u 0, ako je 0 prelazi u 1 i tako u krug
            }
        }
        else
        {
            Debounce = 1;
        }
    }
}

Kod sam kompajlirao XC8 kompajlerom 1.12 bez optimizacije i zauzetost Flash, RAM memorije je svega 10%
Memory Summary:
Program space used 67h ( 103) of 400h words ( 10.1%)
Data space used 7h ( 7) of 40h bytes ( 10.9%)
EEPROM space used 0h ( 0) of 80h bytes ( 0.0%)
Configuration bits used 0h ( 0) of 1h word ( 0.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)

Pokušaj da kreiraš projekat u MPLABX-u, za izvorni kod ubaci gore navedeni i probaj.
Reply


Messages In This Thread
Daljinsko zakljucavanje otkljucavanje - by samuki - 08-02-2014, 02:04 PM
RE: Daljinsko zakljucavanje otkljucavanje - by npejcic - 08-24-2014, 10:22 PM

Forum Jump:


Users browsing this thread: 29 Guest(s)