Не работает millis Attiny13a (MicroCore) в Proteus

Чето ИИ косячит)

2 лайка

да только хотел написать, у меня ии сломался, значит не судьба))) но надо было более точно описывать))) а то я его еще своим описанием запутал наверное))

А сам, ручонками?

1 лайк

не умею, сам только в ардуино идэ))) блокнота любого для написания кода более чем… и только на обычном языке с++
но я найду ии который решать будет за меня абсолютно все! и выдавать результат не зависимо от описания)))
а еще ии на вас ругается, и говорит не слушать вас)))

а что тут не так ? надо разобраться)))

timer_millis **изменяется ТОЛЬКО в прерывании

где ошибка ?**

А мы - форумчане, чем провинились?
Это мы что-ли к

uint8_t timer_accumulator = 0;
прибавляем 256
`timer_accumulator += 256;`
и получаем снова ноль. 


При чтении переменной побайтово в любой момент может произойти прерывание и переменная изменит значение.

вот опять на вас ругается, и говорит что код с ATOMIC_BLOCK защищен от этой проблемы

блин интересно было подкорректировать ии, но меня опять дергают, и времени нет… спс)))

Так я про первый вариант. Во втором там другая ошибка. См. выше.

вот оно, влияние высшего разума на низший. Во всей красе…

5 лайков

Он плохого не посоветует!

да, вы правы, действительно хотя и “работает”, но оооочень некрасиво и запутывает, когда только погружаешься, уж лучше написать WDCE=0 (!) WDE=0 (!) Но рад, что вас это сподвигло ответить ))

А что значат восклицательные знаки в скобках? В первый раз такое встречаю

Ну, разве что в комментариях, и то…
Так то эта запись означает

4 = 0 и 3 = 0 (!) Вот тут восклицательный знак не помешает))

Просто восклицательные знаки.

Зигмунд Фрейд, на вопрос студентов, о чём говорит его привычка постоянно держать во рту “фаллическую хреновину” ответил: “Ни о чём. Иногда сигара – это просто сигара:slight_smile:

1 лайк

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

Вы берете полный набор флагов в используемом регистре и обьединяете их битовым “ИЛИ”(сорян за опечатку):

(1<<WDTIF) | (1<<WDTIE) | (1<<WDCE) | (1<<WDE)

если вам не нужно ставить какой-то из флагов, вы просто меняете бит на 0, не меняя всей строчки

(1<<WDTIF) | (1<<WDTIE) | (0<<WDCE) | (0<<WDE)

Это быстрее, чем стирать ненужный флаг целиком. Кроме того, когда вы захотите снова изменить запись и выставить флаг - вам не придется вспоминать, какое у него имя, все флаги перед вами. Вы просто меняете 0 на 1.
Просто и наглядно.

А вот, наоборот, ваш код, который вы привели в противовес этому - думаю содержит ошибку:

wdt_reset();
cli();
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 0b01100000; // 4s    
sei();

строки 4 и 5 противоречат друг другу.

Вообще, в “красивом коде” (вы же об этом говорили в сообщении 33 ?) - не должно быть употребления “магических чисел”, таких как в строке 5.

1 лайк

исправь, “ИЛИ”. Дети же читать будут… :slight_smile:

1 лайк

Деда, он имел ввиду И это объединение регистра с набором подготовленных данных, которые готовились с помощью ИЛИ

xDriver, “И” так не работает

в пятницу РАБОТАЕТ!

DDRD &= ~(1<<2);