08-25-2014, 07:37 AM
@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:
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
Pogledaj ovaj doc na strani 59 za detalje:
http://ww1.microchip.com/downloads/en/De...52053B.pdf
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
Pogledaj ovaj doc na strani 59 za detalje:
http://ww1.microchip.com/downloads/en/De...52053B.pdf