Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Основы программирования PIC-контроллеров
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Supersonic
Всем привет. раньше я работал только с атмегами, а сейчас задача с PIC12F675. Суть вопроса такова: если порт работает на выход, то значением на выходе управляет, насколько я понял, D-триггер. у него информационный вход управляется регистром GPIO, а тактирующий, согласно даташит, управляется регистром PORT. но я не нашел такого регистра, + ко всему компилятор ругается (нет такого регистра). Помогите хотя бы диодом поморгать)) Как изменять выходное состояние пинов?
sparcmaster
Не пробовали в гугле набрать "PIC моргание светодиодом"?..
Supersonic
Мне конкретно для 12 пика надо. потому что тут регистры имеют какие-то неведомые для меня названия. А в инете все для пик16
sparcmaster
Цитата(Supersonic @ Jan 16 2012, 16:16) *
Мне конкретно для 12 пика надо.

Вот конкретно для 12 пика и спросите гугл.
XVR
Цитата(Supersonic @ Jan 16 2012, 15:48) *
Суть вопроса такова: если порт работает на выход, то значением на выходе управляет, насколько я понял, D-триггер. у него информационный вход управляется регистром GPIO, а тактирующий, согласно даташит, управляется регистром PORT.
Не берите в голову - это аппаратная реализация пинов порта. Програмно они выглядят как регистр GPIO, вот в него и пишите

xemul
Цитата(Supersonic @ Jan 16 2012, 16:16) *
Мне конкретно для 12 пика надо. потому что тут регистры имеют какие-то неведомые для меня названия.

Если пишете на асме, то загляните в "%ProgramFiles%\Microchip\MPASM Suite\P12F629.INC".
Если на C для picc - в "<picc_install_dir>\include\pic12f629.h"
(для других компиляторов аналогично)
Цитата
А в инете все для пик16

"А других глобусов у вас нет?"
Herz
Цитата(Supersonic @ Jan 16 2012, 13:48) *
Всем привет. раньше я работал только с атмегами, а сейчас задача с PIC12F675. Суть вопроса такова: если порт работает на выход, то значением на выходе управляет, насколько я понял, D-триггер. у него информационный вход управляется регистром GPIO, а тактирующий, согласно даташит, управляется регистром PORT. но я не нашел такого регистра, + ко всему компилятор ругается (нет такого регистра). Помогите хотя бы диодом поморгать)) Как изменять выходное состояние пинов?

Какой компилятор? Если HI-TECH, поинтересуйтесь содержимым файла pic12f6x.h из папки include. Станет понятно, как названы регистры. Приведу пример примитивной программки для управления RGB-светодиодом подсветки на PIC12F629, может, сгодится:

Код
/************************************************************/
/* Программа управления RGB светодиодом подсветки часов     */
/* при помощи программного ШИМ  на    PIC12F629 (вариант 1) */
/************************************************************/

#include <pic.h>



#define        RO    GPIO0                // red output, pin 7        
#define        GO    GPIO1                // green output, pin 6
#define        BO    GPIO2                // blue output, pin 5

#define        PWM_Period        for    (i=1; i>0; i++)\
                {\
                if (QR)\
                    {RO = 1; QR--;}\
                else    RO = 0;\
                if (QG)\
                    {GO = 1; QG--;}\
                else    GO = 0;\
                if (QB)\
                    {BO = 1; QB--;}\
                else    BO = 0;\
                }


main()
{
unsigned char Q, Q1, Q2, i, k;
unsigned char     QR, QG, QB;        // к-т заполнения ШИМ для
                                // каждого цвета
unsigned char    step;            // шаг изменения яркости
                                // в периодах ШИМ


INTCON = 0;                        // disable interrupts

GPIO = 0;                        // init GPIO
CMCON = 0x07;                    // comparator module disabled
TRISIO = 0b00101000;            // GP0 - GP2 - outputs
OPTION = 0b00000001;            // prescaler TMR0 1:4

while    (1)
    {
/* Palette 1                         */
step = 18;
    for    (Q = 253, Q1 = 0; Q > Q1; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QB = Q;             // синий падает
            QG = Q1; QR = 0;    // зелёный растёт, красного нет
            PWM_Period
            }
        }
    for    (Q1 = 0; Q > 0; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QR = Q1;            // красный растёт
            QG = 125, QB = Q;     // синий падает
            PWM_Period
            }
        }
    for    (Q = 125; Q > 0; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QR = Q1;            // красный растёт
            QG = Q; QB = 0;     // зелёный падает, синего нет
            PWM_Period
            }
        }
/* Palette 2                         */
    QB = 0;                        // синего нет
    step = 24;
    for    (Q = 253; Q > 0; Q--)
        {
        for    (k = step; k > 0; k--)
            {
            QR = Q;             // красный падает
            QG = 253-Q;            // зелёный растёт
            PWM_Period
            }
        }
/* Palette 3                         */
    step = 38;
    for    (Q = 253, Q1 = 0; Q > Q1; Q-=2, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QG = Q;             // зелёный падает
            QR = Q1; QB = Q1;    // красный и синий растут
            PWM_Period
            }
        }
    for    (; Q1 > 0; Q+=2, Q1--)
        {
        for    (k = step; k > 0; k--)
            {
            QB = Q;             // синий растёт
            QR = Q1; QG = Q1;    // красный и зелёный падают
            PWM_Period
            }
        }
    


/* Palette 4                         */
    step = 24;
    QG = 0;                        // зелёного нет
    for    (Q = 253; Q > 0; Q--)
        {
        for    (k = step; k > 0; k--)
            {
            QB = Q;             // синий падает
            QR = 253-Q;            // красный растёт
            PWM_Period
            }
        }

/* Palette 5                         */
    step = 38;
    for    (Q = 253, Q1 = 0; Q > Q1; Q-=2, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QR = Q;             // красный падает
            QG = Q1; QB = Q1;    // зелёный и синий растут
            PWM_Period
            }
        }
    for    (; Q1 > 0; Q+=2, Q1--)
        {
        for    (k = step; k > 0; k--)
            {
            QG = Q;             // зелёный растёт
            QR = Q1; QB = Q1;    // красный и синий падают
            PWM_Period
            }
        }

/* Palette 6                         */
step = 18;
    for    (Q = 253, Q1 = 0; Q > Q1; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QG = Q;             // зелёный падает
            QR = Q1; QB = 0;    // красный растёт, синего нет
            PWM_Period
            }
        }
    for    (Q1 = 0; Q > 0; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QB = Q1;            // синий растёт
            QR = 125, QG = Q;     // зелёный падает
            PWM_Period
            }
        }
    for    (Q = 125; Q > 0; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QB = Q1;            // синий растёт
            QR = Q; QG = 0;     // красный падает, зелёного нет
            PWM_Period
            }
        }
/* Palette 7                         */
    step = 38;
    for    (Q = 253, Q1 = 0; Q > Q1; Q-=2, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QB = Q;             // синий падает
            QG = Q1; QR = Q1;    // зелёный и красный растут
            PWM_Period
            }
        }
    for    (; Q1 > 0; Q+=2, Q1--)
        {
        for    (k = step; k > 0; k--)
            {
            QR = Q;             // красный растёт
            QG = Q1; QB = Q1;    // зелёный и синий падают
            PWM_Period
            }
        }

/* Palette 8                         */
step = 18;
    for    (Q = 253, Q1 = 0; Q > Q1; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QR = Q;             // красный падает
            QB = Q1; QG = 0;    // синий растёт, зелёного нет
            PWM_Period
            }
        }
    for    (Q1 = 0; Q > 0; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QG = Q1;            // зелёный растёт
            QB = 125, QR = Q;     // красный падает
            PWM_Period
            }
        }
    for    (Q = 125; Q > 0; Q--, Q1++)
        {
        for    (k = step; k > 0; k--)
            {
            QG = Q1;            // зелёный растёт
            QB = Q; QR = 0;     // синий падает, красного нет
            PWM_Period
            }
        }
/* Palette 9                         */
    step = 24;
    QR = 0;                        // красного нет
    for    (Q = 253; Q > 0; Q--)
        {
        for    (k = step; k > 0; k--)
            {
            QG = Q;             // зелёный падает
            QB = 253-Q;            // синий растёт
            PWM_Period
            }
        }

    }

}

XVR
Цитата(Herz @ Jan 17 2012, 15:10) *
Приведу пример примитивной программки ...
Боюсь, что у ТС от этой примитивной програмки волосы встанут дыбом, и он с криком убежит на волю в пампасы laughing.gif
Herz
Цитата(XVR @ Jan 17 2012, 13:29) *
Боюсь, что у ТС от этой примитивной програмки волосы встанут дыбом, и он с криком убежит на волю в пампасы laughing.gif

Да ладно Вам, он же с "атмегами" раньше работал, программист ведь...
@Ark
Цитата
Всем привет. раньше я работал только с атмегами, а сейчас задача с PIC12F675. Суть вопроса такова: если порт работает на выход, то значением на выходе управляет, насколько я понял, D-триггер. у него информационный вход управляется регистром GPIO, а тактирующий, согласно даташит, управляется регистром PORT. но я не нашел такого регистра, + ко всему компилятор ругается (нет такого регистра). Помогите хотя бы диодом поморгать)) Как изменять выходное состояние пинов?

Для задания режимов работы портов регистра GPIO используется регистр TRISIO. По умолчанию (после сброса) все порты конфигурированы как входы.
Предварительно нужно выбрать режим порта аналоговый/цифровой в регистре ANSEL. По умолчанию, порты допускающие такое переключение, установлены в аналоговый режим. Еще в начале работы программы нужно выключить компаратор (регистр CMCON). По умолчанию, он также включен. Подробности найдете в даташите.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.