arquitetura de processadores digitais
TRANSCRIPT
-
8/15/2019 Arquitetura de Processadores Digitais
1/49
Universidade de Brasília
Arquitetura de
Processadores
Digitais
-
8/15/2019 Arquitetura de Processadores Digitais
2/49
SumárioDMA .............................................................................................................................................. 2
DMA........................................................................................................................................... 4
ADC + DAC + DMA + 8253 ......................................................................................................... 4
PROVA TREINO ............................................................................................................................. 8
Considerações gerais: ......................................................................................................... 10
Circuito interface: ............................................................................................................... 11
Rotina void dma_adc (void) ............................................................................................... 12
Rotina rmediap (void) ......................................................................................................... 14
Rotina int_eoc (void) .......................................................................................................... 15
Rotina interrupt int_serial (void) ....................................................................................... 16
Rotina interrupt int_paralela (void) ................................................................................... 17
Rotina interrupt paralela (void) ......................................................................................... 18Rotina main (void) .............................................................................................................. 19
Completo ............................................................................................................................. 21
INTERRUPÇÃO ............................................................................................................................. 25
INTERUPÇÃO ........................................................................................................................... 32
INTERRUPÇÃO SERIAL ............................................................................................................. 34
-
8/15/2019 Arquitetura de Processadores Digitais
3/49
DMA
-
8/15/2019 Arquitetura de Processadores Digitais
4/49
OPERAÇÃO DE DMA PASSO A PASSO:
-
8/15/2019 Arquitetura de Processadores Digitais
5/49
DMA#include
#include
void main(void){
long end20, off, seg;char far *pt;
pt = farmalloc(2*10k);seg = FP_SEG(pt);off = FP_OFF(pt);
end20 = seg8);//MSB QTD
outportb(2,end20);//endereçooutportb(2,end20>>8);//endereço
outportb(0x83,end20>>16);//endereçooutportb(0x0A,1);//apaga máscara
while((inportb(8)&2)==0);outportb(0x0A,5);//ativa máscara
}while((inportb(8)&2)==0){ //para ver quantas conversões foram feitas
x = inportb(3);
x = (x
-
8/15/2019 Arquitetura de Processadores Digitais
6/49
vet12 = getvect(0x0C);setvect(0x0D,rot_eoc);setvect(0x0C,rot_ser);
hab = inportb(0x21);outportb(0x21,hab&0xCF);
// programação do dma
pt1 = far malloc(16);seg = FP_SEG(pt1);
off = FP_OFFF(pt1);adr20 = (seg16) != ((adr20+8)>>16))//verifica a fronteira de página
adr20 = adr20+8;adrda = (FP_SEG(pt2)8);// endereço +outportb(0x83,adr20>>16);//------+
outportb(7,0);//-----------------+outportb(7,0);
outportb(6,adrda);// canal3 +outportb(6,adrda>>8);outportb(6,adrda>>16);//---------+
outportb(0x0B,0x55);// modooutportb(0x0B,0x5B);//-----outportb(0x0A,1);// habilitações
outportb(0x0A,3);//-------------}void interrupt rot_eoc(void){
sum = 0;for(i=0;i
-
8/15/2019 Arquitetura de Processadores Digitais
7/49
-
8/15/2019 Arquitetura de Processadores Digitais
8/49
-
8/15/2019 Arquitetura de Processadores Digitais
9/49
PROVA TREINO
-
8/15/2019 Arquitetura de Processadores Digitais
10/49
-
8/15/2019 Arquitetura de Processadores Digitais
11/49
Considerações gerais:
#include
#include
#define TxB 0x3F8 // Define o endereço do TxB#define RxB 0x3F8 // Define o endereço do RxB#define DLL 0x3F8 // Define o endereço do DLL#define DLM 0x3F9 // Define o endereço doDLM#define LCR 0x3FB // Define o endereço do LCR
#define IER 0X3F9 // Define o endereço do IER
char far *media,*buffer;void interrupt (*vet12)(void);void interrupt (*vet13)(void);void interrupt (*vet15)(void);
-
8/15/2019 Arquitetura de Processadores Digitais
12/49
Circuito interface:
Fig. 1: Interface 1
-
8/15/2019 Arquitetura de Processadores Digitais
13/49
Rotina void dma_adc void)
Executa as inicializações necessárias para o ADC transferir para a memória via canal 1 de DMA.
void dma_adc (void){outportb (CS0,0);
buffer = farmalloc (2*8); // aloca 2*8 espaços na memória para bufferseg = FP_SEG(buffer); // registra o segment de bufferoff = FP_OFF(buffer);
adr20 = (seg16 != (adr20 + 8)>> 16)
adr20 = adr20 + 8;outportb(0XC,0);
outportb(2,adr20);outportb(2,adr20>>8);
outportb(0x83,adr20>>16);outportb(3,7);
outportb(3,0);outportb(0XB,5);
outportb(0xA,1);}
-
8/15/2019 Arquitetura de Processadores Digitais
14/49
Rotina void dma_dac (void)
void dma_dac (void){media = farmalloc(1);seg = FP_SEG(media);off = FP_OFF(media);adr20 = (seg8);outportb(0x81,adr20>>16);
outportb(5,0);outportb(5,0);outportb(0XB,0x5A);outportb(0xA,2);
}
-
8/15/2019 Arquitetura de Processadores Digitais
15/49
Rotina rmediap void)
void rmediap(void){
posição = inportb(3);if (posição = 0){i = 6;}else if(posição = 1){i = 5;} // dava para usar switch-caseelse if(posição = 2){i = 4;}else if(posição = 3){i = 3;}else if(posição = 4){i = 2;}else if(posição = 5){i = 1;}else if(posição = 6){i = 0;}
else if(posição = 7){i = 7;}for(j=0,j++,j>3;}
-
8/15/2019 Arquitetura de Processadores Digitais
16/49
Rotina int_eoc void)
void interrupt int_eoc(void){
int i,posição,soma = 0;rmediap();outportb(CS1,0);outportb(0X20,0X20);
}
-
8/15/2019 Arquitetura de Processadores Digitais
17/49
Rotina interrupt int_serial void)
void interrupt int_serial(void){
c = inportb(RxB);
if(c>=0x30 & c
-
8/15/2019 Arquitetura de Processadores Digitais
18/49
Rotina interrupt int_paralela void)
void interrupt int_paralela(void){
canal = (inportb(0x379)>>3)&7;outportb(CS0+canal,0);outportb(0x20,0x20);
}
-
8/15/2019 Arquitetura de Processadores Digitais
19/49
Rotina interrupt paralela void)
void paralela (int dado){
outportb(0X378,dado);outportb(0X37A,1); //STRBwhile(inportb(0X37A)&2 == 0); // ACK
}
-
8/15/2019 Arquitetura de Processadores Digitais
20/49
Rotina main void)
int main{
long seg,off,adr20;int hab,pesos[8] = {64,32,16,8,4,2,1,1};
char c;//interrupçõesvet12 = getvect(12);vet13 = getvect(13);vet15 = getvect(15);
setvect(12,int_serial);setvect(13,int_eoc);setvect(15,int_paralela);
hab = inportb(0x21);outportb(0x21,hab&0x4F);//serialoutportb (LCR, 7); // Define bit de parada e 8 bits
outportb(IER, 1); // Define interrupção por dado disponíveloutportb(LCR, 0x87); // Aciona o acesso ao divisor
outportb (DLL, 12); // Define N = 12, BR = 9600outportb (DLM, 0); // Define N = 12outportb (LCR, 7); // Define 2 bits de parada e 8 bits//DMAdma_adc();
-
8/15/2019 Arquitetura de Processadores Digitais
21/49
-
8/15/2019 Arquitetura de Processadores Digitais
22/49
Completo
#include #include
#define TxB 0x3F8 // Define o endereço do TxB#define RxB 0x3F8 // Define o endereço do RxB#define DLL 0x3F8 // Define o endereço do DLL#define DLM 0x3F9 // Define o endereço doDLM#define LCR 0x3FB // Define o endereço do LCR#define IER 0X3F9 // Define o endereço do IER
char far *media,*buffer;void interrupt (*vet12)(void);void interrupt (*vet13)(void);
void interrupt (*vet15)(void);
void dma_adc (void){outportb (CS0,0);buffer = farmalloc (2*8); // aloca 2*8 espaços na memória para bufferseg = FP_SEG(buffer); // registra o segment de bufferoff = FP_OFF(buffer);adr20 = (seg
-
8/15/2019 Arquitetura de Processadores Digitais
23/49
void rmediap(void){posição = inportb(3);
if (posição = 0){i = 6
}else if(posição = 1){
i = 5}else if(posição = 2){
i = 4
}else if(posição = 3){
i = 3}else if(posição = 4){
i = 2}else if(posição = 5){
i = 1}else if(posição = 6){
i = 0}else if(posição = 7){
i = 7}
-
8/15/2019 Arquitetura de Processadores Digitais
24/49
outportb(0xA,1);outportb(0xA,2);
}outportb(0x20,0x20);
}
void interrupt int_paralela(void){canal = (inportb(0x379)>>3)&7;outportb(CS0+canal,0);outportb(0x20,0x20);
}
void paralela (int dado){outportb(0X378,dado);outportb(0X37A,1); //STRBwhile(inportb(0X37A)&2 == 0); // ACK
}
int main{
long seg,off,adr20;int hab,pesos[8] = {64,32,16,8,4,2,1,1};char c;//interrupçõesvet12 = getvect(12);vet13 = getvect(13);
-
8/15/2019 Arquitetura de Processadores Digitais
25/49
outportb(0xA,5);
outportb(0xA,6);setvect(12,vet12);setvect(13,vet13);setvect(15,vet15);
}
-
8/15/2019 Arquitetura de Processadores Digitais
26/49
INTERRUPÇÃO
-
8/15/2019 Arquitetura de Processadores Digitais
27/49
-
8/15/2019 Arquitetura de Processadores Digitais
28/49
-
8/15/2019 Arquitetura de Processadores Digitais
29/49
-
8/15/2019 Arquitetura de Processadores Digitais
30/49
-
8/15/2019 Arquitetura de Processadores Digitais
31/49
-
8/15/2019 Arquitetura de Processadores Digitais
32/49
-
8/15/2019 Arquitetura de Processadores Digitais
33/49
INTERUPÇÃO/* Modulo 3 - Aula 1 - 10 de novembro de 2009INTERRUPÇÕES*/
/* IRQ2 IRQ5 IRQ2 IRQ5clk eoc clk eoc t
-----+-------+-------+-------+------->DAC ler AD DACstart calc. start
média*/#include
-
8/15/2019 Arquitetura de Processadores Digitais
34/49
media=i=0;
vetor2 = getvect(0xA); /* A = 13, endereço que atende ao IRQ2*/vetor5 = getvect(0xD); /* guarda vetores antigos*/setvect(0xA,Rot_IRQ2); //novos vetoressetvect(0xD,Rot_IRQ5); //novos vetores
antigo = inportb(0x21); //21H = endereço da Palavra de Controle de OperaçãoOCW1
outportb(0x21,antigo&0xDB);//hab IRQ2 e IRQ5 > XX0X X0XX > máscara 1101 1011
(DBH)
while(!kbhit()){if(band){
printf("[%d] media = %d \n", aux, media);band = 0;
}}
outportb(0x21,antigo|0x24);//desabilta intsetvect(0xA,vetor2);//restaura vetor 2setvect(0xD,vetor5);//restaura vetor 5printf("Acabou!");
}
void interrupt Rot_IRQ2(void){outportb(CS1,0);//start
-
8/15/2019 Arquitetura de Processadores Digitais
35/49
INTERRUPÇÃO SERIAL/* Aula 2 - Interrupção Serial - 17 de novembro de 2009LCR - modoLSR - status
IER - enable interruptionIIR - identify interruption
MCR - controle modemMSR - status modem
DTRDSRRCTS
*/
#include
#include
void interrupt *(ant4)(void);int flag, dado, velho, erros, x, z;
int mestre(void){//inicializaçãoint n = 115200/9600;
-
8/15/2019 Arquitetura de Processadores Digitais
36/49
}
void interrupt rot_ser(void){dado = inportb(RxB);flag = 1;outportb(0x20,0x20);//EOI
}
//==================================================
void interrupt *(ant4)(void);
void rep(void){//inicializaçãoint n = 115200/9600;outportb(LCR,0x80); //progamar DLAB = 1outportb(DLL,n); //lsb do baud rateoutportb(DLM,n>>8); //msb do baud rate
outportb(LCR,7); // 8 bits, sem paridade, 2 stopsoutportb(IER,1); //hab interrupçãooutportb(MCR,8); // out2 = 1
ant4 = getvect(0x0C);setvect(0x0C,rot_ser);velho = inport(0x21);outportb(0x21,velho&0xEF);
-
8/15/2019 Arquitetura de Processadores Digitais
37/49
INTERRUPÇÃO PARALELO/* aula 3 - interrupção paralela
AD DAREG 378H7 D76 D65 D54 D43 WR2 OE
1 START0 ALEREG 379H7* D76 EOC (IRQ7)5 D64 D53 D4REG 37AH3* D3 D32 D2/A2 D21* D1/A1 D10* D0/A0 D0
Média móvel 8 no DAC
-
8/15/2019 Arquitetura de Processadores Digitais
38/49
outportb(MCR,8);
outportb(0x37A,0x10);//habilita IRQ7outportb(0x378,0);
//guarda os vetores antigosvet4 = getvect(12);vet7 = getvect(15);setvect(12,rot_ser);setvect(15,rot_eoc);
antigo = inportb(0x21);outportb(0x21,antigo&0x6F);
//laço principalc = 0;while(c != 'f'){
if(kbhit()){c = getch();
if(c >= 0 && c
-
8/15/2019 Arquitetura de Processadores Digitais
39/49
//flanco de subida do WRoutportb(0x378,(media&0xF0)||8);
outportb(0x378,media&0xF0);
//manda pelo serialoutportb(TxB,media);
//ler ADCoutportb(0x37A,0x10|4);//programa como entradaoutportb(0x378,4);
x = inportb(0x379)^0x80;y = inportb(0x37A)^0x0B;x = (x&0x80)+(x&0x38)
-
8/15/2019 Arquitetura de Processadores Digitais
40/49
LABORATÓRIO
Interrupção//----------------------------------------------------------------------------------------// UNIVERSIDADE DE BRASILIA// ARQUITETURA DE PROCESSADORES DIGITAIS// 1/2016//----------------------------------------------------------------------------------------// Daniela Aguiar de Carvalho Freitas// Renato da Silva Paes
//----------------------------------------------------------------------------------------// Experimento 9// versao 5
#include #include #include
#define TXB 0x3F8#define RXB 0x3F8#define DLL 0x3F8#define DLM 0x3F9#define LCR 0x3FB#define LSR 0x3FD#define IER 0x3F9#define MCR 0x3FC
-
8/15/2019 Arquitetura de Processadores Digitais
41/49
SERIAL_TXB();}
/**/if (flag == 1){SERIAL_RXB();
}}//fim whileprintf("ESC foi pressionado.\n");
outportb(0x21,habilita|0x10); /*Bit 4 volta a ser 0*/
setvect(12, vet12);}// fim main
void SERIAL_TXB (void){caracter_Tx = getch();outportb(TXB, caracter_Tx);if (caracter_Tx = esc) fim=1;
}// fim serial recebe
void SERIAL_RXB(void){flag = 0;printf("%c",caracter_Rx);if (caracter_Rx = esc) fim=1;
}
void interrupt serial_RX(void){
-
8/15/2019 Arquitetura de Processadores Digitais
42/49
Serial//----------------------------------------------------------------------------------------
// UNIVERSIDADE DE BRASILIA// ARQUITETURA DE PROCESSADORES DIGITAIS// 1/2016//----------------------------------------------------------------------------------------// Daniela Aguiar de Carvalho Freitas// Renato Paes//----------------------------------------------------------------------------------------// Experimento 8
// versao 3
#include #include #include
#define TXB 0x3F8#define RXB 0x3F8
#define DLL 0x3F8#define DLM 0x3F9#define LCR 0x3Fb#define LSR 0x3FD
void MENSAGENS(int m, int ct);void INICIALIZA_SERIAL(void);void SERIAL TXB (void);
-
8/15/2019 Arquitetura de Processadores Digitais
43/49
/*habilita recepcao e transmissao e programa de paridade e bit de parada*/outportb(LCR, 7); /*8 bits, 2 stops e sem paridade*/
//MENSAGENS(3,0);}// fim inicializa serial
void SERIAL_TXB (void){caracter = getch(); /* Recebe o caractere*/
//MENSAGENS(4,caracter);/*Rotina para enviar catacter*/outportb(TXB, caracter); /* Transmite pela porta serial*/
while ((inportb(LSR)&0x20) == 0);/* THRE=1 quando byte já foi. *//*Retorna a 0 automaticamente apos a leitura*/
}// fim serial recebe
void SERIAL_RXB (void){//MENSAGENS(5,0);/*Rotina para receber catacter*/
if((inportb(LSR)&1)!=0){ /*Se DR=1, dado está pronto*/
caracter = inportb(RXB); /* Recebe pela porta serial*/if(caracter==0x0D){ /* Se ENTER for pressionada -> Carriage Return (0DH)*/
MENSAGENS(6,0);}else { /* Se não, printa caractere*/
MENSAGENS(7,caracter);}//if-esle
}//if}// fim serial transmite
-
8/15/2019 Arquitetura de Processadores Digitais
44/49
default:printf("...\n");
}// fim switch case
}// fim das mensagens
-
8/15/2019 Arquitetura de Processadores Digitais
45/49
Linguagem C
Comandos
-
8/15/2019 Arquitetura de Processadores Digitais
46/49
case constante2:
Instruções;
break;
default
Instruções;
}
Farmalloc#include
void *farmalloc (unsigned long nbytes);
farmalloc reserva um bloco de memória de tamanho n bytes do heap
-
8/15/2019 Arquitetura de Processadores Digitais
47/49
4
IO
TEMPORIZADOR
SERIAL
Rotinas para transmitir e receber caracteres:/*Rotina para transmitir caracter*/while(!(inport(0x2FD)&0x20));/*aguarda o bit THREE ir para 1*/ouportb(0x2f8,caracter);/*escreve no regist. de transmissão*/
/*Rotina para receber caracter*/while(!(inport(0x2FD)&0x01));/*aguarda o bit DR ir para 1*/caracter = inportb(0x2f8);/*lê dado recebido*/
40h41h42h43h
/*1º: Definição da operação: canal 2, modo 3 e divisor freq.0180h*/outportb(0x43,0xB6); /*Escrita da palavra de controle 10110110*//*2º Carga do divisor de frequência no endereço do canal 2*/outportb(0x42,0x80); /*Carga byte LSB*/outportb(0x42,0x01); /*Carga byte LSB*/
Transmiter
ou receiver
Latch Transceiver
IOR -> in (lê) e IOW ->out (escreve)int ler_adc(){if((inportb(CS1)&0x80)==0){return0;}
else{val_ad = inportb(CS2); return 1;}
/ / i n i c i a l i z a ç ã o –
p r e p a r a_
s e r i a l
i n t n = 1 1 5 2 0 0 / 9 6 0 0 ;
/ / h a b i l i t a a c e s s o a o d i v i s o r
o u t p o r t b ( L C R , 0 x 8 0 ) ; / / p r o g a m a r D L A B = 1 e L C R = 0 x 2 F B
/ / a t u a l i z a ç ã o d o s d i v i s o r e s
o u t p o r t b ( D L L , n
) ; / / l s b B R e D L L = 0 x 2 F 8
o u t p o r t b ( D L M , n > > 8 ) ; / / m s b B R e D L L = 0 x 2 F 9
/ / h a b i l i t a r e c e p ç ã o e t r a n s m i s s ã o e p r o g r a m a p a r i d a d
e e b i t s
d e p a r a d a
o u t p o r t b ( L C R , 7
) ; / / 8 b i t s , s e m p
a r i d a d e , 2 s t o p s
o u t p o r t b ( I E R , 1
) ; / / h a b i l i t a i n t e r r u p ç ã o
o u t p o r t b ( M C R , 8
) ; / / o u t 2 = 1
v o i d s e r i a l ( v o i d ) {
i f ( i n p o r t b ( L S R ) & 1 ) = = 1 ) { c a n a l_ a d = i n p o r t ( R X B ) }
P R E P A R A 8 2 5 3 / 8 2 5 4
N = 2 E 6 / t a x a
o u t p o r t b ( C S 0 + 6 , 0 x 3 6 ) ;
o u t p o r t b ( C S 0 , N
) ; / * C a r g a b y t e L S B * /
o u t p o r t b ( C S 0 , N > > 8 ) ; / *
C a r g a b y t e L S B * /
-
8/15/2019 Arquitetura de Processadores Digitais
48/49
4
PARALELAPara PC se conectar com impressoras paralelas. Composta por 3registradores.
Pode ser usada como entrada ou saída. 3 modos de operação SPP, EPP,
ECP. Endereços consagrados: 378H, 278H ou 3BCH.
Rotina para transmitir um caractere para impressora via LPT1:
while((inport(0x379)&0x80)==0);/*1º aguarda a impressora ficar desocupada*/outportb(0x378,caracter);/*2º disponibiliza o caracter*//*3º gerar um pulso de strobe*//*Deve-se manter *SLCT IN em baixo, *INT em alto e *AUTO FEED em alto*/outportb(0x37A,0x0D);/*abaixa o *STROBE*/outportb(0x37A,0x0C);/*levanta o *STROBE*/Interrupção via *ACK substitui as ultimas duas linhas por:outportb(0x37A,0x1D);/*abaixa o *STROBE, habilitando interrupção*/outportb(0x37A,0x1C);/*levanta o *STROBE, habilitando interrupção*/
CONCEITOSRelação entre o tamanho do cache e o desempenho do processador: quantomaior o tamanho do cache, maior vai ser o número de dados que o processadornão precisará trabalhar com a memória DRAM, mais lenta. Porém, se o tamanhodo cache for igual ao da memória principal, o motivo pela qual ela foiimplementada terá sido em vão pois ela gasta mais potência prejudicando odesempenho do processador. Ou seja, existe um limite para o aumento dedesempenho e, portanto, não é linear a relação.Um processador que usa pipeline com grande número de estágios precisa deum bom preditor de desvios: Porque se errar o prognóstico, ocorre um desviodesnecessário, perde-se tudo que havia no pipeline tendo, assim, que esperaruma nova instrução levando um tempo que poderia ter sido usado para fazer
várias, a quantidade de estágios , instruções.Porque existe grande relação entre um processador RISC e seu compliador: Ocompilador fica a cargo de organizar o conjunto de instruções RISC, que ocorremem paralelo, para que o mundo externo perceba-as como sequênciais. Acomplexidade do programa foi transferida para o compilador. Porque os fabricantes de processadores não levam de uma vez o relógio de seusprocessadores para 10GHz: Porque o tempo de acesso das memórias eperiféricos ainda não é tão rápido por limitações físicas (corrente de fuga,dissipação de calor, interferência eletromagnética, reflexão pelas linhas, retardointroduzido pelos Cis).
-
8/15/2019 Arquitetura de Processadores Digitais
49/49
4
DRAM: •Alta densidade integração • Baixo consumo •Pouco calor • Baixocusto •Baixa velocidade • “Esquece”(uso de refresh) T acesso = 5 a 70 ns SRAM :
20nsCACHE: CPUs muito mais rápidas que as memórias (DRAM).
MÉDIA MÓVELInicializa tudo que for necessáriovoid preps (int canal, int taxa, int bps){
prepara_canal(); prepara_8253();/*taxa*/prepara_serial();/*bps*/apaga_EOC();}
prepara_canal(){ escreva zero no valor de CSX[ativa ALE ADC0808]l ; e zero}prepara_8253(){
escreva o valor controle no CSX[ativa /CS 8253]+ 6 // elimina bit 7
n = 200000/taxaescreva n no CSX[ativa /CS 8253])
escreva n>>8 no CSX[ativa /CS 8253])}Prepara_serial(){
Escreve 0x80 no LCRn=115200/bpsEscreve n no DLLEscreve n>>8 no DLMEscreve 0x00, 0x01,0x02 ou 0x03 no LCR}
Se bit EOC_OK=1 então lê ADC, atualiza val_ad e retorna 1, senão retorna 0.int le_ADC{
se (CS1 estiver ok){pegue (lê) o valor de CS2 e guarde em numa variávelescreva no CS2 (+ mudança no canal) o valor zero
retorne 1}caso contrário {retorne 0}}
Atualiza o DAC com o novo valor da média e ainda a envia pela porta serial.void escr_dac (void){
escreve (transmite) em CS1 o valor da médiaescreve (transmite) em TXB o valor da média}
Verifica se chegou o número do novo canal do ADC e atualiza a variávelcanal_ad.void rec_serial (void){
se o valor LSR (lê valor) AMND 1 for igual a 1{pegue (lê) o valor de RXB e guarde em numa variável(canal_ad) }}
Verifica as chaves, para (“congela”) tudo enquanto CH0 estiver pressionada eainda incrementa o número do canal do ADC a cada acionamento de CH1.void chaves (void){
enquanto se lê o valor de CS1 e for zero fique parado
pegue (lê) o valor de CS1 e guarde em numa variável(chave)se variável chave na posição para mudar o canal{
variável(canal_ad) ++faça um and com 7 ( garante 1 em uma das ultimas 3 posições de dados)faça a chave voltar para posição inicial para não ficar mudando de
posição}se o valor lido for o para habilitar o EOC{
faça a chave igual o valor para habilitar o EOC}}PORTA PARALELA
int le_ad (int qual_ad, int canal){
se qual_ad for igual a zero{// canal e aleescreva canal&7 no valor 0X37Aescreva XX no valor 0X37A; escreva XX no valor 0X37A
enquanto (lê 0x037A&8 for igual XX)escreva XX no valor 0X378lê 0x379 e guarde numa variável X; lê 0x37A e guarde numa variável Y;x = x^0x80; y=y^3; retorne x&0xF8+(y&3)}
Prova treino: Usar mux e usardecoder; usar bits de expansão