Магия таймеров attiny25
- Войдите на сайт для отправки комментариев
Пнд, 05/02/2018 - 23:03
Задача была выдавать на двух ногах по очереди 36кГц на двух других 56 кГц по очереди по 10 импульсов того и другого. Зарядил таймеры и в прерываниях сделал логику вывода, всё работает. Магия в том, что если закомментировать строку 4 с совершенно левым, никак не используемым оператором, то таймер 1 перестает работать и запустить его ни как не получается. Кто нибудь знает почему таймер отваливается?
volatile byte c1,c2,s1,s2; void setup() { pinMode(5,OUTPUT); DDRB = 0x1f; TCCR1 = 0; TCNT1 = 0; OCR1C = 71; TCCR1 = 0x81; TCCR0A = 0; TCCR0B = 0; TCCR0A = (1 << WGM01); OCR0A = 111; TCCR0B = (1 << CS00); TIMSK = (1 << TOIE1) | (1 << OCIE0A); sei(); while(1); } void loop() { } ISR(TIM1_OVF_vect) { c2++; switch (s2) { case 0: PINB = 0x8; if ( c2 > 19) s2=1; break; case 1: if ( c2 > 25) s2=2; break; case 2: PINB = 0x10; if ( c2 > 45) s2=3; break; case 3: if ( c2 > 50) {s2=0;c2=0;}; break; } } ISR(TIM0_COMPA_vect) { c1++; switch (s1) { case 0: PINB = 0x1; if ( c1 > 19) s1=1; break; case 1: if ( c1 > 25) s1=2; break; case 2: PINB = 0x2; if ( c1 > 45) s1=3; break; case 3: if ( c1 > 50) {s1=0;c1=0;}; break; } }
nik182, речь про строчку pinMode(5,OUTPUT) ???? Явно нехватает команды cli() перед настройкой таймера. Ну и совсем на всякий случай не помешает отчистить регистор флагов TIFR=0xFF
cli() пробовал, не помогло. Обычно для остановки TCCR1 = 0; хватало. Флаги тоже поставил на сброс. Переехал в Атмел студию. Теже проблемы. Но вот какой командой запустить таймер 1 не знаю. Работает только нулевой.
Дошёл до алгоритм билдера. В симуляторе всё работает. В кристале только нулевой таймер. Попробовал три кристалла из разных партий. Те жи грабли. Что же четвёртая строка делает то,а?
Вот так работает. Но это другое прерывание.
PINB =
это что? PINx только для чтения состояния ножек порта. И в первом скетче замените OCR1
C
= 71; на OCR1A = 71;
nick182, кажется разобрался. С командой PinMode так же запускается и GTCCR=1<<PWM1B; Соответссно без пинмоде таймер стоит.
PINB =
это что? PINx только для чтения состояния ножек порта.
Не только.
В некоторых АVR'ках (в той же Tiny 25/45/85 о которой топик, а также в ATmega328, ATmega2561 и многих других, но не во всех) запись 1 в этот порт инвертирует соответствующий пин. Если ещё раз записать - снова инвертирует. См. стр. 53, третий абзац сверху даташита на 25-ую.
Не только.
В некоторых АVR'ках (в той же Tiny 25/45/85 о которой топик, а также в ATmega328, ATmega2561 и многих других, но не во всех) запись 1 в этот порт инвертирует соответствующий пин. Если ещё раз записать - снова инвертирует. См. стр. 53, третий абзац сверху даташита на 25-ую.
"The Port Input Pins I/O location is read only, while the Data Register and the Data Direction Register are read/write. " А дальше просто описано что будет если некоторые ..... будут туда что то писать. Но я не из их числа :)
Зря,зря батенька! В одно касание перевернуть порт - дорогого стоит. The Port Input Pins I/O location is read only, while the Data Register and the Data Direction Register are read/write. However, writing a logic one to a bit in the PINx Register, will result in a toggle in the corresponding bit in the Data Register.
Зря,зря батенька! В одно касание перевернуть порт - дорогого стоит.
А это сколько касаний PORTB ^= (1<<led); ???
Ваше право. Есть люди, которые не пользуются goto, потому что слово состоит из четырёх букв, есть люди, которые не пользуются операцией отрицания, потому что она богомерзкая (стр. 15). Ну, вот, оказывается, что есть люди, отказывающиеся переворачивать пин за один такт, потому что ... а почему, кстати? Тоже что-то с религией?
Это Ваше право - мы свободные люди, каждый сам решает, чем ему пользоваться, а чем - нет. Но это не повод утверждать, что другим тоже этого делать нельзя.
Как минимум прочитать,перевернуть бит, записать.
Это Ваше право - мы свободные люди, каждый сам решает, чем ему пользоваться, а чем - нет. Но это не повод утверждать, что другим тоже этого делать нельзя.
Я ничего не утверждаю, если в даташите написано read only, то так тому и быть. Я в первую очередь смотрю в даташиты производителей и выполняю их рекомендации, а уже потом изучаю опыт других. Странно, но у меня ничего не горит, не глючит, нет и большинства проблем с китайским железом, которыми весь форум забит. Хотя "каждый сходит с ума по своему".
P.S. "Свобода это не только возможность выбора но и ответственность за него"
Ну, вот на этой замечательной фразе и остановимся :)
Китайское железо горит и глючит не у тех, кто читает даташит и спорит о том, как понимать его отдельные места (как вы тут), а у тех, кто не знает что такое даташит, а все знания черпает из "видео на ютубе". Так что расслабьтесь, мужики.