Witam.
Napisałem kod do PWM w trybie 14.
Przy ustawieniu OCR1A = TOP dioda na nóżce D5 powinna się świecić.
Przy ustawieniu OCR1A = 0 dioda na nóżce D5 powinna się nie świecić.
Świeci w obydwu przypadkach co tu jest nie tak.
Napisałem kod do PWM w trybie 14.
Przy ustawieniu OCR1A = TOP dioda na nóżce D5 powinna się świecić.
Przy ustawieniu OCR1A = 0 dioda na nóżce D5 powinna się nie świecić.
Świeci w obydwu przypadkach co tu jest nie tak.
#define F_CPU 16000000UL //1MHz zegar procesora
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <stdlib.h>
#include <avr\interrupt.h>
#define SET_BIT(r,x) r|=_BV(x);//USTAW BIT W REJESTRZE
#define CLR_BIT(r,x) r&=~_BV(x);//WYCZYŚĆ BIT W REJESTRZE
#define TOG_BIT(r,x) r^=_BV(x); ///ZMIEŃ STAN BITU W REJESTRZE
/*
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////modulacja PWM/////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//COM1A1:0 bity 7,6 w rejestrze TCCR1A -rodzaj wyścia trybu porównaia A
//COM1B1:0 bity 6,4 w rejestrze TCCR1A -rodzaj wyścia trybu porównaia B
//FOC1A -wpisanie logicznej jedynki wymusza natychniastowe porówanie// w trybie PWM musi być ustawiony jako zero
//FOC1B -wpisanie logicznej jedynki wymusza natychniastowe porówanie// w trybie PWM musi być ustawiony jako zero
//WGM10 -\
//WGM11 - \-bit w odpowiedni sposób ustawione ustalają tryb pracy licznika i 3 rodzaje PWM
//WGM12 - /
//WGM13 -/
// dla trybu 14 bity muszą mieć następujące wartości logiczne WGM10="0", WGM11, WGM12, WGM13, muszą mieć stan logiczny "1"
//CS12 -\
//CS11 ----bity służą do wyboru sygnału zegarowego (CS12=0, CS11=0,CS10=1, -pełna prędkość bez preskalera)
//CS10 -/
*/
#define TOP 0x0FFF //maksymalna rozdielczoćś rtybu PWM 12 bit
void PWMinit();
void PWMinit()// inicjalizowanie trybu FAST PWM (Tryb 14 rejestru ICR1)
{
// ustawienie bitów w rejestrze TTCR1A
SET_BIT(TCCR1A,COM1A1); //--Jeśi conajmniej jeden z tych bitów jest ustawiony to wyjście układu porównującego w liczniku zostaje dołączone do
CLR_BIT(TCCR1A,COM1A0); /// końcówki portu I/O. Rejestr kierunku portu DDR musi być ustawiny jako wyjśćie
CLR_BIT(TCCR1A,COM1B1); // odłączenie wyścia trybu porówniania B
CLR_BIT(TCCR1A,COM1B0); // odłączenie wyścia trybu porówniania B
CLR_BIT(TCCR1A,FOC1A); // Likwidacja wymuszenia natychniastowego porównania A
CLR_BIT(TCCR1A,FOC1B); // Likwidacja wymuszenia natychniastowego porównania B
SET_BIT(TCCR1A,WGM11); // konfiguracja trybu PWM
CLR_BIT(TCCR1A,WGM10); // konfiguracja trybu PWM
// ustawienie bitów w rejestrze TTCR1B
CLR_BIT(TCCR1B,COM1B0); // nie wykorzysrujemy odkłucenia wejścia przechwytującego
CLR_BIT(TCCR1B,5); // zerowanie bitu 5 ustawieni jako zero (rezerwa do wykorzystania w przysłaych układach
SET_BIT(TCCR1B,WGM13); // konfiguracja trybu PWM
SET_BIT(TCCR1B,WGM12); // konfiguracja trybu PWM
CLR_BIT(TCCR1B,CS12); // ustawienie trybu zliczania
CLR_BIT(TCCR1B,CS11); // ustawienie trybu zliczania
SET_BIT(TCCR1B,CS10); // ustawienie trybu zliczania
ICR1 =TOP; //ROZDIELCZOŚĆ 12 bit -stała częstotliwość PWM
DDRD=0xFF; //binarnie 1111 1111 - wyjścia
}
//***************************program główny*******************************************************************//
//
int main (void)
{
void PWMinit();
DDRD = (1 << PD5) ; //PD1 = output
OCR1A = TOP ;
while(1)
{
}
return 0;
}