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)