Перейти к содержанию

Сулейман Мавруханов

Members
  • Постов

    9
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Хасавюрт

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    Микроконтроллеры
  • Оборудование
    Осциллограф, ПК, паяльник.

Достижения Сулейман Мавруханов

Новичок

Новичок (1/14)

  • Месяц на форуме
  • Преданный
  • Неделя на форуме

Последние значки

0

Репутация

  1. В этом случаи не повлияют поверь, вот пример uart_transmit(uart_receive()); тоже рабочий пример, для четкого понимания задачи приведу самый короткий пример: unsigned char c; uint8_t flag = 0; ISR(PCINT0_vect){ if(PINB & (1 << PB0)){ flag = 1; }else{ flag = 0; } } int main(){ interrupt_init(); sei(); while(1){ if(flag == 1){ // Надо запустить это условие с циклом for при получнии прерывания и после вернутся в исходное положение. for(y = 0; data[y] != '\0'; y++){ uart_transmit(data[y]); } flag == 0; } c = uart_receive(); /* Если отсюда не отвязаться, никак не срабатывает условие выше, чтоб условие выше сработал приходится часто нажимать на какую нибуь клавишу. ЗАДАЧА: КАК ОТВЯЗАТЬСЯ ОТСЮДА ДЛЯ ВЫПОЛНЕНИЯ УСЛОВИЯ ВЫШЕ И СРАЗУ ЖЕ ПОСЛЕ ВЫПОЛНЕНИЯ СЮДА ЖЕ ВЕРНУТСЯ? */ uart_transmit(с); } }
  2. Да, она так работает пока в цикл while не появится например вот эту строчку char c = uart_receive(); проверь и убедись.
  3. В прерывании, например ISR(PCINT0_vect) и там же пишу вот это тоже UCSR0A |= (1<<RXC0);
  4. Ах да ошибся, выразился наоборот, в таком случае если я подниму его на 1 в другом прерывании запустится цикл или нет сейчас проверю Проверил, не запустился цикл if(flag == 1){ for(y = 0; data[y] != '\0'; y++){ uart_transmit(data[y]); } в основном цикле while к сожалению.
  5. Мешает то, что флаг бита RXCO из цикла while(!(UCSR0A & (1<<RXC0))); постоянно находится в 1 пока символ с клавиатуры не наберешь, вот тут то и проблема, принудительно этот бить с помощью прерываний сбросить я не смог, так как флаг этого бита в 1 то и цикл тут бесконечный.
  6. Вот тут как раз и проблема, этот самый цикл типа for с выводом данных на экран тоже приходится запускать именно в прерывании и по другому никак, старался запускать, перенаправить по некоторым фагам переменных, но никак не начинается обрабатывать пока какой ни-будь символ не наберешь с клави .
  7. Да по прерыванию работает, но хотелось бы в этом деле обходить прерывания, так как там будут достаточно разнообразный коды и циклы, поэтому хотел чтоб всю нагрузку выгрузить с прерывания на основной цикл. Не тот режим имел в виду, я имел в виду когда открываешь консоль Putty и там МК ждет ввода символа с клавиатуры, при этом не срабатывает нужный мне цикл по выводу данных на консоль, да по прерыванию выводится но загрузить прерывания большими кодами не хотелось бы. Там всего лишь одна задача, как только приходить данные по Пинам и тут же отвязаться от функция uart_receive(void) и начинается основной цикл по выводу на экран данных и после, чтоб сразу же вернулась в функцию uart_receive(void), где ждет ввода символа с клави.
  8. #define F_CPU 16000000UL // Тактовая частота микроконтроллера #define BAUD 9600UL // Скоорость приемо-передачи для консоли #define MYUBRR (F_CPU/(BAUD*16)-1) // Согласно заданной скорости подсчитываем значение для регистра UBRR void uart_init(void) // Объявление функции UART для скорости приемо передачи { UBRR0H=(MYUBRR>>8); // Старшие 8 бит UBRR0L=MYUBRR; // Младшие 8 бит) UCSR0B|=(1<<TXEN0)|(1<<RXEN0); // Бити разрешения приемо-передачи UCSR0C|=(1<<UCSZ00)|(1<<UCSZ01); // Устанавливем формат 8 бит данных } void uart_transmit(unsigned char data) // Объявление функции трансляции (вывода на экран) { while (!(UCSR0A & (1<<UDRE0))); // Ожидаем когда очистится буфер передачи UDR0 = data; // Помещаем данные в буфер, начинаем передачу } unsigned char uart_receive(void) { while(!(UCSR0A & (1<<RXC0))); // Ожидаем пока данные будут получены return UDR0; // Возврат 8-bit данные } void USART_Flush(void){ unsigned char dummy; while (UCSR0A & (1<<RXC0)) dummy = UDR0; } Добрый день! уважаемые форумчане, есть такая необходимость, как выход из ждущего режима например с = uart_receive(); по приему символа чтоб при получение некоторых данных на другие пины от датчика или от другого МК, выходил на короткое время пока не выводится некоторые символы с помощью функции uart_transmit(data[i]); в основном цикле из массива данных а потом сразу же после вывода символов данных, вернулся в режим готовности для приема символа с клавиатуры с = uart_receive();. Что только не пробовал но никак не могу заставить UNO автоматически чтоб выходил из ждущего режима при получении данных для выполнения в основном цикле по выводу на консоль, данные будут выводиться на консоль Putty, как можно эту задачу организовать?
×
×
  • Создать...