реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Основы программирования PIC-контроллеров
Supersonic
сообщение Jan 16 2012, 11:48
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 7-06-11
Пользователь №: 65 542



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


--------------------
Пользователь № 0х10006
Go to the top of the page
 
+Quote Post
sparcmaster
сообщение Jan 16 2012, 12:03
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333



Не пробовали в гугле набрать "PIC моргание светодиодом"?..

Сообщение отредактировал sparcmaster - Jan 16 2012, 12:06
Go to the top of the page
 
+Quote Post
Supersonic
сообщение Jan 16 2012, 12:16
Сообщение #3





Группа: Новичок
Сообщений: 9
Регистрация: 7-06-11
Пользователь №: 65 542



Мне конкретно для 12 пика надо. потому что тут регистры имеют какие-то неведомые для меня названия. А в инете все для пик16


--------------------
Пользователь № 0х10006
Go to the top of the page
 
+Quote Post
sparcmaster
сообщение Jan 16 2012, 12:38
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333



Цитата(Supersonic @ Jan 16 2012, 16:16) *
Мне конкретно для 12 пика надо.

Вот конкретно для 12 пика и спросите гугл.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 17 2012, 10:48
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



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

Go to the top of the page
 
+Quote Post
xemul
сообщение Jan 17 2012, 11:01
Сообщение #6



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



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

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

"А других глобусов у вас нет?"
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 17 2012, 11:10
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(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
            }
        }

    }

}

Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 17 2012, 11:29
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Herz @ Jan 17 2012, 15:10) *
Приведу пример примитивной программки ...
Боюсь, что у ТС от этой примитивной програмки волосы встанут дыбом, и он с криком убежит на волю в пампасы laughing.gif
Go to the top of the page
 
+Quote Post
Herz
сообщение Jan 17 2012, 11:56
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



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

Да ладно Вам, он же с "атмегами" раньше работал, программист ведь...
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Jan 17 2012, 12:07
Сообщение #10





Guests






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

Для задания режимов работы портов регистра GPIO используется регистр TRISIO. По умолчанию (после сброса) все порты конфигурированы как входы.
Предварительно нужно выбрать режим порта аналоговый/цифровой в регистре ANSEL. По умолчанию, порты допускающие такое переключение, установлены в аналоговый режим. Еще в начале работы программы нужно выключить компаратор (регистр CMCON). По умолчанию, он также включен. Подробности найдете в даташите.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 16:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01497 секунд с 7
ELECTRONIX ©2004-2016