logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATTiny13] Czy można uzyskać 2 linie PWM jednoczśnie?

Tomator.pl 03 Sie 2008 15:45 3361 2
  • #1 5404539
    Tomator.pl
    Poziom 11  
    Witam

    Zacząłem nowy miniprojekt i wyszło, że najlepiej byłoby użyć dwóch linii PWM. Ponieważ mam pod ręką sporo ATTiny13, postanowiłem wykorzystać ten typ. W dokumantacji napisano i to chyba nawet kilka razy, że ATTiny13 posiada dwa niezależne komparatory. No to napisałem:

    #include <avr/io.h>
    #include <stdint.h>
    #include <avr/interrupt.h>
    #include <avr/eeprom.h>
    
    #define LED  (1 << PB0)
    #define PING (1 << PB1)
    #define ECHO (1 << PB2)
    
    #define FAST_PWM     ((1 << WGM01) | (1 << WGM00))
    #define COMPARE_MODE ((1 << COM0A1) | (0 << COM0A0) || (1 << COM0B1) | (0 << COM0B0))
    
    
    int main ()
    {
    	MCUCR = (1<< ISC00) | (1 << ISC01); // listen to raising edge pin change
    	PCMSK = 1 << PCINT2; // configure interrupt on pin 2 change
    	GIMSK = 1 << PCIE; // enable pic change interrupts
    	DDRB = LED | PING;
    	OCR0B = 0x80; // square 50% ping wave
    	OCR0A = 0x40;;
    	TCCR0A = FAST_PWM | COMPARE_MODE;
    	TCCR0B = 1 << CS00;
    	sei();
    	while(1)
    	{}
    }


    Czyli moim zdaniem ustawiłem Fast PWM i włączyłem dwie linie do generowania PWM i kazałem licznikowi liczyć... (Procedurę obsługi przerwania wyrzuciłem z listingu.)

    Problem jest taki, że kiedy odpalam to w symulatorze pod AVR Studio 4, to licznik się "kręci", ale PWM nie działa. Gdy włączę tylko linię a LUB b, to owszem, ta jedna linia chodzi. Ale obie już nie.

    Pytanie mam takie, czy:
    1. Coś skopałem
    2. Symulator nie daje rady
    3. ATTiny13 ma dwa komparatory, ale w zadnym trybie nie mogą one działać jednocześnie tworząc 2 kanały PWM.
  • Pomocny post
    #2 5404659
    zumek
    Poziom 39  
    Tomator.pl napisał:

    
    #define COMPARE_MODE ((1 << COM0A1) | (0 << COM0A0) || (1 << COM0B1) | (0 << COM0B0))
    


    Czyli moim zdaniem ustawiłem Fast PWM i włączyłem dwie linie do generowania PWM i kazałem licznikowi liczyć... (Procedurę obsługi przerwania wyrzuciłem z listingu.)

    Z Twoim zdaniem , nie zgadzam się ja i kompilator ;)
    Zastanów się nad różnicą , pomiędzy | i ||

    Piotrek
  • #3 5404704
    Tomator.pl
    Poziom 11  
    Save&Play...

    Łał, jesteś genialny! Podejrzewałem, że to jakaś pierdółka, ale pewnie szukałbym jej do października :) Działa, znaczy się!

    Dzięki!
REKLAMA