Você está na página 1de 6

1 - a)

#include <stdbool.h>
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>

#define BUTTON_PIN 0
#define LED_PIN 1

int main(void) {
// Inicializar as portas A e B
DDRA &= ~(1 << BUTTON_PIN); // Configurar a porta A como entrada
DDRB |= (1 << LED_PIN); // Configurar a porta B como saída
PORTB &= ~(1 << LED_PIN); // Inicializar a porta B em 0 (LED apagado)

bool button_pressed = false;

while (1) {
// Ler o estado da porta A
bool button_state = (PINA & (1 << BUTTON_PIN)) != 0;

if (button_state && !button_pressed) {


// Se o botão foi pressionado e ainda não estava pressionado
_delay_ms(150); // Esperar 150 ms
button_state = (PINA & (1 << BUTTON_PIN)) != 0;
if (button_state) {
// Se o botão ainda estiver pressionado
PORTB ^= (1 << LED_PIN); // Inverter o estado do LED
}
button_pressed = true;
} else if (!button_state) {
// Se o botão não está pressionado
button_pressed = false;
}
}

return 0;
}

Utilizamos a linguagem C e a biblioteca avr/io.h para manipular as portas A e B. O


loop principal do programa lê continuamente o estado da porta A, aguarda um
atraso de 150 ms se o botão é mantido pressionado, e inverte o estado do LED
(porta B) se o botão ainda estiver pressionado após o atraso. O código utiliza a
função _delay_ms() da biblioteca util/delay.h para esperar o atraso de 150 ms.

1 - b)
As memórias FLASH e RAM são dois tipos diferentes de memória que são usados
em sistemas eletrônicos, como computadores e dispositivos móveis. A principal
diferença entre as duas é a forma como elas armazenam e acessam informações.

A memória RAM é uma memória de acesso aleatório. Ela é usada para armazenar
temporariamente dados e programas que estão sendo executados em um
dispositivo. A RAM é uma memória volátil, o que significa que ela perde seus dados
quando a energia é desligada. Ela é composta por células de memória que podem
ser lidas e escritas várias vezes, permitindo o acesso rápido a dados armazenados.

Já a memória FLASH é uma memória não volátil que é usada para armazenar dados
permanentemente. Ela é usada para armazenar informações em dispositivos como
telefones celulares, câmeras digitais e pen drives. A memória FLASH é mais lenta do
que a RAM, mas é mais barata e consome menos energia. Ela armazena dados em
células de memória que podem ser programadas e apagadas, mas não podem ser
lidas diretamente. Para ler dados armazenados em uma memória FLASH, os dados
precisam ser transferidos para a RAM primeiro.

Em resumo, a principal diferença entre a memória FLASH e a RAM é que a RAM é


uma memória volátil que é usada para armazenar temporariamente dados e
programas em execução, enquanto a memória FLASH é uma memória não volátil
que é usada para armazenar dados permanentemente. Além disso, a RAM é mais
rápida e cara do que a memória FLASH.

1 - c)
Os blocos que integram a CPU (Unidade Central de Processamento) são
responsáveis por realizar as operações necessárias para processar as informações
em um computador. Entre esses blocos, destacam-se:

I. Registradores: Os registradores são pequenas áreas de memória que são usadas


para armazenar dados temporários durante o processamento. Eles são mais rápidos
do que a memória principal, pois estão localizados diretamente na CPU. Os
registradores são usados para armazenar valores que serão usados em operações
aritméticas, lógicas, deslocamentos de bits e outras operações de processamento.

II. UC (Unidade de Controle): A UC é responsável por coordenar e controlar o


funcionamento da CPU. Ela interpreta as instruções do programa que está sendo
executado, decodifica essas instruções e controla a execução de cada uma delas. A
UC também determina qual operação deve ser realizada pela ULA, qual dado deve
ser buscado na memória e em que momento os dados devem ser transferidos entre
a CPU e a memória.

III. Unidade Lógica Aritmética (ULA): A ULA é responsável por realizar as operações
aritméticas e lógicas no processador. Ela é a parte da CPU que realiza as operações
de adição, subtração, multiplicação e divisão, além de operações lógicas como AND,
OR, NOT, XOR e outras. A ULA recebe dados dos registradores e executa as
operações de acordo com as instruções da UC.
Em conjunto, os registradores, UC e ULA trabalham juntos para executar as
instruções do programa em um computador. A UC controla a sequência de
instruções, a ULA executa as operações aritméticas e lógicas, enquanto os
registradores armazenam temporariamente os dados necessários para a execução
das instruções. Esses blocos são essenciais para o processamento de dados em
um computador e são encontrados em todas as CPUs modernas.

2 - a)
Os registradores TRIS e PORT são usados nos microcontroladores PIC para
controlar as configurações de entrada/saída dos pinos de E/S (entrada/saída).

O registrador TRIS (Tri-State) define se um pino específico é uma entrada ou saída.


Quando um bit no registrador TRIS é definido como "0", o pino correspondente é
configurado como uma saída. Quando um bit no registrador TRIS é definido como
"1", o pino correspondente é configurado como uma entrada. O TRIS é responsável
por controlar a direção do fluxo de dados em um pino de E/S.

O registrador PORT controla o nível lógico do pino. Quando um bit no registrador


PORT é definido como "0", o pino correspondente é configurado em nível lógico
baixo. Quando um bit no registrador PORT é definido como "1", o pino
correspondente é configurado em nível lógico alto.

Assim, ao alterar os valores desses registradores, é possível controlar a direção de


fluxo de dados em um pino de E/S e também definir o nível lógico do pino. Esses
registradores são amplamente usados em projetos que envolvem
microcontroladores PIC para controlar dispositivos externos, como LEDs, sensores,
atuadores e outros periféricos.

2 - b)

A linguagem Assembly e a linguagem C são duas linguagens de programação que


diferem em vários aspectos, incluindo:

1. Nível de abstração: A linguagem Assembly é considerada uma linguagem de


baixo nível, enquanto a linguagem C é uma linguagem de alto nível. A
linguagem Assembly trabalha com instruções de máquina, diretamente
relacionadas com o hardware, o que exige um conhecimento mais profundo
do funcionamento da arquitetura do processador. Já a linguagem C trabalha
com uma abstração mais elevada e mais próximo da linguagem humana,
fornecendo uma interface mais amigável e facilitando a escrita de
programas.
2. Legibilidade: A linguagem Assembly é muito mais difícil de ler e escrever do
que a linguagem C. Isso ocorre porque a linguagem Assembly é escrita em
código de máquina, o que significa que cada instrução corresponde a um
valor numérico específico. Por outro lado, a linguagem C usa palavras-chave e
estruturas de alto nível para representar operações mais complexas.
3. Portabilidade: A linguagem C é mais portável do que a linguagem Assembly,
pois os programas escritos em C podem ser compilados para diferentes
plataformas sem muitas alterações. Já a linguagem Assembly é altamente
dependente da arquitetura do processador e, portanto, é menos portável.
4. Velocidade de execução: A linguagem Assembly é geralmente mais rápida do
que a linguagem C, porque ela é mais próxima da linguagem de máquina, o
que significa que o código gerado é mais eficiente. No entanto, escrever
programas em Assembly é muito mais trabalhoso do que escrever programas
em C.

Em resumo, a linguagem Assembly é uma linguagem de baixo nível e de difícil


legibilidade, mas é muito rápida e fornece um controle preciso sobre o hardware. A
linguagem C, por outro lado, é uma linguagem de alto nível e mais amigável, que
oferece maior portabilidade e uma velocidade de execução adequada para a maioria
das aplicações.

2 - c)

Esse código Assembly é escrito para um microcontrolador que inclui o arquivo de


cabeçalho "M32DEF.inc". Ele define três constantes simbólicas: X, Y e RES, que
recebem valores hexadecimais (0x99, 0x9A e 0x9B, respectivamente).

A instrução ".ORG 0" define o início do código na posição de memória 0.

A próxima instrução "LDI R16, 8" carrega o valor decimal 8 no registrador R16.

A instrução "STS X, R16" armazena o conteúdo do registrador R16 na posição de


memória X.

A instrução "LDI R17, 13" carrega o valor decimal 13 no registrador R17.

A instrução "STS Y, R17" armazena o conteúdo do registrador R17 na posição de


memória Y.

A instrução "LDS R16, X" carrega o conteúdo da posição de memória X no


registrador R16.

A instrução "LDS R17, Y" carrega o conteúdo da posição de memória Y no


registrador R17.

A instrução "ADD R16, R17" adiciona os valores dos registradores R16 e R17 e
armazena o resultado em R16.

A instrução "STS RES, R16" armazena o conteúdo do registrador R16 na posição de


memória RES.

Portanto, resumindo, o código carrega dois valores (8 e 13) nos registradores R16 e
R17, armazena esses valores nas posições de memória X e Y, carrega os valores
dessas posições de memória nos registradores R16 e R17, adiciona os valores
desses registradores e armazena o resultado na posição de memória RES.
2 - d)

O código Assembly a seguir armazena os valores 8 e 13 nas posições de memória X


e Y, respectivamente. Em seguida, ele carrega os valores dessas posições de
memória nos registradores R16 e R17, adiciona os valores desses registradores e
armazena o resultado na posição de memória RES:
.INCLUDE "M32DEF.inc"
.EQU X=0x99
.EQU Y=0x9A
.EQU RES=0x9B
.ORG 0

LDI R16, 8
STS X, R16
LDI R17, 13
STS Y, R17
LDS R16, X
LDS R17, Y
ADD R16, R17
STS RES, R16

O mesmo código em linguagem de programação C pode ser escrito da seguinte


forma:

#define X 0x99
#define Y 0x9A
#define RES 0x9B

int main(void) {
int R16, R17;

R16 = 8;
*(int*)X = R16;

R17 = 13;
*(int*)Y = R17;

R16 = *(int*)X;
R17 = *(int*)Y;

R16 += R17;
*(int*)RES = R16;
return 0;
}

Neste código em C, as constantes simbólicas X, Y e RES são definidas como macros


usando a diretiva #define. O código em C declara as variáveis R16 e R17 e inicializa-
as com os valores 8 e 13, respectivamente. Em seguida, o valor de R16 é
armazenado na posição de memória X, e o valor de R17 é armazenado na posição
de memória Y, usando o operador de conversão de tipo (int *). Então, o valor das
posições de memória X e Y são lidos e armazenados em R16 e R17,
respectivamente. Por fim, a soma dos valores de R16 e R17 é armazenada na
posição de memória RES.

Você também pode gostar