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

Asmembler, Atmega8 -> Programowanie PWM

pawel200388 17 Maj 2009 18:49 2085 1
REKLAMA
  • #1 6541683
    pawel200388

    Poziom 17  
    Witam Elektrodowiczów,
    Mam problem. Stawiam w asm-ie dopiero pierwsze kroki, a musze bardzo szybko, napisać program, który steruje mi wyjściami uC-a odpowiednio reagując na sygnał podawany na RXD. Ta część programu już jest i działa. Problem teraz z PWM-em. Muszę strerować czterema wyjściami na trzech zegarach. Stały PWM jeszcze jestem jako ś w stanie napisać, ale regulowany już nie. Idea polega na tym, że po zarejestrowaniu na UDR pewnej wartości chciałbym zwiększyć wypełnienie konkretnego sygnału. Np odbieram na wejściu wartość odpowiadającą dziesiętnej "17" to zwiększam wypełnienie na PB2, odbieram "18" to zmniejszam o jakąś stałą wartość wypełnienie PWM. Dla "19" zwiększenie na PB3 itd.
    Proszę o podpowiedzi, a jeśli ktoś jest biegły w tym to proszę o kawałek programu.

    Z góry bardzo dziękuję. Odwdzięczę się punktami!! + oczywiście kliknę pomógł.
  • REKLAMA
  • #2 6541869
    cavendish
    Poziom 17  
    Nie wiem z czym masz dokładnie problem, ale bawiąc się kiedyś w asm napisałem program zmieniający wypełnienie na PB1 (OC1A) w zależności od wartości odczytanej z przetwornika A/C. Może okaże się Tobie pomocny:
    #include "m8def.inc"
    
    .def acc = r16
    .def result = r17
    
    rjmp RESET 			; Reset Handler
    reti ;EXT_INT0 		; IRQ0 Handler
    reti ;EXT_INT1 		; IRQ1 Handler
    reti ;TIM2_COMP 	; Timer2 Compare Handler
    reti ;TIM2_OVF 		; Timer2 Overflow Handler
    reti ;TIM1_CAPT 	; Timer1 Capture Handler
    reti ;TIM1_COMPA 	; Timer1 CompareA Handler
    reti ;TIM1_COMPB 	; Timer1 CompareB Handler
    reti ;TIM1_OVF 		; Timer1 Overflow Handler
    reti ;TIM0_OVF 		; Timer0 Overflow Handler
    reti ;SPI_STC 		; SPI Transfer Complete Handler
    reti ;USART_RXC 	; USART RX Complete Handler
    reti ;USART_UDRE 	; UDR Empty Handler
    reti ;USART_TXC 	; USART TX Complete Handler
    rjmp ADCint			; ADC Conversion Complete Handler
    reti ;EE_RDY 		; EEPROM Ready Handler
    reti ;ANA_COMP 		; Analog Comparator Handler
    reti ;TWSI 			; Two-wire Serial Interface
    
    RESET: 
     
    ldi acc,high(RAMEND)	; Main program start
    out SPH,r16 			; Set Stack Pointer to top of RAM
    ldi acc,low(RAMEND)
    out SPL,r16
    
    ldi acc,(1<<DDB1)
    out DDRB,acc
    
    ldi	acc,((1<<COM1A1)|(1<<COM1A0)|(1<<WGM11))
    out	TCCR1A,acc
    
    ldi	acc,(1<<CS10)
    out	TCCR1B,acc
    
    ldi acc,0xff
    out OCR1AH,acc
    
    ldi acc,(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)
    out ADMUX,acc
    
    ldi acc,(1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)
    out ADCSR,acc
    
    sei
    
    loop:
    rjmp loop
    
    ADCint:
    in result,ADCH
    out OCR1AL,result
    reti
    
REKLAMA