Estoy trabajando en el microcontrolador dsPic33EP512GM604.
He escrito un pequeño programa para encender una lámpara de torre con 3 LED (ROJO, AMARILLO, VERDE).
A continuación se muestra el diagrama del circuito:
Comosemuestraeneldiagramadelcircuito:
ElledROJOestáconectadoalpin<20>RA1
ElLEDAMARILLOestáconectadoalpin<19>RA0
ElLEDVERDEestáconectadoalpin<15>RB15
Acontinuaciónsemuestramicódigodeejemplo:
//TowerLAMP#defineLAMP_ON1//LAMPON#defineLAMP_OFF0//LAMPOFF#defineRED0//ColorCode#defineYELLOW1//ColorCode#defineGREEN2//ColorCode#defineDEFAULT_LAMP4//ColorCode#defineRED_LIGHTPORTAbits.RA1//Output:REDLight#defineYELLOW_LIGHTPORTAbits.RA0//Output:YellowLight#defineGREEN_LIGHTPORTBbits.RB15//Output:GreenLight#pragmaconfigICS=PGD3//ICDCommunicationChannelSelectbits(CommunicateonPGEC1andPGED1)#pragmaconfigJTAGEN=OFF//JTAGEnablebit(JTAGisdisabled)//FPOR#pragmaconfigBOREN=ON//Brown-outReset(BOR)DetectionEnablebit(BORisenabled)#pragmaconfigALTI2C1=OFF//AlternateI2C1pins(I2C1mappedtoSDA1/SCL1pins)#pragmaconfigALTI2C2=OFF//AlternateI2C2pins(I2C2mappedtoSDA2/SCL2pins)#pragmaconfigWDTWIN=WIN25//WatchdogWindowSelectbits(WDTWindowis25%ofWDTperiod)//FWDT#pragmaconfigWDTPOST=PS32768//WatchdogTimerPostscalerbits(1:32,768)#pragmaconfigWDTPRE=PR128//WatchdogTimerPrescalerbit(1:128)#pragmaconfigPLLKEN=OFF//PLLLockEnablebit(ClockswitchtoPLLsourcewillwaituntilthePLLlocksignalisvalid.)#pragmaconfigWINDIS=OFF//WatchdogTimerWindowEnablebit(WatchdogTimerinNon-Windowmode)#pragmaconfigFWDTEN=OFF//WatchdogTimerEnablebit(Watchdogtimerenabled/disabledbyusersoftware)//FOSC#pragmaconfigPOSCMD=NONE//PrimaryOscillatorModeSelectbits(XTCrystalOscillatorMode)#pragmaconfigOSCIOFNC=OFF//OSC2PinFunctionbit(OSC2isclockoutput)#pragmaconfigIOL1WAY=OFF//Peripheralpinselectconfiguration(Allowmultiplereconfigurations)#pragmaconfigFCKSM=CSECMD//ClockSwitchingModebits(Clockswitchingisenabled,Fail-safeClockMonitorisdisabled)//FOSCSEL#pragmaconfigFNOSC=FRC//OscillatorSourceSelection(InternalFastRC(FRC))#pragmaconfigPWMLOCK=ON//PWMLockEnablebit(CertainPWMregistersmayonlybewrittenafterkeysequence)#pragmaconfigIESO=OFF//Two-speedOscillatorStart-upEnablebit(Startupwithuser-selectedoscillatorsource)//FGS#pragmaconfigGWRP=OFF//GeneralSegmentWrite-Protectbit(GeneralSegmentmaybewritten)#pragmaconfigGCP=OFF//GeneralSegmentCode-Protectbit(GeneralSegmentCodeprotectisDisabled)//Timer1Interruptvoid__attribute__((interrupt,no_auto_psv))_T1Interrupt(void){staticinti=0;staticintcount=1;IFS0bits.T1IF=0;T1CONbits.TON=0;//Doyourstuffhereif(count==1000){execTowerLamp(i,LAMP_ON);i++;if(i==4)i=0;count=0;}count++;//execTowerLamp(YELLOW,LAMP_ON);TMR1=0;T1CONbits.TON=1;/*resetTimer1interruptflag*/}voidInitClock(void){//ConfigurePLLprescaler,PLLpostscaler,PLLdivisor//ConfigureOscillatortooperatethedeviceat60Mhz//Fosc=Fin*M/(N1*N2),Fcy=Fosc/2//Fosc=8M*60/(2*2)=120Mhzfor8MinputclockPLLFBD=63;//M=65CLKDIVbits.PLLPOST=0;//N2=2CLKDIVbits.PLLPRE=0;//N1=2//InitiateClockSwitchtoFRCoscillatorwithPLL(NOSC=0b001)__builtin_write_OSCCONH(0x01);__builtin_write_OSCCONL(OSCCON|0x01);//WaitforClockswitchtooccurwhile(OSCCONbits.COSC!=0b001);//WaitforPLLtolockwhile(OSCCONbits.LOCK!=1);}//InitializecommonPortsvoidInitPorts(){ANSELA=0x00;ANSELB=0x00;//TowerLampTRISAbits.TRISA1=0;//Output:REDLightTRISAbits.TRISA0=0;//Output:YellowLightTRISBbits.TRISB15=0;//Output:GreenLight//RejectorTRISBbits.TRISB0=0;//Output:Rejector//IRSENSORTRISBbits.TRISB1=1;//Input:IRSensor}//Mainfunctionintmain(intargc,char**argv){inti=0;InitClock();//ThisisthePLLsettingsInitPort1();//LEDsoutputs,SwitchesInputsInitPorts();//ConfigureallInput/OutputPortsinit_Timer1();execTimer1(40,1);//timerfor40msec,status:ON/*Waitatleast105microseconds(1/9600)beforesendingfirstchar*/DELAY_105uS;while(1){for(i=0;i<1000;i++){DELAY_105uS;}}return(EXIT_SUCCESS);}//ExecuteTowerLampvoidexecTowerLamp(intcolor,intstatus){switch(color){caseRED:RED_LIGHT=status;YELLOW_LIGHT=!status;GREEN_LIGHT=!status;break;caseYELLOW:RED_LIGHT=!status;YELLOW_LIGHT=status;GREEN_LIGHT=!status;break;caseGREEN:RED_LIGHT=!status;YELLOW_LIGHT=!status;GREEN_LIGHT=status;break;default:RED_LIGHT=status;YELLOW_LIGHT=status;GREEN_LIGHT=status;break;}}
Aquíhayun
Estoy enfrentando un problema al cambiar la LÁMPARA ROJA, es decir, pin < 20 > RA1.
Condiciones en las que me enfrento a este problema:
- Si solo la LÁMPARA ROJA está ENCENDIDA, continuará como ENCENDIDA para siempre
- SI solo se alterna la LÁMPARA ROJA, solo se ENCIENDE por una vez que la permanente APAGADA
- Tengo una interrupción de Timer1 en mi código de muestra. Aquí enciendo las tres lámparas simultáneamente. Entonces, RED_LAMP se enciende una vez que AMARILLO y luego VERDE y, a partir de entonces, solo AMARILLO & VERDE. RED_LAMP se enciende aleatoriamente de vez en cuando.
Pin < 19: 20 > tienen la misma multifunción como A / D, comparadores. He desactivado otras funciones como se menciona en la hoja de datos.
¿Puede alguien ayudarme a resolver el problema?
Si me falta información, hágamelo saber. Lo proporcionaré lo antes posible.