Вт сен 01, 2020 19:26:43
Вт сен 01, 2020 20:37:30
Операция чтения будет завершена до конца, а потом уже происходит прерывание основной программы.Demiurg писал(а):И как мы помним, прерывание произошло в момент чтения. Что произойдёт?
Вт сен 01, 2020 20:49:39
строчка PORTB |= 1<<PB0; как работает?Dimon456 писал(а):А то мне не понятно чтение чего и где?
Вт сен 01, 2020 20:51:05
где в основной программе она у меня используется?ARV писал(а):строчка PORTB |= 1<<PB0; как работает?
вот так:
Вт сен 01, 2020 20:54:41
я не знаю я теоретикDimon456 писал(а):где в основной программе она у меня используется?
Вт сен 01, 2020 21:23:14
Вт сен 01, 2020 21:32:11
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);
}
Вт сен 01, 2020 22:17:19
Ср сен 02, 2020 10:51:47
Так и не понял, в чем собственно проблема?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();
Ср сен 02, 2020 10:58:17
Ср сен 02, 2020 11:30:14
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;
}
Ср сен 02, 2020 13:11:45
Ср сен 02, 2020 13:43:40
Ср сен 02, 2020 13:50:47
не что угодно, а не то, что ожидалось.Ivanoff-iv писал(а): то в порт может попасть всё что угодно...
с чего бы это?
отвечаю, раз есть затруднения: на третьем этапе ВТОРОЙ бит будет сброшен, так как в r17 его ЕЩЕ НЕ БЫЛО в тот момент, когда происходило считывание порта.ARV писал(а):1. во временный регистр считывается PORTB, допустим: in R17, PORTB
2. в этом регистре ставится нулевой бит: sbr r17, 0
3. в порт обратно выводится значение регистра: out PORTB, r17
а теперь представьте, что между 1 и 2 этапом возникло прерывание, которое установит ВТОРОЙ бит PORTB. что будет, когда отработает прерывание и выполнится 3-й этап?
Ср сен 02, 2020 15:06:46
Ср сен 02, 2020 15:54:03
правильнее - коллизия при работе с любыми разделяемыми ресурсами. любой ресурс, используемый и в прерывании, и вне прерывания, может попасть в такую коллизию. например, классика - EEPROM.Ivanoff-iv писал(а):коллизия при работе с портами, а не с регистрами
Ср сен 02, 2020 15:58:23
Ср сен 02, 2020 16:02:19
при чем тут её скорость? принцип работы с разделяемыми ресурсами всегда един: перед началом работы заблокируй, после окончания работы разблокируй. в прерывании вы можете парой команд запустить запись EEPROM - быстро очень, а в главном цикле при этом могла или может быть начата своя запись...Demiurg писал(а):согласен, но прерывания?! Она ж медленная...
Ср сен 02, 2020 18:05:56
Что?Demiurg писал(а):На одном порту вы управляете, скажем реле. В качестве имитатора пусть будет светодиод. В симуляторе плевать, что висит на порту. Этим чем-то мы управляем в основном цикле. Пусть также на этом порту висят индикаторы. Пишем тестовую программу. Управляем реле. Генерируем прерывание индикаторов. И там вы все увидите.
и вы конечно грамотный инженер?Demiurg писал(а):Грамотный инженер
Ср сен 02, 2020 18:33:58