Показать сообщение отдельно
Старый 05.10.2009, 11:42   #328   
Форумец
 
Сообщений: 1,532
Регистрация: 19.02.2009
Возраст: 54
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от RN3QGA Посмотреть сообщение
Значит получается прямая зависимость от количества прерываний, но все таки одно не понял, как организовать выбор разных подпрограмм (может не совсем корректно сказано конечно), ну то есть если переменная 1 то так мигаем, если 2 то по другому, если 3 то по третьему, я конечно могу предположить, что можно в зависимости от их количества делать проверку, то есть в нашем случае к примеру. Теоретически все вроде выресовывается так, но можно ли так, а практически ей богу не соображу вообще. Че й то заклинило можно сказать. и еще немного:
Вариантов реализации выбора разных подпрограмм много. Вот код с применением case , в Си это switch.
Код:
program Test_Program;
var count, oldstate, g, old_GPIO, flash: byte;
procedure interrupt; // подпрограмма обработки прерываниий
begin
if TestBit(INTCON, T0IF) = 1 then
begin
count := count+1;
//if g = 255 then
//begin
if count > flash then
begin
GPIO := old_GPIO;
old_GPIO := not(old_GPIO) and 0x07;
count := 0;
end;
// end
//else
//GPIO := 0x07;
ClearBit(INTCON, T0IF);
end
end;
procedure Init; // подпрограмма инициализации
begin
TRISIO := 0x18;
GPIO := 0x07;
OPTION_REG := 0x87; // настройка TMR0, прерывания будут каждые 66,304 ms
INTCON.T0IE := 1;
INTCON.GIE := 1;
count := 14;
oldstate := 0;
g := 0;
old_GPIO := 0;
OSCCAL := OSCCAL;
asm
bsf   STATUS, RP0
call  0x3FF
movwf OSCCAL
bcf   STATUS, RP0
end;
end;
begin
Init;
while true do
begin
if Button(GPIO, 4, 10, 0) then oldstate := 255;
if oldstate and Button(GPIO, 4, 1, 1) then
begin
g := g+1;
oldstate := 0;
end;
case g of
0: flash := 1; // здесь может быть целая подпрограмма, а не один оператор
1: flash := 4;
2: flash := 8;
3: flash := 12
else
begin
g :=0;
flash := 1;
end;
end;
end;
end.
Теперь при нажатии кнопки переменная g при каждом нажатии кнопки увеличивается на 1. После чего в case проверяется значение переменной g, в зависимости от ее значения выполняется оператор (подпрограмма) после двоеточия. Светодиоды в зависимости от значения переменной flash моргают быстрее или медленнее.
Про настройки таймера надо почитать datasheet, здесь перевод на русском http://www.microchip.ru/files/d-shee...12F629_675.pdf, а здесь книга про PIC16F84, но практически все подходит http://vrtp.ru/index.php?act=lib&COD...e&article=2388.

Последний раз редактировалось petrd; 20.09.2010 в 10:08.
  Ответить с цитированием