Отговори на тема  [ 12 мнения ] 
Проблем с PWM за PIC16F8xx в MikroC 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 21, 2006 5:21 pm
Мнения: 7
Мнение Проблем с PWM за PIC16F8xx в MikroC
Здравейте извинявам се за можеби тъпия въпрос, но някой може ли да ми обясни защо тая модулация не работи и то като е пиша 1:1 от библиотеката на MikroC?
#-o #-o #-o
И това е примера:

// 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 ще съм много благодарен..

Поздрави.
Никола.
:prayer:


Пон Май 23, 2011 4:47 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение Re: Проблем с PWM за PIC16F8xx в MikroC
Какво точно не работи ? Закачи ли осцилоскоп на RC2 ? Къде ти е началната стойност на коефициента на запълване на PWM ? Каква е честотата на PWM-a ? Button функците осигуряват ли debounce за бутоните ти ? Що не опиташ само с единия бутон, да не би да имаш нещо кофти в тези функции, първата увеличава j, втората го намалява, в крайна сметка ефект нулев и никога няма да ти се изпълни кода в if( oj != j ) { ... } . Или махни Button функциите, задай начална стойност 50% запълване на PWM и виж какво става на RC2 .

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пон Май 23, 2011 6:02 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 21, 2006 5:21 pm
Мнения: 7
Мнение 
Всичко каквото се сетих пробвах, махнах бутони всичко, и закача осцилоскоп на изхода но нищо.
Ето само това пак не работи, а би трябвало.

void main() {
PORTC = 0x00;
TRISC = 0b00000000;
PWM_Init(4000);
Pwm_Change_Duty(60);
Pwm_Start();


}

А това което не работи е че на RC2 нямам нищо, седи си в нула. Ако го форсна в началото пък си седи в единица и това е!

А първоначалния коефициент на запълване въобще незнам къде е. ДО колкото разбирам от примера даден в компилатора се задава от Pwm_Change_Duty(60);, но никаква идея защо нищо не се случва.
#-o #-o #-o


Пон Май 23, 2011 6:50 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
PWM-а на тия чипове има 3-4 регистъра. Разбирането му как работи пък е задължително. Така, че моето предложение е да се опиташ да го пуснеш ръчно.

Настройват се :

CCP1CON = %00xx1100 (бит 4 и 5 са младшите на Duty Cycle !!!)
CCPR1L = %xxxxxxxx - старшите битове на Duty cycle
TMR2 = %0xxxx1yy - тука x и y са ти прескалер и постскалер - от тука се определя периода какъв да е - в дейташиита има таблички

и само с тия три регистъра тряя тръгне пвм-а. Ако не тръгне значи чипа е сдухан.

едит : примерно
CCP1CON = %00111100
CCPR1L=%01111111
TMR2=%00000101
тряя тръгне на някаква не много висока честота с 50% запълване


Пон Май 23, 2011 7:00 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Сря Апр 05, 2006 9:52 pm
Мнения: 877
Местоположение: Разград
Мнение 
На микро С -то трябва да му кажеш кой модул да пусне - първи, втори ..
също и като променяш запълването.


Пон Май 23, 2011 7:08 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Не знам какво вършат функциите на MicroC, но ето ти работещ код ( за друг компилатор е, може да се наложи да попромениш това-онова по имената на служебните регистри ):
Код:
/*
; PWM_period = ( ( PR2 + 1 ) * 4 * TMR2_prescaler ) / Fosc
; Note: TMR2 postscaler is not used in determination of the PWM frequency.
;      The postscaler could be used to have a servo update rate at a
;      different frequency that the PWM output.
;      TMR2_postcaler are from 1:1 to 1:16 inclusive
; PWM_duty_cycle = (CCPR1L:CCP1CON<5:4>) * Tosc * TMR2_prescaler
; Note: CCPR1L contain 8 MSB bits, and CCP1CON<5:4> 2 LSB bits
;
;    T2CON bits
;   ----------
;   bit 7       unimplemented
;   bit<6:3>   TOUTPS3:TOUTPS0
;
;   bit 2      TMR2ON
;   bit<1:0>   T2CKPS1:T2CKPS0
;            0 0    - Prescaler is 1
;            0 1      - Prescaler is 4
;            1 X      - Prescaler is 16
;
; http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
;
*/
void InitPWM(void)   {
   PORTB &= ~0x04;            // Initial value is Zero of RC2 pin
   TRISC &= ~0x04;            // RC2 to be output
   PR2 = 77;                // Set PWM for 32,0513 kHz period - 10 MHz crystal
   T2CON = 0b00011000;       // prescaler 1:1, postscaler 1:4 ( TMR2IF after 4 / Fpwm )
   CCP1CON = 0x0C;          // Set CCP module in PWM mode
   CCPR1H = 0; CCPR1L = 0x20;   // CCPRxL=0x20 for 50% PWM duty cycle
   TMR2IF = 0;
   TMR2IE = 0;               // Disable Timer2 Interrupts
   TMR2ON = 1;               // Start Timer2 and Run PWM generation
}

void LoadPWM(uint16 duty) {
   CCPR1L = ( duty >> 8 ) & 0x00FF;   
   CCP1CON &= ~0x30;
   if( duty & 0x0100 )       
      CCP1CON |= 0x10;      
   if( duty & 0x0200 )
      CCP1CON |= 0x20;
}


От http://www.micro-examples.com/public/mi ... lator.html можеш да си сметнеш какво да заредиш в PR2, T2CON & CCPxCON, има и пример с директна работа с регистрите. Ако и това не тръгне, може би имаш дефектен процесор.

А сетнал ли си правилно fuse битовете ? Въобще сигурен ли си че процесора работи, щото ми намирисва на неправилни fuse битове, или неработещ осцилатор или комбинация...

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пон Май 23, 2011 7:22 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 21, 2006 5:21 pm
Мнения: 7
Мнение 
Регистрите ги знам но идеята е че в MikroC с PWM_Init(4000); си ги настройва затова не ги барам ръчно, но явно нещо не си ги настройва както трябва. Иначе контролера няма как да е сдухан че схемата е тествам на симулация на Protel,а не вярвам да е от него. А за това кой модул да пусне контролера има само един така че не вярвам да се бърка с това но все пак и това съм пробвал и пак не става. Явно ще трябва да пробвам ръчно. Благодаря все пак за помощта :prayer:


Пон Май 23, 2011 7:23 pm
Профил ICQ WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Нед Юли 22, 2007 8:57 pm
Мнения: 607
Местоположение: Белград
Мнение 
Опитай с тази инициализация:

void InitMain() {
PORTB = 0;
TRISB = 0;

ADCON1 = 6;
PORTA = 255;
TRISA = 0b00000011;

PORTC = 0b00000100;
TRISC = 0;
PWM_Init(5000);
}//~

_________________
http://www.szrefekt.com


Пон Май 23, 2011 8:00 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 
Протел или Протеус? Както и да е. Все тая.

Толкова ли е сложно да настроиш три регистъра?


Пон Май 23, 2011 9:32 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Protel, Proteus, симулация, емулация, поялник, разпойваща станция май вече нямат това значение, което са имали преди :cry:
Симулирал човека и не работел PWM , ай сиктир бе пич, и аз ще ти се връзвам да ти наливам у тъпата кратуна....

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Пон Май 23, 2011 10:29 pm
Профил WWW
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Съб Дек 06, 2008 9:22 am
Мнения: 119
Местоположение: Пловдив
Мнение 
На MikroC библиотечните функции са PWM1_Init, PWM2_Init, PWM3_Init и т.н.

За процесори с един PWM модул се използва по подразбиране PWM1_Init.

Казвал съм го и друг път, дори и когато се преписва се изисква концентрация, иначе следват главоблъсканици.

Оправи си преписа и всичко ще е ОК. Пробвано!


Пон Май 23, 2011 10:58 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Окт 21, 2006 5:21 pm
Мнения: 7
Мнение 
Благодарско на всички, тръгна, но ръчно. Благодаря най-вече на "¶" ей такива интелигентни хора са и нужни на тая държава да се оправи ;) :prayer:


Вто Май 24, 2011 1:35 pm
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

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


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

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