| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Проблем с PWM за PIC16F8xx в MikroC http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8889 |
Страница 1 от 1 |
| Автор: | Nikola [ Пон Май 23, 2011 4:47 pm ] |
| Заглавие: | Проблем с PWM за PIC16F8xx в MikroC |
Здравейте извинявам се за можеби тъпия въпрос, но някой може ли да ми обясни защо тая модулация не работи и то като е пиша 1:1 от библиотеката на MikroC?
И това е примера: // microcontroller : P16F877A // PWM module is set on RC2. unsigned short j, oj; void InitMain() { PORTB = 0; // Set PORTB to 0 TRISB = 0; // PORTB is output ADCON1 = 6; // All ADC pins to digital I/O PORTA = 255; TRISA = 255; // PORTA is input PORTC = 0xFF; // Set PORTC to $FF TRISC = 0; // PORTC is output Pwm_Init(5000); // Initialize PWM module }//~ void main() { InitMain(); j = 80; // Initial value for j oj = 0; // oj will keep the 'old j' value Pwm_Start(); // Start PWM while (1) { // Endless loop if (Button(&PORTA, 0,1,1)) // button on RA0 pressed j++ ; // increment j if (Button(&PORTA, 1,1,1)) // button on RA1 pressed j-- ; // decrement j if (oj != j) { // If change in duty cycle requested, Pwm_Change_Duty(j); // set new duty ratio, oj = j; // memorize it, PORTB = oj; // and display on PORTB } Delay_ms(200); // Slow down a bit } } ПП. Ако някой може да ми обясни как се пуска на C в MikroC ще съм много благодарен.. Поздрави. Никола. |
|
| Автор: | ¶ [ Пон Май 23, 2011 6:02 pm ] |
| Заглавие: | Re: Проблем с PWM за PIC16F8xx в MikroC |
Какво точно не работи ? Закачи ли осцилоскоп на RC2 ? Къде ти е началната стойност на коефициента на запълване на PWM ? Каква е честотата на PWM-a ? Button функците осигуряват ли debounce за бутоните ти ? Що не опиташ само с единия бутон, да не би да имаш нещо кофти в тези функции, първата увеличава j, втората го намалява, в крайна сметка ефект нулев и никога няма да ти се изпълни кода в if( oj != j ) { ... } . Или махни Button функциите, задай начална стойност 50% запълване на PWM и виж какво става на RC2 . |
|
| Автор: | Nikola [ Пон Май 23, 2011 6:50 pm ] |
| Заглавие: | |
Всичко каквото се сетих пробвах, махнах бутони всичко, и закача осцилоскоп на изхода но нищо. Ето само това пак не работи, а би трябвало. void main() { PORTC = 0x00; TRISC = 0b00000000; PWM_Init(4000); Pwm_Change_Duty(60); Pwm_Start(); } А това което не работи е че на RC2 нямам нищо, седи си в нула. Ако го форсна в началото пък си седи в единица и това е! А първоначалния коефициент на запълване въобще незнам къде е. ДО колкото разбирам от примера даден в компилатора се задава от Pwm_Change_Duty(60);, но никаква идея защо нищо не се случва.
|
|
| Автор: | Cekins [ Пон Май 23, 2011 7:00 pm ] |
| Заглавие: | |
PWM-а на тия чипове има 3-4 регистъра. Разбирането му как работи пък е задължително. Така, че моето предложение е да се опиташ да го пуснеш ръчно. Настройват се : CCP1CON = %00xx1100 (бит 4 и 5 са младшите на Duty Cycle !!!) CCPR1L = %xxxxxxxx - старшите битове на Duty cycle TMR2 = %0xxxx1yy - тука x и y са ти прескалер и постскалер - от тука се определя периода какъв да е - в дейташиита има таблички и само с тия три регистъра тряя тръгне пвм-а. Ако не тръгне значи чипа е сдухан. едит : примерно CCP1CON = %00111100 CCPR1L=%01111111 TMR2=%00000101 тряя тръгне на някаква не много висока честота с 50% запълване |
|
| Автор: | kasparov [ Пон Май 23, 2011 7:08 pm ] |
| Заглавие: | |
На микро С -то трябва да му кажеш кой модул да пусне - първи, втори .. също и като променяш запълването. |
|
| Автор: | ¶ [ Пон Май 23, 2011 7:22 pm ] | |||||||||
| Заглавие: | ||||||||||
Не знам какво вършат функциите на MicroC, но ето ти работещ код ( за друг компилатор е, може да се наложи да попромениш това-онова по имената на служебните регистри ):
От http://www.micro-examples.com/public/mi ... lator.html можеш да си сметнеш какво да заредиш в PR2, T2CON & CCPxCON, има и пример с директна работа с регистрите. Ако и това не тръгне, може би имаш дефектен процесор. А сетнал ли си правилно fuse битовете ? Въобще сигурен ли си че процесора работи, щото ми намирисва на неправилни fuse битове, или неработещ осцилатор или комбинация... |
||||||||||
| Автор: | Nikola [ Пон Май 23, 2011 7:23 pm ] |
| Заглавие: | |
Регистрите ги знам но идеята е че в MikroC с PWM_Init(4000); си ги настройва затова не ги барам ръчно, но явно нещо не си ги настройва както трябва. Иначе контролера няма как да е сдухан че схемата е тествам на симулация на Protel,а не вярвам да е от него. А за това кой модул да пусне контролера има само един така че не вярвам да се бърка с това но все пак и това съм пробвал и пак не става. Явно ще трябва да пробвам ръчно. Благодаря все пак за помощта |
|
| Автор: | E1 [ Пон Май 23, 2011 8:00 pm ] |
| Заглавие: | |
Опитай с тази инициализация: void InitMain() { PORTB = 0; TRISB = 0; ADCON1 = 6; PORTA = 255; TRISA = 0b00000011; PORTC = 0b00000100; TRISC = 0; PWM_Init(5000); }//~ |
|
| Автор: | Cekins [ Пон Май 23, 2011 9:32 pm ] |
| Заглавие: | |
Протел или Протеус? Както и да е. Все тая. Толкова ли е сложно да настроиш три регистъра? |
|
| Автор: | ¶ [ Пон Май 23, 2011 10:29 pm ] |
| Заглавие: | |
Protel, Proteus, симулация, емулация, поялник, разпойваща станция май вече нямат това значение, което са имали преди Симулирал човека и не работел PWM , ай сиктир бе пич, и аз ще ти се връзвам да ти наливам у тъпата кратуна.... |
|
| Автор: | a_stankov [ Пон Май 23, 2011 10:58 pm ] |
| Заглавие: | |
На MikroC библиотечните функции са PWM1_Init, PWM2_Init, PWM3_Init и т.н. За процесори с един PWM модул се използва по подразбиране PWM1_Init. Казвал съм го и друг път, дори и когато се преписва се изисква концентрация, иначе следват главоблъсканици. Оправи си преписа и всичко ще е ОК. Пробвано! |
|
| Автор: | Nikola [ Вто Май 24, 2011 1:35 pm ] |
| Заглавие: | |
Благодарско на всички, тръгна, но ръчно. Благодаря най-вече на "¶" ей такива интелигентни хора са и нужни на тая държава да се оправи |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|