Atmega8L need help PWM

Thread Starter

y3llowfl4sh

Joined Oct 28, 2009
4
hi there,

im using codevisionAVR to program Atmega8L,
PWW on timer 2 (8-bit)
Clock source: System Clock
Clock value: 1000.000 kHz
Mode: Phase correct PWM top=FFh
OC2 output: Non-Inverted PWM

im changing OCR2 from 0-255 to alter the duty cycle but
when putting OCR2=0 the PWM output PIN is high,still can't figure this out it should be zero but when using fast PWM with top=ffh Mode this problem is solved.

also when i tried to use PWM on timer1(16 bit)
for both Modes still got the same problem

here's my code
any help will be highly appreciated
thanx in advance

Rich (BB code):
#include <stdio.h>
#include <mega8.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>

// Declare your global variables here

unsigned char w[2];

int show_variable_on_lcd(int x) 

{
sprintf(w,"\r %04d",x);
lcd_clear();
lcd_puts(w);
delay_ms(200);
return;
}


void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x08;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Phase correct PWM top=FFh
// OC2 output: Non-Inverted PWM
ASSR=0x00;
TCCR2=0x61;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

while (1)
      {
      // Place your code here 
      OCR2=0;
      show_variable_on_lcd(OCR2);

      };
}
 

mik3

Joined Feb 4, 2008
4,843
I have checked the registers of the microcontroller from its datasheet and the code CodeVision generated is correct (at least for timer 2). Maybe a fuse is not set properly.
 

Frakk

Joined Jul 6, 2009
40
When using fast pwm, the output will be high for 1 clock cycle (assuming non-inverting mode), even if the compare register is 0 so you can't achieve 0% duty cycle. If I remember correctly this is written in the datasheet and I had this experience with them as well. Try doing phase correct pwm and see if that helps.
 

Thread Starter

y3llowfl4sh

Joined Oct 28, 2009
4
i tried phase correct mode but it's the same,also when i set the compare register to 0 the duty cycle is 100%.

i think i'll go for inverting mode to handle this problem,but if you have any suitable solution just through it .

im really grateful for your help
thnx for your time,,

Amr
 

mik3

Joined Feb 4, 2008
4,843
If you put the correct settings in codevision and let generate the code it will work fine. Remove the LCD code from the program and try again with only the PWM code. Maybe your programming the problem is with the programmer.
 
Top