Семисегментный LED-индикатор. Эффекты анимации

Обсуждаем контроллеры компании Atmel.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Demiurg »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3886616#p3886616"]Да, продолжать.[/uquote]
Продолжаю, в основном цикле считали значение, в прерывании изменили, а в основном цикле неактуальное значение. И как мы помним, прерывание произошло в момент чтения. Что произойдёт?
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Dimon456 »

Demiurg писал(а):И как мы помним, прерывание произошло в момент чтения. Что произойдёт?
Операция чтения будет завершена до конца, а потом уже происходит прерывание основной программы.
Там есть исключения, но в данном случае их нет.

В чем вообще проблема? А то мне не понятно чтение чего и где?
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение ARV »

Dimon456 писал(а):А то мне не понятно чтение чего и где?
строчка PORTB |= 1<<PB0; как работает?
вот так:
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-сегментнике мы плавно ушли в сторону теории качественного кода :))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Dimon456 »

ARV писал(а):строчка PORTB |= 1<<PB0; как работает?
вот так:
где в основной программе она у меня используется?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение ARV »

Dimon456 писал(а):где в основной программе она у меня используется?
я не знаю :dont_know: я теоретик :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Demiurg »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3886685#p3886685"]где в основной программе она у меня используется?[/uquote]
А у вас только однозадачные проекты? Только дисплей на семисегментных индикатора? И МК больше ничем не управляет? Я намекнул. ARV разжевал, в блюдечко с каемочкой выплюнул, все равно не поняли? Вы меня извините, мк только с помощью форумов осваиваете?
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Dimon456 »

Demiurg, плиз, ткинет носом, где тут
Спойлер

Код: Выделить всё

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);
}
после sei() обращение к порту?
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Demiurg »

Тыкаю носом на будущие ситуации в проектах.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Dimon456 »

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-индикатор. Эффекты анимации

Сообщение Demiurg »

Я вам показал, чтобы вы в прерываниях портами мк в своих проектах управляли с осторожностью. Это просто был совет на будущее. Точно также ситуация обстоит с переменными.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Dimon456 »

Вон где проблема зарыта...
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;
}
Насколько я знаю из схемотехнике Z80 80c31, думаю в мегах так же будет (одноядерный процессор), одно другому совершенно не мешает, и два в месте ни как не сработает.
Кроме всего прочего из одного прерывания другое, при всем желании, не запустить.
Даже если находясь в одном прерывании, был получен запрос на второе прерывание, второе прерывание после выполнение первого сразу не запустится, только после выполнения одной команды (1-2 машинных цикла) основной программы.
Так что не так с прерываниями?
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Demiurg »

Очень помогает моделирование разных ситуаций. Проектирование это инженерная работа. Да, да. Именно так. Грамотный инженер всегда должен предполагать различные ситуации. Запомните это. Даже если это хобби, разовая работа. Проект - не письки на заборе рисовать. Напишите тестовую программу. На одном порту вы управляете, скажем реле. В качестве имитатора пусть будет светодиод. В симуляторе плевать, что висит на порту. Этим чем-то мы управляем в основном цикле. Пусть также на этом порту висят индикаторы. Пишем тестовую программу. Управляем реле. Генерируем прерывание индикаторов. И там вы все увидите. На ассемблере это делается элементарно. На си, придётся поизвращаться. Либо тестировать в дизассемблере.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Ivanoff-iv »

Чего-то я тоже не догоняю... в чём проблема?
из обсуждений я понял что если в потоке с низким приоритетом (если не исключена возможность его прерывания в случайном месте) выполнять команду модификации состояния порта, то в порт может попасть всё что угодно... :dont_know:
с чего бы это? прерывание обязано после завершения вернуть в исходное состояние временно использованные регистры для этого до начала исполнения кода прерывания записанная в них информация сохраняется в стек, а по завершению извлекается обратно... в отличии от АСМ, С компилятор делает это сам, не утруждая программиста...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение ARV »

Ivanoff-iv писал(а): то в порт может попасть всё что угодно...
с чего бы это?
не что угодно, а не то, что ожидалось.

я же объяснял по шагам, вспоминайте:
ARV писал(а):1. во временный регистр считывается PORTB, допустим: in R17, PORTB
2. в этом регистре ставится нулевой бит: sbr r17, 0
3. в порт обратно выводится значение регистра: out PORTB, r17

а теперь представьте, что между 1 и 2 этапом возникло прерывание, которое установит ВТОРОЙ бит PORTB. что будет, когда отработает прерывание и выполнится 3-й этап?
отвечаю, раз есть затруднения: на третьем этапе ВТОРОЙ бит будет сброшен, так как в r17 его ЕЩЕ НЕ БЫЛО в тот момент, когда происходило считывание порта.

в итоге мы имеем, что прерывание создаст ИГОЛКУ, но потом уровень сигнала на ВТОРОМ пине порта не изменится
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Ivanoff-iv »

понял - коллизия при работе с портами, а не с регистрами. (3 раза перечитал пока понял о чем речь :) )
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение ARV »

Ivanoff-iv писал(а):коллизия при работе с портами, а не с регистрами
правильнее - коллизия при работе с любыми разделяемыми ресурсами. любой ресурс, используемый и в прерывании, и вне прерывания, может попасть в такую коллизию. например, классика - EEPROM.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Demiurg »

EEPROM в AVR разделяемые ресурсы - согласен, но прерывания?! Она ж медленная... Не знаю, как в современных моделях, особенно MICROCHIP, в старых запись одного байта длится 8 мс.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение ARV »

Demiurg писал(а):согласен, но прерывания?! Она ж медленная...
при чем тут её скорость? принцип работы с разделяемыми ресурсами всегда един: перед началом работы заблокируй, после окончания работы разблокируй. в прерывании вы можете парой команд запустить запись EEPROM - быстро очень, а в главном цикле при этом могла или может быть начата своя запись...

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

Мой уютный бложик... заходите!
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Dimon456 »

Demiurg писал(а):На одном порту вы управляете, скажем реле. В качестве имитатора пусть будет светодиод. В симуляторе плевать, что висит на порту. Этим чем-то мы управляем в основном цикле. Пусть также на этом порту висят индикаторы. Пишем тестовую программу. Управляем реле. Генерируем прерывание индикаторов. И там вы все увидите.
Что?
Вы что хотите сказать что прерывание мне испортит управление реле (выключит когда включено, либо включит когда выключено, любо реле начнет чакать с частотой прерывания, либо еще что-то)?
Вы смеетесь?
Demiurg писал(а):Грамотный инженер
и вы конечно грамотный инженер?
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Семисегментный LED-индикатор. Эффекты анимации

Сообщение Demiurg »

Dimon456. То что я поучаствовал в этой теме, так удачно сложились звезды. Выдалось свободное время и так как искал компромисс с индексным выводом в порты мк. Я не всегда смогу полноценно отвечать на вопросы. Писать примеры. Остаётся только подталкивает в нужном направлении. На последние ваши вопросы отвечать не буду. Как-нибудь сами. Профессионал от слова профессия.

Добавлено after 13 minutes 14 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=3887075#p3887075"]и вы конечно грамотный инженер?[/uquote]
Не плюй в колодец. Пригодится напиться. В конце концов я один из тех кто отвечает на ваши вопросы. И один из тех, чьи примеры вы используете.
Ответить

Вернуться в «AVR»