IMC-V0.1 예제소스파일 1. UART 소스코드 (page 1-3) 2. Encoder 소스코드 (page 4-7) 3. ADC 소스코드 (page 8-10)
UART.h #ifndef _UART_H_ #define _UART_H_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define CPU_CLOCK_HZ 16000000UL UART PORT1 void UARTInit1(unsigned long baud); UART 초기화함수. void SerialPutchar1(char ch); 문자송신함수. char SerialGetchar1(); 문자수신함수. #endif UART.c ============================================================== main.c : 메인함수. rx 받은문자를1초마다전송해주는프로그램. ============================================================== #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <compat/deprecated.h> #include "uart.h" volatile char rx; int main() DDRC = 0x03; LED OUTPUT(PORTC 0,1) PORTC = 0; LED ON DDRD = 0x10; 485 TX/RX OUTPUT(PORTD 4) DIR_RXD; RX mode UARTInit1(57600); 1 번 uart init(baudrate : 57600) while(1) DIR_TXD; 1
SerialPutchar1(rx); while(!bit_is_set(ucsr1a,6) ); DIR_RXD; _delay_ms(1000); return 0; ============================================================== UART.c : UART통신에필요한함수. 사용함수 : UDRn = x; 또는x = UDRn;, ISR(vect) UARTInit0(1) 함수내의레지스터세팅후사용. ============================================================== SIGNAL(USART1_RX_vect) rx = UDR1; / UART PORT1 void UARTInit1(unsigned long baud) unsigned short ubrr; if(baud == 115200) ubrr = (unsigned short)(cpu_clock_hz/(16*baud)); else ubrr = (unsigned short)(cpu_clock_hz/(16*baud)-1); UCSR1A = (0 << U2X1) (0 << MPCM1); UCSR1B = (1 << RXCIE1) (0 << TXCIE1) (0 << UDRIE1) (1 << RXEN1) (1 << TXEN1) (0 << UCSZ12); UCSR1C = (0 << 7) (1 << UCSZ11) (1 << UCSZ10) (0 << UMSEL1) (0 << UPM11) (0 << UPM10) (0 << USBS1) (0 << UCPOL1); UBRR1H = (unsigned char) (ubrr >> 8); 상위바이트 UBRR1L = (unsigned char) ubrr; 하위바이트 BAUDRATE. 103 : 9600BAUD. SREG = 0x80; sei(); GLOBAL Interrupt Enable 2
void SerialPutchar1(char ch) while(!bit_is_set(ucsr1a,5)); UCSR1A = 0x40; UDR1 = ch; char SerialGetchar1() char ch; while(!bit_is_set(ucsr1a,6) ); ch = UDR1; return ch; 3
Encoder.h #ifndef _main_h_ #define _main_h_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define MOTOR_RIGHT #define MOTOR_LEFT #define MOTOR_STOP sbi(portb,0), cbi(portb,1) cbi(portb,0), sbi(portb,1) cbi(portb,0), cbi(portb,1) #define CPU_CLOCK_HZ 16000000UL void InterruptInit(); extern volatile int cnt; void TCInit0(); void TCInit1(); void TCInit2(); void TCInit3(); UART PORT1 void UARTInit1(unsigned long baud); void SerialPutchar1(char ch); char SerialGetchar1(); #endif Encoder.c ============================================================== main.c : 메인함수. 모터정방향구동및엔코더데이터를받을수있는프로그램. ============================================================== #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <compat/deprecated.h> #include "encoder.h" 4
volatile int cnt = 0; int main() DDRC = 0x03; LED OUTPUT(PORTC 0,1) PORTC = 0; LED ON DDRB = 0xff; MOTOR_STOP; MOTOR OUTPUT MOTOR STOP DDRD = 0x10; 485 TX/RX OUTPUT(PORTD 4) DIR_TXD; TX mode UARTInit1(57600); 1 번 uart init(baudrate : 57600) InterruptInit(); Interrupt initial setting sbi(portd,0); 내부풀업저항설정. sbi(portd,1); TCInit1(); Timer/counter 모드 initial setting MOTOR_RIGHT; motor 구동. while(1) SerialPutchar1(cnt); _delay_ms(1000); return 0; ============================================================== UART : UART통신에필요한함수. 사용함수 : UDRn = x; 또는x = UDRn;, ISR(vect) ============================================================== / UART PORT1 void UARTInit1(unsigned long baud) unsigned short ubrr; if(baud == 115200) ubrr = (unsigned short)(cpu_clock_hz/(16*baud)); else ubrr = (unsigned short)(cpu_clock_hz/(16*baud)-1); 5
UCSR1A = (0 << U2X1) (0 << MPCM1); UCSR1B = (0 << RXCIE1) (0 << TXCIE1) (0 << UDRIE1) (1 << RXEN1) (1 << TXEN1) (0 << UCSZ12); UCSR1C = (0 << 7) (1 << UCSZ11) (1 << UCSZ10) (0 << UMSEL1) (0 << UPM11) (0 << UPM10) (0 << USBS1) (0 << UCPOL1); UBRR1H = (unsigned char) (ubrr >> 8); 상위바이트 UBRR1L = (unsigned char) ubrr; 하위바이트 SREG = 0x80; GLOBAL Interrupt Enable sei(); void SerialPutchar1(char ch) while(!(ucsr1a & (1 << UDRE))); UDR1 = ch; char SerialGetchar1() char ch; while(!(ucsr1a & (1<<RXC))); ch = UDR1; return ch; ============================================================== Timer : 타이머 / 카운터구동에필요한함수. 사용함수 : ISR(vect); 혹은SIGNAL(vect) ============================================================== 16bit timer/counter Register void TCInit1() TCCR1A = (0 << COM1A1) (0 << COM1A0) (0 << COM1B1) (0 << COM1B0) (0 << COM1C1) (0 << COM1C0) (0 << WGM11) (0 << WGM10); TCCR1B = (0 << WGM13) (0 << WGM12) (0 << CS12) (0 << CS11) (0 << CS10); TCCR1C = (0 << FOC1A) (0 << FOC1B) (0 << FOC1C); TCCR1A = 0xA2; TCCR1B = 0x11; TIMSK = (0 << OCIE1A) (0 << OCIE1B) (0 << TICIE1) (0 << TOIE1); TIMSK = 0x01; ETIMSK = (0 << OCIE1C); 설정값 (MAX/MIN data) 6
ICR1 = 1000; OCR1A = 800; OCR1B = 800; duty TCNT1H = ; TCNT1L = ; SREG = 0x80; sei(); ============================================================== Interrupt : 인터럽트레지스터설정및구동에필요한함수. 사용함수 : ISR(vect); 혹은SIGNAL(vect) ============================================================== SIGNAL(INT0_vect) interrupt routine cnt++; if(cnt == 5000) cnt = 0; void InterruptInit() EICRA = (0 << ISC31) (0 << ISC30) (0 << ISC21) (0 << ISC20) (1 << ISC11) (0 << ISC10) (1 << ISC01) (0 << ISC00); EICRB = (0 << ISC71) (0 << ISC70) (0 << ISC61) (0 << ISC60) (0 << ISC51) (0 << ISC50) (0 << ISC41) (0 << ISC40); EIMSK = (0 << INT7) (0 << INT6) (0 << INT5) (0 << INT4) (0 << INT3) (0 << INT2) (1 << INT1) (1 << INT0); sei(); 전역인터럽트허용 7
ADC.h #ifndef _main_h_ #define _main_h_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define CPU_CLOCK_HZ 16000000UL #define BUFFER_LENGTH 20 #define MAX_PACKET 5 UART PORT1 void UARTInit1(unsigned long baud); void SerialPutchar1(char ch); char SerialGetchar1(); void ADCInit(); int ADCget(); #endif ADC.c ============================================================== main.c : 메인함수. 1초마다ADC핀에서받은analog값을char 형태로전송한다. ============================================================== #include <avr/io.h> #include <util/delay.h> #include <compat/deprecated.h> #include <avr/interrupt.h> #include "adc.h" int main() int adc; DDRC = 0x03; LED OUTPUT(PORTC 0,1) PORTC = 0; LED ON DDRD = 0x10; 485 TX/RX OUTPUT(PORTD 4) DIR_TXD; TX mode 8
UARTInit1(57600); 1 번 uart init(baudrate : 57600) ADCInit(); ADC init; while(1) adc = ADCget(); SerialPutchar1(adc/256); SerialPutchar1(adc%256); _delay_ms(1000); return 0; ============================================================== ADC : ADC변환에필요한함수. 사용함수 : ADCget(); ============================================================== void ADCInit() ADMUX = 0x40; ADCSRA = 0xe7; ADMUX = (0 << REFS1) (0 << REFS0) (0 << ADLAR); ADCSRA = (0 << ADEN) (0 << ADIE) (0 << ADPS2) (0 << ADPS1) (0 << ADPS0); int ADCget() int ADCR; ADMUX = 0x40; ADMUX = (0 << MUX4) (0 << MUX3) (0 << MUX2) (0 << MUX1) (0 << MUX0); ADCSRA = (1 << ADSC); while((adcsra & 0x10) == 0x00); 변환종료 ADCR = (int)adcl + ((int)adch<<8); return ADCR; 9
============================================================== UART : UART통신에필요한함수. 사용함수 : UDRn = x; 또는x = UDRn;, ISR(vect) ============================================================== / UART PORT1 void UARTInit1(unsigned long baud) unsigned short ubrr; if(baud == 115200) ubrr = (unsigned short)(cpu_clock_hz/(16*baud)); else ubrr = (unsigned short)(cpu_clock_hz/(16*baud)-1); UCSR1A = (0 << U2X1) (0 << MPCM1); UCSR1B = (1 << RXCIE1) (0 << TXCIE1) (0 << UDRIE1) (1 << RXEN1) (1 << TXEN1) (0 << UCSZ12); UCSR1C = (0 << 7) (1 << UCSZ11) (1 << UCSZ10) (0 << UMSEL1) (0 << UPM11) (0 << UPM10) (0 << USBS1) (0 << UCPOL1); UBRR1H = (unsigned char) (ubrr >> 8); 상위바이트 UBRR1L = (unsigned char) ubrr; 하위바이트 BAUDRATE. 103 : 9600BAUD. SREG = 0x80; sei(); GLOBAL Interrupt Enable void SerialPutchar1(char ch) while(!(ucsr1a & (1 << UDRE))); UDR1 = ch; char SerialGetchar1() char ch; while(!(ucsr1a & (1<<RXC))); ch = UDR1; return ch; 10