Hallo Alle.
Umgebung:
Win10-pro, AtmelStudio7 (Version: 7.0.1006), Nanoclone 20 MHz.
Ein peinlicher, versteckter? Programmierfehler macht mir zu schaffen. Verschiedene Änderungen bringen keine Hilfe
Folgender Code soll per HardwarePWM am Pin PB3/OC2A bei meinem bereits mehrfach erfolgreich benutzten Nanoclone die LED mit fade-in und fade-out leuchten lassen. Die Schleife zum fade-in bringt das weiche Aufleuchten der LED, die unmittelbar folgende for-Schleife hält das programmierte delay ein, aber die LED leuchtet hier überhaupt nicht. Ich sehe keinen Fehler :-/ und bitte um Hilfe.
Code:/* >> Stand ...\.._LED-PWM_02-1\main.c =============================================================================== = Target MCU : ATmega 328P TQFP Target Hardware : arduino nano von paradisetronic Target cpu-frequ. : 20 MHz Resonator (War 16 MHz Resonator bis 18-07-2016) ============================================================================== */ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #define F_CPU 16000000UL // ATMEL-Standard-Bibliotheken #include <avr/io.h> #include <util/delay.h> //-------------------------------------------------------------- // Globale variable uint8_t i; //-------------------------------------------------------------- // Funktionsprototypen void PWM_Counter2(void); //ohne Rückgabewert // === HAUPTProgramm ========================================================== = int main ( void ) { // DDRB = 0b00101001; // Ausgänge PB0, PB3/OC2A, PB5 PORTB = 0b11010110; // + Port/Pull Ups (1) aktivieren für unbenutzte Eingänge DDRD = 0b11000000; // Ausgänge PD6 und PD7 PORTD = 0b00111111; // Pull Ups siehe oben // - - - - - - - - - - - - - - - PWM_Counter2(); // Timer 2 initialisieren // while(1) { for( i=0; i<200; i++) // for-Schleife 1. Compare Match Register wird // mit jedem Schleifendurchlauf inkrementiert { OCR2A = i; // OCR2A _delay_ms( 5); } for( i=200; i>0; i--) // for-Schleife 2 { OCR2A = i; _delay_ms( 5); } } // Ende while (1) return 0; // Ende des Hauptprogramms } //-------------------------------------------------------------------------------- // Funktionsdefinitionen // ============================================================================= = // == Aufgabe: Timer2A für LED-PWM auf Port OC2A/PB3 initialisieren // Es wird also die >>Hardware-PWM<< benutzt, hier auf OCR2A/PB3. // Dokumentation Atmel-8271J-AVR- ATmega-Datasheet_11/2015 // - - - - - - - - - - - - - - - - void PWM_Counter2 (void) // Initialisiere TimerCounter 2 A { TCCR2A |= (1<<COM2A1)|(1<<COM2A0); // Set OC2A on Compare Match, clear OC2A at BOTTOM TCCR2A |= (1<<WGM20); // PWM Phase Correct, Mode 5, Teil 1 TCCR2B |= (1<<WGM22); // PWM Phase Correct, Mode 5, Teil 2 // TCCR2B |= (1<<CS21); // clk/8 (From prescaler) // 16 MHz / 8 => 2 MHz, 1 tick sind dann 0,5 µs // 200 tick sind 50 µs, ==> Leuchtdauer der LED // bei OCR2A "200" und delay 5 mit ED 10 % OCR2A =200; // Initialisieren OCR2A Anm: nicht nötig TIMSK2 |= (1<<OCIE2A); // Tmr/Cntr2 CompareA interrupt enabled }







Zitieren



Lesezeichen