Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Vraagjes over (Micro) C

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo iedereen

Ik heb een paar vraagjes:

Vraag 1
======

Ik programmeer in MicroC.

Wat moet ik doen met de hardware dus bvb pinnen die je niet gebruikt of interrupts die je niet gebruikt en werk met een PIC18F2550.

Ik zet nu alles op default waarden en enkel de registers die ik gebruik
Is dat de juiste werkwijze?

Vraag 2
======

Als ik een interrupt functie maak in C kan ik dan in een function deze interrupt aanroepen en vanuit een function een interrupt service routine programmeren?

Ik hoop dat hier mij iemand op weg kan helpen dan kan ik verder programmeren

Groetjes

  • TheGrandWazoo
  • Registratie: Januari 2009
  • Laatst online: 18-11 15:08
Interrupts die je niet gebruikt initialiseer je gewoon niet. Dan worden ze ook niet toegewezen (gemapped). Pinnen die je niet gebruikt kun je gewoon niet gebruiken. Eventueel op een default waarde zetten zou kunnen, maar dan moet je ook 100% zeker weten dat er op een fysieke pin bijv. geen hardware aangesloten zit die reageert op de verandering naar je default value. Of in ieder geval er op letten dat je met je default waardes niet ineens bepaalde functionaliteit aan of uit zet in een register.

Vraag 2 snap ik niet helemaal. Wil je vanuit een interrupt routine een functie aanroepen? Of vanuit een functie een interrupt routine aanroepen? Of wil je een interrupt triggeren vanuit een functie?

Verwijderd

Topicstarter
Hallo TheGrandWazoo,

Ik zou de drie mogelijkheden besproken hebben met een klein voorbeeldje

Ik zou het volgende willen doen:

3 interrupt service routines maken in C met de functie interrupt.
Een interrupt voor ADC
Een interrupt voor SPI (enkel zenden)
Een interrupt voor UART (zenden en ontvangen)

Ik heb een klein voorbeeld in gedachten, moet ik één interrupt routine maken of meerdere?
Begrijp niet goed hoe dat gereserveerd woord werkt?
Schrijf ik binnen die Call Timers met ISR functie?
Zou graag dit weekend starten met een header file te schrijven voor het opvangen van die interrupts
Later moet ik nog een code afspreken welke en wie die interrupt activeert via PC en omgekeerd dus serial communicatie opzetten
Ik heb hier een boek maar die c code staat volledig foutief en werkt dus niet en zo heb ik geen voorbeeld hoe het juist wel moet

void interrupt()
{
if (INTCON.TMR0IF)
{
Call Timers()
}
else
if (INTCON.RBIF) {
Call Drukknoppen();
}
}

Vanuit het hoofdprograma roep ik nog enkel de functies aan als volgt:
void()
{
init();
read_adc();
check_crc();
write_spi();
check_crc();
do{
read_uart();
check_crc();
while(...);

write_uart();
}

Dat is de voorlopige uitwerking nog niet af maar komt wel


Dat is dus mijn probleem

  • Cassettebandje
  • Registratie: Juli 2002
  • Laatst online: 16:21

Cassettebandje

SA-C90 TDK

Als je in je hoofdfunctie in een lus die gegevens wilt uitlezen en verder niets anders dan heb je in principe geen interrupts nodig, want dan kun je gewoon wachten tot bijvoorbeeld de a/d conversie klaar is.

Voor interrupt routines: dat hangt van je compiler af, daar is geen standaard voor. De IAR compiler gebruikt een pragma compiler directive, ander compilers gebruiken een speciaal type of keyword. Daarvoor moet je in de reference manual van de C compiler kijken.

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 15:08
In principe mag je ongebruikte pinnen laten zweven, maar dan zet je ze wel best als output (zodat ze niet staan te klapperen tussen 0 en 1). Beter is het nog om ze als ingang in een gedefiniëerde toestand te zetten (pull-up of pull-down van bijvoorbeeld 10K), en best is ze aan een header te verbinden, zo kan je later gemakkelijk nog extra functionaliteit toevoegen.
Alles uitschakelen wat je niet gebruikt is de bedoeling, als er per ongeluk iets verkeerd ingeschakeld blijft kan je erg moeilijke problemen tegenkomen.

Naar interrupts toe: let heel goed op wat je doet! Wees je goed bewust dat een interrupt op een willekeurige plaats tussen andere code in wordt uitgevoerd. Dus: je interrupt moet zo kort mogelijk zijn, en functies aanroepen in een interrupt is "gevaarlijk" (ga nooit dezelfde functie zowel in de main als in de interrupt code aanroepen, dat is een garantie op miserie, en let op met gebruik van variabelen in main- en interruptcode). Normaal is je main-loop kort genoeg om "trage" zaken als de UART af te handelen met flags (if "UART data toegekomen" then "doe iets met uart data"), daar heb je geen interrupt voor nodig (interrupt uitschakelen, je kan nog altijd de flag blijven gebruiken).

Belangerijk is dat je nu even naar de timing-vereisten gaat kijken, is het bijvoorbeeld echt noodzakelijk dat de ADC via interrupts loopt, is die zo tijdskritisch?

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.