Ghost in shell писал(а):Спасибо, но это просто инвертирование состояния sec1, а нужно именно сравнение.
а в чем разница? кроме того, это НЕ ИНВЕРТИРОВАНИЕ, а ОТРИЦАНИЕ. инвертирование обозначается знаком тильда ~ если sec1 будет 0, то TOIE будет 1, если sec1 будет 1, то TOIE будет 0 - что не так?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Ghost in shell писал(а):Спасибо, но это просто инвертирование состояния sec1, а нужно именно сравнение.
а в чем разница? кроме того, это НЕ ИНВЕРТИРОВАНИЕ, а ОТРИЦАНИЕ. инвертирование обозначается знаком тильда ~ если sec1 будет 0, то TOIE будет 1, если sec1 будет 1, то TOIE будет 0 - что не так?
Поправлю: если sec1 будет 0, то TOIE будет 1, если sec1 будет НЕ 0, то TOIE будет 0
— Не говорите мне что делать и я не скажу куда Вам идти...
напрасный труд - ранее топикстартер показал код, в котором sec1 определен как БИТ, то есть он не может быть НЕ НУЛЕМ, кроме как будучи ЕДИНИЦЕЙ. хотя я не стану спорить, что бит - нестандартная фича для Си, но раз уж есть...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Если имеется МК с частотой кварца 4 МГц, какое значение предделителя нужно выбрать и какое значение надо загрузить в TMR0, чтобы получать переполнения через каждую секунду (если можно вместе с формулой)...не могу сообразить..
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.
Ну так смотрим. За 1 секунду, при частоте 4 МГц, произойдёт: 4 Мгц * 1 с = 4000000 циклов. Теперь подбираем. Количество циклов, которое произойдет при переполнении счётчика при начальном значении делителя А и TMR0 будет таким: С = A*(256-TMR0) Выразим TMR0: TMR0 = 256 - С/A Учитывая условие, что TMR0 >= 0, подбираем А: A = 1: TMR0 = 256 - 4000000/1 < 0 A = 8: TMR0 = 256 - 4000000/8 < 0 A = 64: TMR0 = 256 - 4000000/64 < 0 A = 256: TMR0 = 256 - 4000000/256 < 0 A = 1024: TMR0 = 256 - 4000000/1024 < 0
и всё! Больше значений делителя нет. Одним Таймером0 нельзя устроить задержку в 1 секунду при 4 МГц. Тут нужно либо использовать дополнительную глобальную переменную, либо использовать Таймер1, либо заводить внешнее тактирование на ножку T0.
IfoR писал(а):Тут нужно либо использовать дополнительную глобальную переменную, либо использовать Таймер1, либо заводить внешнее тактирование на ножку T0.
переменную лучше заводить локальную, но статическую.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
IfoR писал(а):Ну так смотрим. За 1 секунду, при частоте 4 МГц, произойдёт: 4 Мгц * 1 с = 4000000 циклов. Теперь подбираем. Количество циклов, которое произойдет при переполнении счётчика при начальном значении делителя А и TMR0 будет таким: С = A*(256-TMR0) Выразим TMR0: TMR0 = 256 - С/A Учитывая условие, что TMR0 >= 0, подбираем А: A = 1: TMR0 = 256 - 4000000/1 < 0 A = 8: TMR0 = 256 - 4000000/8 < 0 A = 64: TMR0 = 256 - 4000000/64 < 0 A = 256: TMR0 = 256 - 4000000/256 < 0 A = 1024: TMR0 = 256 - 4000000/1024 < 0
и всё! Больше значений делителя нет. Одним Таймером0 нельзя устроить задержку в 1 секунду при 4 МГц. Тут нужно либо использовать дополнительную глобальную переменную, либо использовать Таймер1, либо заводить внешнее тактирование на ножку T0.
Последовал вашему совету и вот что получилось: (поочередное переключение ножек порта В из низкого состояние в высокое с шагом примерно 1 секунда)
Тут примерная формула оценки задержки будет такая: С=R*D*(256 - TCNT0) C - задержка в циклах; R - сравниваемое значение в регистре; D - делитель; TCNT0 - начальное значение в счётчике таймера. Найти R можно так: R=С/(D*(256 - TCNT0))
В вашем случае тут будут такие решения, при TCNT0 = 0: D = 64 => R = 244 D = 256 => R = 61 D = 1024 => R ~= 15
Здесь лучше, наверное, использовать делитель в 256.
Вместо этого лучше писать: if (variable>=16) на случай если по каким-то причинам проц пропустит тот момент, когда переменная стала именно 16, тем более если она будет изменятся не в основной программе, а в обработчике прерывания.
Hispanus писал(а):Протестил ее в протеусе..повылазила куча ошибок с таким названием: PIC16core PC=0x0010 Stack overflow pushing return address of interrupt.. что это?
шибко много ваша программа пихает в стек в обработчике прерывания - стек переполняется. а почему так - это не ко мне
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Всё оказалось до ужаса просто надо было лишь перенести функцию обработки прерывания до main, тоесть для нее не надо было писать отдельную подпрограмму..по видимому протеус понимает только так
У радио нет будущего. Летательные аппараты тяжелее воздуха невозможны. Скоро выяснится, что рентгеновские лучи - мистификация.