Sainus Napisano Grudzień 8, 2020 Udostępnij Napisano Grudzień 8, 2020 (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 Grudzień 8, 2020 przez Gieneq Zachęcam do używania bloku kodu
marek1707 Grudzień 8, 2020 Udostępnij Grudzień 8, 2020 (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. 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 Grudzień 8, 2020 przez marek1707 1
Sainus Grudzień 8, 2020 Autor tematu Udostępnij Grudzień 8, 2020 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) { } }
marek1707 Grudzień 8, 2020 Udostępnij Grudzień 8, 2020 (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. 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 Grudzień 8, 2020 przez marek1707 1
Sainus Grudzień 8, 2020 Autor tematu Udostępnij Grudzień 8, 2020 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ń.
marek1707 Grudzień 8, 2020 Udostępnij Grudzień 8, 2020 (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 Grudzień 8, 2020 przez marek1707 1
Sainus Grudzień 8, 2020 Autor tematu Udostępnij Grudzień 8, 2020 Wyłączyłem M103C, a korzystam z USBasp więc też ten JTAGEN i zadziałało. Wielkie dzięki za pomoc.
Pomocna odpowiedź
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ę »