Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.18 KB | None | 0 0
  1. #include <atmel_start.h>
  2. #include <avr/interrupt.h>
  3. #include <util/delay.h>
  4. #include <usart_basic.h>
  5. #include "UART.h"
  6. #include "I2C.h"
  7.  
  8. ISR(TIMER1_COMPA_vect)
  9. {
  10. PORTD ^= 0xff; //MCU동작확인용 점멸 LED
  11. }
  12.  
  13. int read_ADC(int CH)
  14. {
  15. //ADMUX = 0x00;
  16.  
  17. ADMUX = ADMUX & 0b11110000; //ADC 초기화
  18. ADMUX = ADMUX | (CH << MUX0); //ADC 채널 선택
  19.  
  20. ADCSRA = ADCSRA | (1 << ADSC); //ADC 시작
  21.  
  22. while (!(ADCSRA & (1 << ADSC))); //ADC 종료
  23.  
  24. return ADC;
  25. }
  26.  
  27. int main(void)
  28. {
  29. atmel_start_init();
  30. int read, VoltageMonitor, CurrentMonitor = 0;
  31. unsigned char data;
  32. int VoltageProgramming = 0;
  33. int CurrentProgramming = 0;
  34.  
  35. UART_INIT();
  36. I2C_init();
  37. uint8_t addressV = 0b1001100; //I2C의 Slave 1 Address
  38. uint8_t addressC = 0b1001000; //I2C의 Slave 2 Address
  39.  
  40. I2C_start();
  41. I2C_transmit(addressV << 1); //Slave 1의 쓰기모드 실행
  42. I2C_transmit(0x40); //Slave 1의 제어 byte 입력
  43. I2C_transmit(0x00); //Slave 1의 제어 값 0입력: 초기화
  44. VoltageProgramming = 0;
  45. I2C_stop();
  46. I2C_start();
  47. I2C_transmit(addressC << 1); //Slave 2의 쓰기모드 실행
  48. I2C_transmit(0x40); //Slave 2의 제어 byte 입력
  49. I2C_transmit(0x00); //Slave 2의 제어 값 0입력: 초기화
  50. I2C_stop();
  51. CurrentProgramming = 0;
  52. UART_printString("ALL Programming Data Set up is Complete> \r\n");
  53. UART_printString("명령어 표기: 53\r\n");
  54. UART_printString("Voltage Programming 입력: 56 -> 00~ff\r\n");
  55. UART_printString("Current Programming 입력: 43 -> 00~ff\r\n");
  56. UART_printString("Voltage, Current 초기화 입력: 58\r\n");
  57. UART_printString("Voltage, Current Programming 입력값(V, A)표기:5a\r\n");
  58. UART_printString("Voltage Monitor 출력: 76\r\n");
  59. UART_printString("Current Monitor 출력: 43\r\n"); //명령어 표기
  60.  
  61. DDRD = 0x0c;
  62.  
  63. TCCR1A = 0x00;
  64. TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10);
  65. TCCR1C = 0x00;
  66. OCR1AH = (62499 >>8);
  67. OCR1AL = 62499 & 0xff;
  68. TIMSK1 = (1<<OCIE1A); //타이머 설정
  69.  
  70. sei();
  71.  
  72. while (1)
  73. {
  74. data = UART_receive();
  75. UART_transmit(data);
  76.  
  77. if (data == 'S') //S 수신시 명령어 표기
  78. {
  79. UART_printString("명령어 표기: 53\r\n");
  80. UART_printString("ALL Programming Data Set up is Complete> \r\n");
  81. UART_printString("Voltage Programming 입력: 56 -> 00~ff\r\n");
  82. UART_printString("Current Programming 입력: 43 -> 00~ff\r\n");
  83. UART_printString("Voltage, Current 초기화 입력: 58\r\n");
  84. UART_printString("Voltage, Current Programming 입력값(V, A)표기:5a\r\n");
  85. UART_printString("Voltage Monitor 출력: 76\r\n");
  86. UART_printString("Current Monitor 출력: 43\r\n");
  87. }
  88.  
  89. else if (data == 'V') //V 수신시 Voltage 값 입력
  90. {
  91. UART_printString("Voltage Programming Connect is ok");
  92. UART_printString("You put the Hex data");
  93. VoltageProgramming = UART_receive();
  94. I2C_start();
  95. I2C_transmit(addressV << 1);
  96. I2C_transmit(0x40);
  97. I2C_transmit(VoltageProgramming);
  98. I2C_stop();
  99. UART_transmit(VoltageProgramming);
  100. }
  101.  
  102. else if (data == 'C') //C 수신시 Current 값 입력
  103. {
  104. UART_printString("Current Programming Connect is ok");
  105. UART_printString("You put the Hex data");
  106. CurrentProgramming = UART_receive();
  107. I2C_start();
  108. I2C_transmit(addressC << 1);
  109. I2C_transmit(0x40);
  110. I2C_transmit(CurrentProgramming);
  111. I2C_stop();
  112. UART_transmit(CurrentProgramming);
  113. }
  114. else if (data == 'Z') //Z 수신시 입력한 Voltage, Current 값 표시
  115. {
  116. UART_printString("Voltage is ");
  117. UART_print16bitNumber(VoltageProgramming*57);
  118. UART_printString("mV\n");
  119. UART_printString(" | ");
  120. UART_printString("Current is");
  121. UART_print16bitNumber(CurrentProgramming*0.0079);
  122. UART_printString("uA \r\n");
  123. }
  124. else if (data == 'v') //v 수신시 Feedback Voltage 값 표시
  125. {
  126. read = read_ADC(1);
  127. VoltageMonitor = read / 102.3;
  128. UART_print16bitNumber(VoltageMonitor);
  129. UART_printString("V\r\n");
  130. UART_printString("Current Monitor와 중복값이 나올 시 다시 입력해주세요\r\n");
  131. _delay_ms(100);
  132.  
  133. LED_GREEN_set_level(false);
  134. LED_YELLOW_set_level(true);
  135. }
  136. else if (data == 'c') //c 수신시 Feedback Current 값 표시
  137. {
  138. read = read_ADC(0);
  139. CurrentMonitor = (read / 102.3);
  140. UART_print16bitNumber(CurrentMonitor);
  141. UART_printString("mA\r\n");
  142. _delay_ms(100);
  143. UART_printString("Voltage 모니터와 중복값이 나올 시 다시 입력해주세요\r\n");
  144. }
  145. else if (data == 'X') //X 수신시 Voltage, Current 값 초기화
  146. {
  147. I2C_start();
  148. I2C_transmit(addressV << 1);
  149. I2C_transmit(0x40);
  150. I2C_transmit(0x00);
  151. VoltageProgramming = 0;
  152. I2C_stop();
  153. I2C_start();
  154. I2C_transmit(addressC << 1);
  155. I2C_transmit(0x40);
  156. I2C_transmit(0x00);
  157. I2C_stop();
  158. CurrentProgramming = 0;
  159. UART_printString("ALL Programming Data Delete is ok");
  160. }
  161.  
  162. }
  163. return 0;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement