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:
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.
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.