Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8515] PWM na 16 bitowym działa na 8 niechce dlaczego?

14 Paź 2009 22:43 1509 3
  • Poziom 18  
    Witam poniżej przedstawiam kod programu za srednikami jest poustawiany timer 16 bit który steruje serwomechanizmem z modeli RC i działa wszystko poprawnie (wyjscie OC1A do serwa)

    natomiast ja chcialbym to serwo wysterować 8 bitowym wyjscie (OC0/t0 pin1 do serwa) I niby wszytsko dobrze posutawialem ale serwo ani drgnie dlaczego?

    Code:

    #include "avr.inc"
    #include <m8515def.inc>



    .cseg
    .org 0x00
    Rjmp Reset
    .org 0x06
    Rjmp TPWM
    .org 0x07
    Rjmp TKM
    .cseg
    .org 0x11

    ; D E F I N I C J E     P O R T Ó W

    ;klawiatura
    #define      I_Fast      PA0      ;Guzik Szybciej
    #define      I_Slow      PA1      ;Guzik Wolniej
    #define      I_OnOff      PA2      ;Guzik On/Off

    ;Dodatkjowe czujniki
    #define      I_Stop      PA7      ;Pedał stopu
    #define      I_Clutch   PA6      ;Pedał sprzęgła

    ;Dioda
    #define      D_OnOff      PC0


    ;Definicja rejestrów
    .def   Acc         =   R23
    .def   Serwo      =   R17
    .def   Temp      =   R22


    ;Stałe - pozycja sero
    .equ   Min      =   0xB2 ;b6
    .equ    Max      =   0xD9  ;f0

    ;Obsługa PWM - przerwanie timer1
    TPWM: ;Okres 20ms
    ;   Ldi r19, 0x03
    ;   Out TCNT1H, r19
    ;   Ldi r19, 0x1B
    ;   Out TCNT1L, r19
       Reti

    TKM: ;Okres 20ms
       Ldi Acc, 0xC7
       Out TCNT0, Acc   
       Reti


    Reset:

       ;Ustawia wskaźnik stosu
       Ldi    Acc,low(RAMEND)   
       Out    SPL,Acc         
       Ldi    Acc,high(RAMEND)   
       Out    SPH, Acc



       ;Konfiguruj Timer0 na tryb PWM - Phase corect , Preskaler 1024
       Ldi Acc, 0x45
       Out TCCR0, Acc

       ;Okres 20ms
       Ldi Acc, 0xC7
       Out TCNT0, Acc

       ;Stała wypelnienia -> stan niski
       Ldi Acc,  0xFF
       Out OCR0, Acc


       ;Konfiguruj Timer1 na tryb PWM 10bit, Preskaler 256
    ;   Ldi Acc, 0xC3
    ;   Out TCCR1A, Acc
    ;   Ldi Acc, 0x04    ;0x04 włacza PWM 
    ;   Out TCCR1B, Acc


       ;Okres 20ms
    ;   Ldi Acc, 0x03
    ;   Out TCNT1H, Acc
    ;   Ldi Acc, 0x1B
    ;   Out TCNT1L, Acc

       ;Stała wypelnienia -> stan niski
    ;   Ldi Acc,  0xFF
    ;   Out OCR1AH, Acc
    ;   Out OCR1AL, Acc



       ;Ustaw Porty
       Ldi Acc,0x00      ;Port A jaka wejscie klawiszy
       Out DDRA, Acc
       Ldi Acc, 0xFF
       Out PORTA, Acc
       Out PINA, Acc

       Ldi Acc, 0xFF   ;Port C dioda
       Out DDRC, Acc
       Ldi Acc, 0x00
       Out PORTC, Acc
       Out PINC, Acc

       Ldi Acc, 0x7F   ;Port D wyjscie
       Out DDRD, Acc
       Ldi Acc, 0x80
       Out PortD, Acc
       Out PIND, Acc

       Ldi Acc, 0xFF   ;Port B wyjscie
       Out DDRB, Acc
       Ldi Acc, 0x00
       Out PortB, Acc
       Out PINB, Acc

       Ldi Acc, 0x00 ; odblokuj przerwanie od timera 0
       Out TIMSK, Acc



    ;   Ldi Acc, 0x00 ; odblokuj przerwanie od timera 1
    ;   Out TIMSK, Acc




       Ldi Acc,  Min  ;F0
       Mov Serwo,Acc
    ;   Out OCR1AL, Acc
       Out OCR0, Acc

       sei


    Sta:

       Ldi Acc,  Min  ;F0
    ;   Out OCR1AL, Acc
       Out OCR0, Acc

        Cbi PortC,D_OnOff

    ;    Cbi DDRA,I_Stop
    ;    Cbi PortA,I_Stop
          

        Delay_MS 255
        Delay_MS 255
        Delay_MS 255
        Delay_MS 255
        Delay_MS 255
        Delay_MS 255

       Ldi Acc, 0x00    ;0x04 włacza PWM 
    ;   Out TCCR1B, Acc   
       Out TCCR0, Acc   


    Loop:
        Sbic PinA,I_Stop  ;Sprawca czy wcisnieto Stop
       Rjmp loop
    ;   Rjmp Loop

    N1: Sbic PinA,I_Clutch ;Sprawdza czy wcisnieto hamulec
       Rjmp N2
       Rjmp Loop


    N2:   Sbis PinA,I_OnOff ; Sprawdza czy właczono tempomat
       Rjmp N3
       Rjmp Loop
       
    N3: Sbi PortC,D_OnOff
       Delay_Ms 255
       Delay_Ms 255
       Ldi Acc, 0x04    ;0x04 włacza PWM 
       Out TCCR1B, Acc

       Inc Serwo ;cdvxcvcx
       Inc Serwo ;cdvxcvcx
    ;   Out OCR1AL, Serwo
       Out OCR0, Serwo


       Delay_Ms 255

       Dec Serwo
       Dec Serwo ;vcbcvc
    ;   Out OCR1AL, Serwo
       Out OCR0, Serwo


       
    Loop2:
       Sbis PinA,I_Fast
       RCall Up

       Sbis PinA,I_Slow
       RCall Down
          
       Sbis PinA,I_OnOff ; Sprawdza czy wyłaczono tempomat
       Rjmp Sta

        Sbic PinA,I_Stop  ;Sprawca czy wcisnieto Stop;
       Rjmp Sta


       Sbis PinA,I_Clutch ;Sprawdza czy wcisnieto hamulec
       Rjmp Sta


       Rjmp Loop2

    Up:
       Inc Serwo
       Cpi Serwo,Max
       Brcc ed1
       rJMP NF
    ed1:
       dec serwo
       rET

    nf:
       Inc Serwo ;xcvxc
       Inc Serwo ;cdvxcvcx
       Inc Serwo ;cdvxcvcx
       

       Cbi PortC,D_OnOff   
    ;   Out OCR1AL, Serwo
       Out OCR0, Serwo
       Delay_MS 65
       Sbi PortC,D_OnOff
       Delay_MS 65
       Cbi PortC,D_OnOff
       Delay_MS 65
       Sbi PortC,D_OnOff


       
       Dec Serwo
       Dec Serwo ;vcbcvc
       Dec Serwo ;vcbcvc
    ;   Out OCR1AL, Serwo
       Out OCR0, Serwo
             
       Ret
    end1:
       Dec Serwo
       Ret


    Down:
       

       Dec Serwo
       Ldi Temp,Min
       Cpc Serwo,Temp
       Brcs end2
       Rjmp nks   

    end2:
       Inc Serwo
       Ret

    nks:   
       Cbi PortC,D_OnOff   
    ;   Out OCR1AL, Serwo
       Out OCR0, Serwo
       Delay_MS 65
       Sbi PortC,D_OnOff
       Delay_MS 65
       Cbi PortC,D_OnOff
       Delay_MS 65
       Sbi PortC,D_OnOff

    ;   Out OCR1AL, Serwo;
    ;   Delay_MS 200

          
       Ret


    Proszę na przyszłość stosować znaczniki [code] - prawda że bardziej czytelne :?:
    [zumek]
  • Poziom 38  
    Tego nie rozumiem:
    Ldi Acc, 0x04 ;0x04 włacza PWM
    Out TCCR1B, Acc
    Czy dalej korzystasz z Timer1?
  • Użytkownik usunął konto  
  • Poziom 21  
    OC1A, OC1B to sa dwa kanały PWMa

    majac mege8, mozesz miec 3 PWMy,
    1 z licznika 8-bitowego T/C2
    2 z licznika 16-bitowego T/C1

    szczegóły ustawień znajdziesz w nocie, w necie i/lub na elektrodzie :)

    najprostszym zastosowaniem, moze byc np dioda RGB gdzie kazdy kolor jest sterowany innym kanałem PWM, wiec dostaniesz pełną gamę kolorów, dobre do praktyki :)