dsPic33E: Problema de salida digital en pin20 RA1

0

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 hoja de datos

Estoy enfrentando un problema al cambiar la LÁMPARA ROJA, es decir, pin < 20 > RA1.

Condiciones en las que me enfrento a este problema:

  1. Si solo la LÁMPARA ROJA está ENCENDIDA, continuará como ENCENDIDA para siempre
  2. SI solo se alterna la LÁMPARA ROJA, solo se ENCIENDE por una vez que la permanente APAGADA
  3. 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.

    
pregunta skg

1 respuesta

3

Configure siempre las salidas digitales escribiendo los registros LAT. Los registros PORT solo se deben leer.

    
respondido por el Szidor

Lea otras preguntas en las etiquetas