BASIC4MCU | 질문게시판 | 답변 : 프리마스터 LED 시프트 문제...
페이지 정보
작성자 master 작성일2021-10-13 10:47 조회1,896회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=16627
본문
volatile int i=0;
i 변수는 다른용도로 사용하지 않으니 이 변수를 이용해서 쉬프트 하겠습니다.
i++; // 메인 무한루프 마지막의 코드 삭제
쉬프트 방법은 여러가지가 있으니 본인이 잘 아는 것으로 만들면 됩니다.volatile char LED1=1,LED2=1,LED3=1,LED4=1;LEDx 변수는 인터럽트에서 건드릴 예정이므로 volatile 형으로 변경합니다.//---------------------------------------------------------------------2초마다 LED를 오른쪽으로 시프트//----------------------------------------#include "MPC5604P_M26V.h"#include "freemaster.h"#include "init_base.h"//void LED_Ctr(void);void Init_GPIO(void);void Switch(void);void init_ADC1(void);void ADCRead_1(void);void ADC_LED_Ctr(void);void init_PIT(void);void PIT0ISR(void);void PIT1ISR(void);//char SW1,SW2,SW3,SW4;volatile char LED1=1,LED2=1,LED3=1,LED4=1;int R_adc=0;volatile int i=0;uint32_t Pit0cnt=0,Pit1cnt=0;//void LED_Ctr(void){SIU.GPDO[52].B.PDO=LED1;SIU.GPDO[53].B.PDO=LED2;SIU.GPDO[54].B.PDO=LED3;SIU.GPDO[55].B.PDO=LED4;}//void ADC_LED_Ctr(void){if(R_adc> 250)LED1=0; else LED1=1;if(R_adc> 500)LED2=0; else LED2=1;if(R_adc> 750)LED3=0; else LED3=1;if(R_adc>1000)LED4=0; else LED4=1;}//void Switch(void){SW1=SIU.GPDI[48].B.PDI;SW2=SIU.GPDI[49].B.PDI;SW3=SIU.GPDI[50].B.PDI;SW4=SIU.GPDI[51].B.PDI;}//void init_ADC1(void){ADC_1.MCR.B.ABORT=1; //Abort ADC_1ADC_1.MCR.B.OWREN=0; //disable overwrittingADC_1.MCR.B.WLSIDE=0; //conversion data is written right_alignedADC_1.MCR.B.MODE=0; //One Shot modeADC_1.MCR.B.CTUEN=0; //disable CTU triggeredADC_1.MCR.B.ADCLKSEL=0; //Set ADClock 32MHz//ADC_1.MCR.B.ADCLKSEL=1; //Set ADClock 64MHzADC_1.MCR.B.ACK0=0; //disable auto clock offADC_1.MCR.B.PWDN=0; //disable power down modeADC_1.CTR[0].R=0x00008208;ADC_1.NCMR[0].R=0x00000020;ADC_1.CDR[5].R=0x00000000;ADC_1.MCR.B.ABORT=0; //clear ADC_1SIU.PCR[64].R=0x2400; //2000으로 설정해도 가능}//void ADCRead_1(void){ADC_1.MCR.B.NSTART=1;asm("nop");while(ADC_1.MCR.B.NSTART)asm("nop");R_adc=ADC_1.CDR[5].B.CDATA;}//void Init_GPIO(void){SIU.PCR[52].R=0x0200; //LED1SIU.PCR[53].B.PA=0b00;SIU.PCR[53].B.OBE=0b1; //LED2SIU.PCR[54].B.PA=0b00;SIU.PCR[54].B.OBE=0b1; //LED3SIU.PCR[55].R=0b0000001000000000; //LED4SIU.PCR[48].R=0x0100;SIU.PCR[49].R=0x0100;SIU.PCR[50].R=0x0100;SIU.PCR[51].R=0x0100; //switch}//void init_PIT(void){PIT.PITMCR.R=0x00000001; //타이머가 멈추고 디버그 모드로 설정PIT.CH[0].LDVAL.R=6400000; //64만을 16진수로 표현한 값(주기=100ms)PIT.CH[0].TCTRL.R=0x3; //둘 다 1이여야 하므로PIT.CH[1].LDVAL.R=64000000;PIT.CH[1].TCTRL.R=0x3; //예제 문제를 위한 추가 코드}//void PIT0ISR(void){Pit0cnt++;PIT.CH[0].TFLG.B.TIF=1; //100ms 마다 해야할 일 추가 가능 //clear PIT0 flag}//void PIT1ISR(void){ // 1초char c;Pit1cnt++;if(Pit1cnt>=2){ Pit1cnt=0; // 2초마다c=1<<i; // 0~3을 비트로 변경LED1=c&1;LED2=(c>>1)&1;LED3=(c>>2)&1;LED4=(c>>3)&1;if(++i>3)i=0; // 0~3 카운트 업}PIT.CH[1].TFLG.B.TIF=1;}//int main(void){initModesAndClock();disableWatchdog();enableIrq();initOutputClock();FMSTR_Init();init_INTC();init_Linflex0();Init_GPIO();Switch();init_ADC1();init_PIT();INTC_InstallINTCInterruptHandler(PIT0ISR,59,6);INTC_InstallINTCInterruptHandler(PIT1ISR,60,6); //59=하드웨어 고유 넘버(이곳에서 인터럭트 발생),6=우선순위for(;;){FMSTR_Recorder();FMSTR_Poll();LED_Ctr();Switch();ADCRead_1();//ADC_LED_Ctr();}}c=1<<i; // 0~3을 비트로 변경if(++i>3)i=0; // 0~3 카운트 업LED가 어떻게 배치되어 있는지에 따라서 LED 쉬프트 방향이 반대로 될 수가 있습니다.c=8>>i; // 0~3을 비트로 변경if(++i>3)i=0; // 0~3 카운트 업이렇게 변경해도 되고c=1<<i; // 0~3을 비트로 변경if(--i<0)i=3; // 0~3 카운트 다운이렇게 변경해도 됩니다.if문의 조건식에 사용하는 변수는 unsigned 타입이 아닌 signed 타입이어야지 0보다 작은 값이 나올 수 있어서 조건을 만족시킬 수 있습니다.
댓글 0
조회수 1,896등록된 댓글이 없습니다.