실험 키트
ATMEGA128 모듈에 연결
WAT-AVR128 모듈의 PORTA는 LED, PORTB는 DIP SWITCH, PORTC는 FND SELECT, PORTE는 FND DATA, PORTE는 ADC 에 연결하여 PC 프로그램에서 제어 및 상태를 실시간으로 모니터링 하는 예제입니다.
WAT-AVR128 모듈 | WAT-IO&ADC 모듈 |
PORTA | FND DATA |
PORTB | |
PORTC | FND SELECT, ROTARY SWITCH |
PORTD | DIP SWITCH |
PORTE | LED |
PORTF | ADC |
ATEMGA128 펌웨어 코드
/* USART0 로보드의상태PC로전송 PC에서LED, BUZZER, FND 제어 AVRStudio 4.18 */
#include <avr/io.h> #include "WAT128.h"
BYTE g_FNDData[4]={1,2,3,4}; BYTE g_BUZZER = 0; BYTE g_LED = 0;
UINT16 g_adcCDS; // CDS 값보관 UINT16 g_adcVR; // 가변저항값보관
void OperDisplayFND() { DisplayFND4(g_FNDData[0],g_FNDData[1],g_FNDData[2],g_FNDData[3]); }
INT16 g_byteOperPCTXTimer = 0; void OperPCTX() { if(--g_byteOperPCTXTimer>0) return;
PutChar0(0x02); // 0 시작신호 PutChar0(PIND); // 1 DIP SWITCH PutChar0(GetRotaryInt()); // 2 ROTARY PutChar0(g_adcCDS>>8); // 3 CDS 상위값 PutChar0(g_adcCDS); // 4 CDS 하위값 PutChar0((g_adcVR)>>8 &0xFF); // 5 가변저항상위값 PutChar0(g_adcVR&0xFF); // 6 가변저항하위값 PutChar0(0x03); // 7 PutChar0(0xCC); // 8 체크섬 PutChar0(0x03); // 9 끝신호
g_byteOperPCTXTimer = 20;
}
// 가변저항, CDS 값을ADC로읽기 void OperReadADC() { INT16 uiTemp; // 임시변수
g_adcCDS = 0; // 노이즈를생각해서값을번읽어평균을낸다.
for(uiTemp = 0; uiTemp<16;uiTemp++) { ADMUX=0x40 | 0x00; ADCSRA = 0xD7; while((ADCSRA & 0x10) != 0X10); g_adcCDS += ADCL + (ADCH*256); }
g_adcCDS>>=4;
g_adcVR = 0; // 노이즈를생각해서값을번읽어평균을낸다.
for(uiTemp = 0; uiTemp<16;uiTemp++) { ADMUX=0x40 | 0x01; ADCSRA = 0xD7; while((ADCSRA & 0x10) != 0X10); g_adcVR += ADCL + (ADCH*256); }
g_adcVR>>=4; }
int main() {
BUZZER_INIT; // BUZZER 초기화 OpenSCI0(115200); // USART 0 열기 InitFND4(); // FND 초기화 InitADC(); // ADC 초기화
DisplayFND4(3,4,5,6); InitRotary();
DDRD = 0x00; // 딥스위치를입력으로설정 DDRE = 0xFE; // LED
while(1) { BUZZER_OFF; OperDisplayFND(); OperReadADC();
OperPCTX();
if(0x02 ==GetByte0()) { UINT16 uiData = 0; uiData = GetByte0(); //1 uiData<<=8; uiData += GetByte0(); //2
//buzzer g_BUZZER = GetByte0();
g_LED = GetByte0(); //4 GetByte0(); //5 GetByte0(); //6 GetByte0(); //7 if(0xCC == GetByte0() && 0x03 == GetByte0() ) { if( g_BUZZER) { BUZZER_ON; DelayMS(2); }
// PC에서받은LED 값을출력 PORTE =~((g_LED)&0xFC);
// FND 표시 g_FNDData[0]=((uiData/1000)%10); g_FNDData[1]=((uiData/100)%10); g_FNDData[2]=((uiData/10)%10); g_FNDData[3]=(uiData%10); } } } } |
윈도우 코드(통신 처리 부분)
try { // 이번에 수신된 데이터 m_byteArray(QUEUE) 에 넣기 for( int i=1; i<=nRcvSize; i++ ) { m_byteArray.Add(m_CommPort.m_byRcvBuf[i]); }
// 시작 신호 체크 while(m_byteArray.GetSize()>0) { if(m_byteArray.GetAt(0) != 0x02) { m_byteArray.RemoveAt(0); continue; } else { break; } }
CString strData; CString strTemp; if(m_byteArray.GetSize()>=10) { if(m_byteArray.GetAt(0) == 0x02 && m_byteArray.GetAt(9) == 0x03) { // DIP SWITCH 체크 byteTemp = m_byteArray.GetAt(1);
UpdateData(TRUE); m_bDIP8 = ((byteTemp & 0x80)!=0x80); m_bDIP7 = ((byteTemp & 0x40)!=0x40); m_bDIP6 = ((byteTemp & 0x20)!=0x20); m_bDIP5 = ((byteTemp & 0x10)!=0x10); m_bDIP4 = ((byteTemp & 0x08)!=0x08); m_bDIP3 = ((byteTemp & 0x04)!=0x04); m_bDIP2 = ((byteTemp & 0x02)!=0x02); m_bDIP1 = ((byteTemp & 0x01)!=0x01);
// 로터리 스위치 값 읽기 m_strRotary.Format("%d",m_byteArray.GetAt(2));
// CDS 값 읽기 uiTemp = m_byteArray.GetAt(3); uiTemp <<=8; uiTemp += m_byteArray.GetAt(4); m_prgCDS.SetPos(1023 - uiTemp);
// 가변저항 값 읽기 uiTemp = m_byteArray.GetAt(5); uiTemp <<=8; uiTemp += m_byteArray.GetAt(6); m_prgVR.SetPos(1023 - uiTemp);
// 화면 갱신 UpdateData(FALSE); }
// 마지막에 처리한 데이터 보기 for(int i=0;i<10;i++) { strTemp.Format( "%02X ", m_byteArray.GetAt(i) ); strData+=strTemp+ " "; } strData+= "\n";
m_byteArray.RemoveAt(0,10); }
m_ReceiveData = strData; UpdateData(FALSE);
} catch (CException* ) {
} |
윈도우 프로그램에서 FND에 5634, LED 모두 OFF 값을 전송하며 ATMEGA128 보드에서 딥 스위치4번 OFF, CDS값 최대, 가변저항 값 최소, 로터리 스위치 값 3을 전송되면 아래와 같이 됩니다.
< WAT-IO&ADC에 연결한 윈도우 프로그램 >
윈도우 프로그램에서 FND에 5667, LED 3,5,7번 ON 값을 전송하며 ATMEGA128 보드에서 딥 스위치1,3,5,7,번 ON, CDS값 최대, 가변저항 값 최대, 로터리 스위치 값 9을 전송되면 아래와 같이 됩니다.
다운로드
매뉴얼: WAT-IO_ADC매뉴얼.pdf
펌웨어: EX_09_03.zip
윈도우 프로그램(MFC 6.0):실행파일.EXE
윈도우 프로그램(C# 2008): 실행파일.EXE
(실행파일의 소스코드는 제품과 함께 제공됩니다.)
'AVR키트' 카테고리의 다른 글
AtmelStudio7 (AVRStudio7) 프로그램 다운로딩 (0) | 2019.01.21 |
---|---|
WAT-AVR128_PLUS 모듈 (0) | 2013.04.08 |
WAT-IO&ADC 실험 모듈 (0) | 2012.06.07 |
WAT-AVR128, EX_02_01 캐릭터 LCD 영문 출력 (0) | 2011.11.07 |
WAT-AVR128, EX_02_03 그래픽 LCD에 영문, 한글 출력 (0) | 2011.10.30 |
댓글을 달아 주세요