nedaří se mi rozběhat HW PWM na ATmega88. Nejsem si jist zda nechci něco, co není proveditelné.
Používám Timer counter 0 pro generování 1ms pulzů. Na portech PB1 a PB2 potřebuji dva na sobě nezávisle říditelné PWM kanály. Ty jsou taky řízené pomocí TC0.
Mám nastaveno TCTN0 na hodnotu 127 znamená to že: PWM bude už jen 7 bitové?
Pokud jsem správně pochopil tak zápis do TCCR0A udělá:
(1<<COM0A0) // při přetečení invertuje pin mcu PB1
(1<<COM0B0) // při přetečení invertuje pin mcu PB2
(1<<WGM00) | (1<<WGM01) // nastaví mode 3 Fast PWM
OCR0A // přednastaví hodnotu, která se bude inkrementovat až do přetečení
Nějak se v tom ztrácím, ocením jakoukoliv nápovědu.
Kód: Vybrať všetko
#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
uint16_t a =0;
uint8_t dispupdate =0;
uint16_t c =0;
ISR (TIMER0_OVF_vect){
TCNT0 =127;
PORTC ^= (1 << PC1); // Invert
a++;
dispupdate--;
c--;
}
int main(void)
{
DDRC = 0b00111110;
DDRD = 0b11111111;
DDRB = 0b00000111;
PORTB |= (1 << PB5); // pull up
PORTB |= (1 << PB4); // pull up
PORTB |= (1 << PB3); // pull up
uint8_t i =0;
uint16_t j = 0;
uint8_t charakter =0;
uint8_t tlPB5 =0;
uint8_t tlPB4 =0;
uint8_t tlPB3 =0;
uint8_t dPB5 =0;
uint8_t dPB4 =0;
uint8_t dPB3 =0;
uint8_t start =0;
// ?íslice na 7 segmentovem displayi {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
uint8_t segments[10] = {0xDE, 0x88, 0x5D, 0x9D, 0x8B, 0x97, 0xD7, 0x8C, 0xDF, 0x9F };
TCNT0 = 127; // pocatecni hodnota
TCCR0B |= (1<<CS01) | (1<<CS00); // PRESCALER 8
TCCR0A |= (1<<COM0A0) | (1<<COM0B0) | (1<<WGM00) | (1<<WGM01);
TIMSK0 = (1<<TOIE0); //Timer/Counter0 Overflow Interrupt Enable
OCR0A = 200;
OCR0B = 200;
sei();
while (1){
if(dispupdate==0){
if(charakter == 0){
PORTC |= (1 << PC2); // VCC
PORTC &= ~(1 << PC3); // VCC
i = j / 1000;
PORTD = segments[i];
}
if(charakter == 1){
PORTC |= (1 << PC5); // VCC
PORTC &= ~(1 << PC2); // VCC
i = j % 1000 /100;
PORTD = segments[i];
}
if(charakter == 2){
PORTC |= (1 << PC4); // VCC
PORTC &= ~(1 << PC5); // VCC
i = j % 100 /10;
PORTD = segments[i];
}
if(charakter == 3){
PORTC |= (1 << PC3); // VCC
PORTC &= ~(1 << PC4); // VCC
i = j % 10;
PORTD = segments[i];
}
if(charakter < 3){
charakter ++;
}
else{
charakter =0;
}
dispupdate=4;
}
if(c==0){
if((PINB & (1 << PB5)) == 0){
tlPB5++;
if((tlPB5>=10) & (dPB5==0)){
j++;
dPB5=1;
}
}
else{
tlPB5=0;
dPB5=0;
}
if((PINB & (1 << PB3)) == 0){
tlPB3++;
if((tlPB3>=10) & (dPB3==0)){
j--;
dPB3=1;
}
}
else{
tlPB3=0;
dPB3=0;
}
if((PINB & (1 << PB4)) == 0){
tlPB4++;
if((tlPB4>=10) & (dPB4==0)){
start++;
dPB4=1;
}
}
else{
tlPB4=0;
dPB4=0;
}
c=1;
}
if (start >= 2){
start=0;
}
if(j==0){
start=0;
}
if((a>=1000) & (start == 1) & (j>=1)){
a=0;
j--;
}
}//while
} // int main