Вт фев 06, 2018 12:32:43
ISR(USART_RXC_vect)
{
register unsigned char Temp = UDR; // забираем принятый байт данных
if (( Temp != 0x0d) & (Temp != 0x0a)) // пропускаем символы \r\n
{
bufGsm1[numberRX++] = Temp; // сохраняем принятые данные
}
if ( numberRX > addressTemp) // не проверяем первые два символа 0x0d,0x0a
{
if ( Temp == 0x0a) // принят 0x0A, зафиксирован конец пакета данных
{
bufGsm1[numberRX++] = '$'; // разделительный символ
addressTemp = numberRX;
the_data_has++; // принятое количество команд
}
}
}
Вт фев 06, 2018 13:00:11
Вт фев 06, 2018 14:22:25
detect_
void usart_detect_OK()
{
if (the_data_has != 0)
{
if(bufGsm1[0] == 'O')
{
if (bufGsm1[1] == 'K')
{
detect_ = 1;
}
}
}
}
Вт фев 06, 2018 14:26:07
Вт фев 06, 2018 14:36:24
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
unsigned char button = 0,sm1 = 0;
#define But (PINA&(1 << 6))
#define LED_red_on PORTC |= (1 << 5);
#define LED_red_off PORTC &=~ (1 << 5);
#define LED_green_on PORTC |= (1 << 4);
#define LED_green_off PORTC &=~ (1 << 4);
#define LED_yellov_on PORTC |= (1 << 3);
#define LED_yellov_off PORTC &=~ (1 << 3);
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
//////////////////////////////////////////////////////////////////////////
char bufGsm1[60] = {}; // буфер для приема
volatile unsigned char Temp_gsm,numberRX = 0,the_data_has,addressBufGsm1,addressTemp = 0, num = 0;
volatile unsigned char detect_ = 0;
// прием данных
//*****************************//
ISR(USART_RXC_vect)
{
register unsigned char Temp = UDR; // забираем принятый байт данных
if (( Temp != 0x0d) & (Temp != 0x0a)) // пропускаем символы \r\n
{
bufGsm1[numberRX++] = Temp; // сохраняем принятые данные
}
if ( numberRX > addressTemp) // не проверяем первые два символа 0x0d,0x0a
{
if ( Temp == 0x0a) // принят 0x0A, зафиксирован конец пакета данных
{
bufGsm1[numberRX++] = '$'; // разделительный символ
addressTemp = numberRX;
the_data_has++; // принятое количество команд
}
}
}
//************************//
void usart_detect_OK()
{
if (the_data_has != 0)
{
if(bufGsm1[0] == 'O')
{
if (bufGsm1[1] == 'K')
{
detect_ = 1;
}
}
else
{
bufGsm1[0] = 0;
bufGsm1[1] = 0;
}
}
}
/////////////////////////////////////////////////////////////////
void USART_Init()
{
UCSRB |= (1 << RXEN) | (1 << TXEN);
// Включение передачи и приема
UCSRC |= (1 << URSEL) | (1<<USBS) | (1 << UCSZ0) | (1 << UCSZ1);
// Использовать 8-битный символ
UBRRL = BAUD_PRESCALE;
UBRRH = (BAUD_PRESCALE >> 8);
}
void USART_Char(unsigned char d)
{
while ((UCSRA & (1 << UDRE)) == 0);{}// ожидание UDR
UDR = d; // отправка данных
}
void USART_String(const char *msg)
{
while(*msg!='\0')
{
USART_Char(*msg);
msg++;
}
USART_Char(0x0D);
}
void Wait(int j) // функция задержки
{
uint8_t i;
for(i=0;i<j;i++)
_delay_ms(250);
}
void presets()// Головні налаштування процесора
{
DDRB |= (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7);
PORTB &=~ (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7);
DDRA |= (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 7);
PORTA &=~ (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 7);
DDRA &=~ (1 << 6);
PORTA |= (1 << 6);
DDRC |= (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7);
PORTC &=~ (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7);
TCCR1B|=(1<<CS12)|(1<<CS10);//Предделитель = 1024
TIMSK|=(1<<TOIE1);//Разрешить прерывание по переполнению таймера 1
//TIMSK &=~ (1 << TOIE1);//запретить прерывание по переполнению таймера 1
TCNT1=61630;//Начальное значение таймера
UCSRC |= (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0);
PORTD |=(1<<1);
DDRD |=(1<<1);
PORTD &=~(1<<0);
sei(); // enable interrupts
}
ISR(TIMER1_OVF_vect)// сигнал
{
num++;
TCNT1=61630;//Начальное значение таймера
}
void SMS_ON()
{
USART_String("AT+CMGS=\"+НОМЕР\"\r");
USART_Char(0x0D);
Wait(12);
USART_String("Sensor ON");
USART_Char(0x0D);
USART_Char(0x1A);
Wait(2);
}
void SMS_OFF()
{
USART_String("AT+CMGS=\"+НОМЕР\"\r");
USART_Char(0x0D);
Wait(12);
USART_String("Sensor OFF");
USART_Char(0x0D);
USART_Char(0x1A);
Wait(2);
}
int main(void)
{
USART_Init(); //Инициализация UART
sei(); //Глобально разрешаем прерывания
presets();
_delay_ms(1000);
LED_red_on;
while(1)
{
USART_String("AT\r");
USART_Char(0x0D);
_delay_ms(1000);
usart_detect_OK();
_delay_ms(1000);
if (detect_ == 1)
{
LED_red_off; // Диот должен погаснуть!!!
}
switch(button)
{
case 0:
{
if (But == 0)
{
_delay_ms(3000);
if (But == 0)
{
LED_yellov_on;
SMS_ON();
button = 1;
}
else
{
button = 0;
}
}
};break;
case 1:
{
_delay_ms(3000);
if ( But == 0)
{
button = 1;
}
else
{
button = 2;
}
};break;
case 2:
{
_delay_ms(3000);
if (But != 0)
{
LED_yellov_off;
SMS_OFF();
_delay_ms(5000);
button = 0;
}
} ;break;
}
}
}
Вт фев 06, 2018 14:43:29
detect_
if (( Temp != 0x0d) & (Temp != 0x0a))
Вт фев 06, 2018 14:52:08
Вт фев 06, 2018 15:07:11
USART_String("AT\r");
USART_Char(0x0D);
Вт фев 06, 2018 15:27:43
USART_String("AT\r");
ISR(USART_RXC_vect)
{
LED_yellov_on;
register unsigned char Temp = UDR; // забираем принятый байт данных
if (( Temp != 0x0d) && (Temp != 0x0a)) // пропускаем символы \r\n
{
bufGsm1[numberRX++] = Temp; // сохраняем принятые данные
}
if ( numberRX > addressTemp) // не проверяем первые два символа 0x0d,0x0a
{
if ( Temp == 0x0a) // принят 0x0A, зафиксирован конец пакета данных
{
bufGsm1[numberRX++] = 0x24; // разделительный символ
addressTemp = numberRX;
the_data_has++; // принятое количество команд
}
}
}
Вт фев 06, 2018 16:42:35
Вт фев 06, 2018 16:55:21
UCSRB |= (1<<RXEN); // разрешаем работу приема по USART !!!
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
unsigned char button = 0,sm1 = 0;
#define But (PINA&(1 << 6))
#define LED_red_on PORTC |= (1 << 5);
#define LED_red_off PORTC &=~ (1 << 5);
#define LED_green_on PORTC |= (1 << 4);
#define LED_green_off PORTC &=~ (1 << 4);
#define LED_yellov_on PORTC |= (1 << 3);
#define LED_yellov_off PORTC &=~ (1 << 3);
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
//////////////////////////////////////////////////////////////////////////
char bufGsm1[60] = {}; // буфер для приема
volatile unsigned char Temp_gsm,numberRX = 0,the_data_has,addressBufGsm1,addressTemp = 0, num = 0;
volatile unsigned char detect_ = 0;
// прием данных
ISR(USART_RXC_vect)
{
LED_yellov_on;
register unsigned char Temp = UDR; // забираем принятый байт данных
if (( Temp != 0x0d) && (Temp != 0x0a)) // пропускаем символы \r\n
{
bufGsm1[numberRX++] = Temp; // сохраняем принятые данные
}
if ( numberRX > addressTemp) // не проверяем первые два символа 0x0d,0x0a
{
if ( Temp == 0x0a) // принят 0x0A, зафиксирован конец пакета данных
{
bufGsm1[numberRX++] = '$'; // разделительный символ
addressTemp = numberRX;
the_data_has++; // принятое количество команд
}
}
}
void usart_detect_OK()
{
if (the_data_has != 0)
{
if(bufGsm1[0] == 'O')
{
if (bufGsm1[1] == 'K')
{
detect_ = 1;
}
}
else
{
bufGsm1[0] = 0;
bufGsm1[1] = 0;
}
}
}
void USART_Init()
{
UCSRB |= (1 << RXEN) | (1 << TXEN);
// Включение передачи и приема
UCSRC |= (1 << URSEL) | (1<<USBS) | (1 << UCSZ0) | (1 << UCSZ1);
// Использовать 8-битный символ
UBRRL = BAUD_PRESCALE;
UBRRH = (BAUD_PRESCALE >> 8);
}
void USART_Char(unsigned char d)
{
while ((UCSRA & (1 << UDRE)) == 0);{}// ожидание UDR
UDR = d; // отправка данных
}
void USART_String(const char *msg)
{
while(*msg!='\0')
{
USART_Char(*msg);
msg++;
}
USART_Char(0x0D);
}
void presets()// Головні налаштування процесора
{
DDRB |= (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7);
PORTB &=~ (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7);
DDRA |= (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 7);
PORTA &=~ (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 7);
DDRA &=~ (1 << 6);
PORTA |= (1 << 6);
DDRC |= (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7);
PORTC &=~ (1 << 0)|(1 << 1)|(1 << 2)|(1 << 3)|(1 << 4)|(1 << 5)|(1 << 6)|(1 << 7);
PORTD |=(1<<1);
DDRD |=(1<<1);
PORTD &=~(1<<0);
sei(); // enable interrupts
}
int main(void)
{
USART_Init();
presets();
_delay_ms(1000);
LED_red_on;
UCSRB |= (1<<RXEN); // разрешаем работу приема по USART !!!
while(1)
{
USART_String("AT\r");
_delay_ms(1000);
usart_detect_OK();
_delay_ms(1000);
if (detect_ == 1)
{
LED_red_off; // Диот должен погаснуть!!!
}
}
}
Вт фев 06, 2018 17:08:21
Вт фев 06, 2018 17:11:58
Вт фев 06, 2018 17:16:44
Вт фев 06, 2018 18:53:04
ISR(USART_RXC_vect)
{
bufGsm1[numberRX] = UDR;
numberRX++;
}
void usart_detect_OK()
{
if (bufGsm1[0] == 13)
{
if (bufGsm1[1] == 10)
{
if (bufGsm1[2] == 0x4f)
{
LED_red_off;
if (bufGsm1[3] == 75)
{
if (bufGsm1[4] == 13)
{
if (bufGsm1[5] == 10)
{
detect_ = 1;
}
}
}
}
}
}
// for (int i = 0; i < 40; i++)
// {
// if (bufGsm1[i] == 'O')
// {
// detect_ = 1;
// numberRX = 0;
// }
// }
}
Вт фев 06, 2018 19:15:53
Вт фев 06, 2018 19:29:57
Вт фев 06, 2018 19:58:29
// прием данных
ISR(USART_RXC_vect)
{
LED_yellov_on;
register unsigned char Temp = UDR; // забираем принятый байт данных
if (( Temp != 0x0d) && (Temp != 0x0a)) // пропускаем символы \r\n
{
bufGsm1[numberRX++] = Temp; // сохраняем принятые данные
}
if ( numberRX > addressTemp) // не проверяем первые два символа 0x0d,0x0a
{
if ( Temp == 0x0a) // принят 0x0A, зафиксирован конец пакета данных
{
bufGsm1[numberRX++] = '$'; // разделительный символ
addressTemp = numberRX;
the_data_has++; // принятое количество команд
}
}
}
Вт фев 06, 2018 20:17:34
ISR(USART_RXC_vect)
{
//
unsigned int Temp = UDR; // забираем принятый байт данных
//LED_yellov_on;
switch(Temp)
{
case 0x4F: buffer[1] = 1;break;
case 0x4B: buffer[2] = 1;break;
}
}
void usart_detect_OK()
{
if (buffer[1] == 1 )
{
if (buffer[2] == 1)
{
detect_ = 1;
}
}
}
Ср фев 07, 2018 08:04:46