Микроконтролери и електроника
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?
#-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 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);, но никаква идея защо нищо не се случва.
#-o #-o #-o

Автор:  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, но ето ти работещ код ( за друг компилатор е, може да се наложи да попромениш това-онова по имената на служебните регистри ):
Код:
/*
; 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 битове, или неработещ осцилатор или комбинация...

Автор:  Nikola [ Пон Май 23, 2011 7:23 pm ]
Заглавие: 

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

Автор:  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, симулация, емулация, поялник, разпойваща станция май вече нямат това значение, което са имали преди :cry:
Симулирал човека и не работел PWM , ай сиктир бе пич, и аз ще ти се връзвам да ти наливам у тъпата кратуна....

Автор:  a_stankov [ Пон Май 23, 2011 10:58 pm ]
Заглавие: 

На MikroC библиотечните функции са PWM1_Init, PWM2_Init, PWM3_Init и т.н.

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

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

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

Автор:  Nikola [ Вто Май 24, 2011 1:35 pm ]
Заглавие: 

Благодарско на всички, тръгна, но ръчно. Благодаря най-вече на "¶" ей такива интелигентни хора са и нужни на тая държава да се оправи ;) :prayer:

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