Skocz do zawartości

Atmega128A - problem z OC1C


Pomocna odpowiedź

Napisano (edytowany)

Witajcie
Mam problem z Timerem 1 w Atmega128. Próbuje uruchomić 3-fazowy PWM przy użyciu timera 1. Wyjścia OC1A i OC1B reagują na poniższy kod (zmieniam OCR1 od 0),  ale OC1C nie zmienia stanu (zachowuje się jak dla 0). Do wyjść PWM (PB5-PB7) mam narazie podłączone LEDy. 2 z nich przy wartościach rejestrów OCR1 równych 255, mocno świecą lecz ten od OC1C nie. Dla wartości 0 w wszystkich OCR1 ledy nieznacznie świecą. O czym zapomniałem konfigurując rejestry? Jestem raczej mało zaawansowany w tej kwestii.


Tutaj kod którym chce uruchomić ten PWM:

int main(void)
{
    DDRB|=(1<<PB7)|(1<<PB6)|(1<<PB5);
    TCCR1A    |=    (1<<WGM10) ;
    TCCR1B    |=    (1<<WGM12) ;
    TCCR1A    |= (1<<COM1A1) | (1<<COM1B1) | (1<<COM1C1);
    TCCR1B  |= (1<<CS10) | (1<<CS11);
    ICR1 = 255;
        OCR1A    =    255;
        OCR1B    =    255;
        OCR1C    =    255;
    while (1)
    {

    }
}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu
(edytowany)

Napisz w którym trybie odpalasz timer 1. Bo z WGM wynika, że w 5, a do tego nie pasuje mi zapis do ICR1.

I czy na pewno nie uruchamiasz jednocześnie timera 2, bo wtedy automatycznie startuje modulator, którego wyjście widać właśnie na PB7.

m128mod.thumb.PNG.2895f9638c583720b0bbfb60ef72603d.PNG

EDIT: A najlepiej pokaż cały kod jaki naprawdę ładujesz do procka. Jakże powszechne jest przekonanie, że błąd jest w miejscu gdzie sie go spodziewamy.

Edytowano przez marek1707
  • Lubię! 1

Timer 1 ustawiałem na FAST PWM 8 bit, a timera 2 nie ruszałem w ogóle.

To jest ostatni kod jaki wgrywałem.

#include <avr/io.h>
#define F_CPU 1000000UL 
#include <util/delay.h>

int main(void)
{
	DDRB|=(1<<PB7)|(1<<PB6)|(1<<PB5);
	TCCR1A	|=	(1<<WGM10) ;
	TCCR1B	|=	(1<<WGM12) ;
	TCCR1A	|= (1<<COM1A1) | (1<<COM1B1) | (1<<COM1C1); 
	TCCR1B  |= (1<<CS10) | (1<<CS11);
	ICR1 = 255;
        OCR1A    =    0;
        OCR1B    =    0;
        OCR1C    =    255;
    while (1) 
    {

    }
}

 

(edytowany)

OK, to jeszcze sprawdź jak masz ustawione fuse bity. ATmega128 ma taki jeden odpowiedzialny za kompatybilność tego scalaka z historyczną już mega103. A w tamtym chipie niektóre funkcje nie istniały. OC1C do nich się zalicza, bo Timer 1 miał wtedy tylko dwa wyjścia PWM.

mega128compat.thumb.PNG.97e683feaa934f6528e747aea714cacd.PNG

To w jaki spsób możesz grzebać w fuse bitach zależy od programatora. A same bity - ich liczba i znaczenie zależą od modelu procesora AVR. Każdy ma inaczej. Szukaj w datasheet konkretnie ATmega128.

Edytowano przez marek1707
  • Lubię! 1

AVR.thumb.png.81af741c5e61a7649f51b0e08b292b6a.png

Rozumiem że ta zaznaczona opcja M103C może powodować te problemy? Dotychczas nie bawiłem się w konfiguracje tych fusebitów, korzystałem z domyślnych ustawień.

(edytowany)

Tak, wyłącz M103C bo to wycina wiele fajnych peryferiów i funkcji atmega128 oraz - jeśli nie używasz zaawansowanego programatora/debuggera JTAG - także bit JTAGEN. Ten z kolei wyłącza z normalnego funkcjonowania 4 bity portu F.

Możesz też włączyć EESAVE - wtedy podczas operacji chip erase poprzedzającej zawsze wpisanie nowego kodu, nie będzie niszczona zawartość EEPROMu. To bardzo wygodne, jeśli masz tam jakieś logi albo współczynniki kalibracyjne, program nie będzie musiał ich liczyć od nowa.

Edytowano przez marek1707
  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...