Семисегментный LED-индикатор. Эффекты анимации
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
[uquote="Dimon456",url="/forum/viewtopic.php?p=3886616#p3886616"]Да, продолжать.[/uquote]
Продолжаю, в основном цикле считали значение, в прерывании изменили, а в основном цикле неактуальное значение. И как мы помним, прерывание произошло в момент чтения. Что произойдёт?
Продолжаю, в основном цикле считали значение, в прерывании изменили, а в основном цикле неактуальное значение. И как мы помним, прерывание произошло в момент чтения. Что произойдёт?
- Реклама
Re: Семисегментный LED-индикатор. Эффекты анимации
Операция чтения будет завершена до конца, а потом уже происходит прерывание основной программы.Demiurg писал(а):И как мы помним, прерывание произошло в момент чтения. Что произойдёт?
Там есть исключения, но в данном случае их нет.
В чем вообще проблема? А то мне не понятно чтение чего и где?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
строчка PORTB |= 1<<PB0; как работает?Dimon456 писал(а):А то мне не понятно чтение чего и где?
вот так:
1. во временный регистр считывается PORTB, допустим: in R17, PORTB
2. в этом регистре ставится нулевой бит: sbr r17, 0
3. в порт обратно выводится значение регистра: out PORTB, r17
а теперь представьте, что между 1 и 2 этапом возникло прервание, которое установит ВТОРОЙ бит PORTB. что будет, когда отработает прерывание и выполнится 3-й этап?
конечно, этот ужас произойдет при стечении определенных обстоятельств:
- программист делает макаранный код, где к разделяемым ресурсам осуществляетс доступ и из основного кода, и из прерываний, не применяя особых мер;
- компилятор генерирует именно такой "трехэтапный" код.
второй вопрос в avr-gcc, по крайней мере, при включенной оптимизации -Os, исключен - однобитные манипуляции всегда в этом случае делаются командами SBI/CBI. но многобитные (когда изменяется сразу несколько битов, а не один), увы... так же могут быть пробелмы и с доступом к портам, для которых команды SBI/CBI не применяются...
ну а на счет первого - это вам Demiurg намекнул уже
Добавлено after 2 minutes 28 seconds:
как вегда, от эффектов на 7-сегментнике мы плавно ушли в сторону теории качественного кода
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Семисегментный LED-индикатор. Эффекты анимации
где в основной программе она у меня используется?ARV писал(а):строчка PORTB |= 1<<PB0; как работает?
вот так:
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
я не знаюDimon456 писал(а):где в основной программе она у меня используется?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
[uquote="Dimon456",url="/forum/viewtopic.php?p=3886685#p3886685"]где в основной программе она у меня используется?[/uquote]
А у вас только однозадачные проекты? Только дисплей на семисегментных индикатора? И МК больше ничем не управляет? Я намекнул. ARV разжевал, в блюдечко с каемочкой выплюнул, все равно не поняли? Вы меня извините, мк только с помощью форумов осваиваете?
А у вас только однозадачные проекты? Только дисплей на семисегментных индикатора? И МК больше ничем не управляет? Я намекнул. ARV разжевал, в блюдечко с каемочкой выплюнул, все равно не поняли? Вы меня извините, мк только с помощью форумов осваиваете?
Re: Семисегментный LED-индикатор. Эффекты анимации
Demiurg, плиз, ткинет носом, где тут после sei() обращение к порту?
Спойлер
Код: Выделить всё
int main(void){
DDRB = 255;
DDRC = 255;
DDRD = 0x7F;
PORTD = 0x80;
TimerInit();
sei();
scr_y[0]=250; // длительность свечения 1 разряда
scr_y[1]=100; // длительность свечения 2 разряда
scr_y[2]=50; // длительность свечения 3 разряда
scr_y[3]=25; // длительность свечения 0 разряда
while(1);
}-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
Тыкаю носом на будущие ситуации в проектах.
Re: Семисегментный LED-индикатор. Эффекты анимации
Так и не понял, в чем собственно проблема?Demiurg писал(а):Тыкаю носом на будущие ситуации в проектах.
Даже как-то испугался, что работать не будет.
Пришлось собрать стенд
Спойлер
Комментарии к видео
Код: Выделить всё
uint8_t scr[4] = {DIG5,DIG2,DIG3,DIG4};
scr_y[0]=250; // длительность свечения 1 разряда
scr_y[1]=100; // длительность свечения 2 разряда
scr_y[2]=50; // длительность свечения 3 разряда
scr_y[3]=10; // длительность свечения 0 разряда
_delay_ms(5000);
scr[0] = digs[2];
scr[1] = digs[4];
scr[2] = digs[6];
scr[3] = digs[8];
_delay_ms(5000);
scr_y[0]=1;
scr_y[1]=1;
scr_y[2]=1;
scr_y[3]=1;
_delay_ms(5000);
scr_y[0]=250;
scr_y[1]=250;
scr_y[2]=250;
scr_y[3]=250;
_delay_ms(5000);
scr_y[0]=1;
scr_y[1]=250;
scr_y[2]=1;
scr_y[3]=250;
_delay_ms(5000);
scr_y[0]=250;
scr_y[1]=1;
scr_y[2]=250;
scr_y[3]=1;
_delay_ms(5000);
scr_y[0]=1;
scr_y[1]=250;
scr_y[2]=250;
scr_y[3]=1;
_delay_ms(5000);
clr();
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
Я вам показал, чтобы вы в прерываниях портами мк в своих проектах управляли с осторожностью. Это просто был совет на будущее. Точно также ситуация обстоит с переменными.
Re: Семисегментный LED-индикатор. Эффекты анимации
Вон где проблема зарыта...
Demiurg, а что не так с прерываниями?Насколько я знаю из схемотехнике Z80 80c31, думаю в мегах так же будет (одноядерный процессор), одно другому совершенно не мешает, и два в месте ни как не сработает.
Кроме всего прочего из одного прерывания другое, при всем желании, не запустить.
Даже если находясь в одном прерывании, был получен запрос на второе прерывание, второе прерывание после выполнение первого сразу не запустится, только после выполнения одной команды (1-2 машинных цикла) основной программы.
Так что не так с прерываниями?
Demiurg, а что не так с прерываниями?
Спойлер
Код: Выделить всё
static uint8_t com;
const FLASH seg_pin_t *p;
ISR(TIMER0_COMP_vect){
p = commons+com;
OCR0 = scr_y[com];
if(COM_CAT)
*p->port |= p->or;
else
*p->port &= p->and;
}
ISR(TIMER0_OVF_vect)
{
p = commons+com;
if(++com >= 4) com = 0;
uint8_t d = scr[com];
if(!COM_CAT)
d = ~d;
p = pins;
for(uint8_t i=0; i<8; i++, d>>=1){
*p->port = (*p->port & p->and) | (d & 1 ? p->or : 0);
p++;
}
p = commons+com;
if(COM_CAT)
*p->port &= p->and;
else
*p->port |= p->or;
}Кроме всего прочего из одного прерывания другое, при всем желании, не запустить.
Даже если находясь в одном прерывании, был получен запрос на второе прерывание, второе прерывание после выполнение первого сразу не запустится, только после выполнения одной команды (1-2 машинных цикла) основной программы.
Так что не так с прерываниями?
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
Очень помогает моделирование разных ситуаций. Проектирование это инженерная работа. Да, да. Именно так. Грамотный инженер всегда должен предполагать различные ситуации. Запомните это. Даже если это хобби, разовая работа. Проект - не письки на заборе рисовать. Напишите тестовую программу. На одном порту вы управляете, скажем реле. В качестве имитатора пусть будет светодиод. В симуляторе плевать, что висит на порту. Этим чем-то мы управляем в основном цикле. Пусть также на этом порту висят индикаторы. Пишем тестовую программу. Управляем реле. Генерируем прерывание индикаторов. И там вы все увидите. На ассемблере это делается элементарно. На си, придётся поизвращаться. Либо тестировать в дизассемблере.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Семисегментный LED-индикатор. Эффекты анимации
Чего-то я тоже не догоняю... в чём проблема?
из обсуждений я понял что если в потоке с низким приоритетом (если не исключена возможность его прерывания в случайном месте) выполнять команду модификации состояния порта, то в порт может попасть всё что угодно...
с чего бы это? прерывание обязано после завершения вернуть в исходное состояние временно использованные регистры для этого до начала исполнения кода прерывания записанная в них информация сохраняется в стек, а по завершению извлекается обратно... в отличии от АСМ, С компилятор делает это сам, не утруждая программиста...
из обсуждений я понял что если в потоке с низким приоритетом (если не исключена возможность его прерывания в случайном месте) выполнять команду модификации состояния порта, то в порт может попасть всё что угодно...
с чего бы это? прерывание обязано после завершения вернуть в исходное состояние временно использованные регистры для этого до начала исполнения кода прерывания записанная в них информация сохраняется в стек, а по завершению извлекается обратно... в отличии от АСМ, С компилятор делает это сам, не утруждая программиста...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
не что угодно, а не то, что ожидалось.Ivanoff-iv писал(а): то в порт может попасть всё что угодно...
с чего бы это?
я же объяснял по шагам, вспоминайте:
отвечаю, раз есть затруднения: на третьем этапе ВТОРОЙ бит будет сброшен, так как в r17 его ЕЩЕ НЕ БЫЛО в тот момент, когда происходило считывание порта.ARV писал(а):1. во временный регистр считывается PORTB, допустим: in R17, PORTB
2. в этом регистре ставится нулевой бит: sbr r17, 0
3. в порт обратно выводится значение регистра: out PORTB, r17
а теперь представьте, что между 1 и 2 этапом возникло прерывание, которое установит ВТОРОЙ бит PORTB. что будет, когда отработает прерывание и выполнится 3-й этап?
в итоге мы имеем, что прерывание создаст ИГОЛКУ, но потом уровень сигнала на ВТОРОМ пине порта не изменится
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Семисегментный LED-индикатор. Эффекты анимации
понял - коллизия при работе с портами, а не с регистрами. (3 раза перечитал пока понял о чем речь
)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
правильнее - коллизия при работе с любыми разделяемыми ресурсами. любой ресурс, используемый и в прерывании, и вне прерывания, может попасть в такую коллизию. например, классика - EEPROM.Ivanoff-iv писал(а):коллизия при работе с портами, а не с регистрами
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
EEPROM в AVR разделяемые ресурсы - согласен, но прерывания?! Она ж медленная... Не знаю, как в современных моделях, особенно MICROCHIP, в старых запись одного байта длится 8 мс.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
при чем тут её скорость? принцип работы с разделяемыми ресурсами всегда един: перед началом работы заблокируй, после окончания работы разблокируй. в прерывании вы можете парой команд запустить запись EEPROM - быстро очень, а в главном цикле при этом могла или может быть начата своя запись...Demiurg писал(а):согласен, но прерывания?! Она ж медленная...
та же песня и с USART - либо все по прерываниям, либо все без них. ну или если мешать то и другое - надо озаботиться блокировками... хотя бы классическим ATOMIC_BLOCK
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Семисегментный LED-индикатор. Эффекты анимации
Что?Demiurg писал(а):На одном порту вы управляете, скажем реле. В качестве имитатора пусть будет светодиод. В симуляторе плевать, что висит на порту. Этим чем-то мы управляем в основном цикле. Пусть также на этом порту висят индикаторы. Пишем тестовую программу. Управляем реле. Генерируем прерывание индикаторов. И там вы все увидите.
Вы что хотите сказать что прерывание мне испортит управление реле (выключит когда включено, либо включит когда выключено, любо реле начнет чакать с частотой прерывания, либо еще что-то)?
Вы смеетесь?
и вы конечно грамотный инженер?Demiurg писал(а):Грамотный инженер
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Семисегментный LED-индикатор. Эффекты анимации
Dimon456. То что я поучаствовал в этой теме, так удачно сложились звезды. Выдалось свободное время и так как искал компромисс с индексным выводом в порты мк. Я не всегда смогу полноценно отвечать на вопросы. Писать примеры. Остаётся только подталкивает в нужном направлении. На последние ваши вопросы отвечать не буду. Как-нибудь сами. Профессионал от слова профессия.
Добавлено after 13 minutes 14 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3887075#p3887075"]и вы конечно грамотный инженер?[/uquote]
Не плюй в колодец. Пригодится напиться. В конце концов я один из тех кто отвечает на ваши вопросы. И один из тех, чьи примеры вы используете.
Добавлено after 13 minutes 14 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3887075#p3887075"]и вы конечно грамотный инженер?[/uquote]
Не плюй в колодец. Пригодится напиться. В конце концов я один из тех кто отвечает на ваши вопросы. И один из тех, чьи примеры вы используете.


