да, можно даже проще:Ghost in shell писал(а):так правильно?
Код: Выделить всё
T0IE = !sec1;при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
да, можно даже проще:Ghost in shell писал(а):так правильно?
Код: Выделить всё
T0IE = !sec1;Спасибо, но это просто инвертирование состояния sec1, а нужно именно сравнение.ARV писал(а):да, можно даже проще:Ghost in shell писал(а):так правильно?Код: Выделить всё
T0IE = !sec1;
а в чем разница?Ghost in shell писал(а):Спасибо, но это просто инвертирование состояния sec1, а нужно именно сравнение.
Поправлю:ARV писал(а):а в чем разница?Ghost in shell писал(а):Спасибо, но это просто инвертирование состояния sec1, а нужно именно сравнение.кроме того, это НЕ ИНВЕРТИРОВАНИЕ, а ОТРИЦАНИЕ. инвертирование обозначается знаком тильда ~
если sec1 будет 0, то TOIE будет 1, если sec1 будет 1, то TOIE будет 0 - что не так?
напрасный труд - ранее топикстартер показал код, в котором sec1 определен как БИТ, то есть он не может быть НЕ НУЛЕМ, кроме как будучи ЕДИНИЦЕЙ. хотя я не стану спорить, что бит - нестандартная фича для Си, но раз уж есть...md5sum писал(а):Поправлю:
где этот негодяй, который пытками заставляет вас это делать?!Hispanus писал(а):Зачем использовать таймер TMR0, если есть функция delay?)
Этот негодяй я) Просто подумал зачем напрягаться с этими регистрами, когда можно написать всё в одну строчку...ARV писал(а):где этот негодяй, который пытками заставляет вас это делать?!Hispanus писал(а):Зачем использовать таймер TMR0, если есть функция delay?)
задержка по таймеру позволяет не терять время даром, в то время как задержка через функцию - тормозит основной цикл наглухо. решайте, что вам важнее.
переменную лучше заводить локальную, но статическую.IfoR писал(а):Тут нужно либо использовать дополнительную глобальную переменную, либо использовать Таймер1, либо заводить внешнее тактирование на ножку T0.
Последовал вашему совету и вот что получилось: (поочередное переключение ножек порта В из низкого состояние в высокое с шагом примерно 1 секунда)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.
Вместо этого лучше писать:Hispanus писал(а): if (variable==16)
шибко много ваша программа пихает в стек в обработчике прерывания - стек переполняется. а почему так - это не ко мнеHispanus писал(а):Протестил ее в протеусе..повылазила куча ошибок с таким названием: PIC16core PC=0x0010 Stack overflow pushing return address of interrupt.. что это?