| Микроконтролери и електроника 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 |
|
| Автор: | 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 ] |
| Заглавие: | |
Зависи какво влагаш в понятието "самостоятелно един от друг". Винаги ще имаш един най-малък времеви отрязък по който ще са синхронизирани таймерите. Гаден недостатък на цифровата техника. |
|
| Автор: | valioman [ Пон Ное 21, 2005 2:35 pm ] | |||||||||
| Заглавие: | ||||||||||
"самостоятелно един от друг" имам в предвид това че да мога да им регулирам честотата на генериране поотделно. Благодаря на колегата @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. И най-важното, какво очакваш да стане с тоя код:
Помисли добре. |
||||||||||
| Автор: | Dimiter [ Пон Ное 21, 2005 3:03 pm ] |
| Заглавие: | |
Извинявай видях грешки в това което съм ти писал, (писах го набързо сега ще го поправя) |
|
| Автор: | valioman [ Пон Ное 21, 2005 3:22 pm ] | |||||||||
| Заглавие: | ||||||||||
Както казах бос съм в някои отношения и много се надявам с ваша помощ да реша проблема и да науча нещо .Примерно Switch как бачка и т.н. |
||||||||||
| Автор: | 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;} } Тука ползата от файдата май не е много ясна ,но се надявам да разбереш начина на употреба пс "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)? Правилно ли съм направил бутоните? |
|
| Автор: | Gogo [ Пон Ное 21, 2005 4:30 pm ] |
| Заглавие: | |
if (input(pin_a0)) {val1 = val1 +100;} |
|
| Автор: | valioman [ Пон Ное 21, 2005 4:40 pm ] | |||||||||
| Заглавие: | ||||||||||
Да но така го вдига еднократно т.е става първоначалната стойност +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 Успех Мерси но :Схемата ми е направена както казваш само че вместо към маса вризвам бутоните към 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 всеки път когато натисна бутона т.е увеличава се но когато пусна бутоан пак се връща на старата си стойност или приема случайна стойност! Защо ли |
|
| Автор: | 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/ |
|