BASIC4MCU | 질문게시판 | 답변 : 아트메가128 질문입니다.
페이지 정보
작성자 master 작성일2018-12-04 10:38 조회5,264회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=6244
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-04 오전 10:43:49// by Ok-Hyun Park//#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>/*=====모듈 제어 관련정의====*///-FND Slave 설정 관련#define SLAVE_FND_ADDR1 38#define SLAVE_FND_ADDR2 32#define SLAVE_FND_ADDR1_W (SLAVE_FND_ADDR1<<1)#define SLAVE_FND_ADDR1_R (SLAVE_FND_ADDR1<<1)+1)#define SLAVE_FND_ADDR2_W (SLAVE_FND_ADDR2<<1)#define SLAVE_FND_ADDR2_R (SLAVE_FND_ADDR2<<1)+1)#define FND_IOA_REG 6#define FND_IOB_REG 7#define FND_PORTA_REG 2#define FND_PORTB_REG 3//-TWI Clock 설정관련#define CPU_CLOCK 16000000#define SCL_FREQUENCY 400000/*=======초음파 센서 상수======*/volatile unsigned int pulse_count=0;volatile unsigned char togle=0;unsigned char dig1,dig2,dig3,dig4;//ISR(TIMER0_OVF_vect){ pulse_count++; TCNT0=140; }//void seg_figure(unsigned char number){if(number==' ')PORTA=0x00;else if(number==1)PORTA=0x06;else if(number==2)PORTA=0x5B;else if(number==3)PORTA=0x4F;else if(number==4)PORTA=0x66;else if(number==5)PORTA=0x6D;else if(number==6)PORTA=0x7C;else if(number==7)PORTA=0x27;else if(number==8)PORTA=0x7F;else if(number==9)PORTA=0x67;else PORTA=0x3F;}//ISR(INT4_vect){if(togle==0){ pulse_count=0; TCCR0=0x02; TCNT0=140; EICRB=0x02; togle=1; TIMSK=0x01; }else { TIMSK=0x00; togle=0; EICRB=0x03; }}//void seg_display(void){PORTC=0x0E; seg_figure(dig1); _delay_us(750);PORTC=0x0D; seg_figure(dig2); _delay_us(750);PORTC=0x0B; seg_figure(dig3); _delay_us(750);PORTC=0x07; seg_figure(dig4); _delay_us(750);PORTA=0x00;}//void seg_num(unsigned int n){dig1=n/1000;dig2=n/100%10;dig3=n/10%10;dig4=n%10;}/*================*//*====TWI 초기화 구문====*/void TWI_Init(){TWSR&=~((1<<TWPS1)|(1<<TWPS0));TWBR=(CPU_CLOCK/SCL_FREQUENCY-16)/ 2;}/*====FND TWI 초기화 함수====*/void FND_TWI_Init(unsigned char nSLV_Addr,unsigned char nDDR_CMD){TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); //-START condition------TWDR=nSLV_Addr; TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); //-Slave address------TWDR=nDDR_CMD; TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); //-Slave DDR 설정-------TWDR=0; TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); //-Slave DDR을 Output Type 설정----TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); //-STOP condition 설정-------_delay_ms(5);}/*=====FND write 함수=======*/void FND_TWI_Write(unsigned char nSLV_Addr,unsigned char nPORT_CMD,unsigned char nDataValue){TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); //-START condition----TWDR=nSLV_Addr; TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); //-Slave address----TWDR=nPORT_CMD; TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); //-Slave PORT 레지스터 설정-------TWDR=nDataValue; TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR&(1<<TWINT))); //-Slave PORT에 Data write--TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); //-STOP condition--_delay_ms(5);}/*=====전체 FND 초기화 함수=====*/void FND_Init(){FND_TWI_Init(SLAVE_FND_ADDR1_W,FND_IOB_REG);FND_TWI_Init(SLAVE_FND_ADDR1_W,FND_IOA_REG);FND_TWI_Init(SLAVE_FND_ADDR2_W,FND_IOB_REG);FND_TWI_Init(SLAVE_FND_ADDR2_W,FND_IOA_REG);}//int main(void){unsigned char nValues[10]={ 3,159,37,13,153,73,65,31,1,9};TWI_Init();FND_Init();DDRA=0xFF;DDRC=0xFF;//----Interrupt 관련 레지스터 설정----EICRB=0x03;EIMSK=0x10;//------기타 설정-------ACSR=0x80;sei();while(1){_delay_ms(250);DDRE=0xF0; PORTE=0x10; _delay_us(5); PORTE=0x00; DDRE=0x00; // pulse();_delay_ms(18);seg_num(pulse_count);FND_TWI_Write(SLAVE_FND_ADDR1_W,FND_PORTB_REG,nValues[dig1]);FND_TWI_Write(SLAVE_FND_ADDR1_W,FND_PORTA_REG,nValues[dig2]);FND_TWI_Write(SLAVE_FND_ADDR2_W,FND_PORTB_REG,nValues[dig3]);FND_TWI_Write(SLAVE_FND_ADDR2_W,FND_PORTA_REG,nValues[dig4]);}return 0;}/*=====================*/
댓글 1
조회수 5,264helpavr님의 댓글
helpavr 작성일감사합니다 공부하는데 많은 도움이 되고있습니다 ㅎㅎ