BASIC4MCU | 질문게시판 | atmega128 코드 합치기
페이지 정보
작성자 앗메 작성일2024-06-18 19:57 조회208회 댓글0건본문
안녕하세요
atmega128을 이용해서 실습을 진행중입니다.
지금 적외선 센서의 입력을 받아 물체의 수를 측정하는 부분과 블루투스 통신을 이용해서 서보모터를 작동하는 부분을 각각은 구현이 되는데
두 코드를 합치는 계속 오류가 나는 상황입니다...
포트도 겹치지 않게 바꿔보고 코드도 계속 수정하는 상황인데 도와주세요..
코드1-적외선 센서 입력을 받아 LED와 LCD 켜기
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#define NULL 0
#include "lcd.h"
void init_ir_sensor_and_leds(void) {
// PD0, PD1, PD5, PD6 (적외선 센서 입력 핀)를 입력으로 설정
DDRD &= ~((1 << PD0) | (1 << PD1) | (1 << PD5) | (1 << PD6));
// PB1, PB2, PB3, PB4 (초록색 LED 출력 핀)를 출력으로 설정
DDRB |= ((1 << PB1) | (1 << PB2) | (1 << PB3) | (1 << PB4));
// PC0, PC1, PC2, PC3 (빨강색 LED 출력 핀)를 출력으로 설정
DDRC |= ((1 << PC0) | (1 << PC1) | (1 << PC2) | (1 << PC3));
}
int count_red_leds(void) {
int red_led_count = 0;
// 적외선 센서 값 읽기
int sensor1 = PIND & (1 << PD0);
int sensor2 = PIND & (1 << PD1);
int sensor3 = PIND & (1 << PD5);
int sensor4 = PIND & (1 << PD6);
// 센서 1 처리
if (sensor1 == 0) {
PORTC |= (1 << PC0); // 빨간불 켜기
PORTB &= ~(1 << PB1); // 초록불 끄기
red_led_count++;
} else {
PORTC &= ~(1 << PC0); // 빨간불 끄기
PORTB |= (1 << PB1); // 초록불 켜기
}
// 센서 2 처리
if (sensor2 == 0) {
PORTC |= (1 << PC1); // 빨간불 켜기
PORTB &= ~(1 << PB2); // 초록불 끄기
red_led_count++;
} else {
PORTC &= ~(1 << PC1); // 빨간불 끄기
PORTB |= (1 << PB2); // 초록불 켜기
}
// 센서 3 처리
if (sensor3 == 0) {
PORTC |= (1 << PC2); // 빨간불 켜기
PORTB &= ~(1 << PB3); // 초록불 끄기
red_led_count++;
} else {
PORTC &= ~(1 << PC2); // 빨간불 끄기
PORTB |= (1 << PB3); // 초록불 켜기
}
// 센서 4 처리
if (sensor4 == 0) {
PORTC |= (1 << PC3); // 빨간불 켜기
PORTB &= ~(1 << PB4); // 초록불 끄기
red_led_count++;
} else {
PORTC &= ~(1 << PC3); // 빨간불 끄기
PORTB |= (1 << PB4); // 초록불 켜기
}
return red_led_count;
}
int main(void) {
int red_led_count;
LCD_init();
init_ir_sensor_and_leds();
while (1) {
red_led_count = count_red_leds();
int available_spaces = red_led_count;
LCD_clear();
LCD_goto_XY(0, 0);
LCD_write_string("Spaces:");
LCD_goto_XY(0, 8);
char buffer[4];
itoa(available_spaces, buffer, 10);
LCD_write_string(buffer);
LCD_goto_XY(1, 0);
if (available_spaces == 0) {
LCD_write_string("No More Space!");
} else {
LCD_write_string("Welcome!");
}
_delay_ms(100); // 100ms 주기로 상태를 업데이트
}
}
코드2 블루투스 통신을 이용해서 서보모터 작동하기#define F_CPU 16000000UL#include <avr/io.h>#include <util/delay.h>#include <string.h>#define NULL 0char EnteredPassword[5]; // 입력된 비밀번호를 저장할 배열char SetPassword[5]; // 설정된 비밀번호를 저장할 배열uint8_t passwordIndex = 0;uint8_t isPasswordSet = 0; // 비밀번호가 설정되었는지 여부void init_uart1() {UCSR1B = 0x18;UCSR1C = 0x06;UBRR1H = 0;UBRR1L = 8;}void putchar1(char c) {while(!(UCSR1A & (1 << UDRE1)));UDR1 = c;}char getchar1() {while(!(UCSR1A & (1 << RXC1)));return UDR1;}void puts1(char *ptr) {while(*ptr != NULL)putchar1(*ptr++);}void init_servo(void) {// PE3 (OC3A 핀)를 출력으로 설정DDRE |= (1 << PE3);// Fast PWM, 10-bit 모드, 비반전 모드 설정TCCR3A = (1 << WGM31) | (1 << COM3A1);// Prescaler 64 설정TCCR3B = (1 << WGM32) | (1 << WGM33) | (1 << CS31) | (1 << CS30);// TOP 값 설정 (20ms 주기)ICR3 = 4999;// 초기 위치 (서보 모터를 90도로 설정)OCR3A = 375; // 초기값을 90도로 설정}void enable_servo(void) {// Timer3 설정TCCR3A |= (1 << COM3A1);}void disable_servo(void) {// Timer3 비활성화TCCR3A &= ~(1 << COM3A1);OCR3A = 0;}void move_servo_to_angle(uint16_t angle) {// 각도에 따른 PWM 값을 계산 (0도 = 250, 180도 = 500)uint16_t pwm_value = (angle * 250 / 180) + 250;enable_servo();OCR3A = pwm_value;_delay_ms(500); // 서보 모터가 이동할 시간을 줌disable_servo();}void reset_password() {isPasswordSet = 0;passwordIndex = 0;SetPassword[0] = '\0';puts1("Password Reset\r\n");}enum State { IDLE, WAITING_TO_OPEN, OPENING, OPEN_WAIT, OPEN, WAITING_TO_CLOSE, CLOSING, CLOSED_WAIT };enum State state = IDLE;int main() {char c;init_uart1();init_servo();while(1) {c = getchar1();putchar1(c);// 비밀번호 설정 단계if(!isPasswordSet) {if(c >= '0' && c <= '9') {EnteredPassword[passwordIndex++] = c;EnteredPassword[passwordIndex] = '\0'; // 문자열 끝에 NULL 추가if(passwordIndex == 4) { // 비밀번호가 4자리일 때strcpy(SetPassword, EnteredPassword);isPasswordSet = 1;passwordIndex = 0; // 비밀번호 인덱스 초기화puts1("Password Set\r\n");}}} else {// 비밀번호 입력 단계if(c >= '0' && c <= '9') {EnteredPassword[passwordIndex++] = c;EnteredPassword[passwordIndex] = '\0'; // 문자열 끝에 NULL 추가if(passwordIndex == 4) { // 비밀번호가 4자리일 때if(strcmp(EnteredPassword, SetPassword) == 0) {// 올바른 비밀번호 입력 시 서보 모터 작동state = WAITING_TO_OPEN;}passwordIndex = 0; // 비밀번호 인덱스 초기화}} else if (c == 'R') {reset_password(); // 비밀번호 초기화}}switch (state) {case IDLE:break;case WAITING_TO_OPEN:move_servo_to_angle(275); // 차단기를 10도 위치로 이동state = OPEN;break;case OPEN:_delay_ms(5000); // 차단기를 일정 시간 동안 열어 둠state = WAITING_TO_CLOSE;break;case WAITING_TO_CLOSE:move_servo_to_angle(500); // 차단기를 150도 위치로 이동state = CLOSED_WAIT;break;case CLOSED_WAIT:state = IDLE;break;}}}
댓글 0
조회수 208등록된 댓글이 없습니다.