ATmega16 Timer 1 Phase Correct PWM Mode
Mit diesem Sorucecodebeispiel kann der Timer 1 des ATmega16 im Phase Correct PWM Mode initialisiert werden.
Beschreibung
Timer 1 läuft im Phase correct PWM Mode. An PD5 wird das PWM Signal ausgegeben. Die Overflow- und Compare Interrupts sind aktiviert und ihr Auftreten wird auf den Kanälen PA0 und PA1 gezeigt.
Jedes Mal, wenn einer dieser Interrupts stattfindet, erscheint auf dem Digitalport ein Puls. Das PWM Signal hat einen Dutycycle von 10%. |
Please visit: the four |
C Sourcecode
#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
DDRD = 0x20; // Setup PD5 as output
DDRA = 0x03; // Setup PA0 and PA1 as output
ICR1 = 1000; // Set TOP to 10000
OCR1A = 100; // Set Dutycycle to 10%
TCCR1A = (1<<WGM11)|(1<<COM1A1); // Set Timer1 in Phase Correct Mode
// with ICR1 as TOP value. Set OC1A
TCCR1B = (1<<WGM13)|(1<<CS10); // on compare match and clear OC1A
// on BOTTOM. Clock Prescaler is 1024
TIMSK |= (1<<TOIE1) | (1<<OCIE1A); // Enable Timer 1 Overflow
// and Compare interrupt
sei(); // Set the I-bit in SREG
for(;;); // Endless loop
// main() will never be left
return 0; // This line will never be executed
}
// Interrupt subroutine timer 1 overflow
ISR(TIMER1_OVF_vect)
{
PORTA ^= 0x01; // Toggle PA0
PORTA ^= 0x01; // Toggle PA0
}
// Interrupt subroutine timer 1 compare A match
ISR(TIMER1_COMPA_vect)
{
PORTA ^= 0x02; // Toggle PA1
PORTA ^= 0x02; // Toggle PA1
}
Download C-Sourcefile mit ASCII-Schema: C-Sourcefile mit ACII-Schema
Signalplots
Gelb: Digitales Ausgangssignal PD5 (OC1A)
|