Puls-weiten-modulation (PWM), die auf AVR-Studio

Ich versuche, PWM eine LED an einen ATmega8, einen pin von port B. einrichten der Timer wurde ärgerlich, und ich weiß nicht, was zu tun mit meiner OCR1A. Hier ist mein code, und ich würde gerne etwas feedback.

Ich versuche nur, um herauszufinden, wie die Verwendung von PWM. Ich weiß, das Konzept, und OCR1A soll der Bruchteil des gesamten Zähler wollt ich mal den Puls auf.

#define F_CPU 1000000  //1 MHz

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/interrupt.h>

int main(void){

    TCCR1A |= (1 << CS10) | (1 << CS12) | (1 << CS11);
    OCR1A = 0x0000;
    TCCR1A |= ( 0 << WGM11 ) | ( 1 << WGM10 ) | (WGM12 << 1) | (WGM13 << 0);
    TCCR1A |= ( 1 << COM1A0 ) | ( 0 << COM1A1 );
    TIMSK |= (1 << TOIE1); //Enable timer interrupt
    DDRB = 0xFF;
    sei(); //Enable global interrupts
    PORTB = 0b00000000;

    while(1)
    {
        OCR1A = 0x00FF; //I'm trying to get the timer to alternate being on for 100% of the time,
        _delay_ms(200);
        OCR1A = 0x0066; //Then 50%
        _delay_ms(200);
        OCR1A = 0x0000; //Then 0%
        _delay_ms(200);
    }
}

ISR (TIMER1_COMA_vect)  //timer0 overflow interrupt
{
    PORTB =~ PORTB;
}
  • Beantwortet, poste es morgen (nach 8 Stunden).
  • Für ein tieferes Verständnis empfehle ich die Lektüre des Datenblattes: atmel.com/Images/doc2486.pdf
  • Habe nicht viel hinzuzufügen, um die Diskussion nur ein kleiner Hinweis, dass das Umschalten eine pin ist schneller, wenn Sie tun PINB = 0xff statt PORTB = ~PORTB
InformationsquelleAutor michaeljiz | 2012-02-28
Schreibe einen Kommentar