Hallo iedereen,
Ik ben een programatje aan het schrijven voor een µC, aan deze µC hand onderandere een bedieningspaneel dat bestaat uit enkele drukknoppen. Ik zou deze constant moeten uitlezen, hoe doe ik dat?? Wat ik nu doe is is een while lus zetten maar staat het volledige programma stil als er niet voldaan wordt aan de voorwaarden en dit is dus niet de bedoeling. Kan iemand mij helpen??
Alvast bedankt
Peter Claus
It is so simple to be happy, but it is so difficult to be simple
Met interrupts. Of met IF THEN ELSE structuur.
[Bericht gewijzigd door Peter Claus op (51%)]
Electronick
In theory there's no diffrence between theory and practice, in practice there is!
Je kan dat op een aantal manieren oplossen:
1.) Zorg dat ergens in je programma een lusje staat dat de knoppen uitlees en als er iets veranderd dan gebeurd er dit of dit.
2.) Zorg voor een intterupt routine. Dat als er een knop ingedrukt wordt het programma heel even naar een ander gedeelte van een programma gaat er vervolgens weer terug springt.
Zou je verder nog eens kunnen uitleggen wat het precieze software is. Ik zeg namelijk normaal het volgende in een programma:
wile(1=1)
IF knop_aan_is_ingedrukt
LAMP1 aan
ENDIF
IF knop_uit_is_ingedrukt
LAMP1 uit
ENDIF
// en hier post ik de rest van de code...
wend
Daan Timmer
Ik ben programmeur! geen electronicus! http://www.daantimmer.nl/ Er is een ontwerp! nu nog inhoud :-)
Op 1 april 2009 15:55:58 schreef LED-Maniak:
Wat voor een taal programmeer je?
C? zie titel...
Op 1 april 2009 15:55:58 schreef LED-Maniak:
Wat voor een taal programmeer je en welke micro gebruik je?
Nen fujitsu 96FX348. Ik gebruikt deze omdat het voor mijn stage is en ze in het bedrijf deze ook gebruiken. Niet den simpelsten maar wel veelzijdig. Ook simpel te programmern gewoon rs232 ictje op print zetten en kan rechtstreekst van de pc geprogrammeerd worden. Handiger dan al die programmers.
Ik ken die controller niet, maar het is voor mij niet ongebruikelijk om vrijwel alles interrupt driven te doen. Je mainloop is dan doorgaans vrijwel leeg:
while(1)
{
sleep();
}De IRQ zorgt ervoor dat het ding uit sleep komt, de ISR handelt af wat er afgehandeld moet worden.
Meer tijdrovende klus wordt meestal iets met semaphores. Hardware handling in de ISR, zaken die bijvoorbeeld met EEPROM te maken hebben vanuit de main:
while(1)
{
sleep();
kijk-of-semaphore-set-is-en-doe-wat
}Zo ben je snel terug uit je ISR als dat nodig is om andere interrupts af te handelen en heb je geen nested interrupts nodig.
Voordeel van in sleep gaan (als jouw controller dat kan), is vaak dat het stroomgebruik erg laag wordt.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
TS, waarom denk je dat je loop stopt als er niet aan een voorwaarde wordt voldaan?
Je moet (zoals hierboven gezegd) gewoon niets doen als de voorwaarde false is en doorgaan met je loop. Als je wel actie onderneemt moet je zorgen dat dat niet te lang duurt (bv de actie ophakken in meerder delen) zodat de loop toch toch regelmatig blijft rondlopen.
isr zou ik niet zo snel doen voor de keys omdat dat niet zo erg timing kritisch is. Interrupts heb je vaal al nodig voor seriele communicatie of pwm en zo.
[Bericht gewijzigd door flipflop op (19%)]
Op 1 april 2009 16:29:14 schreef Boki88:
[...]Nen fujitsu 96FX348. Ik gebruikt deze omdat het voor mijn
Beetje offtopic: waar kan ik meer informatie over deze controller vinden? Ik ken deze controller helemaal niet en dan wordt ik erg nieuwsgierig. Google geeft 1 hit: deze thread. Is het typenummer dat je hebt opgegeven wel goed?
Ik zou het trouwens oplossen met een timer interrupt die in de interrupt een teller (systeemtimer) ophoogt. Als je dan bij iedere verandering van de systeemtimer naar de toetsen kijkt, dan heb je ook nog enig idee hoe lang een toets is ingedrukt. Ik maak eigenlijk altijd per toets een teller. Toets ingedrukt -> teller=teller+1, toets losgelaten -> teller is 0. Dan heb je meteen een softwarematige anti-dender ingebouwd.
[Bericht gewijzigd door Nico.c op (35%)]
Jochem
If you want to succeed, double your failure rate.
Als je dergelijke vragen stelt, ben je nog een eindje verwijderd van het begrip interrupt. Dat bedoel ik niet hatelijk, maar misschien kun je beter beginnen met een loopje waarin je je ingangen pollt. In de rest van de loop kun je dan rustig doen wat je verder nog wilt.
Op 2 april 2009 00:41:55 schreef Nico.c:
[...]
Beetje offtopic: waar kan ik meer informatie over deze controller vinden? Ik ken deze controller helemaal niet en dan wordt ik erg nieuwsgierig. Google geeft 1 hit: deze thread. Is het typenummer dat je hebt opgegeven wel goed?
Mijn fout zoek op 16FX MB96300 series.
of klip op www.fujitsu.com/downloads/MICRO/fma/pdfmcu/MB96300_HWM_rev15_20080201.…
@Jochem: Kheb ni echt de keuze simpel te beginnen maar kzou die dingen eigelijk al moeten kunnen. Maar ja tis gelukt om 1 schakelaar aan te sturen. Kmoe er wel 15 aansturen in een matrix systeem.
Stukje code (voor dienen enen schakelaar):
MROW = 0x01; //MROW0(0x01),MROW1(0x02),2(04),3(08),4(0F),5(10),6(20),7(40)
while(1)
{
if ((MREAD0 == 1)&(MROW=0x01))
(FRONT_LED_B=1)&(FRONT_LED_R=0);
else
(FRONT_LED_B=0)&(FRONT_LED_R=1);
Er zijn 8 rows die ik aanstuur en 3 readslijnen om uit te lezen hij moet deze constant doorlopen.
Als er ideeën zijn post maar.
Juist hierboven gezegt dat code dat daar staat werkt, deze doet dat ook maar ik heb ook onderandere een watchdog led zitten op mijn print geprogrammeerd met een timer en deze gaat niet meer. Dus dit betekent dat hij constant deze while herhaal maar de rest van mijn programma niet uitvoert???
[Bericht gewijzigd door Henry S. op (12%)]
Jochem
If you want to succeed, double your failure rate.
Op 2 april 2009 09:19:01 schreef Boki88:
@Jochem:KhebIk hebniniet echt de keuze simpel te beginnen maarkzouik zou die dingen eigenlijk al moeten kunnen.
Leuk om daar op je stage achter te komen, niet? Dat jij ineens haast hebt, betekent niet dat je stappen over kunt gaan slaan. Kennelijk is het destijds op school al niet gelukt, wat laat jou denken dat het dan nu allemaal even snel WEL kan?
Maar ja
tishet is gelukt om 1 schakelaar aan te sturen.KmoeIk moet er wel 15 aansturen in een matrix systeem.
Aansturen doe je trouwens met een actuator, een schakelaar is een sensor.
Wat moet je nog meer doen in die code? Blijven pollen in een while-lus is prima zo, alleen hangt het van de rest van de taken af hoe je het verder aan moet pakken. Als er niet veel hoeft te gebeuren doe je dat gewoon eronder in de loop. Moet er een proces gestuurd worden, dan is wellicht een state-machine handig (zelfs als je de schakelaars toch onder interrupt zou uitlezen).
Wat voor schakelaars zijn het (aan/uit of momentaan)? En moet je triggeren op zowel op- als neergaande flank? (Je huidige voorbeeld suggereert die werking namelijk.) Zou je uC dat uberhaupt kunnen onder interrupt?
Op 2 april 2009 09:48:56 schreef Boki88:
Juist hierboven gezegtd dat codedatdie daar staat werkt, deze doet dat ook maar ik heb ook onder andere een watchdog led zitten op mijn print geprogrammeerd met een timer en deze gaat niet meer. Dus dit betekent dat hij constant deze while herhaalt, maar de rest van mijn programma niet uitvoert???
Wat bedoel je nu? Wat is een watchdog led volgens jou? Heb je die timer onder interrupt? Het is bij een watchdog meestal het idee dat je hem in je main-loop reset. Zonder je code is het gissen wat je doet.
Overigens kun je je laatste post editten
ipv onnodig kicken.
Op 2 april 2009 09:48:56 schreef Boki88:
Juist hierboven gezegt dat code dat daar staat werkt, deze doet dat ook maar ik heb ook onderandere een watchdog led zitten op mijn print geprogrammeerd met een timer en deze gaat niet meer. Dus dit betekent dat hij constant deze while herhaal maar de rest van mijn programma niet uitvoert???
Probeer je probleem onder te verdelen in verschillende processen. Die processen moet je in non-blocking functies uitwerken. Non-blocking betekent dat je nooit op iets mag wachten; je moet dus state machines maken. Vanuit je hoofdlus (oneindige while lus in main functie) roep je herhaaldelijk de functies aan die de processen uitvoeren.
Alles non-blocking schrijven vereist wel een andere denkwijze dan men meestal op school leert.