| Автор |
Съобщение |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 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 
|
| Пон Ное 21, 2005 11:55 am |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 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 |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Зависи какво влагаш в понятието "самостоятелно един от друг". Винаги ще имаш един най-малък времеви отрязък по който ще са синхронизирани таймерите. Гаден недостатък на цифровата техника.  Въпросът е къде ти долния праг на синхронизацията.
|
| Пон Ное 21, 2005 12:43 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
"самостоятелно един от друг" имам в предвид това че да мога да им регулирам честотата на генериране поотделно.
Благодаря на колегата @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 |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
пич, тия ; след else го обезсмислят, по-добре го разкарай. По-добре направи проверката със switch. val1 и val2 е добре да са декларирани като volatile.
И най-важното, какво очакваш да стане с тоя код:
Помисли добре.
|
| Пон Ное 21, 2005 3:03 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 04, 2005 3:18 pm Мнения: 309 Местоположение: Sofia
|
Извинявай видях грешки в това което съм ти писал,
(писах го набързо сега ще го поправя) 
|
| Пон Ное 21, 2005 3:03 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Както казах бос съм в някои отношения и много се надявам с ваша помощ да реша проблема и да науча нещо .Примерно Switch как бачка и т.н.

|
| Пон Ное 21, 2005 3:22 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 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 |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 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;}
}
Тука ползата от файдата май не е много ясна ,но се надявам да разбереш
начина на употреба
пс "break" се исползва за напускане на тяло оградено с { & }
важи и при "for" и "while"
|
| Пон Ное 21, 2005 3:50 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 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)?
Правилно ли съм направил бутоните? 
|
| Пон Ное 21, 2005 4:23 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
if (input(pin_a0)) {val1 = val1 +100;}
|
| Пон Ное 21, 2005 4:30 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Да но така го вдига еднократно т.е става първоначалната стойност +100 а не може ли с всяко следващо натискане да става + 100
|
| Пон Ное 21, 2005 4:40 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 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 |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 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 всеки път когато натисна бутона т.е увеличава се но когато пусна бутоан пак се връща на старата си стойност или приема случайна стойност!
Защо ли 
Последна промяна valioman на Пон Ное 21, 2005 5:17 pm, променена общо 1 път
|
| Пон Ное 21, 2005 5:09 pm |
|
 |
|
Dimiter
Ранг: Популярен
Регистриран на: Пет Фев 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 |
|
|