08-24-2014, 10:14 PM (This post was last modified: 08-24-2014, 10:29 PM by mikikg.)
Moze, to je sad sve stvar programa.
Inace nije tu "frekvencija", tu su "kodovi", svaki taster ima svoj kod i kako se u progamu namesti tako ce da radi.
08-24-2014, 10:22 PM (This post was last modified: 08-24-2014, 10:34 PM by npejcic.)
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
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.
@sax778
Kompajler XC8 ima u sebi ugrađene rutine za kašnjenje, koje sudeći po net forumima, ponekad prave probleme, bar u nekim edicijama XC8. Nisam ih koristio, jer više volim da sam izradim pomoćne funkcije kao što je Delay.
Ja sam za ovu našu priču izradio rutine za kašnjenje, i ukoliko možeš, upotrebi ih u svom kodu i nećeš imati problema sa kompajliranjem.
Napominjem da moraš u zavisnosti od frekvencije oscilatora da podesiš broj NOP() instrukcija koje imaš u DelayUs makrou. Za naš primer podrazumevan je 4MHz oscilator.
Evo šta treba da ubaciš u tvoj kod:
Code:
// 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);
}
}
Uzgred, ove moje rutine nisu baš 100% egzaktne tako da očekivati neki malu grešku kod tačnosti.
Što se tiče tvog pitanja oko kompajliranja, primetio sam da MPLABX hoće ponekad greškom da prikaže te uzvičnike, tako da ukoliko je iskompajlirao kod verujem da će raditi.
Za korišćenje ugrađenih rutina za delay (__delay_ms(10)) moraš negde u kodu da definišeš koji XTAL koristiš. To se radi sa:
#define _XTAL_FREQ 4000000
Pade mi na pamet , da se sa ovim pic 12f629 napravi daljinska kontrola za ova nasa pojacala, posto ima 5 izlaza ,
power on
mute
volume+
volume-
to su cetiri i jedna led indikacija ir prijema. i sa pga2511 .
Da li je to izvodivo?
Ima gotov projekat bas za to ovde na forumu, isto je npejcic pravio, potrazi.
Nije bas sa tim 12Fxxx PIC-evima, ima (mora) neki malo jaci kontroler i neki PGA kao opcija. Zaboravio sam detalje …
Napravi ovu prostu varijantu koju si krenuo i dok ne napravis nemoj da dodajes nove funkcije jer neces onda uopste zavrsiti
Sa mikrokontrolerima moze da se napravi bukvalno sta hoces ali sve to zahteva malo detaljniji pristup, iskustvo i znajnje u nekim segmentima.
Moras korak po korak da ides, samo strpljivo i temeljno, docice sve na svoj red.
Tek ces ti da pravis zaniljive spravice sa PIC-evima
Da znam da ima projekat sto je pravio Npejic , to je malo komlikovanije i treba skuplji Pic , ai nema da se kupi ovde, a sa ovim bi bilo jednostavnije i jeftinije , predpostavljam da je komplikovanije pisanje programa za codove daljinskog.
A ovaj je skoro gotov treba prebaciti program sto je Npejic postavio u Hex file i programirati.
08-28-2014, 09:46 PM (This post was last modified: 08-28-2014, 09:46 PM by npejcic.)
Pogledaj "zupčanike" pored ikonice za štampač, to je Build, klikom na tu ikonu kreće kompajliranje. Ukoliko je sve u redu, dobićeš u istom folderu HEX fajl.
Međutim, prilično sam siguran da neće moći Copy-Paste jer mikroC ima drugačiju definiciju pinova, tako da ćeš umesto:
#define ULAZNI_PIN_TRIS TRISIO0
...
08-28-2014, 09:53 PM (This post was last modified: 08-28-2014, 10:25 PM by samuki.)
Da pokazivao mi je gresku za include htc.h
Sad ne prijavljuje gresku I napravio je hex.file
ali mi winpic800 kada hoću da ga ubacim u 12f629 prikaze ovo , kliknem na yes i on nastavi sa ubacivanjem jel to ispravno?
Napravio sam hardware
pin1 5v
pin 8 -v
pin 7ulaz direktno sa Ir Tsop
pin 6 izlaz led dioda preko 1k na 5v
pin 5 izlaz led dioda preko 1k na 5v
i nece da radi