Перейти к содержанию

Денис Е

Members
  • Постов

    4
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Екатаринбург

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    Микроконтроллеры
  • Оборудование
    pic18F4550

Достижения Денис Е

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Добрый день! Код полечился добавлением пустого бесконечного цикла в тело основной программы мэйн: while (1) { } и условием, присваивающим параметру tick_count значения 0x01 при первом запуске: if (tick_count == 0) tick_count=0x01; ... В настоящее время мигание светодиодов осуществляется прерываниями при помощи следующего кода: #include <xc.h> #define _XTAL_FREQ 8000000 volatile int tick_count = 0x01; void main(void) { TRISA = 0; LATA = 0; TRISB0 = 1; TRISB1 = 1; IPEN = 1; GIEL = 1; TMR0IP = 1; TMR0H = 0x00; TMR0L = 0x00; INTCON=0b11100000; T0CON=0b10000100; while (1) { } } void __interrupt() my_isr(void) { tick_count += tick_count; if (tick_count>32) tick_count=0x01; LATA = tick_count; TMR0IF=0; return; } Не знаю, насколько он правильный с точки зрения опытных программистов, но работает. Кстати говоря, выяснилось, что в макетной плате общий провод светодиодов не был подключен к минусу питания, поэтому диоды не горели, а только вспыхивали (оказывается, ёмкости проводников для этого достаточно при большой скорости нарастания напряжения) В общем, большое спасибо за помощь, буду учиться дальше...
  2. Применял LATA вместо PORTA, и вместе их их применял, работа программы оставалась такой же. До этого переключение светодиодов было при помощи функции switch, подумал, она не работает в прерываниях, заменил на умножение: code: tick_count += tick_count; PORTA = tick_count; (было и LATA=tick_count; результат тот же). Я скачал мануал с оф. сайта. Только ощущение, что там такой же пример кода (у меня interrupt не воспринимается, нужно добавлять двойное подчёркивание перед функцией, я понял это из-за того, что версия языка не C90, а C99): code: int tick_count; void interrupt tc_int(void) { if (TMR0IE && TMR0IF) { TMR0IF=0; ++tick_count; return; } // process other interrupt sources here, if required } Я уже вариантов тысячу перебрал. Ощущение, что по кругу хожу, вроде близко ответ, а понять не могу... Тот мануал, который вы предлагаете, вроде болле полный, есть информация про выход из прерывания, и возврат в мэйн, почитаю, может, там что-то найду. Спасибо за помощь.
  3. То, что я вставил в сообщение хоть как-то работает... Про код из мануала я имею в виду вот этот (стр. 142 мануала компилятора): Но они не работают сосвем... Танцы с портами типа PORTA &= 0xFF, никакого влияния не оказывают; Имя функции tc0Int(void) тоже не на что не влияет, функция перестаёт работать, если указана без параметров (вместо tc0Int(void) ставлю tc0Int(tick_count), и более-менее начинает работать...) От того, глобальная tick_count или локальная тоже ничего не меняется, объявление её статической тоже не на что не влияет. Присвоение типа Volitile тоже не решает проблему... int tick_count; void __interrupt(high_priority) tcInt(void) { if (TMR0IE && TMR0IF) { // any timer 0 interrupts? TMR0IF=0; ++tick_count; } if (TMR1IE && TMR1IF) { // any timer 1 interrupts? TMR1IF=0; tick_count += 100; } // process other interrupt sources here, if required return; } И вот этот (оттуда же): void __interrupt(irq(TMR0),high_priority) tc0Int(void) { TMR0IF=0; ++tick_count; return;} void __interrupt(irq(TMR1),high_priority) tc1Int(void) { TMR1IF=0; tick_count += 100; return; } Без прерываний я уже помигал, всё работает. Сейчас задача освоить прерывания. Вот я и спрашиваю, в чём главная ошибка. Почему при выходе из прерывания, светодиод гаснет? Нет никакой команды, гасящей светодиод, что заставляет его погаснуть? Я уже и все остальные функции портов отключал, думал, другие регистры заставляют диод погаснуть, ан нет... Ведь само по себе прерывание-то работает, светодиоды (6 шт.) вспыхивают по очереди, как и задумано, но по задуманному они должны гореть до того момента, пока не загорится каждый следующий светодиод, а они гаснут тут же, как зажглись... И время между вспышками получается как рассчитанное, значит, таймер работает... Спасибо, попробую...
  4. Здравствуйте! Учусь писать программы для pic18f4550 в MPLAB X IDE v5.30, версия языка С99. При попытке помигать светодиодом, возникает проблема с прерываниями от таймера 0. Светодиод мигает, но время его горения не более 30 микросекунд, едва различимо глазом (в протеусе вообще ничего не мигает)... В коде какая-то ошибка, не могу определить что именно не так. Перебрал кучу вариантов, толку нет. Код, скопированный из мануала компилятора тоже не работает почему-то. Подскажите, хотя бы в какую сторону копать? Код без конфигурационных битов: #include <xc.h> #pragma code high_vector=0x08 #define _XTAL_FREQ 8000000 void __interrupt(high_priority) ISR(unsigned int tick_count) { tick_count += tick_count; if (tick_count>32) tick_count=0x01; PORTA = tick_count; INTCONbits.TMR0IF=0; } void main(void) { TRISA = 0x00; PORTA = 0x7F; IPEN = 1; GIEL = 1; TMR0IP = 1; TMR0H = 0xFF; INTCON=0b11100000; T0CON=0b10000100; TRISB0 = 1; TRISB1 = 1; return; }
×
×
  • Создать...