13.07.2015 Views

GIRASSOL - Teste

GIRASSOL - Teste

GIRASSOL - Teste

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>GIRASSOL</strong>Q – Chave de quadranteC3 – FotodiodoC2 – FotodiodoC1 – FotodiodoSensoresDecisãoCi Fotodiodo Hi Di0 Sombra 0 X Parado1 Luz 1 0 CW (horário)Q Chave de Quadrante 1 1 CCW (anti-horário)0 UFES1 -C2C3C1CCWUFESQCWCWCCW


Tabela de DecisãoQ C3 C2 C1 H2 D2 H1 D10 0 0 0 1 1 0 00 0 0 1 0 0 1 10 0 1 0 1 0 1 00 0 1 1 1 0 0 00 1 0 0 1 1 1 00 1 0 1 1 1 0 00 1 1 0 0 0 1 00 1 1 1 0 0 0 01 0 0 0 1 0 0 01 0 0 1 0 0 1 01 0 1 0 1 0 1 11 0 1 1 1 0 0 01 1 0 0 1 1 1 11 1 0 1 1 1 0 01 1 1 0 0 0 1 11 1 1 1 0 0 0 0Tabela de FasesA B C D1 0 1 00 1 1 00 1 0 11 0 0 1


+5VComparadores (¾ do CI do LM324) +5VFotodiodosEntrada dos sensores –porta de entrada 319HS1 (E0 – 319H)R R RS2 (E1- 319H)+5VS3 (E2-319H)R12,5VChave dequadranteQ (E3-319H)MOTOR DE PASSO M1+12V+12VM1A (B6-318H)M1B (B7-318H)M1C (B5-318H)M1D (B4-318H)CI UNL2803DRIVER DECORRENTE+12VM2A (B2-318H)M2B (B3-318H)M2C (B1-318H)M2D (B0-318H)MOTOR DE PASSO M2Fases dos motores –porta de saída 318H


Entrada e saída de dadosSoftwareEm termos gerais, a comunicação do 8086 com periféricos ocorre por meio de duas instruções:• A instrução in, a qual realiza a leitura de dados;• A instrução out, responsável pelo envio de dados.O formato de ambas as instruções é similar. É preciso indicar sempre o endereço da porta onde osdados serão escritos ou de onde serão captados. Caso o endereço da porta esteja entre 0 e 255, elepode ser escrito diretamente na instrução. Caso contrário, deve ser carregado previamente em DX.Para ambas, é necessário, também, um operando de 8 ou 16 bits que servirá como fonte (para ocaso de uma escrita na porta) ou destino dos dados (para uma leitura).O código a seguir apresenta exemplos do uso dessas instruções.IN AL , 200; Lê os dados da porta de endereço 200 e coloca o resultado em ALADD AL, 8h ; Soma AL com 8OUT 203, AL ; Escreve o conteúdo de AL na porta de endereço 203;;;;;;;;;;;;;;;;;;;;;;;;;;MOV DX, 318h; Carrega o endereço da porta em DXIN BL, DX; Lê os dados e escreve o resultado em BLMOV CL, 0xFFOUT DX, CL; Escreve o conteúdo de CL na porta 318h;;;;;;;;;;;;;;;;;;;;;;;;;;MOV DX, 318hIN byte[umaVariavel], DX; Lê a porta 318h e guarda os dados lidos numa variávelINC DXOUT DX, byte[outraVariavel] ; Escreve os dados da variável na porta 319h;;;;;;;;;;;;;;;;;;;;;;;;;;Observação: os operandos de fonte e destino de dados podem ser de 16 bits, mas esse uso não seráabordado nos experimentos da disciplina.


HardwareAlguns PCs do laboratório contam com uma placa especial, a qual provê duas portas decomunicação de 8 bits de largura cada. Além disso, duas tensões de alimentação diferentes (5VDCe 12 VDC) estão disponíveis para uso nas maquetes. A figura a seguir exibe as portas decomunicações e seus respectivos endereços.A porta 319h possui dois barramentos diferentes. Um é empregado exclusivamente para entrada(leitura) de dados. O outro, independente, é utilizado apenas para escrita (saída) de dados. Destaforma, instruções para leitura de dados “enxergarão” somente o estado dos bits E7...E0 dobarramento de entrada, assim como a escrita dos dados afetará, exclusivamente, as linhas S7...S0.A porta 318h, entretanto, é bidirecional. Antes de realizar uma instrução IN ou OUT para esta porta,é preciso certificar-se de que o sentido do barramento está selecionado corretamente. O bit 7 daporta 319h de saída é responsável por esse ajuste. Quando ele é 0 o barramento é saída, quando 1 obarramento é entrada. Só mude a direção do barramento para saída quando necessário, voltandopara entrada assim que possível.O código a seguir escreve o byte 0xF1 na porta 318h.MOV DX, 319h; Carrega o endereço da porta 319hMOV AL, 0x00OUT DX, AL ; Ajusta 318h para saída (bit 7 = 0)DEC DX; Porta 318hMOV AL, 0xF1OUT DX, AL; Escreve o byte 0xF1 na porta 318h


Programasegment code..start:; Inicializacaomov ax, datamov ds, axmov ax, pilhamov ss, axmov sp, topo; Zera todos os bits da porta 319h, inclusive; o bit 7 para acertar direcao da porta 318hmov al, 0mov dx, 319hout dx, alL1: mov dx, 319hin al, dx ; Le a porta 319h onde estao conectados os sensoresand al, 00001111b ; Deixa em al somente os ultimos 4 bits (QC3C2C1)mov bx, decisaoxlatb; Usa al (QC3C2C1) como offset (indice) na tabela de decisao e retorna dado em altest al, 00001000b ; Testa primeiro bit de saida da tabela de decisao para o motor2;m2 movejz testa_m1 ; Se for zero, motor2 nao movetest al, 00000100b ; Se for um, testa direcao (segundo bit do motor2)jz m2cw; Se for zero, gira horariodec byte[p2] ; Se um: para girar anti-horario, decrementa p2 (indice da tabela de fases para motor2)jmp testa_m1 ; Vai para teste motor1m2cw: inc byte[p2] ; Para girar horario, incrementa p2testa_m1:test al, 10b ; Separa primeiro da saida da tabela de decisao para motor 1jz ajusta_ponteiros ; Se for zero, motor1 nao move; m1 movetest al, 1b; Se for um, testa direcao (segundo bit motor1)jz m1cw; Se zero, gira horariodec byte[p1] ; Se um: para girar anti-horario, decrementa p1 (indice da tabela de fases para motor1)jmp ajusta_ponteiros ; Vai para ajusta_ponteiros (escrever saidas na porta 318h)m1cw:inc byte[p1] ; Para girar horario, incrementa p1ajusta_ponteiros:and byte[p1],3; Mantem os dois bits menos significativos de p1and byte[p2],3; Mantem os dois bits menos significativos de p2mov al, [p1]mov bx, fasesxlatb; Usa al (p1) como offset (indice) na tabela de fases e retorna dado em almov cl, 4shl al, cl; Desloca para esquerda os 4 bits lidos para o motor1mov cl, al; Faz copia de almov al, [p2]xlatb; Usa al (p2) como offset (indice) na tabela de fases e retorna dado em alor al, cl; Une dados para motor1 (A7-A4) com dados para motor2 (A3-A0)mov dx, 318hout dx, al; Escreve na porta 318hcall delay; Pula para rotina que cria atrasomov ah,0bhint 21h ; Le buffer de tecladocmp al,0jne sai ; Se alguma tecla foi pressionada, finaliza programajmp L1; Se nenhuma tecla foi pressionada, repete programasai:mov ah,4chint 21h


delay:mov cx, 3del2:push cxmov cx, 0del1:loop del1pop cxloop del2ret; Carrega o valor 3 no registrador cx (contador para loop); Coloca cx na pilha para usa-lo em outro loop; Zera cx; No loop del1, cx eh decrementado seguidamente ate que volte a ser zero; Recupera cx da pilha; No loop del2, cx eh decrementado seguidamente ate que seja zerosegment datafases db 1010b, 0110b, 0101b, 1001bdecisao db 1100b, 0011b, 1010b, 1000b, 1110b, 1100b, 0010b, 0000bdb 1000b, 0010b, 1011b, 1000b, 1111b, 1100b, 0011b, 0000bp1 db 0p2 db 0; Tabela de fases; Tabela de decisao; Indice para tabela de fases motor1; Indice para tabela de fases motor2segment pilha stackresb 100htopo:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!