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