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

Вопросы от начинающих по МК


Рекомендуемые сообщения

Вообще-то прерывания нужны для максимально быстрой реакции на внешние события и задерживаться в них не стоит.

Можно с определенной периодичностью опрашивать геркон и кнопки. В прерывании таймера или в бесконечном цикле, например.

Впрочем, если не планируется никаких действий до срабатывания геркона, можете и делеем. Еще это может быть полезно при использовании спячки. Но более "правильный" способ - после срабатывания прерывания завести таймер и запретить прерывание геркона, а по таймеру разрешить геркон обратно.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

А если сработало прерывание и стоит задержка,но в этот раз еще раз сработало прерывание это же,пока не пройдет задержка,прерывание ведь не запустится еще раз?Схема простая,я планировал использовать геркон как датчик скорости,и программа смотрит только кнопку включения и время следования импульсов с геркона.

Получается структура такая,если кнопка включения нажата,замыкается реле двигателя и когда с геркона приходит сигнал,в обработчике прерывания я запускаю таймер,в таймере я смотрю что бы время после последнего импульса с геркона не превышало 1 секунды,если превышает,значит в двигатель что-то попало и отключаю его.Если импульс с геркона пришел раньше 1 секунды,то сбрасываю счетчик таймера и жду следующий импульс.Больше ничего не будет.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Тогда от дребезга избавляться не нужно. У вас получился обычный одновибратор. точно в этом случае нужен МК?

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Почему избавляться не нужно?Мк уже спаял((( Реле включения двигателя включается так же с ножки МК,а то в прошлой записи можно подумать,что с кнопки включения(правильнее будет её назвать кнопкой разрешения запуска двигателя)

Ссылка на комментарий
Поделиться на другие сайты

Тренды и лучшие решения для разработки зарядных станций в России

К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

То же самое можно реализовать и на лёгкой логике с одновибратором на NE555.

А не надо бороться с дребезгом ибо пофиг сколько раз будешь сбрасывать таймер при нажатии на кнопку - максимум из-за дребезга выдержка увеличится на время дребезга - ну это в худшем случае для геркона 2..5 миллисекунд.

Не пофиг на дребезг только тогда когда необходимо подсчитывать количество событий.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Прочитал такую строчку - Если началась обработка какого-нибудь прерывания, никакое другое не может быть вызвано, даже с большим приоритетом.

Но ведь команда reset это то же прерывание,получается если я ножку reset подтяну к земле,в момент когда прерывание от int0 сработало,микроконтроллер не сбросится пока не закончит работу обработчик прерываний от int0?

Изменено пользователем BiBOX
Ссылка на комментарий
Поделиться на другие сайты

Сброс - это не прерывание. При подаче нуля на ногу reset, МК аппаратно сбрасывается, с установкой значений регистров по-умолчанию.

Что касается приоритетности. Обработчик с более высоким приоритетом всегда будет прерывать обработку прерывания с более низким приоритетом. На то они и приоритеты.

Ссылка на комментарий
Поделиться на другие сайты

То есть строчка Если началась обработка какого-нибудь прерывания, никакое другое не может быть вызвано, даже с большим приоритетом

Не верна?

Вот еще чего там есть -При вызове обработчика любого прерывания бит глобального разрешения прерываний I регистра SREG (status register - регистр состояния) сбрасывается в "0"и только по завершении

обработки прерывания снова устанавливается в "1" и разрешает начать обработку следующего прерывания в очереди.

Получается пока работает обработчик,все прерывания запрещаются или не правильно понимаю?

Изменено пользователем BiBOX
Ссылка на комментарий
Поделиться на другие сайты

То есть строчка Если началась обработка какого-нибудь прерывания, никакое другое не может быть вызвано, даже с большим приоритетом

Не верна?

Не верна только часть строки : "даже с большим приоритетом".

Откуда Вы это прочли ?

Сдаётся мне, Вы говорите о каком-нибудь МК, не имеющим приоритетов, а имеющим всего-лишь таблицу векторов, которую многие называют приоритетностью.

Ссылка на комментарий
Поделиться на другие сайты

Разработчики AVR-ок считали приоритетами таблицу прерываний. То есть если несколько прерываний возникнут одновременно (точнее, возникнут, когда прерывания запрещены, потому что как попасть одновременно в 1 такт контроллера я не представляю), сначала будет вызвано прерывание с большим "приоритетом", то есть выше по таблице векторов.

В даташите приоритетом называется именно это, а вовсе не обычный приоритет, так что постарайтесь не запутаться.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Вывод внешнего сброса это так называемое немаскируемое прерывание, оно работает всегда. Кроме того аппаратный сброс инициализирует состояние всех регистров, кроме RAM и набора рабочих регистров R0-R31(надеятся на то что регистры Rxx как и содержимое оперативной памяти будет нулевым по сбросу/включению питания НЕ СТОИТ).

Приоритет прерываний в контроллере работает только для одновременно возникших прерываний - одновременность имеет квант в 4 такта контроллера!

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Вот что пишет Евстифеев post-187724-0-05611800-1463216553_thumb.jpg

И я так понимаю пока программа находится в обработчике прерываний ни какие другие прерывания не возможны , если их не разрешить принудительно , а все те прерывания , что возникли во время обработки прерывания будут стоять в очереди согласно приоритету , приоритет работает только в очереди .

Изменено пользователем DmitryS
Ссылка на комментарий
Поделиться на другие сайты

Вывод внешнего сброса это так называемое немаскируемое прерывание

От того, что оно работает всегда, прерыванием сброс не становится.

У ЛЮБОГО прерывания есть одно важное свойство. После его исполнения обработчик передает управление в точку откуда оно было вызвано..

Даже если это обработка исключений типа деления на ноль и прочих коллизий.

Сброс не имеет никакой связи с контроллером прерываний. Он ничего не пишет в стек и имеет программную реализацию.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

У ЛЮБОГО прерывания есть одно важное свойство.

Нет у него такого свойства. Всё зависит от обработчика. А он может послать программу куда угодно, хоть на начальный адрес и всё сбросить к чёртовой матери.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

хоть на начальный адрес и всё сбросить к чёртовой матери

переход на нулевой адрес вовсе не означает сброс к чертовой матери. Но чтото нехорошее наверняка случится

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Нет у него такого свойства. Всё зависит от обработчика.

Таки есть.

Послать конечно может. Вопреки свойству. Даже может сбросить.

Но вот вернуть на место возникновения прерывания ресет не сможет.

А именно сохранение адреса возврата отличает прерывание от иных аппаратных фич.

Кстати, выход из обработчика не через стек является не просто дурным стилем, Это хуже, чем дурной стиль.

И потому программирование на чистом Си не дает такой возможности.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Написал простую программу для ацп и уарт.Возникла проблема.Данные передаются на порт B и по усарту.Так вот при подаче на вход ацп 0 вольт,происходит следующее

304756bc3959t.jpg

То есть PB6 всегда в единице.Почему так может быть?

#define F_CPU 11059200UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned int x;
unsigned long count;
ISR (ADC_vect)
{
/*x=ADCH;
PORTB=x;*/
count++;
if (count==500)
{
unsigned char c;
c=ADCH;
count=0;
uart_TX(c);
}



}
void uart_TX( char c )
{
//ждем окончания передачи предыдущего байта
while( ( UCSRA & ( 1 << UDRE ) ) == 0 );
//передача данных
UDR = c;
}
int main(void)
{

DDRB=255;
PORTB=0;
ADMUX=(1<<REFS0)|(1<<ADLAR)|(1<<MUX2)|(1<<MUX0); // 11 питаемся от AVCC
ADCSRA=(1<<ADEN)|(1<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADSC);

/* Настройка UART */
UBRRH=0;
UBRRL=71;
UCSRC = ( 1 << URSEL ) | ( 0 << UCSZ2 ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
UCSRC = ( 1 << URSEL ) | ( 0 << UPM1 ) | ( 0 << UPM0 ) ;
UCSRC = ( 1 << URSEL ) | ( 0 << USBS );
UCSRB = ( 1 << TXEN ) | ( 1 << RXEN );
sei();
while(1)
{



}
}

Изменено пользователем BiBOX
Ссылка на комментарий
Поделиться на другие сайты

Все,разобрался.Дело было в скорости не 9600,а 19200.

P.S. Рано обрадовался,со скоростью все норм.Ошибка еще есть.

Изменено пользователем BiBOX
Ссылка на комментарий
Поделиться на другие сайты

post-145727-0-23213400-1463495592_thumb.png

Рано обрадовался,проблема еще есть и она в уарт.

Оставил только уарт работать,а он оказывается работать не работает(


#define F_CPU 11059200UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned long x=0;
unsigned long counter;
unsigned long pou=0;
/*
ISR (ADC_vect)
{
PORTB=ADCH;
counter++;
if ( counter ==1000)
{
cli();
pou=ADCH;
uart_TX();
counter=0;
sei();
}

}
*/
void uart_TX( void )
{
//ждем окончания передачи предыдущего байта
while( ( UCSRA & ( 1 << UDRE ) ) == 0 );
//передача данных

UDR =0x55;
}

int main(void)
{
DDRB=255;
/*
ADMUX=(0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(1<<MUX2)|(1<<MUX0); // 11 питаемся от AVCC
ADCSRA=(1<<ADEN)|(1<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADSC);
*/
/*Настройка UART */
UBRRH=0;
UBRRL=71;
UCSRC = ( 1 << URSEL ) | ( 0 << UCSZ2 ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 ); // 8 бит
UCSRC = ( 1 << URSEL ) | ( 0 << UPM1 ) | ( 0 << UPM0 ) ; // контроль четности запрещен
UCSRC = ( 1 << URSEL ) | ( 0 << USBS ); // один стоп бит
UCSRB = ( 1 << TXEN ) | ( 1 << RXEN );
sei();
while(1)
{/*
pou++;
_delay_ms(100);
uart_TX();
if (pou>255)
{
pou=0;
}
*/
uart_TX();

}
}

Настройка на 9600,а в терминале вместо положенных 0x55 выдает 0xAC

Изменено пользователем BiBOX
Ссылка на комментарий
Поделиться на другие сайты

Почему с первой настройкой ничего не работает,а со второй настройкой все заработало?Одно и то же ведь.

/*Настройка UART 
UBRRH=0x00;
UBRRL=0x47;
UCSRC = ( 1 << URSEL ) | ( 0 << UCSZ2 ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );  // 8 бит
UCSRC = ( 1 << URSEL ) | ( 0 << UPM1 ) | ( 0 << UPM0 ) ;   // контроль четности запрещен
UCSRC = ( 1 << URSEL ) | ( 0 << USBS );                    // два стоп бита
UCSRB = ( 1 << TXEN ) | ( 0 << RXEN );
*/

//настройка скорости обмена
UBRRH = 0;
UBRRL =0x47;
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN );

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...