Большой Воронежский Форум
Страница 11 из 43
« Первая < 567891011 12131415161721 > Последняя »
»Радиолюбитель>PIC контроллеры. Программаторы и первый проект на PIC
petrd 12:28 28.09.2009

Сообщение от RN3QGA:
Вот еще вопрос.
Пытаюсь сделать примерно следующее:
все время выполняется только код1.

Код надо показать. [Ответ]
RN3QGA 18:28 28.09.2009
Пример не рабочий.

Сообщение от :
program SvetPIC16F629;
{$DEFINE LED_OA}
var g: byte;
begin
TRISIO := 0x18;
{$IFDEF LED_OA}
GPIO := 7;
{$ELSE}
GPIO := 0;
{$ENDIF}
g := 1;
while true do
begin
if Button(GPIO, 4, 10, 0) then
begin
if g = 8 then g := 1;
{$IFDEF LED_OA}
GPIO := (not g) and 7;
Delay_ms(100);
g := g shl 1;
GPIO := 7;
{$ELSE}
GPIO := g;
Delay_ms(100);
g := g shl 1;
GPIO := 0;
{$ENDIF}
end
else
begin
trisio:=0;
Gpio:=0xff;
Delay_ms(300);
Gpio:=0x00;
end;
end ;
end.

В идеале идея заключается в том, чтобы при нажатии бежали огоньки, а без просто мигали.,
Но в будущем хочу сделать, чтоб допустим одной кнопкой переключать разные действия типа программы, друг за другом.
А вот это работает.

Сообщение от :
program Pic12F629Svet;
begin { Main program }
TRISIO:=0;
While true do
begin
if Button (GPIO, 4, 10, 0) then
begin
GPIO:=0x00;
Delay_ms(100);
GPIO:=0xff;
Delay_ms(100);
end
else
begin
GPIO:=0x00;
Delay_ms(500);
GPIO:=0xff;
Delay_ms(500);
end;
end;
end.

Все, разобрался нашел ошибку - надо так:

Сообщение от :
program SvetPIC16F629;
{$DEFINE LED_OA}
var g: byte;
begin
TRISIO := 0x18;
{$IFDEF LED_OA}
GPIO := 7;
{$ELSE}
GPIO := 0;
{$ENDIF}
g := 1;
while true do
begin
if Button(GPIO, 4, 10, 0) then
begin
if g = 8 then g := 1;
{$IFDEF LED_OA}
GPIO := (not g) and 7;
Delay_ms(100);
g := g shl 1;
GPIO := 7;
{$ELSE}
GPIO := g;
Delay_ms(100);
g := g shl 1;
GPIO := 0;
{$ENDIF}
end
else
begin
Gpio:=0xff;
Delay_ms(300);
Gpio:=0x00;
Delay_ms(300);
end;
end ;
end.

Вот возник вопрос еще , а у Delay_ms секунды переменной быть могут? [Ответ]
petrd 21:02 28.09.2009

Сообщение от RN3QGA:
Пример.
В идеале идея заключается в том, чтобы при нажатии бежали огоньки, а без просто мигали.,
Но в будущем хочу сделать, чтоб допустим одной кнопкой переключать разные действия типа программы, друг за другом.
А вот это работает.

Две ошибки. Пока писал Вы все исправили, но я поясню ошибки.
Первая. Зачем Вы в цикле сделали это:
Код:
trisio:=0;
Тем самым Вы все выводы (кроме GP3, так как он никогда не может быть выходом) перевели на выход, а как же GP4, он должен быть входом, на нем же кнопка. Т.о. выполнив эту команду один раз кнопка уже обрабатываться не будет никогда. TRISIO Вы уже настроили в начале программы и не трогайте его больше (во всяком случае в Вашей программе этого не требуется).
Вторая. Вот здесь:
Код:
...
else
begin
trisio:=0;  // это Вы уберёте (уже убрали)
Gpio:=0xff;
Delay_ms(300);
Gpio:=0x00;
end;
......
Между погашенными СД (Gpio:=0xff) и заженными (Gpio:=0x00) явно пройдет время 300 mS (Delay_ms(300)), а вот после Gpio:=0x00; программа заканчивает цикл, проверяет кнопку(т.е читает GPIO, в т.ч и GP4), а она как бы всегда нажата. И получили вечно работающуюю первую часть кода if ...then....else. При таком коде, даже если кнопка работала бы, и была бы ненажатой, программа очень быстро от Gpio:=0x00; снова попадала бы Gpio:=0xff; и как говорится Вы и глазом не успевали моргнуть и СД всегда казались бы погашенными, точнее это можно по симулятору увидеть.

Сообщение от :
Вот возник вопрос еще , а у Delay_ms секунды переменной быть могут?

Не понял вопроса, если 10 сек, то Delay_ms(10000), если про изменение задержки по ходу программы, то см. в помощи вот эту прцедуру
Код:
procedure Vdelay_ms(time_in_ms : word)
[Ответ]
RN3QGA 21:14 28.09.2009
Все понял. Спасибо.
Про Delay - Да совершенно верно, менять задержку по ходу программы.
Буду смотреть.

Сообщение от :
procedure Vdelay_ms(time_in_ms : word)

Теперь еще про кнопку.
А как можно обработать поочередно нажатие.
чтоб нужная часть кода срабатывала, допустим 1 раз - 1код., еще раз 2 код, и т д. по кругу? [Ответ]
dr.ON 21:22 28.09.2009
petrd, А вы с емкостными кнопками, а точнее со слайдерами дело не имели случаем?
Пытаюсь тут сделать его по микрочиповской технологии( 2 треугольных электрода), получается ерунда полнейшая. Чувствительность к боковому смещению пальца просто ужасающая.

P.S. Кстати правильную форму электродов ктонибудь знает? [Ответ]
petrd 21:24 28.09.2009

Сообщение от RN3QGA:
А как можно обработать поочередно нажатие.
чтоб нужная часть кода срабатывала, допустим 1 раз - 1код., еще раз 2 код, и т д. по кругу?

Гонют меня от ПК. Кратко - надо завести переменную-счетчик, которая меняется при каждом нажатии кнопки, а от ее состояния и плясать. Подробнее, если надо, завтра. [Ответ]
RN3QGA 21:25 28.09.2009
Так с

Сообщение от :
procedure Vdelay_ms(time_in_ms : word)

вроде разобрался.
А вообще прикольная весчь PIC вот только знаний маловато.
на одном желании далеко не уедешь.
Жена уже у виска неделю крутит, говорит хуже пацана увлекся не оттянешь, а оно просто надоело собирать кем - то придуманное хочется разобраться самому. [Ответ]
RN3QGA 21:27 28.09.2009
Я только хотел про переменную спросить, значит в верном направлении думаю, будем пробовать если не получиться спрошу. Спасибо.
Ну наверно что-то типа этого в примитиве конечно, работает но с одной особенностью.
Чем больше задержка Delay тем кнопка не точно по нажатию срабатывает. Тратиться время я это понимаю но как обойти. Чтоб кнопка на нажатие четко срабатывала, а то перескакивает бывает.

Сообщение от :
program Pic12F629Svet;
var i,r:word;
begin { Main program }
r:=1;
i:=1;
TRISIO:=0;
While true do
begin
if r=1 then i:=1;
if r=2 then i:=50;
if r=3 then i:=200;
if r=4 then i:=700;
if r=5 then i:=2000;
GPIO:=0x00;
VDelay_ms(i);
GPIO:=0xff;
VDelay_ms(i);
if Button (GPIO, 4, 1, 0) then
begin
r:=r+1;
if r=6 then
begin
r:=1;
i:=1;
end;

end;
end;
end.

[Ответ]
petrd 08:44 29.09.2009

Сообщение от RN3QGA:
Я только хотел про переменную спросить, значит в верном направлении думаю, будем пробовать если не получиться спрошу. Ну наверно что-то типа этого в примитиве конечно, работает но с одной особенностью. Чем больше задержка Delay тем кнопка не точно по нажатию срабатывает. Тратиться время я это понимаю но как обойти. Чтоб кнопка на нажатие четко срабатывала, а то перескакивает бывает.

Использование функций задержки - непозволительная роскошь, контроллер во время их исполнения ничего делать не может. Выход - использовать прерывания и таймеры. Посмотрите пост №42, должно стать понятнее. [Ответ]
petrd 08:50 29.09.2009

Сообщение от dr.ON:
petrd, А вы с емкостными кнопками, а точнее со слайдерами дело не имели случаем?
Пытаюсь тут сделать его по микрочиповской технологии( 2 треугольных электрода), получается ерунда полнейшая. Чувствительность к боковому смещению пальца просто ужасающая.
P.S. Кстати правильную форму электродов ктонибудь знает?

Нет не имел, но кой-чего читал. А Вы на чем пробовали делать? Просто я думаю, что под эту задачу встроенные CTMU модули наиболее заточены. Ну и еще кой-какие мысли есть. [Ответ]
RN3QGA 07:58 30.09.2009
А чегойто я подключил к GP3 (4 нога P12F626) диод а он у меня не светится, хотя трисы в 0 выставлены, светятся только G 0,1,2. Как то одтельно подключать на до что ли ?
Про таймеры и прирывания честно говоря не совсем понятно т.к. на Си, я 0.
Но попробую разобраться если что спрошу.
Спасибо за помощь. [Ответ]
petrd 08:19 30.09.2009

Сообщение от RN3QGA:
А чегойто я подключил к GP3 (4 нога P12F626) диод а он у меня не светится, хотя трисы в 0 выставлены, светятся только G 0,1,2. Как то одтельно подключать на до что ли ?
Про таймеры и прирывания честно говоря не совсем понятно т.к. на Си, я 0.
Но попробую разобраться если что спрошу.
Спасибо за помощь.

1. GP3 не может работать на выход, только как вход или внешний сброс.
2. К Си надо присматриваться, ибо мало кто работает с контроллерами на Паскале, а поэтому и помочь мало кто сможет.
3. С прерываниями и таймерами ничего сложного нет, просто надо один раз разобраться, а без них дальше никуда. [Ответ]
RN3QGA 08:50 30.09.2009
Да понимаю я что к Си - но в Пасе хоть знакомый синтаксис, уж не выпускалиб тогда его вообще может уже бы и начал изучать,а так уж очень заманчиво много знакомого.
Ну уж не обессутьте как надаем просто скажите я пойму.
Если не затруднит может переведете сей код под PIC12F629 на Пас уж простите за наглость.
Но мне так разобраться проще.

Сообщение от :
unsigned short counter, oldstate, step;
void interrupt(){ // подпрограмма обработки прерывания
if(INTCON.T0IF){
counter++;
if (counter>1){
PORTB=~PORTB&0x0f|step;
counter=0;
}
INTCON.T0IF=0;
}
}// interrupt
void Init(){ // подпрограмма начальной инициализации
CMCON=7; // все входы как цифровые, компараторы отключены
TRISA=0xff; // настроили выводы PORTA на вход
TRISB=0; // настроили выводы PORTB на вывод
OPTION_REG = 0x87; // настройка TMR0, прерывания будут каждые 66,304 ms
INTCON.T0IE=1; // разрешили прерывания по переполнению TMR0
INTCON.GIE=1; // разрешили все прерывания
step=0;
oldstate=0;
}// Init
void main(){
Init();
while(1){ // организовали вечный цикл
if (Button(&PORTA, 0, 1, 0))
oldstate = 1;
if (oldstate && Button(&PORTA, 0, 1, 1)){ // ждем отпускания кнопки (переход от 0 к 1)
step=~step&0x80;
PORTB|=step;
oldstate = 0;
}
}
}//~

Если уж не весь код то хоть первую часть до While. Как я понял код разбит на 2 части первая подпрограмма в которой можно делать условия выполнения, а вторая бесконечный цикл где постоянно выполняется что-то. но мне не понятно контроллер все время "заглядывает" с начала подпрограммы или нет?
Допустим в первой части где эти самые прерывания, стоят - переменные и команды, например нажатия кнопок или изменения чего нибудь а как эти изменения будут попадать в While ведь он я понял выполняется сам по себе. Или наоборот в While все переменные и команды, например нажатия кнопок или изменения чего нибудь?
Разьясните если не напряжно. [Ответ]
petrd 16:00 30.09.2009

Сообщение от RN3QGA:
Как я понял код разбит на 2 части первая подпрограмма в которой можно делать условия выполнения, а вторая бесконечный цикл где постоянно выполняется что-то. но мне не понятно контроллер все время "заглядывает" с начала подпрограммы или нет?

Тогда уж сначала. Структура этой программы выглядит так:
Код:
program Name_Program;
// начало объявления констант, переменных, меток
//
//  конец объявления констант, переменных, меток
// начало объявления процедур и функций
procedure interrupt; // подпрограмма обработки прерываниий
begin
if TestBit(INTCON, T0IF) = 1 then
begin
// здесь код, указывающий что делать, если произошло переполнение TMR0
ClearBit(INTCON, T0IF); // стирать бит надо обязательно
end
end;
procedure Init;   // подпрограмма инициализации
begin
end;
// конец объявления процедур и функций
// далее основной код программы, именно отсюда и начинается ее выполнение
begin
Init;            // вызов процедуры инициализации
INTCON.T0IE := 1; // после этой команды разрешается работа прерываний таймера 0 при условии
// разрешения работы механизма прерываний
INTCON.GIE := 1; // после выполнения этой команды разрешена работа механизма прерываний
while true do    // отсюда и до конца код вечного цикла
begin
//код вечного цикла
end;
end.
Программа (как и все программы для МК) состоят из основного кода программы и вызовов процедур и функций из основного кода. В приведенном коде видно, что процедура Init вызывается из основного кода. А вот явного вызова процедуры interrupt не видно. Процедура вызова прерывания стоит особняком и она может быть вызвана в любом месте программы и в любое время, при условии разрешения работы механизма прерываний (INTCON.GIE := 1) и при возникновении определенного разрешенного события (например, INTCON.T0IE := 1). События для механизма прерываний - это выставление так называемых флагов-битов в определенных регистрах (например, регистр INTCON, бит T0IF, если этот бит равен 1, то произошло переполнение TMR0) . Остальное позже. [Ответ]
RN3QGA 22:11 30.09.2009
Ого. Ну это надо вникнуть подожду то что позже.
Буду осмысливать. Но как я понял без этого более менее, что - то путнее написать не пулуцца.
Огромное спасибо Петр.
С уважением RN3QGA. (зовут меня Игорь ну это вдруг послать куда нибудь захочется). [Ответ]
RN3QGA 10:25 02.10.2009
Вот тут подумал, Петр а может на конкретной задаче разобрать.
И я Вам меньше глупых вопросов задавать буду и Вам один раз написать.
Если конечно это Вас устроит. Я понимаю Вам не очень то интересно мигать светодиодами да еще и Паскаль вспоминать, но уж не обижайтесь на мою, отчасти лень, отчасти назойливость.
Просто редко сейчас находятся люди - ЛЮДИ. [Ответ]
petrd 15:44 02.10.2009

Сообщение от RN3QGA:
Вот тут подумал, Петр а может на конкретной задаче разобрать. И я Вам меньше глупых вопросов задавать буду и Вам один раз написать.
Если конечно это Вас устроит. Я понимаю Вам не очень то интересно мигать светодиодами да еще и Паскаль вспоминать, но уж не обижайтесь на мою, отчасти лень, отчасти назойливость.

Я извиняюсь за молчание, некогда было. Вот код. Он немного отличается от кода на Си, но суть таже. Три светодиода и кнопка. Нажать на кнопку, светодиоды моргают, еще раз нажать, не моргают. Использованы прерывания от TMR0, зато теперь контроллер не отвлекается на тупые задержки типа Delay_ms() и может делать еще что-то, здесь "еще что-то" пока только кнопка:
Код:
program Test_Program;
var count, oldstate, g, old_GPIO: byte;
procedure interrupt; // подпрограмма обработки прерываниий
begin
if TestBit(INTCON, T0IF) = 1 then
begin
count := count+1;
if g = 255 then
begin
if count>6 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, прерывания будут каждые 65,536 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 := not(g);
oldstate := 0;
end
end;
end.
Вставка на ассемблере - запись калибровочной константы внутреннего генератора. Что для чего в программе вечерком напишу. [Ответ]
RN3QGA 21:38 02.10.2009
У-ух Петр огромное спасибо.
Я вот единственное забыл сказать Вам, что я у себя на макетке переделал диоды, анодом к выводам, катодом на массу через R. Если это важно конечно. Ну я пока подожду с Вашего позволения комментария дабы лишних вопросов не задавать ну , а уж потом "держитесь".
И вопросик немного в сторону. В постах выше Вы "показали" свое железо для отладки, скажите если не секрет это для работы или для души приобретено, я не буду скрывать, в принципе я могу себе позволить приобрести ну скажем черта в банке, только вот оно мне нужно или нет понять не могу, стоит ли приобретать, просто я немного помешан с детства на электронике, вот только жизнь сложилась далеко от этого, но увлечение оказывается сильней, короче нужен совет пригодится это железо мне или достаточно на макетке собирать и мучать?
Но все остальное в силе через тернии к звездам. [Ответ]
petrd 21:51 02.10.2009

Сообщение от petrd:
Что для чего в программе вечерком напишу.

1. OPTION_REG := 0x87 - настройка TMR0.
Таймер работает от внутреннего генератора (период Fosc/4 = 1 мкс), такты поступают на предделитель 1:256 и дальше собственно в 8-разрядный счетчик TMR0. Итого, переполнение и выставление флага переполнения T0IF в регистре INTCON происходит каждые 1 х 256 х 256 = 65 536 мкс.
2. Код:
Код:
OSCCAL := OSCCAL;
asm
bsf   STATUS, RP0
call  0x3FF
movwf OSCCAL
bcf   STATUS, RP0
end;
Внутренний генератор PIC12F629 работает на частоте около 4 МГЦ, чтобы частота относительно точно соответствовала 4 Мгц производитель измеряет калибровочную константу, которая после записи в регистр калибровки OSCCAL подтягивает частоту внутреннего генератора почти точно к 4 МГц. Эту константу производитель засовывает в команду ассемблера
Код:
retlw xx (код 34xx)
и размещает ее в самой последней ячейке памяти программ, у нас эта ячейка имеет адрес 0x3FF. Команда
Код:
retlw xx
является командой выхода из подпрограммы с помещением в аккумулятор W константы xx. Для получения этой константы нужно вызвать подпрограмму, начинающуюся с адреса 0x3FF (call 0x3FF). После выполнения этой команды выполняется retlw xx, после которой сразу вылетаем из подпрограммы назад, но имеем в аккумуляторе W значение калибровочной константы. После чего помещаем ее в OSCCAL ( movwf OSCCAL) и генератор подстраивается.
Обычно начинающие пользуются простыми программаторами, которые успешно затирают эту константу, после чего в последней ячейке читается 3FFF, что соответствует команде ADDLW 0xFF, а следующей выполняемой командой должна быть команда с адресом 0x400, а так как физически такого адреса нет, то программа переходит на адрес 0x0000, т.е. на начало программы и получаем ненужный вечный цикл, вешающий программу. В результате в точку из которой подпрограмма вызывалась уже не вернуться. В этом случае применение этого кода не имеет смысла. Поэтому если временная точность не нужна, то этот кусок кода можно просто не использовать. Продвинутые программаторы не затирают эту константу, PICKit2 может даже провести калибровку и восстановить эту константу. Если константа затерта, то если есть возможность лучше в ячейку по адресу 0x3FF записать число 0x3480, что соответствует середине диапазона подстройки. Думаю, что если использовать чужие прошивки использующие калибровочную константу, а в прошиваемом контроллере она затерта, то и работать не будет. Вроде так. [Ответ]
petrd 22:36 02.10.2009

Сообщение от RN3QGA:
У-ух Петр огромное спасибо.
Я вот единственное забыл сказать Вам, что я у себя на макетке переделал диоды, анодом к выводам, катодом на массу через R. Если это важно конечно. Ну я пока подожду с Вашего позволения комментария дабы лишних вопросов не задавать ну , а уж потом "держитесь".
И вопросик немного в сторону. В постах выше Вы "показали" свое железо для отладки, скажите если не секрет это для работы или для души приобретено, я не буду скрывать, в принципе я могу себе позволить приобрести ну скажем черта в банке, только вот оно мне нужно или нет понять не могу, стоит ли приобретать, просто я немного помешан с детства на электронике, вот только жизнь сложилась далеко от этого, но увлечение оказывается сильней, короче нужен совет пригодится это железо мне или достаточно на макетке собирать и мучать?
Но все остальное в силе через тернии к звездам.

1. Диоды - не важно.
2. Железо мое, использую для себя и для работы. Если заниматься постоянно, то удобно, когда много делаешь макетки лепить и сопли с них убирать запаришься, я прошел через это. А если это порыв и деньги есть, то все равно жалеть не придется.
3. Сам такой, но от себя не уйти. С 1988 года в ВС СССР, потом РФ, два года окончательно никак с ними не попрощаюсь из-за должка в виде квартиры. За последние два года пришлось наверстывать, что за 19 лет не успел. [Ответ]
RN3QGA 07:03 03.10.2009
О Петр. Да мы с Вами еще и коллеги.
Я тоже из бывших служивых, правда еще старлеем уволился и не стал ничего дожидаться. Если честно то не жалею. Но это тема другая не будем засорять эфир как говорят радиолюбители.
Ок на счет девайса подумаю, може придется купить, уж очень хочется. С кодом буду разбираться, вопросы задам по ходу.
Да чуть не забыл: о константах которые программатор затирает.
я использую самостейный программатор Экстра пик. Мне нужно проверить затирает он или нет для начала? , и если затирает (а скорее всего затирает), то необходимо будет ручками постоянно допписывать

Сообщение от :
Если константа затерта, то если есть возможность лучше в ячейку по адресу 0x3FF записать число 0x3480

или только в том случае когда нужна точность.
Все ли я правильно понял? [Ответ]
petrd 13:58 03.10.2009

Сообщение от RN3QGA:
Да чуть не забыл: о константах которые программатор затирает. я использую самостейный программатор Экстра пик. Мне нужно проверить затирает он или нет для начала? , и если затирает (а скорее всего затирает), то необходимо будет ручками постоянно допписыватьили только в том случае когда нужна точность. Все ли я правильно понял?

Этот момент просто надо иметь ввиду. Программатор просто так не затирает, он затирает, когда его просят что-то записать или стереть. Если простой программатор и новый контроллер с калибровочной константой, то ничего не мешает вставить контроллер в программатор, прочитать его и допустим прямо на корпусе написать маркером две цифры, а когда надо подставить в прошивку их. Потеря калибровочной константы чревата когда используют чужие прошивки, использующие калибровочные константы, она просто может не заработать. Калибровкой можно и пренебречь, но есть случаи, когда в прошивках используют точные временные отсчеты и можно увидеть, что с одним контроллером она работает, а с другим нет, хотя они оба фактически рабочие. Об этом моменте просто надо знать. [Ответ]
RN3QGA 20:29 03.10.2009
И так ,скопировал, компильнул, прошил, включил - горят все три светодиода но реакции на кнопку нет. Закоментировал ASM - все заработало. Подцепил еще светодиод на GP5 и кнопку на GP3 для продолжения экспериментов. Светодиод на GP5 не мигает. Видимо нужно настраивать, вроде бы этот вывод может работать на выход или я ошибаюсь. [Ответ]
petrd 20:43 03.10.2009

Сообщение от RN3QGA:
И так ,скопировал, компильнул, прошил, включил - горят все три светодиода но реакции на кнопку нет. Закоментировал ASM - все заработало. Подцепил еще светодиод на GP5 и кнопку на GP3 для продолжения экспериментов. Светодиод на GP5 не мигает. Видимо нужно настраивать, вроде бы этот вывод может работать на выход или я ошибаюсь.

Все так, просто GP5 из мигания я отключил и программу делал под общие аноды, поэтому при включении и горят 3 светодиода. А с калибровкой не работает потому что у Вас в последней ячейке 3FFF (затертая константа), прочитайте программатором и увидите. Загрузите HEX с калибровкой в программатор, измените последнюю ячейку на 3480 и прошейте. И будет работать. [Ответ]
RN3QGA 21:00 03.10.2009
Да, действительно все работает ОК с этим вроде понял. Так, ну теперь как подключить GP5, и еще допустим как я говорил выше нужно организовать выбор,например разного типа мигания по нажатию кнопки, в приведенном коде, где это сделать? Я понял, так (поправите конечно) видимо необходимо организовать процедуру(ы) отдельно и из цикла While вызывать их при нужном условии.
Наверное сам код здесь (пока теория попозже проверю),
[PHP]procedure interrupt; // подпрограмма обработки прерываниий
begin
if TestBit(INTCON, T0IF) = 1 then
begin
count := count+1;
if g = 255 then
begin
if count>6 then
begin
GPIO := old_GPIO;
old_GPIO := not(old_GPIO) and 0x07;
count := 0;
end[/PHP] а обрабатывать переменные кнопки и т.д. в While надеюсь правильно? [Ответ]
petrd 20:04 04.10.2009

Сообщение от RN3QGA:
Да, действительно все работает ОК с этим вроде понял. Так, ну теперь как подключить GP5, и еще допустим как я говорил выше нужно организовать выбор,например разного типа мигания по нажатию кнопки, в приведенном коде, где это сделать? Я понял, так (поправите конечно) видимо необходимо организовать процедуру(ы) отдельно и из цикла While вызывать их при нужном условии.
....
а обрабатывать переменные кнопки и т.д. в While надеюсь правильно?

1. GP5 уже настроен на выход, просто на нем все время 0, поэтому он не светится, чтобы он начал работать как остальные надо так:
Код:
.....
old_GPIO := not(old_GPIO) and 0x07; -> old_GPIO := not(old_GPIO) and 0x27;
......
GPIO := 0x07; ->GPIO := 0x27;
......
2. В прерывании почти ничего не происходит, кроме изменения состояния нужных выводов на противоположные в нужные моменты времени.
Вот эта строчка:
Код:
if count>6 then
проверяет количество сосчитанных прерываний и если их больше 6 (65ms x 7 ~ 460 ms), то переключает уровни на противоположные. Если вместо 6 ввести переменную и ее значение изменять при нажатии кнопки, то можно изменять частоту мигания.
3. Обрабатывать кнопки надо в вечном цикле while, можно сделать так - одна кнопка включает-выключает моргание, другая изменяет частоту. [Ответ]
RN3QGA 21:12 04.10.2009
Значит получается прямая зависимость от количества прерываний, но все таки одно не понял, как организовать выбор разных подпрограмм (может не совсем корректно сказано конечно), ну то есть если переменная 1 то так мигаем, если 2 то по другому, если 3 то по третьему, я конечно могу предположить, что можно в зависимости от их количества делать проверку, то есть в нашем случае к примеру

Сообщение от :
if count=1 then мигаем 1, if count=2 then мигаем 2 и тд.

. Теоретически все вроде выресовывается так, но можно ли так, а практически ей богу не соображу вообще. Че й то заклинило можно сказать. и еще немного:

Сообщение от :
1. Петр если можно, точная роль переменной count?
2. Процедура Init вызывается каждый раз при выполнеии кода или один раз.
3. OPTION_REG := 0x87 - настройка TMR0. если менять как влияет.

[Ответ]
petrd 11:42 05.10.2009

Сообщение от 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. [Ответ]
RN3QGA 17:39 05.10.2009
Спасибо большое Петр.
Я пока почитаю, помучаю комп и программатор, Вам наверное нужно от меня отдохнуть, а то уж больно я Вас замучал своей бестолковщиной. [Ответ]
RN3QGA 09:25 06.10.2009
Ну уж все таки еще момент.

Сообщение от :
0: flash := 1; // здесь может быть целая подпрограмма, а не один оператор

То есть мо жно так:

Сообщение от :
case g of
0: then begin.......... end;
1: then begin.......... end;
end;

Правильно понял? [Ответ]
Страница 11 из 43
« Первая < 567891011 12131415161721 > Последняя »
Вверх