PIC мк. Эксперимент №1. Мигаем светодиодом.

Примечание: программы откомпилированы с помощью Hi-tech C compiler.

Задача:  Заставить светодиод мигать с заданной частотой.

Исходный материал: PIC16f628a и простенькая devboard.

led

English version

Все предельно просто, здесь используется стандартная схема подключения светодиода. Переходим непосредственно к коду.

Для начала нам необходимо дать понять компилятору какую частоту тактирования мы будем использовать. Делается это с помощью команды:

 #define _XTAL_FREQ 4000000 

Таким образом мы задали частоту 4 МГц.

Маленькое отступление: Мы будем использовать кварц с частотой 4МГц, которая дальше делится делителем на 4. Компилятор Hi-tech с помощью оператора  _delay(n) может выполнять максимум 197120 циклов. Следовательно, в нашем случае максимальное время макроса __delay_ms(n) = 197.12 мс .

Дальше выставим биты конфигурации:

__CONFIG(MCLREN & UNPROTECT & WDTDIS); 

MCLREN – включаем возможность сброса программы.

UNPROTECT - отключаем защиту кода.

WDTDIS - выключаем сторожевой таймер.

Дальнейший код разжевывать смысла нету, поэтому выкладываю все целиком:

#include <htc.h>
#define _XTAL_FREQ 4000000 // Частота 4 МГц

// Config: ext reset, no code protect, no watchdog
__CONFIG(MCLREN & UNPROTECT & WDTDIS);

unsigned char i;  // Переменная для счетчика

void main() {
	TRISB = 0x00;   // Порт В на выход
    PORTB = 0x00;   // Выключаем все выходы порта В
        for (;;)  {      // Запускаем бесконечный цикл
        RB0 = 0;
        __delay_ms(100);  // Пауза 200 мс
        __delay_ms(100);
 	    RB0 = 1;
              // Цикл паузы 800 мс
              for ( i = 0; i < 8; i++) {
              __delay_ms(100);
              }

    }

}

PIC мк. Эксперимент №1. Мигаем светодиодом.: 47 комментариев

  1. Добрый день, а кокой именно у Вас компилятор???
    Пытаюсь повторить Ваш код на 9.50 – не компилируется и выдает ошибку:
    Error[499]: undefined symbol:
    __delay_ms

  2. Hi-tech 9.71

    Такая ошибка вроде вылазит если слишком большое число в скобках указать. Если хотите дайте email, я вышлю вам свой.

  3. в том то и прикол что код 1:1 Ваш набираю, просто уткнулся с тем что с фиксированными задержками НТ-PCC как то криво работает
    А почта разве не показывается вам? я ж ввожу адрес перед тем как сообщение писать

  4. Добрый вечер Сергей. Посмотрел то что вы мне прислали, как я и подозревал у Вас версия компилятора ПРО, к сожалению…
    Ладно буду разбираться с версией Стандарт.

  5. Блин бред какойто с этими задержками, поставил Ваш компилятор функции задержек заработали – но!!!
    с кварцем 4МГц команда __delay_ms(100) выдает строго 100мС.
    вытавляю кварц 10МГц и уже не 100, а всего только 99,691600 мС.

  6. А почему только мне пришлось менять конфигурационные биты на: __CONFIG(MCLRE_ON & CP_OFF & WDTE_OFF);
    Я пробую делать этот проект в реале, но ничего не мигает.
    Может быть PIC16F628A нерабочий, но он и пишется и читается без проблем.
    Вышлете HEX готовый на этот мейл, для сверки.

  7. Почитал чуть дальше ваши стати, тут тоже кварц не подключен, но предполагается, что он есть?
    Если да, то ка его правильно включить? какой стороной кварц на какую ногу контроллера ? И если у меня есть кварц на 12000 то как менять код чтобы все работало с такими же задержками

  8. Если вам приходится менять конфигурационные биты, то значит у вас не та версия компилятора ( у меня hi-tech picc compiler 9.71). Можно сначала вашу версию в протеусе погонять проверить работоспособность кода.

    Кварц предполагается подключенным (если он не подключается ставится конфигурационный бит INTIO). Сторона кварца значения не имеет, подключается на 15 и 16 выводы + на каждую ногу емкости на землю примерно по 20 пФ.

    По поводу 12 МГц никогда не использовал это значение с 628, но менять надо будет строку:
    #define _XTAL_FREQ 4000000

    на
    #define _XTAL_FREQ 12000000
    и в конфиг дописать HS.
    А можно просто в конфиг дописать INTIO и ничего не менять и не подпаивать внешний кварц – все заработает.

    Если код все еще будет нужен – отпишитесь, скину.

  9. Скиньте на емейл мне вашу версию picc.
    Нужен ли #define _XTAL_FREQ 4000000 при INTIO ?
    При INTIO на ноги контроллера кроме vss и vdd надо что-то подключать?

  10. Отправил весь проект. Подозреваю, что в протеусе не работает потому что вы забыли указать частоту кварца в настройках мк в самом протеусе.
    Там в архиве кстати лежит протеусовский проект, можете убедиться в работоспособности.

  11. Но резисторы то на 100 Ом надо да? просто у меня в наличии 330 Ом. А я спаял, думая что надо 10к, два по 4.7к последовательно.
    И Транзистор у меня 547.

  12. Не обязательно по 100, но 10 кОм в базу много будет, это мой косяк на картинке (протеусу кстати пофиг он все равно моделит). 330 Ом в базу сойдет – будет работать, а на светодиод уже вам решать, на сколько надо ограничить ток – на столько и вешайте.

  13. #include
    #define _XTAL_FREQ 4000000 // Частота 4 МГц

    // Config: ext reset, no code protect, no watchdog
    __CONFIG(MCLREN & WDTDIS & UNPROTECT & HS);

    unsigned char i; // Переменная для счетчика

    void main() {
    TRISC = 0x00; // Порт C на выход
    PORTC = 0x00; // Выключаем все выходы порта C
    for (;;) { // Запускаем бесконечный цикл
    RC0 = 1;
    RC4 = 1;
    __delay_ms(100); // Пауза 200 мс
    __delay_ms(100);
    RC0 = 0;
    // Цикл паузы 800 мс
    for ( i = 0; i < 8; i++) {
    __delay_ms(100);
    }
    }

    }
    Почему в этом коде не моргает RC0, но единичка на RC4 есть.
    Если поменять эти две строчки, сначала RC4 = 1; потом RС0 = 1; то работает как надо.

          • Не заметил что у вас там еще строчка.
            Вы в протеусе моделите? Как подключен светодиод, через транзик?

            Какой чип кстати программируете, может там есть прикол вроде открытого коллектора.

            • Все пробую только в железе , контроллер PIC16F676. Причем на PIC ССЫ можно по отдельности управлять битами на порту, не влияя на остальные

              • Аналогично и здесь, можно управлять отдельными, не влияя на остальные. Как светодиод подключен, через транзистор или напрямую? Если напрямую то сколько тока вливаете в светодиод? Может нагрузочной способности просто не хватает.

                • Диод подключен напрямую через резистор. Около 3 миллиампер. Я же говорю что на этой макетке но тот же опыт с другим компилятором проходит как задуманно. а сдесь как будто идет работа не с битом а срегистром целиком. Может где то галочку в настройках надо поставить или напрямую фаил приинклудиить, только как?

                  • Эх, что же вы даташит читать не хотите, а мне приходится это за вас делать…

                    Поставьте в начало кода строку ANSEL = 0;
                    Нужно вырубить аналоговые входы и перевести их в цифровой режим. Все работает.

                    • Упс… Уж как то стыдно стало, а я ведь где то это сегодня уже читал.
                      Готов компенсировать свою невнимательность 🙂
                      Да, заработало.
                      Но в принципе, на 16F630 должоно работать и без этой строчки

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

                    • Большое спасибо, ваша помощь не позволила отбить желание разбираться в Hi-Tech. По Пятигорскому времени 1:22 ночи, поэтому с легким сердцем пойду спать. Счастливо!

  14. Здравствуйте!
    Начинаю изучать МК. Подскажите пожалуйста пока не поздно — чем PIC лучше Atmel и наоборот.
    Смотрел на ChipDip там у Atmel за одинаковую цену характеристики на много лучше.
    Вот и не знаю какой лучше изучать….

    • Доброго времени суток.

      Нельзя просто взять и ответить на этот вопрос 🙂 Каждый решает сам какое семейство использовать, иногда это диктуется ценой, иногда привычкой использования, иногда количеством информации о данном виде мк.
      Попробуйте почитать статьи о разных мк, и о том как они программируются, может найдется сразу такое, которое вам кардинально не понравится. Это в случае если это хобби, если работа, то мое мнение, что разработчик должен уметь написать хотя бы простой код для любого семейства.

      P.S. Чип и дип это не очень хорошее место для покупки электроники. Например, pic18f14k50 например, имеет 16К памяти, USB, 10 битный АЦП и еще кучу ништяков всего за 2$. Подозреваю, что у атмела тоже существуют куча аналогов по схожей цене.
      P.P.S. А вообще я бы сейчас смотрел наверное на stm32…

  15. Уважаемый автор! Ваши публикации очень интересны и поучительны! Спасибо Вам! Но есть проблема. Я неоднократно выполнял трассировку кода PIC16Fxxx в Proteus, все очень удобно и наглядно. Начал осваивать C. Пытаюсь повторить Ваши уроки. Но никак не могу заставить Proteus работать в пошаговом режиме. Точнее, сам режим работает, но окно Source Code отсутствует и все происходит вслепую. Судя по отзывам в Сети, Proteus позволяет отслеживать шаги, но как это сделать – нигде не указано. Пожалуйста, опубликуйте урок, как подключить проект на C к Proteus и как просмотреть его функционирование по шагам. Я использую компилятор HI-TECH Software ver. 9.71. Разумеется, сама компиляция (по F10) проходит нормально, генерация HEX-файла происходит. А дальше как? Максимум что можно – подключить этот HEX к контроллеру и запустить симуляцию “вслепую”, но это не интересно. Помогите пожалуйста.

    • 1. Окно сорс код может не открываться если было когда-то закрыто, для его восстановления выберите Debug->Source code window
      2. Насколько я знаю, для отладки необходим не HEX файл, а COF (Хайтеч обычно кладет его рядом с хексом, с точно таким же названием)

      Урок не планировал делать, если не разберетесь – пишите, на след неделе может будет время, постараюсь показать, что смогу.

  16. Здравствуйте уважаемый автор! Огромное Вам спасибо, все получилось! С п.1 я сталкивался при трассировке программ ASM. Но без рекомендации п.2 строка CPU Source Code в меню Debug в принципе отсутствует. Подстановка файла nn.c в различные поля ничего не давала. Про файл типа COF (его почему-то зовут COFF) в Сети много разговоров, но для чего он нужен, где его прописывать – ничего! Считается, что все умные, знают. А я вот столкнулся впервые, в программах на ASM этого нет. Спасибо! Руки чешутся попробовать Ваши уроки.

  17. простите за мегатупой вопрос, но как можно включить светодиод(ы) на RA4 и/или RA5
    void main (void){
    TRISA = 0b00000000;
    TRISB = 0b00000000;
    CMCON = 0x07;
    PORTA = 0;
    PORTB = 0;
    nRBPU = 0;
    PORTA = 0b00110000;} <- вот тут хочу включить, но в протеусе они гореть отказываются, понимаю, что сказывается недостаток образования…

    • Доброго времени суток

      RA5 – в принципе выходом быть не может, это только вход.
      RA4 – выходом быть может, но он OD (open drain), что значит, что ему требуется подтягивающий резистор, повесьте резак на питание и RA4 и все заработает.

  18. а чем отличается vdd и gnd, в протеусе, от батарейки/блока питания?
    в симуляторе всё хорошо и правильно работает, когда собрал на макетке вообще какой-то ужс происходит.. (контакты на макетке не тупят)

    • Ничем, это шины от блока питания.

      Когда собрали на макетке, что у вас с кварцем? Этот код заточен под внешни

      • кварц? внешнего нету.. код не этот, сам написал (коряво, не красиво и много, но работает в симуляторе 🙂 ) суть в том, что при нажатии на кнопочку1 – светодиоды, через uln2803 загораются в одну сторону, при нажатии на кнопочку2 – гаснут в другую сторону, нажал кнопку2 опять – загорелись.. ну и т.п…, так вот, кнопки подключены к ra5 и ra4, с резистором на 10к к +5, кнопочка замыкает -, вот, если оставляю vcc и gnd, то всё класс, а вот если тоже самое, но подключаю к батарейке (которая компонент в протеусе или на макетке), то всё начинает работать совсем не так как было с vcc и gnd.. вот и не понимаю, если это одно и тоже, то почему работает один вариант верно, а второй криво.. если не лень и есть время, то могу на почту перекинуть программку и модель в протеусе, покажете, где накосячил, если описал проблему совсем не понятно 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.