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

ATMega8: Jak uzyskać 12-bitowy PWM dla 4096 kroków w ASM?

Alcatraz 29 Paź 2006 18:51 9545 54
Najlepsze odpowiedzi

Jak w asemblerze na ATmega8 uzyskać 12-bitowy PWM z 4096 krokami do strojenia napięciowego tunera?

Ustaw Timer1 w trybie Fast PWM mode 14 z TOP w ICR1, wpisz do ICR1 wartość 4095 i steruj wypełnieniem przez OCR1A lub OCR1B w zakresie 0–4095; jeśli używasz PB1, konfiguruj kanał OC1A, a jeśli PB2, OC1B [#3177185][#3177647] W tym rozwiązaniu trzeba też ustawić odpowiednie bity WGM i COM w TCCR1A/TCCR1B oraz uruchomić timer preskalerem, np. /1, jak w podanym przykładzie [#3170321][#3177185] Pamiętaj, że 4096 kroków oznacza zakres 0–4095, bo 0 też jest jednym z kroków [#3177647] Sam PWM z procka daje tylko 0–5 V, więc do 33 V potrzebujesz zewnętrznego wzmacniacza/skali i bardzo stabilnego zasilania procka, bo stabilność napięcia PWM zależy od stabilności Vcc [#3169282][#3171291] Jeśli chcesz uzyskać dokładnie 7,5 mV na krok, ustaw wzmocnienie tak, by pełna skala 4096 kroków dawała około 30,72 V na wyjściu i potem dobieraj to na oscyloskopie [#3171291][#3170798]
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
  • #1 3166420
    Alcatraz
    Poziom 11  
    Posty: 62
    Witam.

    Brdzo bym prosil o odpowiedz na pytanie:

    W jaki sposob mam rozwiazac taki problem, chodzi tu o PWM.

    A mianowicie: Mam sobie Uklad zasilacza stabilizowanego 33V, dalej to idzie poprzez filtr do tranzystorka i na wejscie "TU" Glowicy Tunera. Na baze tego tranzystorka wchodzi µC, ktory steruje tu PWM - czyli strojenie napieciowe.

    A teraz problem:
    1. Jak mam uzyskac od 0V do 33V "4096 krokow" czyli jak mam napisac PWM by sterowac przyciskami UP/DN napieciem od 0V do 33V o 7,5mV czyli od 0 do 4096 klikniec w UP i od 4096 do 0 klikniec w DN?

    Jak uzyskac 4096 krokow gdy ja sie tylko bawilem 255 krokami (niewiem jak zrobic wiecej)

    2. Jak i czym ustawic ten skok o 7,5mV

    Jak dobrze zrozumialem tu chodzi o Fast PWM czyli programowe PWM do tego potzrebne jest 12-bit (chyba) standardowo mega8 ma 8-bit.

    Od czego mam zaczac piszac programowe pwm na 12-bit?? bym mogl luznie sobie ustawic te 4096 krokow kazdy o wypelnieniu 7,5mV.

    Do tego chcial bym podlaczyc PWMa

    ATMega8: Jak uzyskać 12-bitowy PWM dla 4096 kroków w ASM?

    Prosze o Pomoc.
    Pozdrawiam Quato.
  • #2 3166888
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Licznik1 ma rozdzielczość 16bit i możesz na nim zrobić PWM z rozdzielczością jaką chcesz. Może być każda wartość którą wpisujesz do rejestru ICR1 lub OCR1A, tylko pamiętaj że wraz ze wzrostem rozdzielczości maleje częstotliwość wyjściowa i filtr w końcu nie zrobi tego co trzeba.
  • #3 3167532
    Jarkon2
    Poziom 25  
    Posty: 1085
    Pomógł: 5
    Ocena: 77
    Witam,
    T1 w ATmega8 rzeczywiście ma rozdzielczość 16 bitów, ale PWM sprzętowo uzyskasz tylko 10 bitów.
    Można jednak zwiekszyć rozdzielczość PWM o 1 lub 2 bity programowo - ostatnio to właśnie udało mi się zrobić :) tylko, że w procku ATtiny13, zwiększyłem PWMa z 8 do 10 bitów - programowo w przerwaniu od licznika, który obsługiwał PWMa.
    Idea jest taka, że musisz załączyć przerwania od licznika, na którym robisz PWM - ale nie przepełnienia, tylko od porównania z rejestrem OCR - i w każdym takim przerwaniu wykonać małą procedurkę, która dokona korekty wartości w rejestrze OCR w zależności od wartości zmiennej sterującej (w Twoim przypadku 0-4095), co określoną liczbę wywołań przerwania.
    Załóżmy, że masz zmienną sterującą, która przyjmuje wartości 0-4095 i chcesz zwiększyć rozdzielczość PWM z 10 do 12 bitów.
    W przerwaniu od porównania licznika z OCR analizujesz zawsze 2 najmłodsze bity 12-bitowej zmiennej sterującej PWMem oraz licznik wywołań przerwania - licznik przyjmujący 4 wartości, np. od 0 do 3.
    Także w tym przerwaniu do rejestru OCR pakujesz 10 najstarszych bitów 12-bitowej zmiennej sterującej PWMem skorygowanych lub nie, tzn. zwiększonych o 1 lub nie zwiększonych.
    O potrzebie korekcji decydują wartości, które wymieniłem powyżej - 2 najmłodsze bity 12-bitowej zmiennej sterującej PWMem (ab) oraz 2-bitowy licznik wywołań przerwania (cd):

    abcd
    0000 - 0 brak korekcji, OCR = 10 najstarszych bitów 12-bitowej bitów zmiennej sterującej
    0001 - 0
    0010 - 0
    0011 - 0

    0100 - 1 korekcja, OCR = 10 najstarszych bitów 12-bitowej bitów zmiennej sterującej + 1
    0101 - 0
    0110 - 0
    0111 - 0

    1000 - 1
    1001 - 1
    1010 - 0
    1011 - 0

    1100 - 1
    1101 - 1
    1110 - 1
    1111 - 0

    Otrzymasz w ten sposób na wyjściu OC procka przebieg 10-bit PWM "lekko modulowanego" - co 1, 2 lub 3 okresy przebiegu PWM - wartością dwóch najmłodszych bitów zmiennej sterującej.
    Jeśli zachowasz odpowiednio dużą częstotliwość przebiegu, myślę, że min 4kHz, to na wyjściu analogowym będziesz miał regulację 4096 różnych wartości napięć :)
    Oczywiście nie zapomnij o dobrej stabilizacji napięcia zasilania procka - to jest jednocześnie napięcie referencyjne takiego przetwornika PWM-analog. Pewnie będziesz zasilał 5V, więc musisz dać na wyjściu wzmacniacz operacyjny, aby uzyskać zakres do 33V - patrz rys.

    Powodzenia, wszystko jest do zrobienia :)
    Załączniki:
    • ATMega8: Jak uzyskać 12-bitowy PWM dla 4096 kroków w ASM? wzm.jpg (6.95 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #4 3167573
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    :arrow: Jarkon2
    Poczytaj dokładnie PDFa co ten scalak potrafi to będziesz pisać wydajniejsze programy.
    W dokumentacji ATmega8 jest napisane:
    "True 16-bit Design (i.e., allows 16-bit PWM)"
    Do tego na wyjściu wzmacniaczy operacyjnych nie wolno dawać kondensatorów podłączonych do masy, chyba że szukasz kłopotów.
  • #5 3168052
    Alcatraz
    Poziom 11  
    Posty: 62
    Co do mozliwosci megi8 mam pojecia w tym zecz ze nigdy nie odpalalem sprzetowego PWM.

    Pytanie jak mam poprawnie ustawic WGM, CS... Na te 12-bitow
    Oraz w jaki sposob ma ustawiac 4096 krokow oraz wpisac stale wypelnienie kazdego kroku co 7,5mV

    Jest to w PDFie ale zabardzo tego nie trybie za duzo tego jest..

    Prosze o pomoc... Dziekuje jak narazie za te informacje.
  • #6 3169282
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Samo PWM zrobi od 0 do 5V a potem jest potrzebny wzmacniacz napięciowy. Czy koniecznie musi być co 7,5mV a co się stanie jak będzie drobniejszy krok?. Cały schemat jestem w stanie ci narysować ale jest jeszcze problem ze stabilnością zasilania ATMegi. Napięcie PWM będzie tak stabilne jak stabilne jest zasilanie ATMegi.
  • #7 3169374
    Alcatraz
    Poziom 11  
    Posty: 62
    Witam Dar.El

    Wlasnie to jest najgorsze ze to musi byc te 7,5mV tak mam to opisane tu chodzi o strojenie napieciowe tunera telewizyjnego.

    Ten schemat co zamiescilem wyzej jest wlasnie przeznaczony do tej glowicy jest on wydlubany z PDFa VCRa SANYO.

    Tak jak tam widac jest koncowka TU glowicy tunera zasilanie stabilizowane 33V oraz wejscie PWM ktore jest podlaczone bezposrednio do Procka (m50957-xxxps) ktory ma standardowo PWMa 14-bit i 16-bit raczej ten 14 jest uzyty (wyczytalem to z jego PDFa).

    Chodzi o to ze program ktory pisze ma obslugiwac cale urzadzenie ktore zmontowalem i brakuje tu programu do mega8 ktory wszystkim steruje.

    A mianowicie wybieranie programow up/dwn z przedzialu 50 zaprogramowanych stacji dane przechowywane w epromie to zakres i wlasnie ilosc krokow.

    Mega ma 5 swichow i lcd all fajnie dziala tylko brak tego pwma :( i sterowania iloscia krokow by je potem przyciskiem memo zapamietac w epromie.

    Moja dalsza zabawa z tym stanela na PWMie moze pomoze cos PDF tego procka co juz to obsluguje dokladnie to jest M50957-125PS.

    Prosil bym Cie o pomoc w napisaniu tego PWMa bo moja wiedza jest za mala by to napisac, a jest mi bardzo potrzebne te urzadzenie.

    Pozdrawiam Patryk
  • #8 3169776
    Jarkon2
    Poziom 25  
    Posty: 1085
    Pomógł: 5
    Ocena: 77
    -> Dar.El
    "True 16-bit Design (i.e., allows 16-bit PWM)"
    Nie mam zamiaru się z Tobą spierać, rzeczywiście jest coś takiego napisane, jednak zwiększanie rozdzielczości, spowoduje spadek częstotliwości przebiegu PWM - sam o tym pisałeś.
    Musisz zatem zwiększać częstotliwość zegara taktującego procek.
    W moim rozwiązaniu wystarczy mała częstotliwość zegara, aby uzyskać podobny efekt - należy pamietać, że zwiększenie częstotliwości taktowania procesora zwiększa pobór prądu, co w moim układzie było priorytetem; wydajność programu, to nie wszystko - należy mieć na uwadze także optymalizację układową oraz mocową.
    Poza tym moje rozwiązanie nadaje się do zastosowania praktycznie do każdego procka, nie tylko ATmega8. Spróbuj zrobić 10-bit PWM w ATtiny13 przy taktowaniu 1.2 MHz i F_pwm >= 4 kHz to zrozumiesz co mam na myśli, a może uważasz, że to niemożliwe?

    "na wyjściu wzmacniaczy operacyjnych nie wolno dawać kondensatorów podłączonych do masy..."

    Pozostawmy teorię teoretykom. W układzie jaki narysowałem ze wzmacniaczem typu LM358 lub OP90 kondensator 10 do 100nF podłączony bezpośrednio między wyjście wzm, a masę bardzo dobrze poprawia stabilność napięcia. Co innego gdyby wzmacniacz pracował, np. w konfiguracji wyjścia prądowego, a nie napięciowego. Dodatkowo LM358 i OP90 nie wymagają ujemnego zasilania - pracują od 0V wzgl. masy na wejściu i wyjściu, dlatego nadają się do tego typu rozwiązań z PWM.

    -> Alcatraz
    Jaki masz kwarc lub jaką częstotliwość wewnętrznego generatora RC ustawiłeś?
    Zobaczymy co da się napisać :)
  • #9 3169891
    Alcatraz
    Poziom 11  
    Posty: 62
    Jak mowilem Atmega 8 ma sterowac calym urzadzeniem t.j.
    Kwarc 8MHz, LCD, 5xSwich

    LCD interface 4-bit
    4 bity lcd wspolne z 4 swichami
    osobno 5 swich, wszystko na PORTD

    SW1 - UP
    SW2 - DN
    SW3 - MODE
    SW4 - BAND SEL
    SW5 - MEMO

    A na PORTB

    PB0 - PWM
    PB1 - AUDIO MUTE /
    PB2 - AFT MUTE
    PB3 - TUNER ON
    PB4 - BAND1
    PB5 - BAND2

    Chodzi mi o PWM tak jak wyzej pisalem i by to nie koligowalo z wyswietleniem danych na lcd oraz wybieranie poszczegolnych kanalow oraz ich programowanie.

    Pozdrawiam Patryk.
  • #10 3170321
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Wyjście PWM może być na PB1 lub PB2 ale ze wskazaniem na PB1. Timer1 w procesorze musi być przeznaczony dla PWM. Jeśli to masz to można robić.
    1. Ustaw PB1 jako wyjście.
    2. TCCR1A=0b10000011
    2. TCCR1B=0b00011001
    3. OCR1A wpisujesz rozdzielczość czyli 4095 (0 też się liczy) ale sprawdzisz w działaniu.
    4. TCNT1 wpisujesz wartość wypełnienia od 0 do 4095
    Robiłem już coś takiego i trochę było problemów. częstotliwość tego PWM będzie około 1950Hz. Sprawdź czy działa.
  • #11 3170507
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Może zastosuj AT90PWM te procki są dedykowane dla sterowania PWM i mają 16bitowe PWM
  • #12 3170798
    Jarkon2
    Poziom 25  
    Posty: 1085
    Pomógł: 5
    Ocena: 77
    -> Alcatraz
    Diabeł tkwi w szczegółach :)

    "Jak mam uzyskac od 0V do 33V "4096 krokow" czyli jak mam napisac PWM by sterowac przyciskami UP/DN napieciem od 0V do 33V o 7,5mV czyli od 0 do 4096 klikniec w UP i od 4096 do 0 klikniec w DN?"

    Chcesz uzyskać krok 7.5mV czy 4096 kroków?
    Powinieneś sprecyzować o jaki przypadek Ci chodzi:
    a) zmieniasz U od 0V do 33V co 7.5mV - to daje 33000mV / 7.5mV = 4400 kroków
    b) zmieniasz U od 0V do 33V w 4096 krokach - to daje skok U = 33 / 4096 = ok. 8mV
    c) zmieniasz napięcie co 7.5mV w 4096 krokach - to daje Umax = 7.5mV x 4096 = 30.72V
    Więc a, b, czy c ? :)
  • #13 3170820
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Nie będzie z tym problemu, wystarczy dostosować rozdzielczość w OCR1A.
  • #14 3171017
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Jeżeli ma to przestrajać głowicę odbiornika TV to nie jest istotna dokładność kroku tylko jego powtarzalność i oczywiście nie może być za duży aby można było dokładnie wstroić odbiornik TV. Dla syntezy napięciowej stosuje się generalnie sprzążenie zwrotne z dedektora wizji na krzywej S co eliminuje błędy a raczej rozbieżności, napięciowe i wpływy termiczne.
  • #15 3171061
    Alcatraz
    Poziom 11  
    Posty: 62
    ad. c) :)

    cos kolo tego:
    napięcie co 7.5mV w 4096 krokach - to daje Umax = 7.5mV x 4096 = 30.72V

    tylko wlasnie zeby to bylo kazdy nastepny krok 7,5mV rowniutko

    ja kombinuje cos z tym pwm i jakies dziwne zeczy mi sie dzieja z scalakiem heh

    wiem ze w przypadku tego fast pwm mozna sobie latwo ustawic wypelnienie i dobrac je w zaleznosci wskazan na oscyloskopie..

    Cytat:
    UP/DN napieciem od 0V do 33V o 7,5mV czyli od 0 do 4096 klikniec w UP i od 4096 do 0 klikniec w DN?


    tak wlasnie tylko chyba licznik na fast pwm zlicza tylko w gore ??
  • #16 3171164
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Czy pamiętasz o kolejności wpisywania liczb 16 bitowych? Fast PWM jest w tym wypadku lepszy bo można uzyskać 2x wyższą częstotliwość.
  • #17 3171291
    Jarkon2
    Poziom 25  
    Posty: 1085
    Pomógł: 5
    Ocena: 77
    "napięcie co 7.5mV w 4096 krokach - to daje Umax = 7.5mV x 4096 = 30.72V
    tylko wlasnie zeby to bylo kazdy nastepny krok 7,5mV rowniutko"

    Żeby było równiutko, to musisz zadbać o porządną stabilizację napięcia zasilania procka.
    Nie polecałbym tu zwykłego 7805, raczej np. 7809 jako wstępny stabilizator i za nim LP2950-5.0
    Ten ostatni to odpowiednik 78L05, tylko że lepszy.

    A jak już jesteś pewien, że zasilanie jest OK, to teraz zrób wzmacniacz o wzmocnieniu 31V / 5V = 6.2 z możliwością dokładnego doregulowania wzmocnienia, np. taki jak na rys.
    stabilne temperaturowo rezystory; napięcie zas. wzm. w granicach 33V do 36V (max Uzas wzm.)
    Wzmacniacz pracuje od 0V, ale od góry potrzebuje ok. 1.5V do 2V zapasu napięcia, aby podać max napięcie na wyjście. Jak masz pod ręką 33V, to będzie idealne do zasilenia wzm. op.
    OP90 jest lepszy od LM358, ale droższy.
    Ustaw PWM = max wypełnienie i doreguluj wzmocnienie tak, aby na wyjściu wzmacniacza było 7.5mV x 4096 = 30.72V. Teraz zmieniając wypełnienie uzyskujesz zmiany Uwyj ze skokiem 7.5mV

    A teraz PWM.
    Możesz zrobić tak jak napisał Dar.El (ja tego nie sprawdzałem) lub pokombinować z moim pomysłem.
    Ja ustawiłem licznik T1 dla trybu 10-bit PWM:
    LDI R16,0B11000011 ;PWM OC1A + NEG
    OUT TCCR1A,R16 ;od 1023 do 0
    LDI R16,0B00001001 ;CK / 1
    OUT TCCR1B,R16
    Co tu jest istotne:
    nie wiem jak to jest w przypadku 16-bit PWM, ale dla 10-bit PWM chcąc uzyskać regulację od 0V należy wpisać do TCCR1A wartość 0B11xxxxxx - to da regulację od 0V do Vcc - ziarno (7.5mV)
    wpisanie do TCCR1A = 0B10xxxxxx - da regulację od (0V+7.5mV) do Vcc - czyli nie osiągniesz 0V.
    Regulacja przy TCCR1A = 0B11xxxxxx odbywa się od wartości 1023 do 0 - daje zmianę U od 0V do Vcc - ziarno

    ;tu w programie - w R17:R16 - wartość 0 - 1023 sterująca PWMem

    ;przeliczenie 0 - 1023 na 1023 - 0, bo NEG PWM (sprzetowa negacja) na OC1A
    LDI R18,LOW(1023)
    LDI R19,HIGH(1023)
    SUB R18,R16 ;R19:R18 = R19:R18 - R17:R16 = 1023 - wartosc zadana
    SBC R19,R17
    MOV R16,R18
    MOV R17,R19

    ;odswiezenie wartosci PWM1 - wyjscie OC1A
    OUT OCR1AH,R17
    OUT OCR1AL,R16


    Reszta później.
    Załączniki:
    • ATMega8: Jak uzyskać 12-bitowy PWM dla 4096 kroków w ASM? uklad.jpg (21.06 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #19 3173411
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Jarkon2, nie potrzeba wzmacniacza operacyjnego. Obejrzyj dokładnie schemat z pierwszego postu.
  • #20 3173934
    Alcatraz
    Poziom 11  
    Posty: 62
    Witam.

    Łożesz Kurde !

    Nie dam tu tego kodu co zem wykombinowal bo to wielka porazka, dioda to mi doslownie troche rozjasni sie po czym zaswieci, po czym znowu zgaznie cos jest ni tak heh.

    tej czesci nei rozumiem co mam z tym zrobic ??

    Cytat:

    LDI R18,LOW(1023)
    LDI R19,HIGH(1023)
    SUB R18,R16 ;R19:R18 = R19:R18 - R17:R16 = 1023 - wartosc zadana
    SBC R19,R17
    MOV R16,R18
    MOV R17,R19


    Zamieszcze tu kod, z ktorym probuje polaczyc tego fast pwma i mi nie wychodzi. Tylko w takiej postaci cos z tego rozumiem i latwo to bedzie gralo z moim kodem zwiekszania krokow i zmniejszania.

    ;*****************************************
    .include "M8def.inc"
    .def Temp =r16 	
    .def pw   =r20	
    
    
    ;***** Init ********************
    INIT_SP:
    
    			ldi   r16,high(RAMEND)   
          		out   SPH,r16 
          		ldi   r16,low(RAMEND) 
          		out   SPL,r16
    
    			ldi Temp,0
    			out OCR1AL,Temp
    			out OCR1BL,Temp
    		
    INIT_PORTB:
    			ser	Temp
    			out	DDRB,Temp		
    			clr Temp
    			out PORTB,temp			
    
    INIT_TIMER_1AB:
    			ldi	Temp, 0b11000011
    			out	TCCR1A, Temp		;
    			ldi Temp, 0b00001001	
    			out TCCR1B, Temp
    
     
    LOOP:		rcall delay	
    			rcall	UP	
    			rcall delay	
    			rcall	DN
    			rcall delay	
    			rjmp 	LOOP
    
    UP:			inc pw
    			out OCR1AL,pw		
    			rcall delay			
    			cpi pw,255		
    			brne UP
    			ret
    
    DN:			dec pw
    			out OCR1AL,pw
    			rcall delay
    			cpi pw,0
    			brne DN
    			ret
    
    
    
    
    DELAY:								; delay of 0.01s @ 8Mhz
    ; ============================= 
    ;    delay loop generator 
    ;     40000 cycles:
    ; ----------------------------- 
    ; delaying 39999 cycles:
              ldi  R17, $43
    WGLOOP0:  ldi  R18, $C6
    WGLOOP1:  dec  R18
              brne WGLOOP1
              dec  R17
              brne WGLOOP0
    ; ----------------------------- 
    ; delaying 1 cycle:
              nop
    ; =============================
       ret
     


    O takie cos mi chodzi tylko bym mogl sterowac 4096 krokami a nie 255, oraz wypelnienie 7,5mV (najlepiej gdybym mogl to jakos ustawiac bym sobie to wyregolowal puzniej na oscyloskopie) i zeby to sie wykonywalo w jakims przerwaniu da sie ?? bym mogl swobodnie wychwytywac moment nacisniecia jakiegos SW ?? Da sie takie cos zrobic??

    Co do schematu z pierwszego postu to on wystarczy jest to standardowy schemat do tego tunera.

    Pozdrawiam i dziekuje za pomoc w realizacji programu oby dwum Panom.
    I prosze o dalsza pomoc.
  • #21 3174006
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Może teraz napisz program korzystający z moich podpowiedzi. Nie zapomnij że niektóre rejestry są 16 bitowe i trzeba je w odpowiedniej kolejności zapisywać.
  • #22 3174325
    Alcatraz
    Poziom 11  
    Posty: 62
    Witam.

    Wlasnie mam z tym problemy.

    ad. 3. OCR1A jak mam tu przypisac w tym rejestrze odpowiednio do OCR1AL i OCR1AH - ZL i ZH nierozumiem tych 16 - bit :P
    ad. 4. TCNT1 tu zas mam wpisac do TCNT0 czy TCNT1L i TCNT1H

    ??

    mozesz mi to wklepac w powyzszy program ??
  • #23 3174451
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Najpierw ładujesz wartość OCR1AH, a następnie OCR1AL. To samo jest z licznikiem najpierw TCNT1H a potem TCNT1L. Jak chcesz odczytać zawartość tych rejestrów to w odwrotnej kolejności, najpierw ...L potem ...H.
  • #25 3174638
    Jarkon2
    Poziom 25  
    Posty: 1085
    Pomógł: 5
    Ocena: 77
    -> Dar.El
    Cytat:
    1. Ustaw PB1 jako wyjście.
    2. TCCR1A=0b10000011
    2. TCCR1B=0b00011001
    3. OCR1A wpisujesz rozdzielczość czyli 4095 (0 też się liczy) ale sprawdzisz w działaniu.
    4. TCNT1 wpisujesz wartość wypełnienia od 0 do 4095

    Jesteś pewien, że to bedzie działać? Po wpisaniu do TCNT1 wartości wypełnienia, w jakim rejestrze będzie realizowane zliczanie impulsów wejściowych licznika T1?
    A może trzeba jeszcze odświeżać wartość TCNT1 po każdym przepełnieniu lub porównaniu, w wyniku którego nastąpiła zmiana stanu linii OC1A?
    Coś mi tu brakuje rejestrów, a na razie nie chce mi się wgłębiać w pdf'a.
  • #26 3174725
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Sprawdziłem w działającym programie i tak właśnie jest zrobione. Wartość OCR1A musi się mieścić między 3 a 65535.
  • #27 3174745
    Jarkon2
    Poziom 25  
    Posty: 1085
    Pomógł: 5
    Ocena: 77
    OCR1A rozumiem, ale TCNT1 po zapisaniu jakąkolwiek wartością powinien ją zmieniać, jako że jest licznikiem impulsów; a skoro piszesz, że ten rejestr pamięta wartość wypełnienia, to musi być jakiś bufor sprzętowy przed nim lub zrobione odświeżanie TCNT1 w przerwaniu od niego.
    Nie omieszkam sprawdzić niebawem jak to działa :)
  • #28 3176107
    Alcatraz
    Poziom 11  
    Posty: 62
    Witam.

    Dopiero co wrocilm i zaczynam sprawdzac ten program i go przeanalizuje.

    Mam takie pytanie z offtopa...

    Jak mam zlikwidowac takiego Warninga:

    tuner.asm(461): warning: .cseg .db misalignment - padding zero byte

    Mam sobie kilkanascie tabel i nie kminie co mam zrobic by tego Warna nie bylo?
  • #29 3176130
    Dar.El
    Poziom 41  
    Posty: 5450
    Pomógł: 750
    Ocena: 888
    Witam
    Na samym początku pisania programu trzeba napisać coś takiego:
    -------------------------------------
    .include "M162def.inc"

    .CSEG

    jmp START ;RESET


    -----------------------------------------------------------
    Czyli zdefiniować jakiego scalaka będziemy używać, oraz zdefiniować miejsce gdzie zaczynają się segment kodu programu.
  • #30 3176402
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Alcatraz napisał:

    Mam takie pytanie z offtopa...
    Jak mam zlikwidowac takiego Warninga:
    tuner.asm(461): warning: .cseg .db misalignment - padding zero byte
    Mam sobie kilkanascie tabel i nie kminie co mam zrobic by tego Warna nie bylo?

    Ilość bajtów w bloku danych MUSI być parzysta , a jeśli nie jest , to i tak kompilator zarezerwuje(doda 1 bajt) parzystą ilość bajtów.
    Więc możesz:
    a)uzupełnić każdy blok do parzystej liczby bajtów
    b)wyłączyć warningi -v0
    c)wszystkie dane umieścić w jednym miejscu pamięci , a wtedy najwyżej "zmarnujesz" 1 bajt.
    Ja stosuję opcję c.

    Piotrek

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji 12-bitowego PWM (4096 kroków) na mikrokontrolerze ATMega8 w asemblerze, celem precyzyjnego sterowania napięciem od 0 do 33V z krokiem około 7,5mV, wykorzystywanym do strojenia napięciowego głowicy tunera telewizyjnego. ATMega8 posiada sprzętowy timer1 o rozdzielczości 16-bit, jednak sprzętowo PWM można uzyskać do 10 bitów. Proponowane rozwiązania obejmują wykorzystanie trybu Fast PWM z ustawieniem TOP w rejestrze ICR1 na 4095, co pozwala na 12-bitową rozdzielczość, przy czym wypełnienie PWM reguluje się przez rejestry OCR1A lub OCR1B. Wskazano, że zwiększenie rozdzielczości PWM powoduje spadek częstotliwości sygnału, co wymaga kompromisu między rozdzielczością a częstotliwością PWM i stabilnością zasilania. Zalecane jest stosowanie wzmacniacza operacyjnego o wzmocnieniu około 6,2 do przeskalowania napięcia PWM z 0-5V do 0-33V, z dokładną stabilizacją napięcia zasilania mikrokontrolera. W dyskusji pojawiły się przykładowe fragmenty kodu asemblerowego konfigurującego timer1 w trybie Fast PWM, z uwzględnieniem poprawnego zapisu 16-bitowych rejestrów OCR1A i TCNT1 (najpierw bajt wysoki, potem niski). Omówiono także programowe zwiększanie rozdzielczości PWM poprzez korektę wartości OCR1A w przerwaniach, co pozwala na uzyskanie efektywnej rozdzielczości do 12 bitów i więcej. Poruszono kwestie inkrementacji i dekrementacji 16-bitowych wartości PWM w asemblerze, z wykorzystaniem instrukcji ADIW, SUBI i SBC. Wskazano na konieczność odpowiedniego ustawienia portów i pinów (np. PB1 jako wyjście PWM) oraz na problemy z kolizją funkcji PWM z innymi sygnałami (np. AFT MUTE na PB2). Dyskusja zawierała także porady dotyczące eliminacji warningów kompilatora związanych z wyrównaniem danych w asemblerze. W podsumowaniu podkreślono, że sprzętowo ATMega8 pozwala na 10-bitowy PWM, a wyższe rozdzielczości można osiągnąć programowo, jednak wymaga to kompromisów i dokładnej stabilizacji układu zasilania oraz filtracji sygnału PWM.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA