BASIC4MCU | 질문게시판 | ATmega128 시리얼통신으로 정지, 초기화, 정지해제를 하고있습니다,
페이지 정보
작성자 July 작성일2019-11-19 10:17 조회4,571회 댓글0건본문
#include <avr/io.h> // AVR 입출력 관련 헤더파일을 포함합니다.
#define F_CPU 16000000UL // 사용하고 있는 크리스탈 주파수 값을 상수로 설정합니다.
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char rx;
char mode;
void walker_G(void){
PORTA=0x21; PORTB=0x11; PORTC=0xaa; PORTF=0x96; _delay_ms(250);
PORTA=0x21; PORTB=0x11; PORTC=0xaa; PORTF=0x82; _delay_ms(250);
}
//
void walker_B(void){
PORTA=0x11; PORTB=0x21; PORTC=0x96; PORTF=0xaa; _delay_ms(250);
PORTA=0x11; PORTB=0x21; PORTC=0x82; PORTF=0xaa; _delay_ms(250);
}
//
void walker_P(void){
PORTA=0x02; PORTB=0x02; PORTC=0x69; PORTF=0x69; _delay_ms(250); //주행 중이던 신호 노란불
PORTA=0x02; PORTB=0x02; PORTC=0x28; PORTF=0x28; _delay_ms(250); //주행 중이던 신호 노란불
}
ISR(USART1_RX_vect) // 수신완료 인터럽트
{
rx = UDR1;
UCSR1B |= (1 << UDRIE0);
if(rx=='2')mode=0; // 2누르면 정지
if(rx=='1')mode=1; // 1누르면 출발
if(rx=='3')mode=2; // 3누르면 초기화 // 송신 준비완료 인터럽트 인에이블 비트 Set
}
ISR(USART1_UDRE_vect) // 송신 준비완료 인터럽트
{
UDR1 = rx;
UCSR1B &= ~(1 << UDRIE0); // 송신 준비완료 인터럽트 인에이블 비트 Clear
_delay_ms(100);
}
ISR(INT4_vect){ // PE4
while(rx==2); // PE4 누르고 있는 동안 대기
while(rx==1); // PE5 누를 때까지 대기
// 채터링 방지용, 인터럽트 플래그 clear
}
int main(void){
int i;
DDRA=0xff; DDRB=0xff; DDRC=0xff; DDRF=0xff;
UCSR1B=0x98; UBRR1L=103; SREG=0x80; // 9600
start:;
PORTA=0; PORTB=0; PORTC=0; PORTF=0; // 초기화
mode=0; // 정지
while(1){
PORTA=0xc1; PORTB=0x11; PORTC=0xaa; PORTF=0x96; //초록 선일 때 LED점등
for(i=0;i<800;i++){ _delay_ms(10); if(mode==2)goto start; while(mode==2); }
//
for(i=0; i<4; i++)walker_G(); //노란불,보행자 깜빡임
//
PORTA=0x11; PORTB=0xc1; PORTC=0x96; PORTF=0xaa; //파란 선일 때 LED점등
for(i=0;i<800;i++){ _delay_ms(10); if(mode==2)goto start; while(mode==2); }
//
for(int i=0; i<4; i++)walker_B(); //노란불,보행자 깜빡임
//
PORTA=0x18; PORTB=0x18; PORTC=0x69; PORTF=0x69; //보라 선일 때 LED점등
for(i=0;i<800;i++){ _delay_ms(10); if(mode==2)goto start; while(mode==2); }
//
for(int i=0; i<4; i++)walker_P(); //노란불,보행자 깜빡임
//
PORTA=0x14; PORTB=0x14; PORTC=0xaa; PORTF=0xaa; //빨간 선일 때 LED점등
for(i=0;i<800;i++){ _delay_ms(10); if(mode==2)goto start; while(mode==2); }
//
PORTA=0x02; PORTB=0x02; PORTC=0xaa; PORTF=0xaa; //주행 중이던 신호 노란불
for(i=0;i<200;i++){ _delay_ms(10); if(mode==2)goto start; while(mode==2); }
}
}
초기화는 작동이 잘되는데,
정지랑 출발이 테라텀에서 작동이 안됩니다.
댓글 0
조회수 4,571등록된 댓글이 없습니다.