Beste CO'ers,
ik ben sinds kort weer een beetje bezig met microcontrollers en begonnen met een nieuw projectje,
Nu heb ik voor dat projectje meerdere externe interrupt nodig, na wat rond gekeken te hebben heb ik een code gevonden die gebruikt maakt van Poort B (7:4), dit is idiaal voor mijn projectje.
Het probleem waar ik nu tegen aan loop is dat de code niet doet wat die moet doen, de problemen zijn:
- zowel bij het indrukken dan wel het loslaten van de schakelaar wordt een interrupt gegenereerd.
- het ledje op PoortA.3 hoort om de 500ms te wisselen van toestand, dit gebeurd niet.
Wie kan mij verder helpen ?
Alvast bedankt,
Mike
ps. De code zoals die nu is:
Device = 16F628A
Config INTRC_OSC_NOCLKOUT, CP_OFF, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, BODEN_off
ALL_DIGITAL TRUE
PORTB_PULLUPS = On
DelayMS 200
;76543210
PORTA = %00000000
TRISA = %11110011
' Interrrupt symbols
Symbol GIE = INTCON.7 'Global Interrupt Enable
Symbol RBIF = INTCON.0 'External RB Interrupt Flag
Symbol RBIE = INTCON.3 'External RB Interrupt Enable
'Interrupt initialisatie
While GIE=1
GIE=0 'Interrupts uit zetten
Wend
'Interrupt instellen
Clear RBIF 'RB Interrupt Flag = 0
Set RBIE 'RB Interrupt aanzetten
Set GIE 'Alle interrupt aan zetten
ON_Interrupt GoTo ICR
GoTo Main 'Ga naar Main
'********************************************************
ICR: 'Interrupt Controlle Routine
'Interrupt worden automatisch uit gezet
If RBIF = 1 Then 'Kijk of er een interrupt op PortB.5 is
If PORTB.5 = 1 Then
Toggle PORTA.2 'Zo ja, Wordt PortA.2 getoggled
EndIf
RBIF = 0 'RB Interrupt Flag = 0, voor volgende interrupt
EndIf
Context Restore
'Interrupts (GIE) worden automatisch weer aan gezet
'********************************************************
Main: 'Main programma bestaad uit het wachten op een interrupt \
PORTA.3 = 1
DelayMS 500
PORTA.3 = 0
DelayMS 500
GoTo Main
End 'Einde van het programma
PORTB[7:4] is een "Interrupt on Change" interrupt. Die reageert inderdaad op beide flanken.
Je kan RB0/INT gebruiken. Bij die interrupt kan je instellen of die op een positieve of negatieve flank moet reageren.
Als dat geen optie is kan je softwarematig oplossen om elke 2e interrupt te negeren.
Ik zie zo even niet waarom je A3 ledje niet goed togglet. Wat gebeurd er wel?
@Neen:
normaal gesproken is het zo dat deze interrupt reageert op beide flanken, maar ik heb in de interrupt routine ook nog een if lus zitten die kijkt of de juiste poort ook hoog is en niet laag (If PortB.5 = 1 Then ....).
ik denk daarom ook niet dat hier de fout zit.
nu ik het weer eens heb aangesloten blijkt dat het ledje wel goed toggled maar dat het interrupt ledje uit gaat als het gewone ledje aan gaat, heel vaag eigenlijk.
@Bas Smit:
de testopstelling bestaat uit een knopje en een tweetal leds zoals hieronder weergegeven.
Je zou misschien ook last kunnen hebben van dender aan de schakelaar. Maak een anti-dender schakelingetje bij (R/C) of programeer anti-dender code bij.
Weerstanden aan de led's zijn zeker aan te bevelen.
Als eerste bedankt voor de reacties,
Zoals al gezegd is het knipperen van het ledje (A3) opgelost maar het ledje van de interrupt doet nog steeds raar, het gaat uit als het ledje (A3) aan gaat...
Dender is inderdaad een goed punt,
Hoe zou ik dat kunnen oplossen in de software, gewoon een paar milliseconden wachten of zit dit anders ?
De weerstanden voor de leds is niet nodig omdat de uitgang van de microcontroller begrenst is, ik heb dit al vaker gedaan en heeft nog nooit problemen opgeleverd.
verder bedankt voor de reacties en ik zal jullie verder informeren als ik het probleem gevonden is.
Mike
Zucht...
Zoek maar eens op RMW .
Dender niet software matig oplossen, dan worden je interrupts veelste lang. Zoek maar op contact dender e.d. Dan vind je genoeg oplossingen.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
De weerstanden voor de leds is niet nodig omdat de uitgang van de microcontroller begrenst is
Dubbele zucht...
Soms denk ik wel eens dat het geen zin heeft om uit te leggen hoe het moet. Dit is toch al honderden malen ter sprake gekomen, maar het dubbeltje schijnt niet te vallen...
ik heb dit al vaker gedaan en heeft nog nooit problemen opgeleverd.
Je kunt ook met een blinddoek voor de A2 overwandelen. Dan kom je een enkele keer ook wel levend aan de overkant. Maar daarom is het nog niet aan te raden...
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
Het besproken probleem kan zelfs (hoeft niet) veroorzaakt worden omdat de weerstanden zijn weggelaten!
Dus idd, weerstanden plaatsen!
@Bas Smit:
Dender was inderdaad een deel van het probleem en is opgelost door een externe pullup weerstand en een condensator over de schakelaar.
Er zat ook een fout in de Interrupt routine: ik liet de toggle de led als PortB.5 hoog was, maar door de interne en externe pullup weerstanden is deze natuurlijk altijd hoog.
na dit veranderd te hebben werkt de schakeling naar behoren.
@Arco:
Ik begrijp dat het weglaten van weerstanden uit den boze is en omdat het bij mij nooit mis is gegaan hoeft niet te betekenen dat het altijd goed gaat, ik zal voortaan de weerstanden toevoegen om problemen te voorkomen.
bedankt in ieder geval voor de hints en tips, ik heb weer veel geleerd en als mijn projectje af is zal ik het posten.
Mike