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