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

[ATmega8][asm] konfiguracja PWM

Walentynka 23 Gru 2008 23:04 4875 9
REKLAMA
  • #1 5896943
    Walentynka
    Poziom 14  
    Walczę z tym już od kilku dni, przekopałem większość postów dotyczących PWM, oraz notę katalogowa robię wszystko według niej i tak dalej nie działa.

    Chcę ustawić PWM,Phase and Frequency Correct

    Ustawiam wyjscia PB1 jako wyjscia nastepnie konfguruje bity COM1A1,COM1A2 zgodnie z tabela 38 strona 98. (ostani przykład dwie 1)

    [ATmega8][asm] konfiguracja PWM

    następnie konfiguruje bity WGM1 13, 12, 11, 10 dla mode 9(tabela 39 strona 99) z zapisem wartości TOP do OCR1A tak mi się wydaje ze o to chodzi

    [ATmega8][asm] konfiguracja PWM

    nastepnie ustalam prescaler wartosc TOP w rejestrze OCR1A, itp itd

    kod programu:

    
    .include "m8def.inc"
    
    .macro load
    	push R16
    	ldi R16, low(@1)
    	out @0, R16
    	ldi R16, high(@1)
    	out @0+1, R16
    	pop R16
    .endmacro
    
    .org 0x0000
    rjmp Reset
    
    
    
    Reset:
    	load SPL, RAMEND
    	load OCR1AL, 3445
    
    	ldi R16, 0x07
    	out DDRB, R16
    
    	ldi R16, 0b11000001
    	out TCCR1A, R16
    
    
    	ldi R16, 0b00010001 ;prescaler
    	out TCCR1B, R16
    
    Main:
    
    	nop
    	rjmp Main
    


    Programator i mikro sprawny bo inne pogramy dobrze działają.

    Pytania
    - Wartość w rejestrze OCR1A jest wartością do której będzie zliczał tajmer wiec jak się steruje wypełnieniem.

    -Zauważyłem także dziwne zachowanie po załadowaniu rejestru TCCR1A, zostaje wyzerowana starsza cześć(High) rejestru OCR1A w symulatorze AVRStudio4.

    -Czy jest to poprawna konfiguracja i gdzie powinienem szukać błędu.
  • REKLAMA
  • #2 5897065
    dawid512
    Poziom 32  
    Cytat:
    Wartość w rejestrze OCR1A jest wartością do której będzie zliczał tajmer wiec jak się steruje wypełnieniem.
    Wartość w OCR1A to wypełnienie.
    Cytat:
    Zauważyłem także dziwne zachowanie po załadowaniu rejestru TCCR1A, zostaje wyzerowana młodsza cześć(High) bitu OCR1A w symulatorze AVRStudio4.
    Nie patrz na symulator tylko uruchom na sprzęcie.[quote]
  • REKLAMA
  • #3 5897241
    BoskiDialer
    Poziom 34  
    W trybie 9 który masz, OCR1A jest wartością do której będzie zliczał timer, a więc nie będzie się dało sterować wypełnieniem
    Cytat:
    When using OCR1A as TOP value in a PWM mode, the OCR1A Register can not be used for generating a PWM output.
    Zmień tryb na 8, wtedy licznik będzie zliczał do ICR1
    Cytat:
    If a fixed TOP value is required, the ICR1 Register can be used as an alternative, freeing the OCR1A to be used as PWM output.
    Rejestr ten będzie wtedy pełnił tylko funkcję ograniczenia licznika
    Cytat:
    When the ICR1 is used as TOP value (see description of the WGM13:0 bits located in the TCCR1A and the TCCR1B Register), the ICP is disconnected and consequently the Input Capture function is disabled.
  • REKLAMA
  • #4 5898918
    Walentynka
    Poziom 14  
    Zmieniłem kod na mode8, z tego co rozumiem teraz timer będzie zliczał do TOP które znajduje się w ICR1, a zmiany stanu portu PB1(OC1A) będą w momencie porównania stanu licznika z wartością wpisana do rejestru OCR1A.

    
    .include "m8def.inc"
    
    .macro load
    	push R16
    	ldi R16, low(@1)
    	out @0, R16
    	ldi R16, high(@1)
    	out @0+1, R16
    	pop R16
    .endmacro
    
    .equ FPWM=255
    .equ WYPE=127
    
    .org 0x0000
    	rjmp Reset
    
    
    
    Reset:
    	load SPL, RAMEND
    
    	load ICR1L, FPWM
    	load OCR1AL, WYPE
    
    	ldi R16, 0x07
    	out DDRB, R16
    
    	ldi R16, 0b11000000
    	out TCCR1A, R16
    
    	ldi R16, 0b00010001 ;PRESCALER
    	out TCCR1B, R16
    
    	
    Main:
    
    
    	rjmp Main
    


    Według wzorów podanych w dokumentacji częstotliwość takiego PWM powinna wynosić około 2k Hz jednak dioda nie migają w ogóle. Przy wypełnieniu 50% jak mi się wydaje dla 127 takie powinno być, powinienem zaobserwować ze coś się tam dzieje.
  • #5 5899653
    ZbeeGin
    Poziom 39  
    Szybkie ma kolega oko, jeśli wie, że przy 2kHz dioda jednak nie mruga. :)
    Zmniejsz wypełnienie do 63 i zobacz czy dioda świeci ciemniej - 50% to może być zbyt mało by dało się różnicę jasności zauważyć.
  • #6 5900824
    Walentynka
    Poziom 14  
    możne źle się wyraziłem dioda w ogóle nie świeci jest dobrze podłączona bo w innych programach świeciła mrugała i takie tam. Podejrzewam że gdzieś jest jakiś błąd w programie bądź brakuje jakieś konfiguracji nie trzeba do PWM konfigurować Fuse Bitów ?
  • REKLAMA
  • #8 5907459
    Walentynka
    Poziom 14  
    Znalazłem działający program w innym wątku. Co prawda jest to konfiguracja dla Fast PWM, ale taka sama powinna być dla Phase Corect PWM mode.

    Program napisał Zumek w temacie:

    https://www.elektroda.pl/rtvforum/topic612705-30.html

    
    
    .include "m8def.inc"
    .macro load16
       ldi r16,high(@1)
       out @0+1,r16
       ldi r16,low(@1)
       out @0,r16
    .endm
    .equ res=65535   ;rozdzielczość
    .equ pwm=30000      ;wypełnienie
    .if pwm>res
    .error "stala pwm jest wieksza od rozdzielczosci"
    .endif
    .cseg
    .org 0x0000
    uC_config:
       cli
       load16 SPL,RAMEND
       rcall config_pwm1ab
    main:
       rjmp main
    ; wypełnienie na OC1A(PB1) jest zanegowane do OC1B(PB2)
    config_pwm1ab:
       push r16
       in r16,DDRB
       ori r16,(1<<PB1|1<<PB2);PB1 & PB2 ->wyjście
       out DDRB,r16
       ;TCNT1 < OCR1B -> OC1B=0 & TCNT1 < OCR1A -> OC1A=1
       load16 TCCR1B,((1<<WGM11|1<<COM1B0|1<<COM1B1|1<<COM1A1)<<8)|(1<<WGM12|1<<WGM13)
       clr r16
       out TCNT1H,r16
       out TCNT1L,r16
       out OCR1BL,r16
       out OCR1AL,r16
       out OCR1BH,r16
    
       out OCR1AH,r16
       load16 ICR1L,res
       in r16,TCCR1B
       ori r16,(1<<CS10)
       out TCCR1B,r16 ;start timer1 prescale=1
       pop r16
       ret
    


    Nie rozumiem tylko kilku aspektów tego programu, stała pwm która ma sterować wypełnieniem nie jest ładowana do żadnego rejestru ani OCR1AL, ani OCR1BL. Wiec w jaki sposób steruje ona wypełnieniem nie pojawiając się nigdzie w całym programie oprócz zdefiniowania ?

    Oraz po co i gdzie wykonuje sie ta operacja "; wypełnienie na OC1A(PB1) jest zanegowane do OC1B(PB2)"
  • #10 5954278
    Walentynka
    Poziom 14  
    Działajacy program dla FastPWM mode.

    zapisany bardziej ludzko niż to zrobił zumek:

    
    .include "m8def.inc"
    
    .macro load
    	push R16
    	ldi R16, high(@1)
    	out @0+1, R16
    	ldi R16, low(@1)
    	out @0, R16
    	pop R16
    .endmacro
    
    .equ FPWM=10000	;ROZDZIELCZOSC
    .equ WYPE=9000	;WYPELNIENIE
    .equ PRES=0b001 ;PRESCALER
    
    .org 0x0000
    	rjmp Reset
    
    
    
    Reset:
    	load SPL, RAMEND
    	ldi R16, 0x06
    	out DDRB, R16
    
    	clr R16
            out TCNT1H,r16
            out TCNT1L,r16
            out OCR1AH,r16
            out OCR1AL,r16
            out OCR1BH,r16
            out OCR1BL,r16 
    	
    	load OCR1AL, WYPE
    	load ICR1L, FPWM
    
    Start:
    	ldi R16, 0b10000010
    	out TCCR1A, R16
    
    	ldi R16, 0b00011000
    	out TCCR1B, R16
    
    	in R16, TCCR1B
    	ori R16, PRES
    	out TCCR1B, R16
    Main:
    	rjmp Main
    
REKLAMA