Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
Използване ан PIC16f84 като два генератора ......... 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение Използване ан PIC16f84 като два генератора .........
...........с отделно управление
Здравейте още съм начинаещ в програмирането и си поставих за цел да направя един пикльо
като два генератора с отделно управление на честотата съответно с бутони.И успях да скалъпя това:

#include <16f84.h>
#use delay(clock=4000000)
void main()
{
int j,i;
i=100;
j=180;
while(1){
if (input(pin_a0)) j++;
else ;
if (input(pin_a1)) j--;
else ;
if (input(pin_a2)) i++;
else ;
if (input(pin_a3)) i--;
else ;

output_high(pin_b0);
output_high(pin_b1);
delay_us(i);
delay_us(j);
output_low(pin_b0);
output_low(pin_b1);
delay_us(j);
delay_us(i);
}
}



и запецнах щото не мога да отделя двата генератора да бачкат самостоятелно един от друг.
Pleaseee Help :cry:


Пон Ное 21, 2005 11:55 am
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
#include <16F84.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading

#use delay(clock=4000000)

#define hi output_high
#define low output_low
#define some_time 100


int16 val1=100;// for example
int16 val2=150;

int16 count1,count2;

void Key_procedure(void);

void main()
{
count1=val1;count2=val2;

while(1)//main loop
{
if(count1){count1--;}else{count1=val1;}
if(count2){count2--;}else{count2=val1;}

if(bit_test(count1,0)) {hi(pin_b0);} else {low(pin_b0);}
if(bit_test(count2,0)) {hi(pin_b1);} else {low(pin_b1);}

delay_us(some_time);
Key_procedure();
}


}
//----------
void Key_procedure(void)
{
//manipulate var1 and var2 here
}


Пон Ное 21, 2005 12:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Зависи какво влагаш в понятието "самостоятелно един от друг". Винаги ще имаш един най-малък времеви отрязък по който ще са синхронизирани таймерите. Гаден недостатък на цифровата техника. :roll: Въпросът е къде ти долния праг на синхронизацията.


Пон Ное 21, 2005 12:43 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Реконструктор написа:
Зависи какво влагаш в понятието "самостоятелно един от друг". Винаги ще имаш един най-малък времеви отрязък по който ще са синхронизирани таймерите. Гаден недостатък на цифровата техника. :roll: Въпросът е къде ти долния праг на синхронизацията.

"самостоятелно един от друг" имам в предвид това че да мога да им регулирам честотата на генериране поотделно.
Благодаря на колегата @Dimiter след малко ще пробвам кода.
Опс пробвах го но регулирането не стана .Не може ли да се рагулира delay на всеки поотделно
и Как.
Направих това :
#include <16F84.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading

#use delay(clock=4000000)

#define hi output_high
#define low output_low
#define some_time 100


int16 val1=100;// for example
int16 val2=150;

int16 count1,count2;
void Key_procedure(void)
{
if (input(pin_a0)) val1++;
else ;
if (input(pin_a1)) val1--;
else ;
if (input(pin_a2)) val2++;
else ;
if (input(pin_a3)) val2--;
else ;
//manipulate var1 and var2 here
}
//void Key_procedure(void);

void main()
{
count1=val1;count2=val2;

while(1)//main loop
{
if(count1){count1--;}else{count1=val1;}
if(count2){count2--;}else{count2=val2;}

if(bit_test(count1,0)) {hi(pin_b0);} else {low(pin_b0);}
if(bit_test(count2,0)) {hi(pin_b1);} else {low(pin_b1);}

delay_us(some_time);
Key_procedure();
}


}
Предварително благодаря на всички.


Пон Ное 21, 2005 2:35 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
пич, тия ; след else го обезсмислят, по-добре го разкарай. По-добре направи проверката със switch. val1 и val2 е добре да са декларирани като volatile.

И най-важното, какво очакваш да стане с тоя код:

Код:
if(bit_test(count1,0)) {hi(pin_b0);} else {low(pin_b0);}
if(bit_test(count2,0)) {hi(pin_b1);} else {low(pin_b1);}


Помисли добре.


Пон Ное 21, 2005 3:03 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
Извинявай видях грешки в това което съм ти писал,
(писах го набързо сега ще го поправя) :oops:


Пон Ное 21, 2005 3:03 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Dimiter написа:
Извинявай видях грешки в това което съм ти писал,
(писах го набързо сега ще го поправя) :oops:

Както казах бос съм в някои отношения и много се надявам с ваша помощ да реша проблема и да науча нещо .Примерно Switch как бачка и т.н.
:oops:


Пон Ное 21, 2005 3:22 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
Това работи ,пробвах го на 16ф877а (нямам ф84) честотите ги манипулираш с
промана на стойностите на val1 & val2

Сори за предишната глупост ама...

#include <16F877A.h>

#FUSES xxxxxxxxxxxx // ti si znaesh

#use delay(clock=4000000)

#BYTE PORTB=6
#BIT out1=PORTB.0
#BIT out2=PORTB.1

int16 val1=100;// for example
int16 val2=250;

int16 count1,count2;

void Key_procedure(void);

void main()
{
count1=val1;count2=val2;
set_tris_b(0xfc); // PORTB 0,1 will be outputs

while(1)//main loop
{
if(count1){count1--;}else{count1=val1;out1=!out1;}
if(count2){count2--;}else{count2=val2;out2=!out2;}
Key_procedure();
}


}
//----------
void Key_procedure(void)
{
//manipulate var1 and var2 here
}


Пон Ное 21, 2005 3:39 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
"....Примерно Switch как бачка и т.н. "


if (x==5){ printf("5"); }
if (x==9){ printf("9"); }
if (x==2){ printf("2"); }
if((x!=5)&&(x!=9)&&(x!=2)){ printf("не знам за какво иде реч!");}

Това е еквивалентно на долното:

switch(x)
{
case 5: { printf("5"); break;}
case 9: { printf("9"); break;}
case 2: { printf("2"); break;}
default: { printf("не знам за какво иде реч!");break;}
}

Тука ползата от файдата май не е много ясна ,но се надявам да разбереш
начина на употреба :roll:

пс "break" се исползва за напускане на тяло оградено с { & }
важи и при "for" и "while"


Пон Ное 21, 2005 3:50 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Много ти благодаря Dimiter Направих го така:
#include <16F84.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)

#BYTE PORTB=6
#BIT out1=PORTB.0
#BIT out2=PORTB.1


#define hi output_high
#define low output_low


int val1=1000;// for example
int val2=1500;

int count1,count2;
void Key_procedure(void)
{
if (input(pin_a0)) val1++;

if (input(pin_a1)) val1--;

if (input(pin_a2)) val2++;

if (input(pin_a3)) val2--;


}
void main()
{
count1=val1;count2=val2;
set_tris_b(0xfc); // PORTB 0,1 will be outputs

while(1)//main loop
{
if(count1){count1--;}else{count1=val1;out1=!out1;}
if(count2){count2--;}else{count2=val2;out2=!out2;}
Key_procedure();
}
}


и тръгна но можеш ли да ми кажеш как с едно натискане на бутона да увелича стойноста на val* с точно определена стойност (примерно с 100)?
Правилно ли съм направил бутоните? :oops:


Пон Ное 21, 2005 4:23 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 24, 2005 11:41 pm
Мнения: 1049
Местоположение: Pz
Мнение 
if (input(pin_a0)) {val1 = val1 +100;}


Пон Ное 21, 2005 4:30 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
Gogo написа:
if (input(pin_a0)) {val1 = val1 +100;}

Да но така го вдига еднократно т.е става първоначалната стойност +100 а не може ли с всяко следващо натискане да става + 100


Пон Ное 21, 2005 4:40 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
Радвам се ,че е тръгнало

но горещо ти препоръчвам да се откажеш от този
" if (input(pin_a0)) val1++; "
начин на писане ,по добре слагай скобите за щяло и не щяло
от колкото да ги спестяваш
" if (input(pin_a0)) { val1++;}

Ще се убедиш ,че е по добре когато една програма стане по сложна
или едно условие съдържа много вложени под условия.

А за обслужване на бутоните ти препоръчвам следния подход:

1 поиш по един изтеглящ към + резистор (1-10к) на пиновете на които имаш бутони
за да не се уемблияят във времето и пространството
(или използваш порт Б той има вградени pull up резистори)

2 поиш бутоните м/у маса и съответните пинове
3 конфигурираш ги като входове (най-лесно е с "output_float")
4 пишеш нещо от рода на

if(! input(pin_xx) ) { x=x+y; delay_ms(50); }

удивителната значи отрицание (интересуваме се от ниско ниво т.е. натиснат бутон)
delay_ms(50); - задължително имаме някакво времезакъснение за да се избегне
ефекта с притрепването на пластините

Успех :)


Пон Ное 21, 2005 4:52 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
[q

Успех :)[/quote]

Мерси но :Схемата ми е направена както казваш само че вместо към маса вризвам бутоните към VDD а резисторите към маса
Кода е :
#include <16F84.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)

#BYTE PORTB=6
#BIT out1=PORTB.0
#BIT out2=PORTB.1


#define hi output_high
#define low output_low
#define some_time 100


int val1=1000;// for example
int val2=1500;

int count1,count2;
void Key_procedure(void)
{
if (input(pin_a0)) {val1 = val1 +100;}

if (input(pin_a1)) {val1 = val1 -100;}

if (input(pin_a2)) {val2 = val1 +100;}

if (input(pin_a3)) {val2 = val1 -100;}


}






void main()
{
count1=val1;count2=val2;
set_tris_b(0xfc); // PORTB 0,1 will be outputs

while(1)//main loop
{
if(count1){count1--;}else{count1=val1;out1=!out1;}
if(count2){count2--;}else{count2=val2;out2=!out2;}
Key_procedure();
}
}
и пак не може да се увеличава с 100 всеки път когато натисна бутона т.е увеличава се но когато пусна бутоан пак се връща на старата си стойност или приема случайна стойност!
Защо ли :roll:


Последна промяна valioman на Пон Ное 21, 2005 5:17 pm, променена общо 1 път



Пон Ное 21, 2005 5:09 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
имащ грешка!

void Key_procedure(void)
{
if (input(pin_a0)) {val1 = val1 +10;}

if (input(pin_a1)) {val1 = val1 -10;}

if (input(pin_a2)) {val2 = val1 +10;} // <---- val2=val2+10

if (input(pin_a3)) {val2 = val1 -10;} // <---- val2=val2-10



}


Пон Ное 21, 2005 5:14 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни