Большой Воронежский Форум

Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел.
Вернуться   Большой Воронежский Форум » Компьютеры и все, что с ними связано » »Радиолюбитель
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио

Ответ
 
Опции темы
Старый 28.09.2009, 12:28   #301   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от RN3QGA Посмотреть сообщение
Вот еще вопрос.
Пытаюсь сделать примерно следующее:
все время выполняется только код1.
Код надо показать.
  Ответить с цитированием
Старый 28.09.2009, 18:28   #302   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Пример не рабочий.
Цитата:
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 секунды переменной быть могут?

Последний раз редактировалось RN3QGA; 28.09.2009 в 20:29.
  Ответить с цитированием
Старый 28.09.2009, 21:02   #303   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от 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)
  Ответить с цитированием
Старый 28.09.2009, 21:14   #304   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Все понял. Спасибо.
Про Delay - Да совершенно верно, менять задержку по ходу программы.
Буду смотреть.
Цитата:
procedure Vdelay_ms(time_in_ms : word)
Теперь еще про кнопку.
А как можно обработать поочередно нажатие.
чтоб нужная часть кода срабатывала, допустим 1 раз - 1код., еще раз 2 код, и т д. по кругу?
  Ответить с цитированием
Старый 28.09.2009, 21:22   #305   
Форумец
 
Сообщений: 552
Регистрация: 17.06.2005
Возраст: 40

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

P.S. Кстати правильную форму электродов ктонибудь знает?
  Ответить с цитированием
Старый 28.09.2009, 21:24   #306   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от RN3QGA Посмотреть сообщение
А как можно обработать поочередно нажатие.
чтоб нужная часть кода срабатывала, допустим 1 раз - 1код., еще раз 2 код, и т д. по кругу?
Гонют меня от ПК. Кратко - надо завести переменную-счетчик, которая меняется при каждом нажатии кнопки, а от ее состояния и плясать. Подробнее, если надо, завтра.
  Ответить с цитированием
Старый 28.09.2009, 21:25   #307   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Так с
Цитата:
procedure Vdelay_ms(time_in_ms : word)
вроде разобрался.
А вообще прикольная весчь PIC вот только знаний маловато.
на одном желании далеко не уедешь.
Жена уже у виска неделю крутит, говорит хуже пацана увлекся не оттянешь, а оно просто надоело собирать кем - то придуманное хочется разобраться самому.
  Ответить с цитированием
Старый 28.09.2009, 21:27   #308   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Я только хотел про переменную спросить, значит в верном направлении думаю, будем пробовать если не получиться спрошу. Спасибо.
Ну наверно что-то типа этого в примитиве конечно, работает но с одной особенностью.
Чем больше задержка 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.

Последний раз редактировалось RN3QGA; 28.09.2009 в 22:30.
  Ответить с цитированием
Старый 29.09.2009, 08:44   #309   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от RN3QGA Посмотреть сообщение
Я только хотел про переменную спросить, значит в верном направлении думаю, будем пробовать если не получиться спрошу. Ну наверно что-то типа этого в примитиве конечно, работает но с одной особенностью. Чем больше задержка Delay тем кнопка не точно по нажатию срабатывает. Тратиться время я это понимаю но как обойти. Чтоб кнопка на нажатие четко срабатывала, а то перескакивает бывает.
Использование функций задержки - непозволительная роскошь, контроллер во время их исполнения ничего делать не может. Выход - использовать прерывания и таймеры. Посмотрите пост №42, должно стать понятнее.
  Ответить с цитированием
Старый 29.09.2009, 08:50   #310   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от dr.ON Посмотреть сообщение
petrd, А вы с емкостными кнопками, а точнее со слайдерами дело не имели случаем?
Пытаюсь тут сделать его по микрочиповской технологии( 2 треугольных электрода), получается ерунда полнейшая. Чувствительность к боковому смещению пальца просто ужасающая.
P.S. Кстати правильную форму электродов ктонибудь знает?
Нет не имел, но кой-чего читал. А Вы на чем пробовали делать? Просто я думаю, что под эту задачу встроенные CTMU модули наиболее заточены. Ну и еще кой-какие мысли есть.
  Ответить с цитированием
Старый 30.09.2009, 07:58   #311   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
А чегойто я подключил к GP3 (4 нога P12F626) диод а он у меня не светится, хотя трисы в 0 выставлены, светятся только G 0,1,2. Как то одтельно подключать на до что ли ?
Про таймеры и прирывания честно говоря не совсем понятно т.к. на Си, я 0.
Но попробую разобраться если что спрошу.
Спасибо за помощь.
  Ответить с цитированием
Старый 30.09.2009, 08:19   #312   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от RN3QGA Посмотреть сообщение
А чегойто я подключил к GP3 (4 нога P12F626) диод а он у меня не светится, хотя трисы в 0 выставлены, светятся только G 0,1,2. Как то одтельно подключать на до что ли ?
Про таймеры и прирывания честно говоря не совсем понятно т.к. на Си, я 0.
Но попробую разобраться если что спрошу.
Спасибо за помощь.
1. GP3 не может работать на выход, только как вход или внешний сброс.
2. К Си надо присматриваться, ибо мало кто работает с контроллерами на Паскале, а поэтому и помочь мало кто сможет.
3. С прерываниями и таймерами ничего сложного нет, просто надо один раз разобраться, а без них дальше никуда.
  Ответить с цитированием
Старый 30.09.2009, 08:50   #313   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Да понимаю я что к Си - но в Пасе хоть знакомый синтаксис, уж не выпускалиб тогда его вообще может уже бы и начал изучать,а так уж очень заманчиво много знакомого.
Ну уж не обессутьте как надаем просто скажите я пойму.
Если не затруднит может переведете сей код под 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 все переменные и команды, например нажатия кнопок или изменения чего нибудь?
Разьясните если не напряжно.

Последний раз редактировалось RN3QGA; 30.09.2009 в 14:46.
  Ответить с цитированием
Старый 30.09.2009, 16:00   #314   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от 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) . Остальное позже.

Последний раз редактировалось petrd; 20.09.2010 в 10:07.
  Ответить с цитированием
Старый 30.09.2009, 22:11   #315   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Ого. Ну это надо вникнуть подожду то что позже.
Буду осмысливать. Но как я понял без этого более менее, что - то путнее написать не пулуцца.
Огромное спасибо Петр.
С уважением RN3QGA. (зовут меня Игорь ну это вдруг послать куда нибудь захочется).
  Ответить с цитированием
Старый 02.10.2009, 10:25   #316   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Вот тут подумал, Петр а может на конкретной задаче разобрать.
И я Вам меньше глупых вопросов задавать буду и Вам один раз написать.
Если конечно это Вас устроит. Я понимаю Вам не очень то интересно мигать светодиодами да еще и Паскаль вспоминать, но уж не обижайтесь на мою, отчасти лень, отчасти назойливость.
Просто редко сейчас находятся люди - ЛЮДИ.
  Ответить с цитированием
Старый 02.10.2009, 15:44   #317   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от 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.
Вставка на ассемблере - запись калибровочной константы внутреннего генератора. Что для чего в программе вечерком напишу.

Последний раз редактировалось petrd; 20.09.2010 в 10:07.
  Ответить с цитированием
Старый 02.10.2009, 21:38   #318   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
У-ух Петр огромное спасибо.
Я вот единственное забыл сказать Вам, что я у себя на макетке переделал диоды, анодом к выводам, катодом на массу через R. Если это важно конечно. Ну я пока подожду с Вашего позволения комментария дабы лишних вопросов не задавать ну , а уж потом "держитесь".
И вопросик немного в сторону. В постах выше Вы "показали" свое железо для отладки, скажите если не секрет это для работы или для души приобретено, я не буду скрывать, в принципе я могу себе позволить приобрести ну скажем черта в банке, только вот оно мне нужно или нет понять не могу, стоит ли приобретать, просто я немного помешан с детства на электронике, вот только жизнь сложилась далеко от этого, но увлечение оказывается сильней, короче нужен совет пригодится это железо мне или достаточно на макетке собирать и мучать?
Но все остальное в силе через тернии к звездам.
  Ответить с цитированием
Старый 02.10.2009, 21:51   #319   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от 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, что соответствует середине диапазона подстройки. Думаю, что если использовать чужие прошивки использующие калибровочную константу, а в прошиваемом контроллере она затерта, то и работать не будет. Вроде так.
  Ответить с цитированием
Старый 02.10.2009, 22:36   #320   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от RN3QGA Посмотреть сообщение
У-ух Петр огромное спасибо.
Я вот единственное забыл сказать Вам, что я у себя на макетке переделал диоды, анодом к выводам, катодом на массу через R. Если это важно конечно. Ну я пока подожду с Вашего позволения комментария дабы лишних вопросов не задавать ну , а уж потом "держитесь".
И вопросик немного в сторону. В постах выше Вы "показали" свое железо для отладки, скажите если не секрет это для работы или для души приобретено, я не буду скрывать, в принципе я могу себе позволить приобрести ну скажем черта в банке, только вот оно мне нужно или нет понять не могу, стоит ли приобретать, просто я немного помешан с детства на электронике, вот только жизнь сложилась далеко от этого, но увлечение оказывается сильней, короче нужен совет пригодится это железо мне или достаточно на макетке собирать и мучать?
Но все остальное в силе через тернии к звездам.
1. Диоды - не важно.
2. Железо мое, использую для себя и для работы. Если заниматься постоянно, то удобно, когда много делаешь макетки лепить и сопли с них убирать запаришься, я прошел через это. А если это порыв и деньги есть, то все равно жалеть не придется.
3. Сам такой, но от себя не уйти. С 1988 года в ВС СССР, потом РФ, два года окончательно никак с ними не попрощаюсь из-за должка в виде квартиры. За последние два года пришлось наверстывать, что за 19 лет не успел.
  Ответить с цитированием
Старый 03.10.2009, 07:03   #321   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
О Петр. Да мы с Вами еще и коллеги.
Я тоже из бывших служивых, правда еще старлеем уволился и не стал ничего дожидаться. Если честно то не жалею. Но это тема другая не будем засорять эфир как говорят радиолюбители.
Ок на счет девайса подумаю, може придется купить, уж очень хочется. С кодом буду разбираться, вопросы задам по ходу.
Да чуть не забыл: о константах которые программатор затирает.
я использую самостейный программатор Экстра пик. Мне нужно проверить затирает он или нет для начала? , и если затирает (а скорее всего затирает), то необходимо будет ручками постоянно допписывать
Цитата:
Если константа затерта, то если есть возможность лучше в ячейку по адресу 0x3FF записать число 0x3480
или только в том случае когда нужна точность.
Все ли я правильно понял?
  Ответить с цитированием
Старый 03.10.2009, 13:58   #322   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от RN3QGA Посмотреть сообщение
Да чуть не забыл: о константах которые программатор затирает. я использую самостейный программатор Экстра пик. Мне нужно проверить затирает он или нет для начала? , и если затирает (а скорее всего затирает), то необходимо будет ручками постоянно допписыватьили только в том случае когда нужна точность. Все ли я правильно понял?
Этот момент просто надо иметь ввиду. Программатор просто так не затирает, он затирает, когда его просят что-то записать или стереть. Если простой программатор и новый контроллер с калибровочной константой, то ничего не мешает вставить контроллер в программатор, прочитать его и допустим прямо на корпусе написать маркером две цифры, а когда надо подставить в прошивку их. Потеря калибровочной константы чревата когда используют чужие прошивки, использующие калибровочные константы, она просто может не заработать. Калибровкой можно и пренебречь, но есть случаи, когда в прошивках используют точные временные отсчеты и можно увидеть, что с одним контроллером она работает, а с другим нет, хотя они оба фактически рабочие. Об этом моменте просто надо знать.
  Ответить с цитированием
Старый 03.10.2009, 20:29   #323   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
И так ,скопировал, компильнул, прошил, включил - горят все три светодиода но реакции на кнопку нет. Закоментировал ASM - все заработало. Подцепил еще светодиод на GP5 и кнопку на GP3 для продолжения экспериментов. Светодиод на GP5 не мигает. Видимо нужно настраивать, вроде бы этот вывод может работать на выход или я ошибаюсь.
  Ответить с цитированием
Старый 03.10.2009, 20:43   #324   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от RN3QGA Посмотреть сообщение
И так ,скопировал, компильнул, прошил, включил - горят все три светодиода но реакции на кнопку нет. Закоментировал ASM - все заработало. Подцепил еще светодиод на GP5 и кнопку на GP3 для продолжения экспериментов. Светодиод на GP5 не мигает. Видимо нужно настраивать, вроде бы этот вывод может работать на выход или я ошибаюсь.
Все так, просто GP5 из мигания я отключил и программу делал под общие аноды, поэтому при включении и горят 3 светодиода. А с калибровкой не работает потому что у Вас в последней ячейке 3FFF (затертая константа), прочитайте программатором и увидите. Загрузите HEX с калибровкой в программатор, измените последнюю ячейку на 3480 и прошейте. И будет работать.
  Ответить с цитированием
Старый 03.10.2009, 21:00   #325   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Да, действительно все работает ОК с этим вроде понял. Так, ну теперь как подключить 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 надеюсь правильно?

Последний раз редактировалось RN3QGA; 03.10.2009 в 22:23.
  Ответить с цитированием
Старый 04.10.2009, 20:04   #326   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 1

petrd вне форума Не в сети
Цитата:
Сообщение от 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, можно сделать так - одна кнопка включает-выключает моргание, другая изменяет частоту.
  Ответить с цитированием
Старый 04.10.2009, 21:12   #327   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Значит получается прямая зависимость от количества прерываний, но все таки одно не понял, как организовать выбор разных подпрограмм (может не совсем корректно сказано конечно), ну то есть если переменная 1 то так мигаем, если 2 то по другому, если 3 то по третьему, я конечно могу предположить, что можно в зависимости от их количества делать проверку, то есть в нашем случае к примеру
Цитата:
if count=1 then мигаем 1, if count=2 then мигаем 2 и тд.
. Теоретически все вроде выресовывается так, но можно ли так, а практически ей богу не соображу вообще. Че й то заклинило можно сказать. и еще немного:
Цитата:
1. Петр если можно, точная роль переменной count?
2. Процедура Init вызывается каждый раз при выполнеии кода или один раз.
3. OPTION_REG := 0x87 - настройка TMR0. если менять как влияет.

Последний раз редактировалось RN3QGA; 04.10.2009 в 22:57.
  Ответить с цитированием
Старый 05.10.2009, 11:42   #328   
Форумец
 
Сообщений: 1,525
Регистрация: 19.02.2009
Возраст: 52
Записей в дневнике: 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.
  Ответить с цитированием
Старый 05.10.2009, 17:39   #329   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Спасибо большое Петр.
Я пока почитаю, помучаю комп и программатор, Вам наверное нужно от меня отдохнуть, а то уж больно я Вас замучал своей бестолковщиной.
  Ответить с цитированием
Старый 06.10.2009, 09:25   #330   
Форумец
 
Сообщений: 35
Регистрация: 30.06.2009
Возраст: 47

RN3QGA вне форума Не в сети
Ну уж все таки еще момент.
Цитата:
0: flash := 1; // здесь может быть целая подпрограмма, а не один оператор
То есть мо жно так:
Цитата:
case g of
0: then begin.......... end;
1: then begin.......... end;
end;
Правильно понял?
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind