Advertisement
Guest User

Untitled

a guest
Apr 27th, 2020
356
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 KB | None | 0 0
  1. /*slave*/
  2. #include <asf.h>
  3. #include "main.h"
  4. #include "SPI.h"
  5. #include "uart.h"
  6. #include "modbus_func.h"
  7.  
  8. void Timer_ini() // T=2мс
  9. {
  10. TCNT2 = 0;
  11. OCR2A = 248;
  12. TCCR2A = 0b00000010;
  13. TCCR2B = 0b00000011;
  14. TIMSK2 = (1<<OCIE2A);
  15. }
  16.  
  17. ISR(SPI_STC_vect)
  18. {
  19. Massiv_input[len] = SPDR;
  20. len++;
  21. global_time = 0;
  22. }
  23.  
  24. ISR(TIMER2_COMPA_vect)
  25. {
  26. if (global_time != 0xFFFF) global_time++;
  27. }
  28.  
  29. int main (void)
  30. {
  31. SPI_SlaveInit();
  32. Timer_ini();
  33. sei();
  34. adress = 0x04;
  35.  
  36. while(1)
  37. {
  38. if (global_time != 0xFFFF)
  39. {
  40. if (global_time > 10)
  41. {
  42. global_time = 0xFFFF;
  43. //----------------------------------------------------------------------
  44. last_mas = 0;
  45. //Проверка адреса устройства
  46. if (Massiv_input[0] == adress)
  47. {
  48. Massiv_output[0] = Massiv_input[0];
  49. last_mas++;
  50. }
  51. else
  52. {
  53. //Massiv_output[0] = MB_exception_rsp[0];
  54. //break;
  55. }
  56.  
  57. //Проверка функции
  58. if (Massiv_input[1] == 0x03)
  59. {
  60. Massiv_output[1] = Massiv_input[1];
  61. last_mas++;
  62. //чтение
  63. Read_Holding_Reg();
  64. }
  65. else if (Massiv_input[1] == 0x04)
  66. {
  67. Massiv_input[1] = Massiv_output[1];
  68. last_mas++;
  69. Read_Input_Registers();
  70. }
  71. else if (Massiv_input[1] == 0x06)
  72. {
  73. Massiv_output[1] = Massiv_input[1];
  74. last_mas++;
  75. //запись
  76. Write_single_register();
  77. }
  78. else if (Massiv_input[1] == 0x10)
  79. {
  80. Massiv_output[1] = Massiv_input[1];
  81. last_mas++;
  82. Write_Multiple_Registers();
  83. }
  84.  
  85. else
  86. {
  87. Massiv_output[1] = 0x83;
  88. last_mas++;
  89. }
  90. //------------------------------------------------------------------------
  91. SPI_Write_Array((void *) last_mas, &Massiv_output);
  92. }
  93. }
  94. }
  95. }
  96.  
  97. _______________________________________________
  98. SPI инициализация
  99. #ifndef SPI_H_
  100. #define SPI_H_
  101.  
  102. #define SPI_PORTX PORTB
  103. #define SPI_DDRX DDRB
  104.  
  105. #define DDR_SPI DDRB
  106. #define DD_SCK 5
  107. #define DD_MISO 4
  108. #define DD_MOSI 3
  109. #define SPI_SS 2
  110.  
  111. void SPI_SlaveInit(void)
  112. {
  113. DDR_SPI = (1<<DD_MISO);
  114. SPCR = (1<<SPIE)|(1<<SPE)|(0 << DORD)|(0 << MSTR);
  115. SPSR = (0 << SPI2X);
  116. }
  117.  
  118. void SPI_Write_Array(uint8_t num, uint8_t *data)
  119. {
  120. PORTB &= ~(1<<SPI_SS);
  121. while(num--)
  122. {
  123. SPDR = *data++;
  124. while(!(SPSR & (1<<SPIF)));
  125. }
  126. PORTB |= (1<<SPI_SS);
  127. }
  128.  
  129. #endif /* SPI_H_ */
  130. ______________________________________
  131. уарт инициализация
  132. #define UART_TO_TRANSMIT UCSR0B = (0<<RXEN0)|(1<<TXEN0)|(0 << RXCIE0)|(0 << TXCIE0);
  133. #define UART_TO_RECEIVE UCSR0B = (1<<RXEN0)|(0<<TXEN0)|(1 << RXCIE0)|(0 << TXCIE0);
  134.  
  135. void USART_ini( unsigned int speed) //инициализация USART
  136. {
  137. UBRR0H = (unsigned char) (speed>>8);
  138. UBRR0L = (unsigned char) speed;
  139. UCSR0B = (0<<RXEN0)|(1<<TXEN0)|(0 << RXCIE0)|(0 << TXCIE0);
  140. UCSR0A = (0 << U2X0);
  141. UCSR0C = (1<<USBS0)|(3<<UCSZ00);
  142. }
  143.  
  144. void USART_Transmit(unsigned char data) //передача по USART из мк в пк
  145. {
  146. while (!(UCSR0A&(1<<UDRE0)));
  147. UDR0 = data;
  148. }
  149.  
  150. unsigned char USART_Receive() //передача по USART из пк в мк
  151. {
  152. while (!(UCSR0A&(1<<RXC0)));
  153. return UDR0;
  154. }
  155.  
  156. void USART_Transmit_data(unsigned char *data, unsigned char loc_len) //передача с мк на пк. data - массив с байтами, len - длина массива
  157. {
  158. while (loc_len--)
  159. {
  160. while (!(UCSR0A&(1<<UDRE0)));
  161. UDR0 = *data;
  162. data++;
  163. }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement