MC404 3ª Prova - 24 Jun 2010

  1. [1.0] Considere um microcontrolador cuja palavra tem 12 bits. Escreva em hexadecimal os seguintes valores de 12 bits:
    (i)o maior valor inteiro positivo com sinal no formato complemento de 2
    (ii)o menor valor inteiro negativo com sinal no formato complemento de 2
    (iii)o menor valor inteiro negativo com sinal no formato complemento de 1
    (iv) o maior inteiro (positivo) sem sinal
    
    
    
    
    
    
    

  2. [1.0] Escreva um trecho de programa para ligar apenas o bit 2 do registrador TIMSK0
    Obs: consulte com atenção a folha de regs de E/S
    	 lds r16, TIMSK0
    	 ori r16, 4
    	 sts TIMSK0, r16
    
    
    
    
    

  3. [1.0] Escreva uma macro soma16 com 2 parâmetros onde onde o 1º parametro (@0) é um dos pares de registradores X, Y ou Z e o 2º parâmetro (@1) é uma constante de 16 bits. O objetivo da macro é somar a constante de 16 bits ao par passado como parâmetro.
    
    
    
    
    
    
    
    
    
    
    
    
    

  4. [2.0 ] Escreva uma subrotina comentada strinlen com o objetivo de calcular com precisão de 16 bits o tamanho de uma cadeia de caracteres ASCII armazendada na memória RAM e delimitada pelo valor binário 0.
    Parâmetro de entrada: X: apontador para o inicio do vetor.
    Parâmetro de saida: Y: tamanho da cadeia
    Escreva apenas o código da subrotina
    srinlen:
    		clr yl
    		clr yh        ; zera parametro de saida
    loop:	
    		ld r0, X+     ; obtem um elemento da cadeia, X aponta para o proximo
    		tst r0        ; fim de cadeia ou cadeia vazia
    		breq fim
    		adiw y,1
    		rjmp loop
    fim:	ret
    
    
    
    
    
  5. [3.5] Escreva uma subrotina comentada somaestendida com o objetivo de calcular a soma com precisão estendida de dois inteiros "grandes" localizados em dois vetores na memória RAM no formato little endian (byte menos significativo primeiro) e deixando o resultado no 1º vetor.
    Parâmetros de entrada: X: apontador para o byte - significativo do 1º inteiro
    Y: apontador para o byte - significativo do 2º inteiro
    r0: tamanho em bytes do inteiro (vetor)
    Excetuando os parâmetros, você deve salvar/restaurar na/da pilha os registradores que for usar.
    Escreva apenas o código da subrotina
    Dica: as instruções dec e inc não alteram o CY
    somaestendida:	 			   ;suposição: r0 >0
    			  push r16         ; só precisamos de 2 registradores
    			  push r17         ; para obter um byte de cada vetor
    			  clc              ; preciso zerar o CY por causa da 1a soma
    loop:		  
    			  ld r16, x         ; mantem x apontado para o byte corrente
    			  ld r17, y+	   ; mas y passa a apontar para o próximo byte
    			  adc r16,r17	   ; soma 2 bytes com CY, pode gerar novo CY
    			  st x+, r16	   ; põe soma no byte apontado por x e x aponta para próximo byte
    			  dec r0		   ; dec preserva o CY da soma acima
    			  brne loop        ; volta se r0 > 0
    			  pop r17
    			  pop r16
    			  ret
    
    
    
    

  6. [1.5] Detalhe as funções dos seguintes registradores de E/S do Timer/Counter 0 do ATMega 88 (com o fim de ser usado para interrupção do tipo Overflow): TCCR0B, TCNT0, TIMSK0, TIFR0.