Download pdf - Mplabx Icd3 Tutorial

Transcript
  • 1

    MPLABX/ICD3TutorialThisdocumentisadaptedforMPLABXandtheICD3IncircuitDebuggerfromthetutorialsthatformchapter3oftheMPLABICD2InCircuitDebuggerUsersGuideandchapter3oftheMPLABICD3InCircuitDebuggerUsersGuide.

    1 INTRODUCTIONThistutorialwalksyouthroughtheprocessofdevelopingasimpleprojectusingasampleprogram,TUT452.asm.Thisprogramusestheanalogtodigital(A/D)converterofthePIC18F452onthePICDEM2PlusDemoBoard(DM163022).TheprogramconfigurestheA/DmoduletoconvertinputfromA/Dchannel0(connectedtothepotentiometeronthedemoboard)anddisplaytheresultsasabinarynumberonthefourPORTBLEDs.Topicscoveredinthistutorial:

    CreatingadirectoryontheLabfileserver Settingupthedevelopmentenvironment Creatingandconfiguringaproject Addingsourcefilestotheproject Buildingtheproject Debuggingtheproject Programmingtheapplication TUT452.asmsourcecode

    2 CREATINGADIRECTORYONTHEFILESERVERIntheMechatronicsLabwemayupdatetheimageonthecomputersatanytimewithoutwarning.ThismeansthatanyfilesthatyouhavestoredlocallyonaMxLabPCwillbedestroyed.Youmustalways(andonly)storeyourfilesontheFileServer,mxlabserver.Forthistutorial,thefirstthingthatyoumustdoiscreateadirectoryontheFileServertoworkin.

    1. Dependingonwhetheryouareworkingaloneforthistutorial,orwithalabpartner,followtheinstructionsinsection1.1oftheMechatronicsLaboratoryFacilitiesdocumenttoeithera. createapersonaldirectoryontheU:drive(\\mxlabserver\Users)ORb. createandassignpermissionstoadirectoryontheV:drive(\\mxlabserver\Groups)that

    youcansharewithyourlabpartner.2. MakeanewdirectorysayDemointhedirectorythatyoucreatedinstep1.

    3 SETTINGUPTHEDEVELOPMENTENVIRONMENTTheMPLABXintegrateddevelopmentenvironment(IDE)softwareisinstalledandconfiguredbeforeyoubeginthistutorial.IntheMechatronicsLabwewillalwayspowertheICD3fromtheUSBcablethatconnectsittothehostPC.Anexternalpowersupplywillalwaysbeusedtopowerthetargetboard(thePICDEM2PlusDemoBoardforthistutorial).Remember:YoumustnotinjectasignalintotheICD3whenitisnotpowered.ThismeansthattheICD3mustbeconnectedtothehostPCfirstanddisconnectedlast.Usethefollowingconnection/powerupsequence:

    1. PlugthePCsUSBcableintoMPLABICD3pucktoapplypowertoit.ThePowerandActiveLEDsonthepuckshouldgoon.PluggingintheICD3willensurethatMPLABXcanfinditduringcreationofaproject.DONOTpowerthetargetboardyet.DONOTconnecttheICD3tothetargetyet.

    2. StarttheMPLABXIDEapplication,whichshouldinitiallylooksimilartoFigure1.ItwillbeusefultomaximisetheMPLABXwindow.

  • 2

    Figure1:InitialviewofMPLABX,withnoprojectopen.

    4 CREATINGANDCONFIGURINGAPROJECTMPLABXisanintegrateddevelopmentenvironmentbasedontheopensource,crossplatformNetBeansIDE.WithinMPLABXeverythingisprojectbased;youmustcreateaprojecttodevelopyourapplication.Creatingaprojectinvolvesselectingaspecificmicrocontrollerdevice,aswellasselectingandsettinguplanguagetools,debugtools,programmingtoolsandotherprojectspecifics.Thisensuresallitemsneededforsuccessfullydevelopinganapplicationarepresent.4.1CreatingaprojectTocreateanewproject,selectFile>NewProject.TheNewProjectDialoguewillopen.Followthestepsbelowtoconfiguretheproject.

    1. ChooseProjectSelectCategoryMicrochipEmbeddedandProjectStandaloneProject.Click[Next>]

    2. SelectDeviceChooseFamily:Advanced8bitMCUs(PIC18)andDevice:PIC18F452.Click[Next>]4. SelectToolUnderHardwareTools,clickontheserialnumber(SN:JITxxxx)oftheICD3thatis

    shown.Thereshouldonlybeone;thisistheICD3thatisconnectedtothePC.Click[Next>]6. SelectCompilerUnderCompilerToolchains,clickonmpasm(v5.51)undermpasm.Click[Next>]7. SelectProjectNameandFolderIntheProjectNamebox,typeasuitablenameTute0for

    example,fortheproject.InProjectLocationbrowsetotheDemodirectorythatyoucreatedinstep3.2ofthistutorial.TicktheSetasmainprojecttickbox.LeaveEncoding(thecharacterset)atISO88591.Click[Finish].

    MPLABXshouldnowlooksimilartoFigure2.

  • 3

    Figure2:MPLABXafterprojectcreation.

    Figure2showsthefourmainMPLABXwindowsintheirdefaultarrangement.TheFileWindowshowsdifferentviewsofallofthefilesintheproject.EventhoughwehavenotyetputevenonesourcefileintheprojecttherearealotoffilesthatcanbeseeninFigure2intheFiletaboftheFileWindow.AllofthefilesthatyoucanseeareautomaticallycreatedandmaintainedbyMPLABX.Thesefilesdefinetheproject,includingtheexactmicrocontroller,thesoftwaretoolchain(assembler,compiler,linker,etc.)andthehardwaredebuggingtools.Donoteditanyofthefilesinthenbprojecttree!DoubleclickingonanyfilenameintheFileWindowopensthefileintheEditorWindow.Thisiswhereyouwilledityoursourcefilesandviewthemwhendebugging.TheNavigatorWindowiswhereyoucanviewtheprojectconfigurationandmakechangestoit.TheTaskWindowiswhereoutputfromtheIDEisshown,suchasoutputfromthesoftwaretoolchainduringaprojectbuildandstatusmessagesfromthedebugginghardwareforexample,togetherwiththeinternalstateofthemicrocontrollersmemory.Memoryvaluescanonlybeinspectedorchangedwhenthemicrocontrollerisnotexecutinginstructions.4.2ConfiguringtheprojectToinspecttheprojectconfiguration,clickontheProjectname(hereitiscalledTute0)intheFileWindowandselectFile>ProjectProperties(Tute0)fromthemainmenubar.YouwillseesomethingliketheviewshowninFigure3.

  • 4

    Figure3:ProjectPropertiesinitialview.

    Havealookatwhatcanbeconfigured.Youshouldnothavetochangeanythingforthisprojectasitshouldhaveallbeencorrectlyconfiguredduringprojectcreation.IntheGeneralconfiguration(Figure4)youwillseethatMPLABXhascreatedaprojectfoldercalledTute0.XunderyourDemodirectorytostoretheproject,andwillignoresubfoldersaccordingtotheregularexpression^(nbproject|build|test)$.

    Figure4:ProjectPropertiesGeneralconfiguration.

    PleasechecktomakesurethatinthePoweroptionscategoryoftheICD3configuration(Figure5)thatPowertargetcircuitfromICD3isNOTselectedsincewewillalwayspowerthetargetmicrocontrollerboardandothercircuitryfromanexternalpowersupply.

  • 5

    Figure5:ProjectPropertiesICD3Powerconfiguration.

    5 ADDINGSOURCEFILESTOTHEPROJECT5.1ObtainthesourcefilesYoufirstneedtoobtainthetwoassemblylanguagefilesthatyouwillneedforthetutorialandplacetheminthedirectorythatyoumadeinstep2.

    1. OnthedesktopthereisalinktoCoursework Files on Server.OpenthatlinkandgotoMtrx3700\Initial Workspace\

    2. CopythefilesfromInitial WorkspaceintothedirectoryDemo\Tute0.XthatwascreatedbyMPLABXwhentheprojectwascreated.Makethesefileswritable.

    5.2Addsourcefilestotheproject1. Toaddanexistingsourcefiletotheproject,rightclickontheprojectnameintheFileWindowand

    selectAddexistingitem...2. SelectTUT452.asm,makesurethatStorepathasRelativeisactiveandclick[Select].Usingrelative

    pathsmakesitmucheasiertomoveaprojectfromonecomputertoanother.3. NowifyoudoubleclickonthefilenameTUT452.asmintheFilesWindowthefilewillopenintheEditor

    WindowascanbeseeninFigure6.

    6. BUILDINGTHEPROJECTWecannowbuildtheproject.Sincethisprojectcontainsassemblylanguagesourcecode,buildingitmeansassemblingthesourcecodeusingtheMPASMassemblertoproducerelocatableobjectcode,andlinkingthatcodewiththeMPLINKlinkertocreateanexecutablebinaryfile.BuildinginMPLABXusestheUNIXmaketooltobuildandlinkallsourcefilesintheproject(onlyoneinthissimpletutorialexample)inthecorrectorder,accountingfordependenciesbetweensourcefiles.Onlyfilesthathavebeenchangedbetweenbuilds,andtheirdependantfiles,willberebuiltbymake.

    1. Tobuildtheproject,clickontheHammericon.IftheHammericonisnotvisible,clickView>Toolbars>Run.TheHammerandBroomicondoesacleanandbuild,deletingintermediatefiles(forexamplerelocatableobjectfiles)beforebuilding.Thiswillforceallsourcefilesintheprojecttoberebuilt.

    2. Astheprojectbuilds,outputfrommakeisshownintheOutputwindow(Figure7).Youwillfirstseetheresultofassemblerexecution.Iftheassemblersucceeds,thelinkerwillthenexecute.Theprojectshouldbuildsuccessfully,producingtwooutputfiles:

    a. Demo/Tute0.X/dist/default/production/Tute0.X.production.hexThisistheexecutablebinaryfilereadytobeloadedintotheparticularmicrocontrollerandexecuted.

  • 6

    b. Demo/Tute0.X/dist/default/production/Tute0.X.production.cofThisisafileincommonobjectfileformat(COFF)thatcontainssymbols(variablenames,etc)fromthesourcecodeandassociatedaddresses.ItallowstheIDEtoshowyouthesourcecodeinsteadofmemoryaddresseswhendebugging.

    c. IntermediatefilesarealsoproducedfilesTUT452.err,TUT452.lst, TUT452.oand TUT452.o.dinthedirectoryDemo/Tute0.X/build/default/production/

    Figure6:Projectwithasingleassemblylanguagefileadded.

    Figure7:OutputWindowaftersuccessfulbuild.

    7. DEBUGGINGTHEPROJECTNowthattheprojectbuildswecandownloadittothetargetboardinthiscaseaPICDEM2Plusandattempttorunthecode.

    1. Important:TheICD3shouldbeconnectedtothePCviaaUSBcableatthispoint,providingpowertotheICD3.

    2. MakesurethePICDEM2PlusDemoBoardissetupasfollows:

  • 7

    d. ThepackagedoscillatorhasbeenselectedbyremovingjumperJ7.ThisselectstheclockhardwarethatmatchesthewaythatthemicrocontrollerclockcircuitshavebeenconfiguredbytheECOSCselectioninconfigReg.incwhichisincludedfromTUT452.asm.

    a. TheLEDshavebeenenabledbyfittingjumperJ6.3. PowerthePICDEM2Plusboardusingthe5Vplugpacksuppliedandthenconnecttheboardtothe

    ICD3usingtheshortRJ11cable.4. ClicktheMakeandProgramDeviceMainProjecticon(bluerectanglewithdownwardsgreen

    arrow).MPLABwillattempttoconnecttothetargetboardthroughtheICD3.YouwillseeaCautionmessagepopup,warningyoutocheckthatthedeviceselectedinMPLABisthesameoneasisactuallyonthetargetboard;youcansafelydismissthismessage.

    5. MPLABshouldconnecttothetargetboard,programthemicrocontrollerandverifythatprogrammingwascorrect.TheOutputWindowshouldappearasinFigure8.

    Figure8:OutputWindowafterexecutablesuccessfullydownloadedtotarget.

    7.1WhatshouldtheTUT452.asmprogramdo?Whenrun,theprogramTUT452.asmrepeatedlyconvertstheanalogvoltagethatispresentonanalogtodigitalchannel0toaneightbitnumber,scalesthatnumbertolieintherange0to15andthenwritesthescalednumbertothedigitaloutputportPORTB.WhenrunonaPICDEM2PlusDemoBoard(MicrochipDM163022)theanalogvoltagevariesbetween0Vand+5VasthepotentiometerRA0isturned,andthescalednumbervariesbetween0and15.IfthesoftwareandhardwareareworkingtogethercorrectlyyoushouldseetheLEDschangingbetween1and15inbinaryasyouturnthepotentiometer.7.2RunTUT452.asmprogramtoverifythatitworkscorrectlyTheMPLABICD3executesusercodeineitherrealtimemodeorinstepmode.RealtimeexecutionoccurswhenthePIC18F452inthePICDEM2PlusdemoboardisputintheMPLABIDEsrunmode.Theuserprogramexecutesatthefullspeedofthehardwareclockonthetargetboard4MHzinthiscase.Instepmode,executionofthetargetprocessoriscontrolledbyMPLABthroughtheICD3.Theusercan,forexample,executeasingleassemblylanguageinstruction,orexecutethecodeuntilabreakpointisreached.TheiconsintheMPLABXRunToolbararedescribedinFigure9.WhenexecutionofusercodeishaltedundercontroloftheICD3theusercaninspectorchangethevaluesinanyofthemicrocontrollersregisters.

    1. NowletusseeiftheTUT452.asmprogramexecutescorrectly.Duringadebugsession,executionoftheprogramiscontrolledbytheICD3throughMPLABX,sowemustfirstlaunceadebugsession.ClickontheDebugMainProjecticon(codelistingschematicwithsmallrightfacinggreenarrow)andseveralthingswilloccur:firstlytheprojectwillberebuiltifnecessary.SeveraltabswillopenintheOutputWindowandyouwillagainseeaCautionmessagepopup,warningyoutocheckthatthedeviceselectedintheMPLABprojectconfigurationisthesameoneasisactuallyonthetargetboard;youcansafelydismissthismessage.Theexecutablecodewillthenbedownloadedtothetargetboardandexecuted.MPLABXwillthenlooksomethinglikeFigure9.

    2. YoucanturnthepotentiometerallyoulikebutnoneofthePORTBLEDswilllightbecausetheprogramTUT452.asmisdeliberatelybroken...

  • 8

    Figure9:Startofdebuggingsession.

    Table1:ButtonsontheRuntoolbar.DebuggerMenu Button ActionFinishDebuggerSession Exitfromthedebuggersession.Pause FinishthecurrentinstructionandgivecontroltoMPLABReset SetthePCtotheresetaddress(0x0000)Continue ResumerunningtheuserprogramStepOver Atafunctioncall,stepoverthefunctionStepInto Atafunctioncall,stepintothefunctionRuntoCursor Resumerunninguserprogram,pauseatcursorSetPCtoCursor Whatitsays!Equivalentofjumptocursor.FocusCursoratPC

  • 9

    7.3DebugTUT452.asmAnyofthefollowingcouldpreventtheTUT452programfromworking.

    ThejumperJ6isnotfitted,sotheLEDswillneverlight.Checkit! TheA/DconvertervalueisnotbeingproperlywrittentothePORTBLEDs. TheA/Dconverterisnotenabledorhasnotbeensettostartaconversion. Atypingerrorinthesourcecodeiscausingtheprogramtofunctionimproperly.

    WewillinvestigatethesepossibilitiesintheDebugsession.Toexplorethesecondpossibility,wewanttosetabreakpointatthelineofthefilethatwritesthevalueoftheA/DresulttoPORTBsothatuserprogramexecutionwillpausethere.Whentheprogramispausedwecaninspectvaluesinthemicrocontrollersregisters.

    1. First,clickonthePauseiconNOTtheFinishDebugSessioniconsincethiswillclosethesession,disconnectingtheICD3fromMPLAB.OnPause,thecurrentlyexecutinginstructionfinishesandMPLABshowsthenextinstructiontobeexecutedbyhighlightingthewholelinewithalightgreenbackground.

    2. Next,clicktheReseticon.ThisresetsthemicrocontrollersPC(programcounterregister)totheresetaddressandsetsallotherregisterstotheirresetvalues.Runningtheprogramfromhereisthesameasitcomingoutofreset.

    3. Now,clickthecursoronthefollowinglineofcodefromTUT452.asmintheEditorWindow:movwf PORTB ;Write A/D result to PORTB

    4. RightclickonthelinetodisplayashortcutmenuandselectToggleLineBreakpoint.ThissetsabreakpointatthelinewhichismarkedascanbeseeninFigure10.

    Figure10:Breakpointsetatline56.

  • 10

    5. Next,clicktheRunicontoagainfreeruntheuserprogram.Ifprogramexecutioneverreachesthebreakpointtheprogramwillpausebeforeexecutingthelineatwhichthebreakpointisset.However,thesampleprogramdoesnotpausesoitisneverreachingthebreakpoint.

    6. ClickPausetopausetheprogramwhereverithappenstobe.IntheEditWindow,theprogramwillhavehaltedononeofthetwolinesunderthelabelWaitForAdConversion.TryRunandPauseafewmoretimestheprogramwillalwayspauseatoneofthesetwolines.Basedonthepauselocationandthefactthattheprogramneverreachesthebreakpoint,itcanbeconcludedthattheproblemisintheA/Dconversion.Theprogramatline51testsabitforA/Dconversioncomplete;thisbitneverbecomesset.A/DinitializationoccursundertheSetuplabelatthebeginningoftheprogram.

    7. Toverifythattheflagbit(bitADIFinregisterPIR1)isnotbeingset,ClickontheSFRtabintheOutputWindow.ThisshowstheSpecialFunctionRegisterswhicharethemicrocontrollerscontrolandstatusregisters.ClickonNametosorttheSFRsbyname,thenscrolldownandclickonPIR1.IfyouhoverthemouseoverthetextPIR1,MPLABwillshowthesymbolicnamesofthebitsintheregisterascanbeseeninFigure11.ADIFisbit6anditisalwayszerotheA/Dconversionnevercompletes.TheA/DconverterinthePIC18F452hasanorganisationsuchthatifaconversionstartsthenitmustcomplete.TheA/Dconversionisthereforenotstarting.

    Figure11:InspectingthevalueofbitsinthePIR1registerwiththeprogrampaused.

    8. A/DconversionnotstartingcouldbecausedbyincorrectconfigurationoftheA/Dhardware,orbytheprogramsfailuretoinitiateaconversion.Toinvestigate,firstclickReset.ThensetabreakpointatthefirstinstructionafterthelabelSetup.ClickonthefollowinglineofcodefromTUT452.asm:

    clrf PORTB ;Clear PORTB Thenrightclickonthelineandtogglethebreakpointattheline.

  • 11

    9. WewillwanttoinspectthevaluesthatarewrittenintothetworegistersADCON0andADCON1.ThesetworegisterscontainthecontrolandstatusbitsfortheA/Dconverterhardware.WewanttoinspecthowtheA/Dconverterisconfigured.AWatchWindowisanotherwaytoinspectregisters(andvariables).ClickDebugandthenselectNewWatch.Inthepopup,clickonSFRs,thenselectADCON0andADCON1andclick[OK].TheVariablesWindowwillopen,showingthestateofthetworegistersthatwehaveadded.

    10. Beforecontinuing,makesurethatUnlimitedBP(S/W)isEnabledunderDebugResourcesintheDashboard.Thisenablessoftwarebreakpoints.Onlyonehardwarebreakpointcanbeactive,butanunlimitednumberofsoftwarebreakpointscanbeused.

    11. Nowrunthecodeagain:clickResetthenContinue.Executionwillpausebeforeexecutingthelineofcodeatthebreakpoint.MPLABwilllooklikeFigure12.Line31(thebreakpoint)hasnotexecuted.Thelittlegreenarrowpointstothenextinstructiontobeexecuted.

    Figure12:Programpausedatbreakpointatline31.

    12. Now,singlestepthecodefivetimes,inspectingthevaluesinADCON0andADCON1aftereachstep.YoucanuseStepOverorStepInto:itdoesntmatterhereasthereisnofunctioncall.PayparticularattentiontothevaluesinADCON0andADCON1whentheinstructionsmovwf ADCON0andmovwf ADCON1execute.Theseinstructionsmovevaluesintotheregisters.Youwillseethatthevalueschange;theyareshowninredtoindicatethattheychangedasaresultofthepreviousinstruction.Thefollowinglineofcodeshouldbeindicatedwhenfinished:

    movlw B11000111 ;TMR0 prescaler, 1:256 13. NoticethatADCON0hasavalueof0x40.Thiscorrespondstothebinaryvaluedesignatedinthe

    program,butisthisvaluecorrect?IfyouexpandthedisplayofADCON0intheVariablesWindowthevalueofeachbitwillbeshownascanbeseeninFigure13.

  • 12

    Figure13:VariablesWindowshowingvaluesofADCON0bits.

    14. InFigure13,bit0ofADCON0hasthesymbolicnameADON,andthevalue0.AreviewofthePIC18F452DataSheetsectiononA/D(Chapter17)indicatesthatfunctionofthisbitistoenabletheA/Dcircuitry.Theconversionisneverfinishingbecauseitisneverstarting,anditisneverstartingbecausetheA/Dhardwaremoduleisnotenabled.

    15. TheleastsignificantbitofADCON0shouldbeaone,notazero,toenabletheA/Dmodule.Tofixthisbug,change:

    movlw B01000000 ;Fosc/8, A/D enabled to:

    movlw B01000001 ;Fosc/8, A/D enabled 16. Torebuildtheprojectwehavetogetoutofthedebuggingsession,soclickonFinishDebugger

    Session.ClickingonDebugMainProjectwillforcearebuildoftheproject,followedbydownloadingandrunningonthetargetboard.

    17. WhenthecodeexecutesyoushouldseetheLEDscountinginbinaryasthepotentiometerRA0isturned.

    Thesourcecodeinthistutorialcontainedonlyonesimplebug.Realcodeiscertaintohavemore,particularlywhenyouarelearninganewprocessor.UsingtheMPLABICD3andMPLABIDEdebuggingfunctions,togetherwithcarefulthoughtandsimpleexperimentation,userscansuccessfullyfindandfixallproblemsintheircode.

    8 PROGRAMMINGTHEAPPLICATIONWhentheprogramissuccessfullydebuggedandrunning,usuallythelaststepistoprogramthemicrocontrollerforstandaloneoperationinthefinisheddesign.Whendoingthis,theresourcesreservedbytheICDarereleasedforusebytheapplication.ThedevicecanbeprogrammedfromwithinMPLABXbyfollowingthesesteps:

    1. EndthedebuggingsessionbyclickingFinishDebuggerSession.2. ClickonMakeandProgramDeviceMainProject.Thiswillrebuildtheprojectasaproductionbuild

    (whichdoesnotincludethesmalldebugmonitorprogramforcommunicatingwiththeICD3),programthemicrocontrollerandruntheprogram.YouwillbeabletodisconnecttheICD3fromthetargetboard,powercyclethetargetboardandtheprogramwillexecute.

  • 13

    ;********************************************************** ;* TUT452.asm ;********************************************************** ;* Microchip Technology Incorporated ;* 17 March 2003 ;* Assembled with MPASM V3.20 and MPLINK v3.20 ;********************************************************** ;* This program configures the A/D Module to convert on ;* A/D channel 0 (the potentiometer) and display the ;* results on the LEDS on PORTB. ;********************************************************** list p=18f452 ; Include file, change directory if needed include "p18f452.inc" include "configReg.inc" ; Start at the reset address. There *must* be code at address ; 0x000 since the PC is loaded with address 0 when the processor ; comes out of reset. This declares a code section named 'RST'. RST code 0x0000 goto Setup ; Start application beyond vector area. ; This declares an 'unnamed' code section. code 0x0030 Setup: clrf PORTB ; Clear PORTB clrf TRISB ; PORTB all outputs, display 4 MSB's ; of A/D result on LEDs movlw B'01000000' ; Fosc/8, A/D enabled movwf ADCON0 movlw B'00001110' ; Left justify, 1 analog channel movwf ADCON1 ; VDD and VSS references movlw B'11000111' ; TMR0 prescaler, 1:256 movwf T0CON Main: btfss INTCON, TMR0IF ; Wait for Timer0 to timeout goto Main bcf INTCON, TMR0IF bsf ADCON0, GO ; Start A/D conversion WaitForAdConversion: btfss PIR1, ADIF ; Wait for conversion to complete goto WaitForAdConversion swapf ADRESH, W ; Swap A/D result nibbles andlw 0x0f ; Mask off lower 4 bits movwf PORTB ; Write A/D result to PORTB clrf PORTB WaitForSwitchRelease: ; Pause while switch is pressed btfss PORTA, 4 goto WaitForSwitchRelease movwf PORTB goto Main ; Do it again end


Recommended