1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 연희야 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
at90can128 공부하는 초보입니다 ㅜㅜ
아래 소스는 CAN 통신으로 온도값 수신하여 TEXT lcd에 출력하는 프로그램입니다.
질문들은 빨강색 으로 나타 냈고요
고수님들 꼭 좀 도와주세요 ㅜㅜ
#include <avr/io.h>
#include <avr/interrupt.h>
#include "avr_lib.h"
#include "lcd.h"
#include "can.h"
// 1)
volatile unsigned char CAN_TX = 0;
unsigned char timer0Cnt=0;
unsigned int tmp;
Msg_object Rmsg, Tmsg, Imsg;
TCan_fifo Can_fifo;
void printf_temp(u16 sense_temp);
int main(void)
{
// 2)
can_initialize(b1M);
init_can_fifo(&Can_fifo); // initialize CAN FIFO
can_RXmsg_set(1, STD, 0x00, 0x00);
CANGIE |= 0x80;
CANGIE |= 0x20; // RXOK
CANEN1 = 0xFF;
CANEN2 = 0xFF;
// 3)
TCCR0A = 0x05;
TCNT0 =0xff - 156;
TIMSK0 |= 1 << TOIE0; //이 라인에서 1<<TOIE0 가 이해 안갑니다 ㅜㅜ TIMSK0 |= 1 먼저 수행하고
// <<TOIE0를 수행하는 건가요?
// 그리고 TOIE0<<1 와 차이점은 뭔가요? 1>>TOIE0 이런게 존재하나요??
TIFR0 |= 1 << TOV0;
// 4)
lcdInit();
lcdGotoXY(2,0);
lcdPrintData("CAN Module 1",12);
lcdGotoXY(2,1);
lcdPrintData("Temp : ",7);
sei();
while(1) {
// 5)
// CAN 메시지가 수신된 경우 이를 읽어서 처리한다
if( read_can_fifo(&Can_fifo, &Rmsg) ) {
tmp = (((u16)Rmsg.data[4])<<8) | (u16)Rmsg.data[5];
lcdGotoXY(9,1);
printf_temp(tmp); // 온도값을 TEXT LCD에 출력
}
// 6)
if(CAN_TX == 1) { // Delay 1 sec
CAN_TX = 0;
Tmsg.ide = STD; // Standard
Tmsg.id = 0x01; // Module 1 의 ID
Tmsg.length = 8; // 데이터 길이
Tmsg.data[0] = 0xff; // 센서값 달라는 명령
can_transmit(5, &Tmsg);// CAN 송신
CANCDMOB |= 0x80; // 수신모드
}
}
}
// 7)
void printf_temp(u16 sense_temp) { // temp값 출력 함수
u08 s100,s10,s1;
s100 = sense_temp/100; // 100의 자리 값 저장, 100단위까지의 값을 100로 나눈 몫
if(s100> 0) lcdDataWrite(s100+'0'); // 100의 자리 값이 0 이상이면 출력
else lcdPrintData(" ",1); // 100의 자리 값이 0 이하이면 빈칸 출력
sense_temp = sense_temp%100; // 100으로 나눈 나머지, 10단위까지의 값 저장
s10 = sense_temp/10; // 10의 자리 값 저장, 10단위까지의 값을 10으로 나눈 몫
s1 = sense_temp%10; // 1의 자리 값 저장, 10단위까지의 값을 10으로 나눈 나머지
if(s10> 0) lcdDataWrite(s10+'0'); // 10의 자리 값이 0 이상이면 출력
else { // 10의 자리 값이 0 이하일때
if(s100> 0 ) lcdDataWrite('0'); // 100단위 숫자가 출력되었으면 0으로 출력
else lcdPrintData(" ",1); // 100단위 숫자가 출력되지 않았으면 빈칸 출력
}
lcdDataWrite('.'); // 소수점
lcdDataWrite(s1+'0'); // 1의 자리 값 출력
}
// 8)
SIGNAL(SIG_OVERFLOW0)
{
cli();
TCNT0=0xff - 156;
timer0Cnt++;
if(timer0Cnt == 100){ // 0.01s * 100 = 1s //1초를 얻기 위한 카운트 횟수
CAN_TX = 1;
timer0Cnt=0;
}
sei();
}