Vous êtes sur la page 1sur 16

UNIVERSIDADE FEDERAL DO MARANHO

CENTRO DE CINCIAS EXATAS E TECNOLOGIA


DEPARTAMENTO DE ENGENHARIA DE ELTRICA
CURSO DE ENGENHARIA ELTRICA
INTRODUO A ARQUITETURA DE COMPUTADORES





ADRIANA FERREIRA BRAGA (2014005076)
BIANCA FONTENELE LEMOS (2013018015)
CAMILA SANTOS SILVA (2013015194)
ELIUKER DE MOURA CAVALCANTE (2013005723)
MATHEUS DA SILVA MORAES (2013005830)
NATALIA COSTA SOEIRO (2013015229)












TRABALHO DE PROGRAMAO EM PIC 12F629


















SO LUS MA
2014
INTRODUO E METODOLOGIA

O presente trabalho tem como objetivo explicar detalhadamente questes
de programao em assembly para PIC12F629. O PIC12F629 um
microcontrolador fabricado pela Michochip Technology, que processa dados de 8
bits, possui arquitetura Harvard e conjunto de instrues reduzido (35 instrues).
Sero apresentados os fluxogramas e explicaes para cada questo. O ambiente
de desenvolvimento utilizado foi o MPLAB IDE Software.








































QUESTES

1. Pede-se que seja feito um programa em assembly para PIC12F629 que
corresponda ao programa em linguagem de alto nvel a seguir.
void main(){
int X = 8; // X uma varivel que armazena valores inteiros recebidos de uma
porta digital
int Y = 2;
int Z = 6;
int W=0;
int R=0;
int T=0;
int K=0;
int S=0;
R = 3*X + 2 * Y - Z;
T = Z + 5 * R;
K = 6*X + 2 * Z;
f(K < T){
S = 3 * T + Y;
W= funcA(S,R);
}else{
S = 2 * T + 4;
W=funcB(S,T);
}
int funcA(int parA1, int parA2){
return parA1+8* parA2;
}
int funcB(int parB1, int parB2){
return parB1 parB2;
}

1.1 Fluxograma



















Alocao de memria
X=8 Y=2 Z=6
R=3X + 2Y - Z
T= Z + 5R








SIM NO




























1.2 Explicao

O objetivo do programa multiplicar dois nmeros de 24 bits cada. Para isso,
foram usadas 3 posies de memria para armazenar o multiplicando (A1, B1, C1 ) e
mais 6 posies de memria para armazenar o multiplicador (A, B, C, D, E, F) e o
resultado dos mesmos ficaram armazenados em posies diferentes.
Para multiplicar cada nmero do multiplicador pelo multiplicando foi necessrio
usar uma subrotina multi, fazendo somas sucessivas e testando se houve o carry.
Havendo carry, ele seria somado a um auxiliar (AUX1) que seria somado ao resultado
da prxima multiplicao. Sabendo-se que poder ocorrer um carry extra aps realizar
as operaes de multiplicao por C1, foi utilizado um espao de memria extra para
aloc-lo.
Na hora da soma percebeu-se que os resultados no se encontravam
alinhados. Foi necessrio agrupar o resultado da primeira linha da multiplicao com a
terceira e quinta linha para soma-las. O mesmo foi feito com as linhas dois, quatro e
seis.
K= 6X + 2Z
K < X
S= 3T + Y
W= S + 8R
FIM
W= S - T
S= 2T + 4
Aps essa soma, restaram apenas duas linhas de resultados para serem
somados. Porm, estas continuavam desalinhadas e para isso multiplicou-se a linha
mais pra esquerda por 10 (16 em hexa). Durante a adio, atentou-se para o carry de
cada soma para que ele pudesse ser somado com o resultado da prxima.


2. Pede-se que seja feito um programa em assembly para PIC12F629
correspondente ao programa em linguagem de alto nvel a seguir.
void main(){
int r = 0; // pode ser qualquer valor inteiro
int s = 6;
int t = 9;
int u=0;
int z=0;
int v = s + t (3 * t + 5);
if(r > 0){
u = 2 * v - t;
z = funcD(u, v);
}else{
u = 3 * v + 4*t;
z=funcE(u, r); }
}
int funcD(int parD1, int parD2){
return parD1+parD2;
}
int funcE(int parE1, int parE2){
return parE1 - parE2;
}

2.1 Fluxograma





















INCIO
V= S + T (3*T + 5)
R= ?
T=9 S=6


NO SIM



































2.2 Explicao

O primeiro passo alocar os espaos de memria para as variveis que sero
usadas. As variveis usadas foram VarR, VarS, VarT, VarU1, VarU2, VarZ1, VarZ2, e
VarV, alm de um auxiliar (temp). Como o valor de VarR inicialmente
desconhecido, o usurio informa o valor de VarR no cdigo do programa para em
seguida execut-lo.
VarT recebe 9 e VarS recebe 6, isso movendo o literal para o registrador w e em
seguida movendo para a respectiva varivel. Feito isso, a seguinte operao
matemtica feita: VarV = VarS + VarT - (3*VarT+5). Para isso, carrega-se 3 no
registrador w que em seguida move-o para o m2, que na funo MULT funcionar
como o multiplicador. M1 recebe o valor de VarT, pulando para a funo MULT.
A funo MULT feita a partir de somas sucessivas e no seu desenvolvimento
sempre testado a existncia de carry no resultado. Se houver, o mesmo colocado
na posio de memria carry. O resultado adicionado ao valor 5 e ento movido
R>0
FIM
U= 3*T + 4*T
Z= U - R
Z= U + V
U= 2*T - V
para uma varivel temporria (temp). Assim, o resto da operao pode ser realizado.
Subtrai-se temp de VarS e o resultado adicionado a VarT. O prximo passo
verificar se o nmero que o usurio colocou em VarR maior que zero. Para isso
subtrai-se o valor de 1 dessa varivel. A inteno verificar se o bit de sinal
alterado com essa operao, pois caso seja, significa que o nmero menor ou igual
a zero. Sendo maior que zero, a funo MAIOR ser chamada. Essa funo far
VarU=2*VarV VarT e chamar a funo FUNCD. Caso seja menor ou igual a 0, a
funo MENOR ser chamada e far VarU = 3*VarV + 4*VarT e chamar funo
FUNCE. Feito isso o programa encerrado.


3. Pede-se que seja feito um programa em assembly para PIC12F629 que
permita calcular o fatorial de 0 at 10 (em decimal) devendo o resultado ser
colocado nas posies de memria 0x25, 0x26 e 0x27 de memria RAM.
OBS: 10! = 3.628.800 (base 10) e 375F00 (base 16). Por isso, precisa-se de trs
posies de memria para armazenar este valor.
OBS: a soluo pode ser dada atravs:
- do clculo do fatorial,isto , n!= n*(n-1)*(n-2)*...*0!;
- da criao de um vetor que armazena os dados do fatorial de acordo com a
posio de memria, isto , dado o vetor A[0]=1, A[1]=1, A[2]=2, A[3]=6, ...,
A[10]=3.628.800.

3.1 Fluxograma

























SIM NO



INCIO
ALOCAO DE
MEMRIA
INFORMA VAR
VAR==0?








SIM NO





















3.2 Explicao

A terceira questo tem como objetivo o clculo do fatorial de um nmero. A
lgica para a execuo desse programa baseada na operao matemtica em que o
fatorial de um nmero dado por n!= n*(n-1)*(n-2)*...*0!.
O primeiro passo para a implementao do programa a alocao de espaos
de memria para as variveis a serem utilizadas. Chamamos de VAR a posio 0x20,
a qual receber o valor numrico que se calcular seu respectivo fatorial; de AUX e
AUX1 a posio 0x22 e 0x24, respectivamente, que funcionam como variveis
auxiliares para o clculo; FAT3, que armazena o terceiro byte da resposta; FAT2, que
armazena o segundo byte e FAT1, que armazena o primeiro byte (observando da
direita para esquerda). E por fim M1, M2 e MRES que so variveis da funo de
multiplicao.
Em seguida, usando as funes MOVLW e MOVWF informado o valor do
nmero que se quer calcular seu fatorial e o armazena em VAR. Primeiro carregado
o valor 0A no registrador W por MOVLW, que logo transferido para a posio de
memria VAR por MOVWF. Como a lgica do programa baseada em multiplicaes,
imprescindvel a implementao de uma sub-rotina que realize somas sucessivas e
funcione como multiplicao, j que no h nenhuma funo j pronta que realize esse
tipo de operao.
FIM
FAT1 <- 1
FAT1 <- 1
AUX <- VAR
FAT1 < FAT1 * AUX
AUX < AUX - 1
AUX > 0
Feito isso, necessrio verificar se o nmero ou no 0. Sendo levado em
considerao que o nmero informado maior ou igual a 0. Para isso, limpa-se a
varivel AUX1 e subtrado dela, com SUBWF, o valor contido em W, no caso 0A.
Logo, tem-se como lgica AUX1 = 0-W, isso implica que se o nmero informado for
positivo AUX1 ter um valor negativo, no entanto se for 0 ser considerado positivo.
O resultado da subtrao movido para o varivel STATUS e esta testada atravs
da instruo BTFSS, em que colocado a varivel a ser testada e o nmero do bit de
sinal.
Dependendo do resultado do teste, ser chamada a funo IGUALZERO ou
DIFERENTEZERO. Entendendo por partes, tem-se que se a funo IGUALZERO for
chamada, ela ir colocar na varivel FATORIAL o valor 1, tendo em vista que 0!=1, e
logo indo para o fim do programa. No entanto se a funo chamada for
DIFERENTEZERO ela ir colocar 1 na varivel FATORIAL e colocar o valor de VAR
(o nmero informado para o clculo no incio do programa) da varivel AUX. Antes de
tudo, necessrio informar que FAT3, FAT2 e FAT1 so as posies de memria que
formam o resultado final. Como eles so resultados, no possvel que qualquer parte
do loop1 de DIFERENTEZERO acrescente qualquer valor a ele. Ento, no programa
h duas partes que testam se h um aumento no nmero de bytes que corresponder
a uma alterao nos valores presentes em FAT3 e FAT2. Veja a figura abaixo:




Sempre que se inicia o loop1, o programa verifica se h algum valor em FAT3 e
FAT2, se hover ele chama respectivas funes MULTFAT3 e MULTFAT2 que
multiplicam por AUX valor contido na posio de memria respectiva. Deve ser levado
em considerao que sempre que houver carry, o programa direcionar para uma
funo chamada SOMAFAT2 e/ou SOMAFAT3 que somaro 1 a prxima posio de
memria. Depois de executar todas somas sucessivas e possveis correes de carry,
o programa lana todos os resultados, de maneira sucessiva, nas posies que
armazenam o resultado, voltando pro loop1 e logo em seguida para parte do programa
principal, encerrando o programa.


4. Pede-se que seja feito um programa em assembly para PIC12F629 que
realize a multiplicao de dois valores com tamanho de 24 bits cada um, sendo
que o resultado final deve ser armazenado na posio de memria 0x30, 0x31,
0x32, 0x33, 0x34 e 0x35.

4.1 Fluxograma



FAT3 0x25 FAT2 0x26 FAT1 0x27
INCIO




















SIM NO









SIM NO





















ALOCAO DE VARIVEIS
MULTIPLICANDO*MULTIPLICADOR
HOUVE CARRY?
LTIMA
MULTIPLICAO
?
B <- L1 + L8 + L5 A <- L2 + L4 + L6
A*10
A + B
SOMA O CARRY A
PRXIMA
MULTIPLICAO
VAI PARA
PRXIMA
MULTIPLICAO
FIM
DECLARAO DE VARIVEIS:
Aksb; Amsb; Alsb; Bksb; Bmsb; Blsb; Cksb;
Cmsb; Clsb; I
4.2 Explicao

O objetivo do programa multiplicar dois nmeros de 24 bits cada. Para isso,
foram usadas 3 posies de memria para armazenar o multiplicando (A1, B1, C1 ) e
mais 6 posies de memria para armazenar o multiplicador (A, B, C, D, E, F) e o
resultado dos mesmos ficaram armazenados em posies diferentes.
Para multiplicar cada nmero do multiplicador pelo multiplicando foi necessrio
usar uma subrotina multi, fazendo somas sucessivas e testando se houve o carry.
Havendo carry, ele seria somado a um auxiliar (AUX1) que seria somado ao resultado
da prxima multiplicao. Sabendo-se que poder ocorrer um carry extra aps realizar
as operaes de multiplicao por C1, foi utilizado um espao de memria extra para
aloc-lo.
Na hora da soma percebeu-se que os resultados no se encontravam
alinhados. Foi necessrio agrupar o resultado da primeira linha da multiplicao com a
terceira e quinta linha para soma-las. O mesmo foi feito com as linhas dois, quatro e
seis.
Aps essa soma, restaram apenas duas linhas de resultados para serem
somados. Porm, estas continuavam desalinhadas e para isso multiplicou-se a linha
mais pra esquerda por 10 (16 em hexa). Durante a adio, atentou-se para o carry de
cada soma para que ele pudesse ser somado com o resultado da prxima.


5. Pede-se que seja feito um programa em assembly para PIC12F629 que
calcule os 30 primeiros valores da srie de Fibonacci.

5.1 Fluxograma














ATRIBUI OS VALORES DAS
VARIAVEIS Aksb; Amsb; Alsb; Bksb;
Bmsb; Blsb; I
AS VARIVEIS RECEBEM SEUS
VALORES E INICIA-SE AS OPERAES
DE SOMA E TESTE DE CARRY









SIM NO











SIM NO





CARRY == 1
SOMA 0x01 VARIVEL Amsb
CONTINUA AS OPERAES DE
SOMA E TESTE DE CARRY:
Cmsb <- Amsb + Bmsb
CARRY2 ==
1
SOMA 0x01 VARIVEL AKsb
FAZ A OPERAO:
Cksb <- Aksb + Bskb
FAZ A OPERAO:
Clsb <- Alsb + Blsb
















SIM NO







5.2 Explicao

A srie a ser usada a seguinte:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1.597, 2.584,
4.181, 6.765, 10.946, 17.711, 28.657, 46.368, 75.025, 121.393, 196.418, 317.811,
514.229.
O primeiro passo a ser realizado o de declarar as variveis e reservar as
posies de memria para cada uma: Aksb <0x20>; Amsb <0x21>; Alsb <0x22>; Bksb
<0x23>; Bmsb <0x24>; Blsb <0x25> Cksb <0x26>; Cmsb <0x27>; Clsb <0x28>; I
<0x29>.
FAZ A TROCA DE VALORES:
A <- B
B <- C
FAZ A OPERAO SEGUINTE:
DECREMENTA 1 DO CONTADOR I
SE I != 0
VOLTA PARA O INCIO DAS OPERAES
DE SOMA E TESTE DE CARRY (LOOP)
FIM DO PROGRAMA
Como o ltimo nmero da srie de Fibonacci resultar em um valor muito alto,
foi necessrio utilizar trs registradores com um total de 24 bits. Para iniciar a
operao, necessrio carregar as variveis A e B com os dois primeiros nmeros da
srie de Fibonacci (A=0000; B = 0001). Para isso foi utilizado as instrues MOVLW,
que carrega o acumulador com um nmero e MOVWF, que coloca no registrador o
valor do acumulador. Tambm foi utilizado um contador que recebeu o nmero em
hexa 1C (28 em decimal, j que os dois primeiros j foram colocados) para
decrementar o loop e realizar todas as somas.
Para as somas, foram utilizadas trs instrues: MOVF f,0 que carrega no
acumulador o valor da varivel, MOVWF que move o que est no acumulador para o
registrador e ADDWF f,1 que soma o que est no acumulador com o valor da varivel
e deixa no registrador. Aps a soma, necessrio que se verifique se a operao
houve carry ou no. Para isso, utilizamos a instruo BTFSC STATUS, 0x00, que testa
o bit 0 da palavra STATUS e pula se for 0 ou executa a prxima instruo se for 1.
Havendo carry, o programa vai para a subrotina carry, que soma 1 ao Amsb e continua
na subrotina se houver mais carry. No havendo, o cursor do programa volta para a
subrotina soma e adiciona as prximas posies de memria. Havendo carry na soma
de Amsb e Bmsb , o cursor vai para a prxima subrotina de carry (carry2) e soma 1 ao
Aksb e depois volta para a subrotina contsom. Faz a prxima operao de soma das
posies Aksb, Bksb e no haver a necessidade de analisar outro carry, j que o
mximo de bits que vamos precisar so de 19. Assim, a prxima etapa ser atribuir ao
endereo de A o valor de B e atribuir a B o valor de C. Posteriormente h a instruo
DECFSZ, que decrementar o contador I e continuar o loop se o resultado for
diferente de 0 ou saltar para o fim do programa se o resultado for 0.



6. Dado dois vetores, A e B com tamanho 10 cada um, pede-se que seja
feito um programa em assembly para PIC12F629 que permita calcular D[i] = 2 *
A[i] + 4 * B[i], sendo que 0 <= i <= 9.

6.1 Fluxograma






















CARREGA VALORES X EM A
CARREGA VALORES Y EM B
I=0
2* A(I)

















NO




SIM









6.2 Explicao

feita a alocao de espaos da memria para o vetor A, que ocupar as
posies de <0x20> a <0x29>, da mesma maneira para os vetores B e D, que
ocuparo as posies de <0x30> a <0x39> e de <0x40> a <0x49>, respectivamente.
Logo aps isso os valores fornecidos so colocados nas posies de memrias de
cada vetor. A prxima etapa fazer duas vezes o valor do vetor A. O valor 2
movido para m1 e multiplicado com A0-primeira posio do vetor A at a nona
posio. O valor desse produto colocado na posio correspondente de D. De
maneira semelhante feito com o vetor B, em que cada posio de memria
multiplicada por 4. O resultado adicionado a D, que j contm o valor do produto de
A.O seguinte trecho do programa feito para as posies de 0 a 9 de cada
vetor:
;2*A
MOVLW 0x02 ;carrega valor 2 em W
MOVWF m1 ;move valor de W para m1
MOVF A0,0 ;move o valor de x para W (x->elemento genrico contido
em A)
MOVWF m2 ;move o valor de W para m2
CALL mult ;chama subrotina "mult" para fazer 2*x
MOVF mRes,0 ;carrega o resultado damultiplicacao mRes em W
SOMA E
ENVIA
PARA
D(I)
4* B(I)
I=9?
I= I + 1
FIM
MOVWF D0 ;salva a 1 multiplicao em D1

;4*B
MOVLW 0x04 ;carrega valor 4 em W
MOVWF m1 ;move o valor de W para m1
MOVF B0,0 ;move o valor de y para W(y->elem. genrico contido em B)
MOVWF m2 ;move o valor de W para m2
CALL mult ;faz 4*y
MOVF mRes,0 ;carrega o resultado da mult em W
ADDWF D0,1 ;adiciona W+D



CONCLUSO
Tendo em vista as questes aqui apresentadas, podemos perceber a
importncia que a lgica de programao tem na formao do engenheiro eletricista,
tanto quanto o estudo de arquitetura e organizao de computadores. So inmeros
os problemas que podem ser resolvidos utilizando essas ferramentas.




BIBLIOGRAFIA

PIC12F629/675 Data Sheet, Microchip Technology Inc.
(http://ww1.microchip.com/downloads/en/devicedoc/41190c.pdf)

Introduction to Microchip PIC Assembler Language Part 1
(http://www.ermicro.com/blog/?p=875)



Introduction to Microchip PIC Assembler Language Part 2
(http://www.ermicro.com/blog/?p=909)