Страница 495 из 628
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 22:14:14
*Trigger*
Проверил в Proteus`е таким кодом:
Код: Выделить всё
#include <tiny2313.h>
void main(void)
{
DDRB|=0b111111;
PORTB.0=1;
PORTB.1=PORTB.0;
PORTB.2=PINB.0;
PORTB.3=0;
PORTB.4=PORTB.3;
PORTB.5=PINB.3;
}
В итоге:
На PORTB0,1,2 единицы, а на PORTB3,4,5 - нули. Значит, все были правы. Читать можно откуда угодно, если нужные биты настроены на выход (как в нашем случае)
ARV писал(а):и в последнем, и в двух предпоследних макросы написаны с ошибками - не смотрите на такие примеры
Спасибо, забыл совсем. Исправил.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 22:16:41
ARV
*Trigger* писал(а):Значит, все были правы. Читать можно откуда угодно, если нужные биты настроены на выход (как в нашем случае)
читать можно откуда угодно, как и писать, причем не взирая на настройки.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 22:17:48
*Trigger*
Насчёт "не взирая на настройки" выше a_skr привёл пример, когда нельзя.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 22:19:01
ARV
*Trigger* писал(а):Насчёт "не взирая на настройки" выше a_skr привёл пример, когда нельзя.
можно всегда. нужно - по необходимости

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 22:21:20
*Trigger*
С этим согласен.

Другой вопрос - что мы получим.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 22:23:17
ARV
*Trigger* писал(а):Другой вопрос - что мы получим.
иногда - весьма интересное: вывод 1 в порт PINx приводит к инвертированию уровня на пине PORTx, вывод 0 не меняет состояние пина. это, например, верно для многих AVR последнего поколения...
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 22:27:05
*Trigger*
Где-то читал об этом, но сам никогда не использовал. Проще и понятнее написать в несколько действий (считать - инвертировать - записать), пригодится, наверное, только там, где памяти не хватает.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 22:32:52
ARV
*Trigger* писал(а): пригодится, наверное, только там, где памяти не хватает.
пригождается чаще там, где надо программно генерировать частоту в широком диапазоне - считать приходится каждый такт
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 23:03:39
FreshMan
ARV писал(а):и в последнем, и в двух предпоследних макросы написаны с ошибками - не смотрите на такие примеры

чтобы ошибок не было, надо "аргумент" макроса заключать в круглые скобки в "теле" макроса. см. пример знаменитого макроса:
#define _BV(x) (1 << (x))
странно
но когда я пишу так
#define TurnOff_Nixie (PORTB=0x0A;PORTD&= ~(1<<4 | 1<<3))
то эклипс ругается
а когда так
#define TurnOff_Nixie PORTB=0x0A;PORTD&= ~(1<<4 | 1<<3)
то нет
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 23:09:36
ua1arn
макрос ( что-то ; что-то ещё) не применить. Сделайте так ( что-то , что-то ещё)
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 23:20:04
FreshMan
спасибо
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Вт апр 01, 2014 23:29:51
ARV
FreshMan писал(а):когда я пишу так
#define TurnOff_Nixie (PORTB=0x0A;PORTD&= ~(1<<4 | 1<<3))
то эклипс ругается
правильно: скобка воспринимается, как начало "параметров" макроса. кроме вашего второго варианта можно так:
#define TurnOff_Nixie() (PORTB=0x0A;PORTD&= ~(1<<4 | 1<<3))
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Ср апр 02, 2014 00:10:10
ua1arn
Да, позднее время Про макрос-функцию забыл. Для макросов (с параметрами или без) есть хорошее правило оформления:
Код: Выделить всё
#define spi_select(target, spimode) \
do { prog_select(target); hardware_spi_connect(SPIC_SPEEDFAST, (spimode)); } while (0) // начало выдачи информации по SPI
#define spi_select2(target, spimode, speedcode) \
do { prog_select(target); hardware_spi_connect((speedcode), (spimode)); } while (0) // начало выдачи информации по SPI
#define spi_unselect(target) \
do { hardware_spi_disconnect(); prog_unselect(target); } while (0) // заверщение выдачи информации по SPI - поднять чипселект
#define spi_complete(target) \
((void) (target), hardware_spi_complete()) // ожидание выдачи последнего байта в последовательности
По последнему примеру - что в выражении делает semicolon (точка с запятой)? Компилер при использовании будет ругаться. А вообще? окончательный вариант такой:
#define TurnOff_Nixie() do { PORTB = 0x0A; PORTD &= ~ (1U << 4 | 1U << 3); } while (0)
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб апр 05, 2014 13:41:42
Мikа
Доброе субботнее утро! Иkи обед

Помогите, пожалуйста, понять логику внешних прерываний ATmega, по восходящему фронту.
Суть вопроса такова: нога даёт прерывание, когда "чувствует" восходящий фронт. Но следующее прерывание будет дано только при появлении восходящего фронта после возвращения в изначальное состояние, которое было до первого прерывания? Или же Второе прерывание по восходящему фронту будет дано сразу же, как только первый восходящий фронт перейдёт в постоянную величину и после этого появится новый?
Я приложил некую иллюстрацию для наглядности вопроса.
Как мне кажется, истиным является второй вариант. Или подводные камни?

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб апр 05, 2014 15:39:40
КРАМ
Вход прерывания является ЦИФРОВЫМ, то есть поддерживает только ДВА логических уровня. Прерывание генерируется при изменении этого уровня.
Например.
При питании МК +5 вольт уровнем логической единицы на входе будет напряжение в диапазоне примерно 4...5 вольт. Уровнем логического нуля - 0...1 вольт. Все остальные значения входного напряжения являются неопределенными.
Схема формирования сигнала прерывания должна обеспечивать гарантированные уровни логических 0 и 1.
Таким образом, нижняя эпюра НЕРАБОТОСПОСОБНА.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб апр 05, 2014 17:48:57
Мikа
Таким образом отличие прерывания по восходящему фронту от прерывания по ЛОГ 1 заключается в том, что прерывание по возрастающему фронту срабатывает 1 раз при переходе в ЛОГ 1 и не будет повторно взводить флаг, пока не вернтся в ЛОГ 0 и потом обратно в ЛОГ 1, а при прерывании по ЛОГ 1 флаг будет подниматься постоянно, пока на ножке присутствует ЛОГ 1? Так правильно?
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб апр 05, 2014 18:15:23
КРАМ
Прерывание по восходящему фронту в понимании ЦИФРОВЫХ УРОВНЕЙ - это и есть прерывание по изменению с 0 на 1.
Никаких других вариантов и нет.
Если Вам нужно анализировать СКОРОСТЬ изменения АНАЛОГОВОГО сигнала (на Ваших эпюрах именно это показано), то нужно вначале продифференцировать сигнал с помощью ФВЧ (например простейшей RC цепью), затем отнормировать его в логические уровни с помощью компаратора и лишь затем подать на вход прерываний. А проще воспользоваться встроенным в МК компаратором и активировать прерывание по изменению его выходного сигнала...
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб апр 05, 2014 19:40:45
Мikа
Да, да, я вас понял, на тему цифровых уровней.Но судя по всему так и есть: прерывание по 0 или 1 - поднимают флаги непрерывно, пока 0 или 1 на жоке. А прерывания по фронтам поднимаю флаг однократно. Следующее прерывание по фронту возможно только при изменении уровня на противоположный и обратно. Спасибо

Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб апр 05, 2014 20:15:23
akl
Замечу, у AVR mega нет прерывания по уровню 1. Да и в других 90S, 90USB, TINY не замечал.
Re: Мелкие вопросы по МК и ПЛИС.
Добавлено: Сб апр 05, 2014 20:23:59
КРАМ
Прерывания по изменению состояния пинов порта в общем и есть прерывание по УРОВНЮ, потому что оно взводится как результат сравнения состояния пина и защелки последнего из прочитанных состояний пина (порта).
То есть пока пин не будет прочитан флаг прерывания опустить не возможно...
А вот входы внешних прерываний реагируют только на активные фронты...