|
|
  |
Основы программирования PIC-контроллеров |
|
|
|
Jan 16 2012, 11:48
|
Группа: Новичок
Сообщений: 9
Регистрация: 7-06-11
Пользователь №: 65 542

|
Всем привет. раньше я работал только с атмегами, а сейчас задача с PIC12F675. Суть вопроса такова: если порт работает на выход, то значением на выходе управляет, насколько я понял, D-триггер. у него информационный вход управляется регистром GPIO, а тактирующий, согласно даташит, управляется регистром PORT. но я не нашел такого регистра, + ко всему компилятор ругается (нет такого регистра). Помогите хотя бы диодом поморгать)) Как изменять выходное состояние пинов?
--------------------
Пользователь № 0х10006
|
|
|
|
|
Jan 16 2012, 12:16
|
Группа: Новичок
Сообщений: 9
Регистрация: 7-06-11
Пользователь №: 65 542

|
Мне конкретно для 12 пика надо. потому что тут регистры имеют какие-то неведомые для меня названия. А в инете все для пик16
--------------------
Пользователь № 0х10006
|
|
|
|
|
Jan 16 2012, 12:38
|
Частый гость
 
Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333

|
Цитата(Supersonic @ Jan 16 2012, 16:16)  Мне конкретно для 12 пика надо. Вот конкретно для 12 пика и спросите гугл.
|
|
|
|
|
Jan 17 2012, 11:01
|
    
Группа: Свой
Сообщений: 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 "А других глобусов у вас нет?"
|
|
|
|
|
Jan 17 2012, 11:10
|

Гуру
     
Группа: Модераторы
Сообщений: 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 } }
}
}
|
|
|
|
Guest_@Ark_*
|
Jan 17 2012, 12:07
|
Guests

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