oberallgeier
17.08.2016, 12:03
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.
/* >>
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
}
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.
/* >>
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
}