Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <atmel_start.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- #include <usart_basic.h>
- #include "UART.h"
- #include "I2C.h"
- ISR(TIMER1_COMPA_vect)
- {
- PORTD ^= 0xff; //MCU동작확인용 점멸 LED
- }
- int read_ADC(int CH)
- {
- //ADMUX = 0x00;
- ADMUX = ADMUX & 0b11110000; //ADC 초기화
- ADMUX = ADMUX | (CH << MUX0); //ADC 채널 선택
- ADCSRA = ADCSRA | (1 << ADSC); //ADC 시작
- while (!(ADCSRA & (1 << ADSC))); //ADC 종료
- return ADC;
- }
- int main(void)
- {
- atmel_start_init();
- int read, VoltageMonitor, CurrentMonitor = 0;
- unsigned char data;
- int VoltageProgramming = 0;
- int CurrentProgramming = 0;
- UART_INIT();
- I2C_init();
- uint8_t addressV = 0b1001100; //I2C의 Slave 1 Address
- uint8_t addressC = 0b1001000; //I2C의 Slave 2 Address
- I2C_start();
- I2C_transmit(addressV << 1); //Slave 1의 쓰기모드 실행
- I2C_transmit(0x40); //Slave 1의 제어 byte 입력
- I2C_transmit(0x00); //Slave 1의 제어 값 0입력: 초기화
- VoltageProgramming = 0;
- I2C_stop();
- I2C_start();
- I2C_transmit(addressC << 1); //Slave 2의 쓰기모드 실행
- I2C_transmit(0x40); //Slave 2의 제어 byte 입력
- I2C_transmit(0x00); //Slave 2의 제어 값 0입력: 초기화
- I2C_stop();
- CurrentProgramming = 0;
- UART_printString("ALL Programming Data Set up is Complete> \r\n");
- UART_printString("명령어 표기: 53\r\n");
- UART_printString("Voltage Programming 입력: 56 -> 00~ff\r\n");
- UART_printString("Current Programming 입력: 43 -> 00~ff\r\n");
- UART_printString("Voltage, Current 초기화 입력: 58\r\n");
- UART_printString("Voltage, Current Programming 입력값(V, A)표기:5a\r\n");
- UART_printString("Voltage Monitor 출력: 76\r\n");
- UART_printString("Current Monitor 출력: 43\r\n"); //명령어 표기
- DDRD = 0x0c;
- TCCR1A = 0x00;
- TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10);
- TCCR1C = 0x00;
- OCR1AH = (62499 >>8);
- OCR1AL = 62499 & 0xff;
- TIMSK1 = (1<<OCIE1A); //타이머 설정
- sei();
- while (1)
- {
- data = UART_receive();
- UART_transmit(data);
- if (data == 'S') //S 수신시 명령어 표기
- {
- UART_printString("명령어 표기: 53\r\n");
- UART_printString("ALL Programming Data Set up is Complete> \r\n");
- UART_printString("Voltage Programming 입력: 56 -> 00~ff\r\n");
- UART_printString("Current Programming 입력: 43 -> 00~ff\r\n");
- UART_printString("Voltage, Current 초기화 입력: 58\r\n");
- UART_printString("Voltage, Current Programming 입력값(V, A)표기:5a\r\n");
- UART_printString("Voltage Monitor 출력: 76\r\n");
- UART_printString("Current Monitor 출력: 43\r\n");
- }
- else if (data == 'V') //V 수신시 Voltage 값 입력
- {
- UART_printString("Voltage Programming Connect is ok");
- UART_printString("You put the Hex data");
- VoltageProgramming = UART_receive();
- I2C_start();
- I2C_transmit(addressV << 1);
- I2C_transmit(0x40);
- I2C_transmit(VoltageProgramming);
- I2C_stop();
- UART_transmit(VoltageProgramming);
- }
- else if (data == 'C') //C 수신시 Current 값 입력
- {
- UART_printString("Current Programming Connect is ok");
- UART_printString("You put the Hex data");
- CurrentProgramming = UART_receive();
- I2C_start();
- I2C_transmit(addressC << 1);
- I2C_transmit(0x40);
- I2C_transmit(CurrentProgramming);
- I2C_stop();
- UART_transmit(CurrentProgramming);
- }
- else if (data == 'Z') //Z 수신시 입력한 Voltage, Current 값 표시
- {
- UART_printString("Voltage is ");
- UART_print16bitNumber(VoltageProgramming*57);
- UART_printString("mV\n");
- UART_printString(" | ");
- UART_printString("Current is");
- UART_print16bitNumber(CurrentProgramming*0.0079);
- UART_printString("uA \r\n");
- }
- else if (data == 'v') //v 수신시 Feedback Voltage 값 표시
- {
- read = read_ADC(1);
- VoltageMonitor = read / 102.3;
- UART_print16bitNumber(VoltageMonitor);
- UART_printString("V\r\n");
- UART_printString("Current Monitor와 중복값이 나올 시 다시 입력해주세요\r\n");
- _delay_ms(100);
- LED_GREEN_set_level(false);
- LED_YELLOW_set_level(true);
- }
- else if (data == 'c') //c 수신시 Feedback Current 값 표시
- {
- read = read_ADC(0);
- CurrentMonitor = (read / 102.3);
- UART_print16bitNumber(CurrentMonitor);
- UART_printString("mA\r\n");
- _delay_ms(100);
- UART_printString("Voltage 모니터와 중복값이 나올 시 다시 입력해주세요\r\n");
- }
- else if (data == 'X') //X 수신시 Voltage, Current 값 초기화
- {
- I2C_start();
- I2C_transmit(addressV << 1);
- I2C_transmit(0x40);
- I2C_transmit(0x00);
- VoltageProgramming = 0;
- I2C_stop();
- I2C_start();
- I2C_transmit(addressC << 1);
- I2C_transmit(0x40);
- I2C_transmit(0x00);
- I2C_stop();
- CurrentProgramming = 0;
- UART_printString("ALL Programming Data Delete is ok");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement