Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Използване ан PIC16f84 като два генератора .........
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=1302
Страница 1 от 2

Автор:  valioman [ Пон Ное 21, 2005 11:55 am ]
Заглавие:  Използване ан 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:

Автор:  Dimiter [ Пон Ное 21, 2005 12:25 pm ]
Заглавие: 

#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:43 pm ]
Заглавие: 

Зависи какво влагаш в понятието "самостоятелно един от друг". Винаги ще имаш един най-малък времеви отрязък по който ще са синхронизирани таймерите. Гаден недостатък на цифровата техника. :roll: Въпросът е къде ти долния праг на синхронизацията.

Автор:  valioman [ Пон Ное 21, 2005 2:35 pm ]
Заглавие: 

Реконструктор написа:
Зависи какво влагаш в понятието "самостоятелно един от друг". Винаги ще имаш един най-малък времеви отрязък по който ще са синхронизирани таймерите. Гаден недостатък на цифровата техника. :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 3:03 pm ]
Заглавие: 

пич, тия ; след 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);}


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

Автор:  Dimiter [ Пон Ное 21, 2005 3:03 pm ]
Заглавие: 

Извинявай видях грешки в това което съм ти писал,
(писах го набързо сега ще го поправя) :oops:

Автор:  valioman [ Пон Ное 21, 2005 3:22 pm ]
Заглавие: 

Dimiter написа:
Извинявай видях грешки в това което съм ти писал,
(писах го набързо сега ще го поправя) :oops:

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

Автор:  Dimiter [ Пон Ное 21, 2005 3:39 pm ]
Заглавие: 

Това работи ,пробвах го на 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
}

Автор:  Dimiter [ Пон Ное 21, 2005 3:50 pm ]
Заглавие: 

"....Примерно 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"

Автор:  valioman [ Пон Ное 21, 2005 4:23 pm ]
Заглавие: 

Много ти благодаря 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:

Автор:  Gogo [ Пон Ное 21, 2005 4:30 pm ]
Заглавие: 

if (input(pin_a0)) {val1 = val1 +100;}

Автор:  valioman [ Пон Ное 21, 2005 4:40 pm ]
Заглавие: 

Gogo написа:
if (input(pin_a0)) {val1 = val1 +100;}

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

Автор:  Dimiter [ Пон Ное 21, 2005 4:52 pm ]
Заглавие: 

Радвам се ,че е тръгнало

но горещо ти препоръчвам да се откажеш от този
" 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); - задължително имаме някакво времезакъснение за да се избегне
ефекта с притрепването на пластините

Успех :)

Автор:  valioman [ Пон Ное 21, 2005 5:09 pm ]
Заглавие: 

[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:

Автор:  Dimiter [ Пон Ное 21, 2005 5:14 pm ]
Заглавие: 

имащ грешка!

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



}

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/