C pro PIC (MPLAB): vektor a obsluha přerušení, zápis funkcí

Zdravim,

pustil sem se do Cčka pro PIC (MPLAB, HI-TECH C compiler) a podle jednich skrip taky z fora (od nějakého študenta, sou to skripta pro 32bit pic, pro základ a pochopení mi to dost pomohlo). Tak sem nějak podle toho napsal první program pro PIC 18F4685 na nějaký blikání ledek a to se i povedlo. ale mám trochu nejasnosti ještě :slight_smile:

takže první dotaz: přerušení, když nastavim třebas přerušení od RBO, tak kam mě to skočí když to přerušení nastane? tam napíšu void INTERRUPT() a tam mě to vyskočí a pod to budu psát obsluhu?? jak pak rozdělim přerušení HIGH a LOW???

druhý dotaz: potřeboval bych trochu objasnit řádky
void main ()
void main (void)
int main ()
int main (void)
a podobně…
proč je je někde jen void main () a někde ještě v závorce void, a co vlastně znamená void a int v těchto případech???

omlouvám se za asi až moc začátečnický dotazy, ale nějak asi špatně hledám a nemůžu to vyzjistit :frowning: dělám jen asembler, ale chtěl bych taky trochu pokročit i do C :slight_smile:

:arrow_right: administrator: přejmenováno z "C pro PIC, pár začátečnických dotazů"

Pokud opravdu zacinas s C tak bych doporucil nejprve prostudovat dotove typy… Myslim, ze v sekci download je jedna ucebnice jazyka C pro dsPIC33 pokud ne rad ti ji ulozim na soukromy FTP server ke stazeni ( doufam, ze to nebude autorovi vadit ).

studoval jsem tuto knihu http://forum.mcontrollers.com/t/ceska-knizka-programovani-dspic-v-c/1675/1

a ted sem jí narychlo prohlídnul znova, a jestli sem to dobře pochopil tak to co je v závorce určuje typ parametru, v tom parametru se mi bude vracet hodnota z volané funkce. ale pořád nevim proč se před main někde píše void a někde int.

int fce (void)
{
unsigned int Z;
unsigned int x = 250;
unsigned int y = 250;
x+y = Z;
Z = 500;
return(Z);

}

int = 16-bitova hodnota!!!

kdyz je pred funkci nejaky datovy typ tak ho ta funkce vraci…
…v zavorce je s jakym parametrem ho volame ( treba void -> “NIC”) = procti si tu knihu jeste jednou!

neviem pre origo prekladac od mikro cipu C18 mi fachci toto:

//***********************************************************
#pragma interruptlow MyLowISR
void MyLowISR(void)
{

if(INTCON3bits.INT1IF) 
	{button=1;
	tlc=!tc;
	INTCON3bits.INT1IE = 0;		//zakazane prerusenie RB1 Tlacidla
	INTCON3bits.INT1IF = 0;
	}

if(INTCONbits.TMR0IF) 
	{T0CONbits.TMR0ON = 0; //vypina timer0
	INTCONbits.TMR0IE = 0;	//zakazane prerusenie tmr0
	        INTCONbits.TMR0IF = 0; 
	rdsON=1;
	}

}
// Handle low priority interrupts.

//#pragma code /* return to default code section nove*/
//----------------------------------------------
#pragma interruptlow MyHighISR
void MyHighISR(void)
{
unsigned char stavIR;

if(INTCONbits.INT0IF) get_RC5();
INTCONbits.INT0IF = 0; 

    // disable TX interrupt  
  	// INTCONbits.TMR0IF = 0;         // disable TX interrupt  
   // USART handler end 

}
//#pragma code /* return to default code section nove*/
//***********************************************************

//++++++++++++++++++++++++++++++++++++++++++++++
#pragma code highVector=0x08
void HighVector (void)
{
_asm goto MyHighISR _endasm
}
#pragma code /* return to default code section */

#pragma code lowVector=0x18
void LowVector (void)
{
_asm goto MyLowISR _endasm
}
#pragma code /* return to default code section */
//++++++++++++++++++++++++++++++++++++++++++++++

void znamená prázdný - když je před názvem funkce, znamená to, že funkce po vykonání nic nevraci - když je v závorkách za funkcí - znamená to, že funkci nepředáváš žádná data (parametry) s kterými potom pracuje no a () je totéž co (void) - starší verze MPlab C18 ale házely varování, když jsi do těch závorek to void nenapsal

A rozdíl mezi void main () a int main (void) je v tom, že některý překladač chce, aby hlavní funkce vracela hodnotu - podle mně zbytečně - a některý zas ne.