Semestralni prace

Z MAM wiki

Přejít na: navigace, hledání

Ovládání hlasitosti pomocí PGA2320/11:

  • Vyčítání dvou potenciometrů - Volume & balance
  • výpočet hodnot hlasitosti pro levý a pravý kanál
  • Data se posílají pouze při změně natočení potenciometrů
  • Odeslání dat po SPI

Soubor:mam.jpg

/*
 * spi3.asm
 *
 *  Created: 17.5.2012 3:11:14
 *   Author: Dlouhy & Petrik
 */ 




;.include "m328def.inc"
.def pot1=r20	; stav potenciometru - volume
.def pot2=r21   ; stav potenciometru - balance
.def pot1p=r22	; stav potenciometru - volume v predchozim prevodu
.def pot2p=r23   ; stav potenciometru - balance v predchozim prevodu
.def volR=r24	;
.def volL=r25	;

.org 0x000
       rjmp begin
;----------------------------------------------------------------------------------------------------------------------------------------------
; vektory přerušení
;----------------------------------------------------------------------------------------------------------------------------------------------
.org ADCCaddr
       rjmp PREVODNIK  ;obsluha interruptu z ADprevodniku

;----------------------------------------------------------------------------------------------------------------------------------------------
;start programu
;----------------------------------------------------------------------------------------------------------------------------------------------
.org 0x100
begin:
;----------------------------------------------------------------------------------------------------------------------------------------------
;inicializace stack pointeru
;----------------------------------------------------------------------------------------------------------------------------------------------
               ldi     r16,low(RAMEND)
               out     SPL,r16
               ldi     r16,high(RAMEND)        ;na konec ramky (RAMEND)
               out     SPH,r16
;----------------------------------------------------------------------------------------------------------------------------------------------
; nastaveni ADC
;----------------------------------------------------------------------------------------------------------------------------------------------
/*
ADC    - ADC0
       - left justified, reference ne AVCC na AREF je kondenzator
       - povoleny interrupt po konverzi, zapnute ADC.
       - je treba ho rucne poustet - free running !
*/
       ldi     r16, 1<<adlar|1<<refs0  ; left jsutified| AVCC with external capacitor at AREF pin
       sts     ADMUX, r16

       ldi     r16, 1<<aden|1<<ADIE    ; adc enabled| AD interrupt enable
       sts     ADCSRA, r16

       clr     r16
       sts     ADCSRB, r16             ; trigger mode - free runing

       ldi     r16, 1<<ADC0D
       sts     DIDR0, r16              ; ADC0D digital buffer off
;----------------------------------------------------------------------------------------------------------------------------------------------
; nastaveni SPI
;----------------------------------------------------------------------------------------------------------------------------------------------
/*
SPI -  	master mode
		f_SCK=f_osc2/64
		MSB first
		rising edge - sample
*/

       clr     r16
       in      r16,ddrb
       ori     r16,(1<<DDB3)|(1<<DDB5)|(1<<DDB2) ; portb2,3,5 jako vystup
       out     ddrb,r16 

						
		ldi     r18, 1<<SPE|1<<MSTR|1<<SPR0|1<<SPR1 ;  | SPI enable | master mode |f/64
		out     SPCR, r18
		
	

;----------------------------------------------------------------------------------------------------------------------------------------------
; vlastni program
;----------------------------------------------------------------------------------------------------------------------------------------------
       sei     ;globalni povoleni int.
   
       lds     r17, ADCSRA     ; spusteni samotne konverze ADC
       ori     r17, (1<<ADSC)
       sts     ADCSRA, r17

loop:

       nop
       nop
       nop

rjmp loop


PREVODNIK:
		lds		r17,ADMUX
			sbrc r17,0
			rjmp PREVODNIK2
			
		
	   lds     pot1,ADCH        ; vycteni dat z prevodniku
       	   
       ori     r17, 1<<MUX0		; vstup prevodniku = ADC1
       sts     ADMUX, r17
	   
	   lds     r17, ADCSRA
       ori     r17, 1<<ADSC
       sts     ADCSRA, r17     ; zapnuti adc   
	   	   
reti
PREVODNIK2:
	 lds     pot2,ADCH
	 
	 mov		r17,pot1
	 mov		r18,pot2
	 sub		r17,pot1p
	 sub		r18,pot2p
		
	 add		r17,r18
	 clr		r16
	 cpse		r17,r16
     rcall SPI

	 lds     r17, ADMUX 
     andi    r17, ~((1<<MUX0))		; vstup prevodniku = ADC0
     sts     ADMUX, r17

	  lds     r17, ADCSRA
      ori     r17, 1<<ADSC
      sts     ADCSRA, r17     ; zapnuti adc
reti


SPI:
	mov pot1p,pot1
	mov	pot2p,pot2

	subi pot2,127 ; pot2-127

	lsr pot2 ; /2
	lsr pot2 ; /2

	in r19, sreg
	

	sbrc r19, 2
		add pot1, pot2
		mov volR, pot1
	sbrc r19, 2
		sub pot1, pot2
		mov volL, pot1
	sbrs r19, 2
		add volL, pot2
		mov volL, pot1
	sbrs r19, 2
		sub volR, pot2
		mov volR, pot1


	out SPDR,volR
		rcall Wait_transmit
	out SPDR,volL
		rcall Wait_transmit
ret


Wait_transmit:
		in r16,SPSR
		sbrs r16, SPIF
	    rjmp Wait_transmit
ret


Soubor:scope.jpg

Osobní nástroje