Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*slave*/
- #include <asf.h>
- #include "main.h"
- #include "SPI.h"
- #include "uart.h"
- #include "modbus_func.h"
- void Timer_ini() // T=2мс
- {
- TCNT2 = 0;
- OCR2A = 248;
- TCCR2A = 0b00000010;
- TCCR2B = 0b00000011;
- TIMSK2 = (1<<OCIE2A);
- }
- ISR(SPI_STC_vect)
- {
- Massiv_input[len] = SPDR;
- len++;
- global_time = 0;
- }
- ISR(TIMER2_COMPA_vect)
- {
- if (global_time != 0xFFFF) global_time++;
- }
- int main (void)
- {
- SPI_SlaveInit();
- Timer_ini();
- sei();
- adress = 0x04;
- while(1)
- {
- if (global_time != 0xFFFF)
- {
- if (global_time > 10)
- {
- global_time = 0xFFFF;
- //----------------------------------------------------------------------
- last_mas = 0;
- //Проверка адреса устройства
- if (Massiv_input[0] == adress)
- {
- Massiv_output[0] = Massiv_input[0];
- last_mas++;
- }
- else
- {
- //Massiv_output[0] = MB_exception_rsp[0];
- //break;
- }
- //Проверка функции
- if (Massiv_input[1] == 0x03)
- {
- Massiv_output[1] = Massiv_input[1];
- last_mas++;
- //чтение
- Read_Holding_Reg();
- }
- else if (Massiv_input[1] == 0x04)
- {
- Massiv_input[1] = Massiv_output[1];
- last_mas++;
- Read_Input_Registers();
- }
- else if (Massiv_input[1] == 0x06)
- {
- Massiv_output[1] = Massiv_input[1];
- last_mas++;
- //запись
- Write_single_register();
- }
- else if (Massiv_input[1] == 0x10)
- {
- Massiv_output[1] = Massiv_input[1];
- last_mas++;
- Write_Multiple_Registers();
- }
- else
- {
- Massiv_output[1] = 0x83;
- last_mas++;
- }
- //------------------------------------------------------------------------
- SPI_Write_Array((void *) last_mas, &Massiv_output);
- }
- }
- }
- }
- _______________________________________________
- SPI инициализация
- #ifndef SPI_H_
- #define SPI_H_
- #define SPI_PORTX PORTB
- #define SPI_DDRX DDRB
- #define DDR_SPI DDRB
- #define DD_SCK 5
- #define DD_MISO 4
- #define DD_MOSI 3
- #define SPI_SS 2
- void SPI_SlaveInit(void)
- {
- DDR_SPI = (1<<DD_MISO);
- SPCR = (1<<SPIE)|(1<<SPE)|(0 << DORD)|(0 << MSTR);
- SPSR = (0 << SPI2X);
- }
- void SPI_Write_Array(uint8_t num, uint8_t *data)
- {
- PORTB &= ~(1<<SPI_SS);
- while(num--)
- {
- SPDR = *data++;
- while(!(SPSR & (1<<SPIF)));
- }
- PORTB |= (1<<SPI_SS);
- }
- #endif /* SPI_H_ */
- ______________________________________
- уарт инициализация
- #define UART_TO_TRANSMIT UCSR0B = (0<<RXEN0)|(1<<TXEN0)|(0 << RXCIE0)|(0 << TXCIE0);
- #define UART_TO_RECEIVE UCSR0B = (1<<RXEN0)|(0<<TXEN0)|(1 << RXCIE0)|(0 << TXCIE0);
- void USART_ini( unsigned int speed) //инициализация USART
- {
- UBRR0H = (unsigned char) (speed>>8);
- UBRR0L = (unsigned char) speed;
- UCSR0B = (0<<RXEN0)|(1<<TXEN0)|(0 << RXCIE0)|(0 << TXCIE0);
- UCSR0A = (0 << U2X0);
- UCSR0C = (1<<USBS0)|(3<<UCSZ00);
- }
- void USART_Transmit(unsigned char data) //передача по USART из мк в пк
- {
- while (!(UCSR0A&(1<<UDRE0)));
- UDR0 = data;
- }
- unsigned char USART_Receive() //передача по USART из пк в мк
- {
- while (!(UCSR0A&(1<<RXC0)));
- return UDR0;
- }
- void USART_Transmit_data(unsigned char *data, unsigned char loc_len) //передача с мк на пк. data - массив с байтами, len - длина массива
- {
- while (loc_len--)
- {
- while (!(UCSR0A&(1<<UDRE0)));
- UDR0 = *data;
- data++;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement