Пт авг 18, 2017 13:18:48
unsigned char usartTxBuf[15]; //передающий буфер
buffer_tx_index = 0;
void USART_PutChar(unsigned char sym)
{
usartTxBuf[buffer_tx_index] = sym; //помещаем символы в буфер
buffer_tx_index++;
}
//функция отправки строки
void USART_SendStr(char * data)
{
unsigned char sym;
while(*data){
sym = *data++;
USART_PutChar(sym);
}
}
buffer_tx_index=0; //эта переменная очищается в нужный момент, перед помещением новой строки в массив
USART_SendStr("какая-то строка");
void USART_PutChar(unsigned char sym)
{
usartTxBuf[buffer_tx_index] = sym; //помещаем символы в буфер
if(buffer_tx_index < 15-1)
{
buffer_tx_index++;
}
}
Пн сен 04, 2017 18:48:47
if(m[0]<x && m[1]<x && m[2]<x && ......m[50]<x) y=0;
Пн сен 04, 2017 19:10:08
if(m[0]<x && m[1]<x && m[2]<x && ......m[50]<x) y=0;
int i;
for(i = 0; (i < 51) && (m[i] < x); i++);
if(i >= 51) y = 0;
Ср сен 06, 2017 10:14:09
Ср сен 06, 2017 13:59:55
Ср сен 06, 2017 14:11:01
Т.е. у Вас всего два возможных состояния уровней напряжения на порте. Посоветую не использовать АЦП и сделать уровни, которые гарантируют четкие логические уровни.Protosha писал(а):ADC подтянут к + через 10 кОм, а к земле через кнопку и 5кОм,
Ср сен 06, 2017 14:24:35
Ср сен 06, 2017 14:30:00
Ср сен 06, 2017 14:48:36
Ср сен 06, 2017 16:18:23
Ср сен 06, 2017 17:40:23
а вы по ссылке ходили? статью читали? я там подробно все описал, зачем и почему.Protosha писал(а):Вот хотелось бы пояснений.
если у вас все нормально организовано в основном цикле - не будет никаких проблем! ничего ждать не придется.Protosha писал(а):А если в основном цикле что-то работает, прикажете мне стоять с нажатой кнопкой и ждать чуда? А если я хочу не ждать, а прервать все процессы и сделать что-то другое?
Ср сен 06, 2017 18:26:16
Ср сен 06, 2017 18:57:22
Маловероятно, что при нормальном алгоритме нет времени на кнопки в основном цикле.Protosha писал(а):А если организовано нормально
Ср сен 06, 2017 19:14:27
разумеетсяProtosha писал(а):Вот этими словами вы имели ввиду выдача "1" с порта PB3?
я не знаю, что именно вы там мастерите, и не могу дать советов. поделитесь, что за задачу вы решаете? я не единожды сталкивался с тем, что простые вещи пытаются сделать слишком сложно, загоняя себя в тупик искусственно завышенных требований. например, многие считают, что реакция на кнопки должна быть мгновенной, но не дают себе труда задуматься, что такое "мгновенно" с точки зрения микроконтроллера и человека-пользователя.Protosha писал(а):А если организовано нормально, прям высчитано время, которое...
Чт сен 07, 2017 21:53:39
Пн окт 16, 2017 08:47:22
#include <AVR_caller.h>
// Обявляем прототипы функций
void InitSIMCOM(void);
void SendStr(char *string);
void SendByte(char byte);
char Parsing(char *string, unsigned int parsing_delay);
char Parsing_in_UART(char *string);
// Обявляем глобальные переменные
volatile char *parsing_pointer; // Указатель на строку, которую будем парсить
volatile char parsing_result; // Результат парсинга строки
// Заводим строки AT команд во флеше. Обязательно вне main
char AT[] PROGMEM = "AT\r\n";
char OK[] PROGMEM = "OK\r\n";
// Прерывание по приходу байта в буффер UART
ISR (USART_RXC_vect)
{
parsing_result = Parsing_in_UART(parsing_pointer); // Парсим строку посимвольно, после каждого вызова возвращаем состояние парсинга (0-парсинг продолжаеться, 1- парсинг успешно закончен, 2- ошибка парсинга или превышено время парсинга)
}
int main(void)
{
volatile unsigned char i;
// Инициализация периферии
UBRRL = LO(bauddivider);
UBRRH = HI(bauddivider);
UCSRA = 0;
UCSRB = 0<<RXCIE|0<<TXCIE|0<<UDRIE|1<<RXEN|1<<TXEN; // Прерывание UDRIE сразу никогда не разрешаем, иначе контроллер сразу входит в это прерывание
UCSRC = 1<<URSEL|1<<UCSZ1|1<<UCSZ0;
LED_DDR |= 1<<LED1|1<<LED2; // Светодиоды на вывод
sei();
InitSIMCOM(); // Инициализируем модуль SIMCOM
// Главный цикл
while(1)
{
i++;
LED_PORT ^=1<<LED1;
_delay_ms(1000);
}
}
// Инициализация модуля SIMCOM =========
void InitSIMCOM(void)
{
while (parsing_result != 1) // Пока нет овета ОК, долбим АТ
{
SendStr_P(AT); // Шлем АТ
parsing_result = Parsing(OK,500); // И после каждого АТ 500 мс ждем ответ. Должен быть "ОК"
}
}
// Парсинг строки ==================
char Parsing(char *string, unsigned int parsing_delay) // На входе указатель на первый символ строки, и время парсинга строки
{
parsing_pointer=string; // Копируем указатель на 1 сивол строки, которую будем парсить в глобальную переменную
UCSRB |= 1<<RXCIE; // Разрешаем прерывание по приходу байта - парсинг начался
while(parsing_result != 1) // Ждем успешного окончания, либо ошибки парсинга
{
_delay_ms(1);
parsing_delay--;
if (parsing_delay==0) return 2; // Если время парсинга вышло, вываливаемся из цикла с ошибкой парсинга
}
return 1;
}
// Парсинг символа строки в обработчике UART =========================
char Parsing_in_UART(char *string) // На входе указатель на символ строки
{
if (UDR == pgm_read_byte(string)) // Сравниваем принятый байт с символом из строки
{ // Если идентичны
string++; // Увеличиваем указатель, выбирая следующий символ строки
if (pgm_read_byte(string)=='\0') // Если следующий байт строки 0 (конец строки)
{
UCSRB &=~(1<<RXCIE); // Запрещаем прерывание по приходу байта - прием закончен
return 1; // Возвращаем признак успешного окончания парсинга
}
else
{
parsing_pointer=string; // Иначе обновляем глобальный указатель
return 0; // И вываливаемся без признака успешного парсинга
}
}
else return 2; // Если не идентичны - возвращаем признак ошибки парсинга. Не 0, чтобы сразу закончить неудачный парсинг
}
// Отправка строки из флеша в UART =================
void SendStr_P(char *string) // На входе указатель на символ строки
{
while (pgm_read_byte(string)!='\0') // Пока байт строки не 0 (конец строки)
{
SendByte(pgm_read_byte(string)); // Мы продолжаем слать строку
string++; // Не забывая увеличивать указатель, выбирая следующий символ строки
}
}
// Отправка одного символа строки в UART ===========
void SendByte(char byte) // На входе байт
{
while(!(UCSRA & (1<<UDRE))); // Ждем флага готовности UART
UDR=byte; // Засылаем байт в UART
}
Пн окт 16, 2017 09:01:20
Пн окт 16, 2017 13:41:45
Пн окт 16, 2017 20:02:38
Пн окт 16, 2017 20:10:51