Pesquisar neste blog

17/01/2022

Comandos no SQL Server #2













--BULK INSERT: É usado no SQL server para copiar (importar) dados de um arquivo
texto ou nativo do SQL Server (também chamados de flat file)
É o modo mais rápido de se importar dodos; porém somente trabalha em uma direção e
com um tipo de arquivo: flat file.

--Exemplo de Bulk Insert
BULK INSERT produto FROM 'C:\SQLServer\scripts\Dados\produto.txt' 
   WITH CODEPAGE='ACP',
   DATA FILELETYPE = 'widechar', 
   filedterminator = '|', -- separando um do outro
   rowterminator = '\n', -- pula linha
   maxerrors = 0,          
   fire_triggers,           
   firestroe = 1,            -- importar a partir da primeira linha
   lastrow = 10             -- importar 10 linhas
)

________________________/ / ___________________________________

EXTENSÃO SQL: Permite a geração de 'scripts' poderosas e procedimentos
armazenados (scripts armazenados no servidor e que podem ser reutilizados).
Instruções de definição de dados CREATE VIEW, CREATE PROCEDURE, CREATE RULE,
CRIATE TRIGGER e CREATE DEFAULT dever ser cada uma a única instrução em um scripts

IF 1=1 AND 2 <> 2 BEGIN PRINT 'Correto é TRUE' 
  END ELSE
     PRINT 'Errado é falso'

DECLAARE @pedido INT, SET @pedido '10789';
  IF (SELECT Count(")
  FROM ped_detalhe WHERE pedido = @pedido
  GROUP BY pedido) > 3
     BEGIN 
        PRINT 'Condicao Satisfeita'
    END
    ELSE BEGIN
       PRINT 'Os Itens são' SELECT pedido, cod_mat
       FROM ped_detalhe
     END
_______________________ / /_______________________________

--Uso do WHILE no SQL Server

DECLARE @cont int
SET @CONT = 10
WHILE (SELECT GETDATE()- @cont) <= getdate()
    BEGIN
      PRINT GETDATE() -cont
        SET @cont = @cont -1
      IF (GETDATE() -@cont) >=GETDATE()
BREAK
      ELSE
  CONTINUE
END


--WHILE USANDO TABUADA
DECLARE @COUNT INT, @TAB INT
  SET @COUNT = 0
SET @TAB = 10

WHILE (@COUNT <= 10) BEGIN --enquanto cont < 10
   PRINT CAST (@COUNT as nvarchar) --imprimindo os valores
     + N' X' + --contatenando o valor X --
     CAST (@TAB as nvarchar) + N' = ' + CAST(@CONT * @TAB as nvarchar)
     CAST (@CONT * @TAB
  SET @CONT = @CONT +1
END

____________________________/ / ____________________

IF no SQL Server

--informe aqui o período para o qual deseja criar os dados
set @dataInicial = '01/01/2012'
set @dataFinal = '31/12/2030'

WHILE @dataInicial <= @dataFinal BEGIN
 set @data = @dataInicial
 set @ano = year(@data)
 set @mes = month(@data)
 set @dia = day(@data)
 set @diaSemana = datepart (weekday, @data)

if @diaSemana in (1,7)
 set @fimSemana = 'S'
else set @fimSemana = 'N'

/*Feriados locais/reginais e aqueles que não possuem data fixa
(carnaval, páscoa e corpus cristis) também devem ser adicionados aqui */

if(@mes = 1 and @dia =1) or (@mes = 12 and @dia =31)
 set @nomeFeriado = 'confraternização universal'
else
if (@mes = 4 and @dia =21)
 set @nomeFeriado = 'tiradentes'
 else
if (@mes = 5 and @dia =1) --dia do trabalho
 set @nomeFeriado = 'dia do trabalho'
else set @nomeFeriado = null

08/01/2022

Comandos no SQL Server #1

























Definição da Linguagem: Linguage Statmends
A linguagem SQL é dividida em 5 tipos de instruções de linguagem primária: DML, DDL, DCL, TCL

DML: Manipulação de linguagem de Dados, ou seja ão os que vai permitir manipular o banco de dados
DDL: Linguagem de Definição de Dados, são os comandos de criação de alteração de objetos dentro do banco de dados.
DSL: Linguagem de domínio específico, são os comandos para controlarmos os acessos dos usuários a base de dados ou tabela.
TCL: Linguagem de controle de transação, são as instruções que vai controlar as operações no banco de dados.

DML 
Select - recuperar dados 
Insert - inserir dados em uma tabela
Update - atualiza os dados existentes em uma tabela
Delete - exclui registros de uma tabela

DDL
Create - criar objetos no banco de dados, tabelas, indexes, procedures, views, functions,e tiggers
Alter - altera a estrutura da base de dados, tabelas, indexes, procedures, views, functions,e tiggers
Drop - apaga objeto do banco de dados, tabelas, indexes, procedures, views, functions,e tiggers
Truncate - remover todos os registros de uma tabela, tabelas, indexes, procedures, views, functions,e tiggers

DCL
Grante - atribui privilégios de acesso do usuário a objetos do banco de dados
Revoke - remove os privilégios de acesso aos objetos obtidos com o comando GRANT
Deny - nega permissão a um usuário ou grupo para realizar operação em um objeto ou recurso

TCL
Begin Transaction - Inicia uma transação
Commit -  salva o trabalho feito
Save Transaction - identificar um ponto em uma transação para que mais tarde você pode efetuar um ROLLBACK
Rollback - restaurar banco de dados ao original desde o último COMMIT




SELECT p.firstname,
p.lastname, 
e.vacationhours,
e.sickleavehours,
e.vacationhours + e.sickleavehours AS 'Horas Ausente'
FROM humanresources.employee AS e 
 JOIN person.person AS p 
 ON e businessentityid p businnessentityid
ORDER BY 'Horas Ausente' ASC


SELECT (2+5) -- retorna 7
SELECT (10%2) -- retorna 5


-- calcula a diferença de taxas de imposto
SELECT Max(taxrate) - Min(taxrate) AS 'Tax rate Difference' -- seleciona o maior e o menor valor
FROM sales salestaxrate
WHERE stateprovicenid IS NOT NULL


SELECT '1', 1 UNION SELECT 'A', 2 -- seleciona 2 colunas (1:A ; 1:2)


--seleciona tudo de city e ordena crescente por city
SELECT city FROM customers UNION ALL SELECT city
   FROM suppliers ORDER BY city




-- DDL CRIAÇÃO DA TABELA PARA EXERCICIOS
CREATE TABLE FUNCIONARIOS (
 ID int identy (1,1), -- campo do int com identificador (alto numeração)
 NOME VARCHAR(50) NOT NULL
 SALARIO DECIMAL(10,2) -- 2 casas decimais
 SETOR VARCHAR(30)
)

-- DML SELECT, EXEMPLO
SELECT *FROM funcionarios

SELECT nome, setor from funcionarios 

-- DML INSERT
INSERT INTO funcionarios VALUES ('Joao', 1000,''),
 ('Jose', 2000, '')

INSERT INTO funcionarios ('nome',salario), VALUES ('Pedro', 1000)-- insere 1 valor nulo na 3 coluna


--DML UPDATE
UPADATE funcionarios SET salario = '1500' WHERE id = '1' -- Altera o valor alterior para 1500

UPDATE funcionarios SET salario = salario * 1.5 WHERE id = '1' -- Altera e multiplica o salario pelo fator 1.5


--DML DELETE
DELETE funcionarios WHERE id = '1' -- exclui na tabela funcionarios onde 1 seja igual a 1



________________//_______________

Comandos DDL servem para gerar novas tabelas

--CREATE TABLE funcionario (
matricula INT IDENTITY (1,1), --inteiro, começa com 1 e acrescenta 1+1
nome CHAR(50) NOT NULL, -- 50 caracter e não pode ser nulo
data_nasc DATETIME -- só vai aceitar valor de data
)

--DDL GERANDO TABELA COM CHAVE ESTRANGEIRA
CREATE TABLE salario (
matricula INT PRIMARY KEY NOT NULL, --Não pode 2 vezes o mesmo número gravado na tabela
salario DECIMA (10, 2) NOT NULL,
FOREIGN KEY (matricula) REFERENCES funcionario(matricula)
)

--DDL PARA ADICIONAR CHAVE PRIMARIA
ALTER TABLE FUNCIONARIO ADD PRIMARY KEY (MATRICULA) 


--DDL GERANDO INDEX // índice para performação de consulta
CREATE INDEX ix_func1 ON funcionario(data_nasc)
CREATE INDEX ix_func2 ON funcionario(cidade, pais)


--Adicionando novo campo na tabela
ALTER TABLE funcionario  ADD genero  CHAR(1);
 
--Renomeando campo da tabela
EXEC sp_rename 'TABELA_ORIGEM.CAMPO_ORIG', 'Campo_orig', 'COLUMN'
EXEC Sp_rename 'funcionario.endereco', 'ender', 'COLUM' --'tabela que vai alterar . e o campo endereco' , 'para no nome x', 'tipo do objeto'


--Excluindo campo da tabela
ALTER TABLE funcionario DROP COLUMN genero; --exclui o campo genero

--Renomeando Tabela
EXEC sp_rename 'FUNCIONAIRO', 'FUNC'; -- renomeia de FUNCIONARIO para FUNC

--Excluindo tabela
DROP DATABASE CURSO;

--VISUALIZAÇÃO
CREATE VIEW v_funcionario AS SELECT *FROM FUNCIONARIOS


--Excluir um index
DROP index ix_func1 ON FUNCIONARIOS; --excluindo ix_func1 na tabela funcionarios

--Excluindo procedure
DROP PROCEDURE proc_salario;

--Excluindo função
DROP function func_salario;

--Excluindo Trigger
DROP trigger trig_func_salario;

--DDL TRUNCATE //VAI ELIMINAR TODOS OS DADOS DA TABELA, MAS A TABELA CONTINUARÁ DENTRO DO SISTEMA
TRUNCATE TABLE CIDADES; --os comandos anteriores serão eliminados

--Fazendo backup em tabela temporaria
SELECT *INTO #HJTEMP FROM person.Password -- person.password = nome da tabela


--ANALISE DE REGISTROS ANTES DO TRUNCATE
SELECT Count(*) AS AntesTruncateCount FROM person.Password;
go -- fará que ele siga para as instruções seguinte
--DDL TRUNCATE APAGADOS DADOS DA TABELA
TRUNCATE TABLE person.Password;
go
--VERIFICANDO TABELAS APOS TURNCATE
SELECT Count(*) AS DepoisTruncate FROM humanresources.jobcandidate;



______________________________/ /_________________________________

Comandos DCL (LINGUAGEM DE CONTROLE DE DADOS)

--GRANT, REVOKE e DENY: são comandos transact-sql usados para atribuir
--e negar permissões para acessos à objetos e recursos.

--CONCEDER (GRANT) - permite aos usuários ler / escrever em determinados objetos
de banco de daodos

--Cria um login e dá permissões no banco
exec master.dbo.sp_addlogin 'UsrTeste', 'SenhaTeste' --UsrTeste = usuário

--Concedendo Acesso de atualização para UsrTeste
GRANT UPDATE ON FUNCIONARIOS TO UsrTeste; -- Tabela 'FUNCIONARIOS' para o usuário UsrTeste

--Concedendo Acesso para INSERT usuário UsrTeste
GRANT INSERT ON FUNCIONARIOS TO UserTeste;

--Concedendo acesso de leitura para UsrTeste
GRANT SELECT ON FUNCIONARIOS TO UsrTeste;

--Concedendo acesso de DELETE PARA UsrTeste
GRANT DELETE ON FUNCIONARIOS TO UsrTeste;

--Concedendo acesso para EXECUTAR PROC TESTE_PROC para UsrTeste.
GRANT EXECUTE ON testproc TO UsrTeste;

--gerando uma procedure
CREATE PROCEDURE testproc as select *from cidades;

excutando procedure
EXEC testproc -- retorna o conteúdo da tabela cidades



--REVOGAR (REVOKE) - mantém os usuários de permissão de leitura / gravação em
objetos de banco de dados

--NEGAR (DENY) - Nega permissão a um usuário ou grupo para realizar operação
em um objeto ou recurso


--Verificando usuario logado
select CURRENT_USER

--ALTERANDO USUARIO LOGADO
SETUSER 'UsrTeste'

--inserindo dados
INSERT into FUNCIONARIOS values ('Maria', '1000', 'TI')

--UPDATE
UPDATE FUNCIONARIOS set nome='Marisa' where id='7'

--3° PARTE NEGA-DENY
--negando acesso de atualização UsrTeste
DENY UPDATE ON FUNCIONARIOS TO UsrTeste;

--NEGANDO ACESSO DE ATUALIZAÇÃO UsrTeste
DENY INSERT ON FUNCIONARIOS TO UsrTeste;

--NEGANDO ACESSO DE LEITURA UsrTeste
DENY SELECT ON FUNCIONARIOS TO UsrTeste;

--nega acesso a execução de procedure
DENY EXECUTE ON testtproc TO UsrTeste;

--VERIFICANDO USUARIO LOGADO
select CURRENT_USER

--Alterando usuario logado
SETUSER 'UsrTeste'

--EXECUTANDO PROCEDURE COM USUARIO UsrTeste
EXEC testproc


______________________/ / _______________________________

--TCL são usados para gerenciar as mudanças feitas por instruções
DML. Ele permite que as declarações sejam agrupadas em transações lógicas

BEGIN - Abre uma transação
COMMIT - Confirma/Salva uma transação
ROLLBACK = Rerter uma transação em caso de qualquer erro

--INICIA A TRANSAÇÃO
BEGIN TRANSACTION

--RETORNA A TABELA NO ESTADO ANTERIOR DO BEGIN TRANSACTION
ROLLBACK

--EFETIVA AS INFORMAÇÕES NA TABELA DO BD
COMMIT TRANSACTION --salva todas as informações 

--GERA UM PONTO DE RECUPERAÇÃO
SAVE TRANSACTION a3

--Restaura a tabela ate o ponto A2
ROLLBACK TRANSACTION a2


--Somente apresenta os clientes que fizeram compras antes da data atual
SELECT cli_cod
cli_nome
FROM clientes WHERE cli_cod IN (
SELECT cli_cod
FROM pedidos
WHERE ped_data <Getdate()


--Apresenta todos os clientes somente se qualquer cliente já fez algum pedido
SELECT cli_cod
cli_nome
FROM clientes WHERE cli_cod IN (
SELECT cli_cod
FROM pedidos


--Sub select
/*
P.num_ped = num_ped
P.data = data
P.cod_cli = cod_cliente
NOME_CLI */

SELECT P.num_ped, P.data, P.cod_cli,
(SELECT C.NOME_CLI FROM cliente C -- sub select para apresentar o nome do cliente
WHERE P.cod_cli = C.cod_cli) AS --onde o codigo do cliente seja = cod do cliente
NOME_CLI FROM pedidos AS P


--Trazer o total de cada cliente da tabela pedidos
P.cod_cli = cod_cli
NOME_CLI = NOME_CLI
(p.total) total = total



SELECT P.cod_cli,
(SELECT C.NOME_CLI FROM cliente C -- sub select para apresentar o nome do cliente
WHERE P.cod_cli = C.cod_cli) AS --onde o codigo do cliente seja = cod do cliente
NOME_CLI, Sum(p.total) total
FROM pedidos AS P GROUP BY P.cod_cli 


--GERANDO UMA CHAVE PRIMARIA COMPOSTA
ALTER TABLE MATRICULA ADD CONSTRAINT PK_1 PRIMARY KEY (ID_ALUNO, id_disciplina)

--ADICIONANDO CHAVE PRIMARIA TABELA DISCIPLINA
ALTER TABLE DISCIPLINA ADD CONSTRAINT PK_2 PRIMARY KEY(id_disciplina)

--Adicionando chave estrangeira na tabela matricula campo ID_ALUNO
ALTER TABLE MATRICULA ADD CONSTRAINT fk_mat1 FOREIGN KEY
(id_aluno) REFERENCES alunos(id_aluno)


_________________________/ / ____________________

INNER JOIN

--INNER JOIN
SELECT a.nome, c.nome_disc, b.periodo
FROM alunos a 
inner join matricula b
on a.id_aluno=b.id_aluno
inner join disciplina c
on b.id_disciplina=c.id_disciplina


________________________/ / ______________________

AGREGAÇÃO

--AGREGAÇÃO: São funções que executam um cálculo em um conjunto 
de valores e retornam um único valor


--AVG: Retorna a média dos valores em um grupo
--MIN: Retorna o mínimo na expressão
--MAX: Retorna o valor máximo na expressão
--SUM: Retorna a soma de todos os valores ou somente os valores
DISTINCT na expressão
--COUNT: Retorna o número de itens do grupo
--STEDV: Retorna o desvio padrão estatístico para a população de todos
os valores na expressão especificada
--GROUPING: Indica se uma expressão de coluna especificada em uma lista GROUPY BY
é agregada ou não.
--GROUPING_ID: É uma função que calcula o nível de agrupamento
--VAR: Retorna a variância estatistica de todos os valores da expressão especificada
--VARP: Retorna a variância estatística para o preenchimento de todos os valores
 da expressão especificada


--AVG Retorna a média dos valores em um grupo
SELECT AVG(populacao) FROM cidades

--AVG MEDIA POR ESTADO
SELECT UF, UF(POPULACAO) FROM CIDADES 
GROUP BY UF
ORDER BY 2

--AVG POR REGIÃO
SELECT B.regiao, AVG(a.POPULACAO) FROM CIDADES A
INNER JOIN regiao_uf 8
ON A.cod_uf=B.ID
GROUP BY B.regisao
ORDER BY 2 desc

--MIN 
SELECT MIN (populacao) from cidades 

--MIN POR ESTADO
SELECT UF, MIN(POPULACAO) FROM CIDADES
GROUP BY UF ORDER BY 2


--MIN POR REGIÃO
SELECT B.regiao, MIN(POPULACAO) FROM CIDADES A
  INNER JOIN regiao_uf B
  ON A.cod_uf=B.ID
  GROUP BY B.regiao
  ORDER BY 2

--MAX retorna o valor máximo na expressão
SELECT MAX(populacao) from cidadees

--MAX POR ESTADO
SELECT UF, MAX(POPULACAO) FROM CIDADES
GROUP BY UF
ORDER BY 2


SELECT B.regiao, MAX(a.POPULACAO) maximo FROM CIDADES a --a.POPULACAO= campo populacao
 INNER JOIN regiao_uf B
 ON A.cod_uf=B.ID
 GROUP BY B.regiao
 ORDER BY 2


/*As funções de classificação retornam um valor de classificação
para cada linha em uma partição. Dependendo da função usada, para
cada linha em uma partição.*/

SELECT rack() OVER (ORDER BY estado ASC) AS rack_uf,
 estado from uf

SELECT rack() OVER (ORDER BY estado ASC) AS rack_uf,
 regiao,
 estado from regiao_uf


--ROW NUMBER EM SQL
Retona o número sequencial de uma linha em uma partição de um 
conjunto de resultados iniciando em 1 para a primeira linha
de cada partição

SELECT ROW_NUMBER() OVER (ODER BY estado ASC) ROW_NUMBER_uf
regiao, estado, FROM regiao_uf

--FUNÇÕES LÓGICAS
--CHOOSE: Retorna o item ao índice espedifico de uma lista
de valores no SQL Server

SELECT Choose(1, 'Gerentee', 'Diretor', 'Desenvolvedor')AS Escolhido -- 1= posição

SELECT productcategoryid, Choose (productcateroyid, 'A', 'B', 'C') AS
Expressao FROM production.productcategory

SELECT jobtitle, hiredate,
Month(hiredate)mes,
Choose(Month(hiredate), 'Winter','Winter','Spring','Spring',
... ), As Quarter_hired
FROM humanresourses.employee 


--IIF: Retorna um de 2 valores 
DECLARE @a INT = 45,
@b INT = 40;
SELECT IIF (@a > @b, 'TRUE', 'FALSE') AS Resultado;

DECLARE @a INT = 45, @b INT = 40;
SELECT IIF (@a > @b, "Maior', "Menor') AS Resultado;

--FUNÇÕES MATEMÁTICAS
ABS: Uma função matemática que retorna o valor absoluto

SELECT Abs(-1.0),
Abs(0.0),
Abs(1.0),
Abs(-9);

RAND: Retorna um valor float pseudoaleatorio de 0 a 1

SELECT Rand();
SELECT Rand(), Rand(), Rand();

DECLARE @cont smallint;
SET @cont = 1;
WHILE @cont < 5 --enquanto contador for menor que 5
  BEGIN -- então faça
    SELECT RAND() Random_Number
    SET @cont = @cont + 1
  END;


ROUND: Retorna um valor numérico, arredondado.

SELECT Round(123.9994, 3), Round(123.9995);
SELECT Round(123.4545, 2); --precisão de 2 casas decimais
SELECT Round(123.45, -2); 

_____________/ / _____________________
--FUNÇÃO DE LIMITE
--TOP: É útil em grandes tabelas com milhares de registros

SELECT TOP 3 * FROM customers

_______________________ / /___________________________

--SRT: Retorna dados de caractere convertido em dados numéricos
SELECT Str(123.45, 6, 1);

--Conversao de numérico para caractere
SELECT 'Teste' +Str(123.45, 6, 1);

--CONCAT: Retorna uma cadeia de caracteres que retorna da concatenação
de 2 ou + valores

SELECT Concat (CURRENT_USER, 'Seu saldo é R$', 11.00, ' em',
  day(getdate()), '/', month(getdate()), '/', year(getdate())),
  AS resultado

--Substitui a cadeia de caracter cde em abcef...
SELECT REPLACE ('abcdefghicde', 'cde', 'xxx') para

SELECT REPLACE ('Isto é um teste' de,  'teste', 'producao') para;

SELECT REGIAO, REPLACE(REGIAO, 'sul', 'South') FROM regiao_uf

__________________/ / ____________

DATA E HORAS 

SELECT Sysdatetime() exSysdatetime
SELECT Sysdatetimeoffset() exSysdatetimeoffset
SELECT Syssutcdatetime() exSyssutcdatetime
SELECT CURRENT_TIMESTAMP exCURRENT_TIMESTAMP
SELECT Getdate() exGetdate
SELECT Getutcdate() exGetutcdate

--FUNÇÃO DE DATA E HORA PARTES QUE RETORNA O DIA/MES/ANO

SELECT Datename(day, Getdate()) DIA_N
  Datename(month, Getdate()) MES_N,
  Datename(year, Getdate()) ANO_N


--DATEADD: Retorna um novo valor datetime adicioando um intervalo
à datepart especificada da date especificada

SELECT Dateadd(day, 90, Getdate())

SELECT getdate() agora, Dateadd (day, 90, Getdate())-- adcionando 90 dias

SELECT getdate() agora, Dateadd(month, 2, Getdate()) -- adc 2 meses

SELECT getdate() agora, Dateadd(year, 3, Getdate())-- adc 3 anos


--DATEDIF: Retorna o número de limites de datepart de data ou
hora entre duas datas especificadas

--Diferença em dias
SELECT Datediff (day, '2022-03-12', '2017-07-13')

--Diferença em meses
SELECT Datediff (month, '2022-03-12', '2017-07-13')

--Diferença em anos
SELECT Datediff (year, '2022-03-12', '2017-07-13')

--FORMATANDO DATAS
SELECT convert(varchar(10), getdate(), 103)


____________________/ / ___________________________________

--USO DO CASE

DECLARE @data DATETIME
SET @data = getdate()-1
SELECT @data, CASE WHEN @data = Getdate() THEN 'Hoje'
SELECT CASE WHEN @data = Getdate() THEN 'Ontem'
SELECT CASE WHEN @data = Getdate() THEN 'Amanhã'
 END dia


USE AdventureWorks2014 SELECT 
  productnumber, productline,
  Categoria = CASE productline --nome da coluna: Categoria
  WHEN 'R' THEN 'Road'
  WHEN 'M' THEN 'Mountain'
  WHEN 'Not for sale' END, 
  NAME
FROM production.product
ORDER BY productnumber;


SELECT productnumber, NAME,
  CASE WHEN lisprice = 0 THEN 'Não está a venda'
  CASE WHEN lisprice < 50 THEN 'Abaixo de $50'
  CASE WHEN lisprice >= 0 AND listprice < 250 THEN 'Abaixo de $1000'
  ELSE 'Acima de $1000' END Price_Range, 'Produtos' AS Categoria
FROM production.product
ORDER BY productnumber


_________________________/ /_____________________________

--VIEWS: Pode ser definida como uma tabela virtual composta por linhas
e colunas de dados vindos de tabelas relacionadas em uma query

VANTAGENS: 
Reuso: Reutilização das views como objetos de caráter permanente
Segurança: As views permitem que ocultemos determinadas colunas de uma tabela
Simplificação do código: As views nos permitem criar um código de
programação muito mais limpo, na medida em que podem conter um SELECT complexo.


CREATE VIEW v_data_contratacao AS SELECT p.firstaname,
   p.lastname, e.businessentiyid, e.hiredate FROM
   humanresources.employee e JOIN person.person AS p
   ON e.businessentifyid = p.businessentiyid;


CREATE VIEW v_fornec_geral AS SELECT id_fornec, fornec FROM
   fornecedores1 UNION ALL
   SELECT id_fornect, fornec FROM fornecedores2 UNION ALL


_________________________ / / ____________________________________

--TEMP TABLE: Tabelas temporárias são geradas no database TempDB e 
podem ser classificadas como Locais e Globais:

* Tabelas Temporárias são geradas no prefixo "#" e possuem visibilidade para a conexão
responsável por sua criação; outas conexões não "enxergam" a tabela.
* Tabelas Temporárias Globais são geradas com o prefixo '##' e são visíveis por todas as conexões


--OPÇÃO DE DROP
- Uma tabela temporária (Local ou Global) só existe enquanto a conexão responsável
pela sua criação estiver ativa.

- No momento da desconexão, tabelas temporárias remanescentes serão dropadas automaticamente.

--GERANDO TABELA TEMPORÁRIA
CREATE TABLE #minhatemporaria (
  campo1 VARCHAR(80) NOT NULL,
  campo2 VARCHAR(80) NOT NULL)

--inserindo informações na tabela temporária
INSERT INTO #minhatemporaria VALUES ('Real', 1000)
INSERT INTO #minhatemporaria VALUES ('Dolar', 3000)


--Gerando tabela temporária através de um select
SELECT * INTO #minhatemporaria2 FROM #minhatemporaria

--Atualizando a tabela temporaria
UPDATE #minhatemporaria SET campo1= 'Libra' WHERE campo1= 'Real' 

--Deletando registros
DELETE FROM #minhatemporia

--Dropando a tabela temporaria
DROP TABELA #minhatemporaria






























31/12/2021

Contador 0 a 99 com PIC 16F877A

Código feito em CCS C Compiler

#include <16f877A.h>
#fuses HS, NOWDT, NOPROTECT, NOLVP
#use delay(crystal = 20 MHz)

int v1[] = {0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1100111};

int v2[] = {0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1100111};

int size = sizeof(v1)/sizeof(int);

void main(){
     
   while(true){
            
      for(int i = 0; i < size; i++){
         for(int j = 0; j <size; j++){
            output_b(v1[i]);
            output_c(v2[j]);
            delay_ms(500);
         }
      }
      
   }
}


Saída gerada no software Proteus versão 7.7






















Palavras chave:

Számláljon 0-tól 99-ig a PIC 16F877A segítségével
Лічыльнік ад 0 да 99 з PIC 16F877A
Հաշվիչ 0-ից 99 PIC 16F877A-ով
מונה 0 עד 99 עם PIC 16F877A
Teller 0 tot 99 met PIC 16F877A
Laskuri 0 - 99 PIC 16F877A:lla
Counter 0 ho 99 e nang le PIC 16F877A
PIC 16F877A ile 0'dan 99'a kadar Sayaç
Лічильник від 0 до 99 з PIC 16F877A
Tæller 0 til 99 med PIC 16F877A

16/12/2021

Catraca eletrônica

Trabalho 1 – Unidade II 2021/2 - MICROCONTROLADORES: construir uma fechadura eletrônica com o PICSimLab e programa de gerenciamento.

Descrição do funcionamento. 

O Usuário: Ao digitar uma senha correta de quatro dígitos os sistema apresentará uma mensagem de boas-vindas no LCD, ligará um LED e aciona um Relé simulando a abertura da catraca ou porta. Se a senha não for uma senha cadastrada o sistema apresenta uma mensagem informando para o usuário procurar a secretaria para resolver a pendência, acende outro LED e não aciona o relé. O 

Administrador: Ao digitar a senha de administrador o sistema apresenta um menu no LCD para que o mesmo possa dar manutenção no sistema. A manutenção consiste de poder incluir, deletar e buscar um cadastro de usuário. Também deve ser possível enviar e receber e receber para um programa, o banco com todos os cadastros de usuários. No programa deve ser possível fazer a manutenção do banco. Recomenda-se usar o “banco de dados” SqLite. Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores

Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores























O Vídeo do projeto: https://youtu.be/s_2AreNMFAM

Resolução:


Clique aqui para fazer o download do projeto

Créditos para: Danubia e André

15/12/2021

Escrever dados e salvar em Java

Objetivo: Escrever informações em um arquivo qualquer.

Classe: EscreverPalavras.java


import java.io.FileOutputStream;
import java.io.PrintWriter;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author HENRIQUE
 */
public class EscreverPalavras {
    public void escreve(Object texto){
        try {
            FileOutputStream arq = new FileOutputStream("arquivo.asm");
            PrintWriter tk = new PrintWriter(arq);
            
            tk.print(texto);
            tk.close();
        } catch (Exception e) {
            System.out.println("ERRO !"+e.getMessage());
        }
    }
}

Arquivo: Main.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author HENRIQUE
 */
public class Main {
    public static void main(String[] args) {
        EscreverPalavras es = new EscreverPalavras();
        es.escreve("Wello World!");
        
    }
}

Saída gerada no simulador: https://www.onlinegdb.com/









Código no simulador:


Palavras chave:

Write data and save in Java
כתוב נתונים ושמור ב-Java
ډاټا ولیکئ او په جاوا کې خوندي کړئ
Nulis data lan simpen ing Jawa
在Java中寫入數據並保存
Записать данные и сохранить на Java
Java дээр өгөгдөл бичиж хадгална
Skriv data och spara i Java
Napišite podatke i sačuvajte u Javi
Tulis data sareng simpen dina Java
Գրեք տվյալները և պահպանեք Java-ում
Запісвайце дадзеныя і захоўвайце іх у Java
Írjon adatokat és mentse el Java-ban

Catraca eletrônica no PicSimLab

Trabalho 1 – Unidade II 2021/1 - MICROCONTROLADORES: construir uma fechadura eletrônica com o PICSimLab e programa de gerenciamento.

Descrição do funcionamento. 

O Usuário: Ao digitar uma senha correta de quatro dígitos os sistema apresentará uma mensagem de boas-vindas no LCD, ligará um LED e aciona um Relé simulando a abertura da catraca ou porta. Se a senha não for uma senha cadastrada o sistema apresenta uma mensagem informando para o usuário procurar a secretaria para resolver a pendência, acende outro LED e não aciona o relé. O 

Administrador: Ao digitar a senha de administrador o sistema apresenta um menu no LCD para que o mesmo possa dar manutenção no sistema. A manutenção consiste de poder incluir, deletar e buscar um cadastro de usuário. Também deve ser possível enviar e receber e receber para um programa, o banco com todos os cadastros de usuários. No programa deve ser possível fazer a manutenção do banco. Recomenda-se usar o “banco de dados” SqLite. Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores

Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores
























O Vídeo do projeto: https://youtu.be/s_2AreNMFAM


Resolução:


Clique aqui para fazer o download do projeto

Créditos para: Afonso e Daniel

13/12/2021

Controlador PID de Temperatura — PICSimLab

Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:


















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.


Resolução:



























Clique aqui para fazer o download do projeto

Créditos para: Afonso

12/12/2021

Controle de temperatura em malha fechada

Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:




















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.


Resolução:




























Clique aqui para fazer o download do arquivo completo

Créditos para: Igor

Palavras chave:

Closed loop temperature control
Temperaturkontroll med sluten slinga
Temperaturkontroll i lukket sløyfe
Kontrola temperatury w pętli zamkniętej
Kontrola temperature zatvorenog kruga
Suljetun piirin lämpötilan säätö
Регулювання температури в замкнутому циклі
בקרת טמפרטורה בלולאה סגורה

11/12/2021

Controle de Temperatura no PicSimlab


Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:
















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.

Resolução:

Código feito em CCS C Compiler

Arquivo temp.c


#include <temp.h>
#include "biblioteca\mod_lcd.c"


char grau = 223;                           //  Pega o simbolo "º", grau

float temperatura_Atual = 0.0,
      temperatura_Antiga = 0.0,
      Disturbio = 0;
      
double ref,                                // Referencia desejada
       error,                              // Diferenca entre temperatura desejada e temperatura atual
       kP = 70,
       kI = 2,
       kD = 0,
       P, I, D,
       pid;
      
       
       
       
double process(){
// Implementação PID
//Proporcional
P = error * kP;
//Integrador
I = I + (error * kI);
//Derivador
D = (temperatura_Antiga - temperatura_Atual) * kD;
temperatura_Antiga = temperatura_Atual;
// Soma tudo
pid = P + I + D;

return pid;
}

void main(){

   setup_adc(ADC_CLOCK_DIV_16);                       // ADC Module uses its internal oscillator
   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);              // Configuracao de portas analogicas
   
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   setup_timer_2(T2_DIV_BY_16,255,1);      //819 us overflow, 819 us interrupt 255+1 = 256 *4 = 1024

   setup_ccp1(CCP_PWM);                    // Configura a porta CCP1 como PWM
   setup_ccp2(CCP_PWM);                    // Configura a porta CCP2 como PWM
      
   lcd_ini();        // Inicializa LCD
   delay_ms(10);

  
   while(TRUE) {

      set_adc_channel(0);                                    // Seleciona o canal ANA0
      delay_ms(10);                                          // Tempo para ativacao
      ref = read_adc() * 0.0489 + 20;                        // Pega a leitura do ANA0
      
      set_adc_channel(2);
      delay_ms(10);
      temperatura_Atual = ((read_adc() * 5)/1023.0)/0.010;
      if (temperatura_Atual >=1) {
      
      error = ref - temperatura_Atual;

      process();

      if(pid>1023) { pid=1023; } else if (pid<=0) { pid=0; }
      if (error >0) { set_pwm2_duty((int16)pid); }
      
      else if (error <=0) { set_pwm2_duty(0); }
           
      set_adc_channel(1);
      delay_ms(10);
      disturbio = read_adc();

      SET_PWM1_DUTY((int16) disturbio);    
                                                                            // Escreve na Tela
      printf (lcd_escreve,"\fTemp= %f %cC",temperatura_Atual, grau);        // Temperatura
      printf (lcd_escreve,"\n\rRef= %f %cC",ref, grau);                     // Referencia
      delay_ms(1000);
      
      
      }
   } // While

} // Main

_______________________//___________________

Arquivo mod_lcd.c

// As defininições es a seguir s�o utilizadas para acesso aos pinos do display
// caso o pino RW n�o seja utilizado, comente a defini��o lcd_rw
#ifndef lcd_enable
   #define lcd_enable       pin_e1      // pino enable do LCD
   #define lcd_rs         pin_e0      // pino rs do LCD
   //#define lcd_rw      pin_e2      // pino rw do LCD
   #define lcd_d4         pin_d4      // pino de dados d4 do LCD
   #define lcd_d5         pin_d5      // pino de dados d5 do LCD
   #define lcd_d6         pin_d6      // pino de dados d6 do LCD
   #define lcd_d7         pin_d7      // pino de dados d7 do LCD
#endif

#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40    // Endere�o da segunda linha na RAM do LCD

// a constante abaixo define a seq��ncia de inicializa��o do m�dulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};

byte lcd_le_byte()
// l� um byte do LCD (somente com pino RW)
{
   byte dado;
   // configura os pinos de dados como entradas
   input(lcd_d4);
   input(lcd_d5);
   input(lcd_d6);
   input(lcd_d7);
   // se o pino rw for utilizado, coloca em 1
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_high(lcd_enable); // habilita display
   dado = 0;   // zera a vari�vel de leitura
   // l� os quatro bits mais significativos
   if (input(lcd_d7)) bit_set(dado,7);
   if (input(lcd_d6)) bit_set(dado,6);
   if (input(lcd_d5)) bit_set(dado,5);
   if (input(lcd_d4)) bit_set(dado,4);
   // d� um pulso na linha enable
   output_low(lcd_enable);
   output_high(lcd_enable);
   // l� os quatro bits menos significativos
   if (input(lcd_d7)) bit_set(dado,3);
   if (input(lcd_d6)) bit_set(dado,2);
   if (input(lcd_d5)) bit_set(dado,1);
   if (input(lcd_d4)) bit_set(dado,0);
   output_low(lcd_enable);   // desabilita o display
   return dado;   // retorna o byte lido
}

void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
   // coloca os quatro bits nas saidas
   output_bit(lcd_d4,bit_test(dado,0));
   output_bit(lcd_d5,bit_test(dado,1));
   output_bit(lcd_d6,bit_test(dado,2));
   output_bit(lcd_d7,bit_test(dado,3));
   // d� um pulso na linha enable
   output_high(lcd_enable);
   output_low(lcd_enable);
}


void lcd_envia_byte( boolean endereco, byte dado )
{
   // coloca a linha rs em 0
   output_low(lcd_rs);
   // aguarda o display ficar desocupado
   //while ( bit_test(lcd_le_byte(),7) ) ;
   // configura a linha rs dependendo do modo selecionado
   output_bit(lcd_rs,endereco);
   delay_us(100);   // aguarda 100 us
   // caso a linha rw esteja definida, coloca em 0
   #ifdef lcd_rw
      output_low(lcd_rw);
   #endif
   // desativa linha enable
   output_low(lcd_enable);
   // envia a primeira parte do byte
   lcd_envia_nibble(dado >> 4);
   // envia a segunda parte do byte
   lcd_envia_nibble(dado & 0x0f);
}


void lcd_ini()
// rotina de inicializa��o do display
{
   byte conta;
   output_low(lcd_d4);
   output_low(lcd_d5);
   output_low(lcd_d6);
   output_low(lcd_d7);
   output_low(lcd_rs);
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_low(lcd_enable);
   delay_ms(15);
   // envia uma seq��ncia de 3 vezes 0x03
   // e depois 0x02 para configurar o m�dulo
   // para modo de 4 bits
   for(conta=1;conta<=3;++conta)
   {
      lcd_envia_nibble(3);
      delay_ms(5);
   }
   lcd_envia_nibble(2);
   // envia string de inicializa��o do display
   for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}

void lcd_pos_xy( byte x, byte y)
{
   byte endereco;
   if(y!=1)
      endereco = lcd_seg_lin;
   else
      endereco = 0;
   endereco += x-1;
   lcd_envia_byte(0,0x80|endereco);
}

void lcd_escreve( char c)
// envia caractere para o display
{
   switch (c)
   {
     case '\f'    :   lcd_envia_byte(0,1);
              delay_ms(2);
            break;
     case '\n'   :
     case '\r'    :   lcd_pos_xy(1,2);
              break;
     case '\b'    :   lcd_envia_byte(0,0x10);
              break;
     default   :   lcd_envia_byte(1,c);
              break;
   }
}

char lcd_le( byte x, byte y)
// le caractere do display
{
   char valor;
   // seleciona a posi��o do caractere
   lcd_pos_xy(x,y);
   // ativa rs
   output_high(lcd_rs);
   // l� o caractere
   valor = lcd_le_byte();
   // desativa rs
   output_low(lcd_rs);
   // retorna o valor do caractere
   return valor;
}

Saída ggerada no PicSimlab

























Clique aqui para fazer o download o Projeto Completo

Créditos para: Fábio Pereira

16/11/2021

Pisca led PWM #3 com PIC 16F877A

Código feito em CCS C Compiler

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device ADC=8                           // Set ADC resolution to 8-bit
#use delay(clock=8000000)
 
unsigned int8 i, j;
void main(){
  setup_adc(ADC_CLOCK_DIV_32);           // Set ADC conversion time to 32Tosc
  setup_adc_ports(AN0_AN1_AN3);          // Configure AN0,AN1 and AN3 as analog
  setup_ccp1(CCP_PWM);                   // Configure CCP1 as a PWM
  setup_ccp2(CCP_PWM);                   // Configure CCP2 as a PWM
  delay_ms(100);                         // Wait 100ms
  setup_timer_2(T2_DIV_BY_16, 255, 1);   // Set PWM frequency to 488Hz
  while(TRUE){
  
    set_adc_channel(0);                  // Select channel AN0
    delay_ms(1);                         // Wait 1ms
    i = read_adc();                      // Read from AN0 and store in i
    delay_ms(1);                         // Wait 1ms
    set_adc_channel(1);                  // Select channel AN1
    delay_ms(1);                         // Wait 1ms
    j = read_adc();                      // Read from AN1 and store in j
    set_pwm1_duty(i);
    set_pwm2_duty(j);
    delay_ms(1);                         // Wait 1ms
   }
}


Simulador Proteus versão 7.7

13/11/2021

Motor de passo #2 com PIC 16F877A

Simulador Proteus versão 7.7



















Código feito em CCS C Compiler

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP                       
#use delay(clock = 20MHz)
#use fast_io(B)  // habilita todas as portas B
#use fast_io(D)  // habilita todas as porras D
 
unsigned int8 speed_;
void main(){
   
  output_b(0);
  set_tris_b(0x03);
  port_b_pullups(TRUE);
  output_d(0);
  set_tris_d(0);
  setup_adc(ADC_CLOCK_DIV_32);      // Set ADC conversion time to 32Tosc
  setup_adc_ports(AN0);             // Configura AN0 em analógica  
  set_adc_channel(0);               // Select channel 0 input
  delay_ms(100);                    // Wait 100ms
  
  while(TRUE){
      output_d(0);
      
      while( ! input(PIN_B0)){
         speed_ = read_adc();
         
         if(speed_ < 2)
            speed_ = 2;
         output_d(0b00000011);
         delay_ms(speed_);
         output_d(0b00000110);
         delay_ms(speed_);
         output_d(0b00001100);
         delay_ms(speed_);
         output_d(0b00001001);
         delay_ms(speed_);
      }
      while( ! input(PIN_B1)){
         speed_ = read_adc();
         if(speed_ < 2)
            speed_ = 2;
         output_d(0b00001001);
         delay_ms(speed_);
         output_d(0b00001100);
         delay_ms(speed_);
         output_d(0b00000110);
         delay_ms(speed_);
         output_d(0b00000011);
         delay_ms(speed_);
      }
   }
}

Saída gerada






















Palavras chave:

Stepper motor with PIC 16F877A
Motor paso a paso con PIC 16F877A
Stappenmotor met PIC 16F877A
PIC 16F877A ସହିତ ଷ୍ଟେପର୍ ମୋଟର |
ʻO ka mīkini stepper me PIC 16F877A
מנוע צעד עם PIC 16F877A
Stepper motor na may PIC 16F877A
PIC16F877Aを搭載したステッピングモーター
Stegmotor med PIC 16F877A

11/11/2021

Verifica 2 vetores em C

Objetivo: Verificar se 2 são exatamente iguais em suas devidas posições.

Código feito em linguagem C

#include <stdio.h>
#define SIZE 3

int vetor[SIZE];

int vet[SIZE] = {2, 2, 9};
int var[SIZE] = {2, 9, 2};
int acertos = 0;

void verifica(int valor, int posicao){
    if(valor == vet[posicao]){
        printf("%d = %d\n",valor, vet[posicao]);
        acertos++;
    }else{
        printf("[%d] != [%d] Não é igual !\n",valor, vet[posicao]);
    }
}

int main(){
    
    for(int i = 0; i < SIZE; i++){
        verifica(var[i], i);
    }
    printf("Acertos = %d\n",acertos);
    return 0;
}

Saída gerada no www.https://www.onlinegdb.com/



10/11/2021

Fatorial #2 com MIPS Assembly

.data
prompt: .asciiz "Entre com num: "
factMsg: .asciiz "Fatorial = "
num: .word 0
.text

la $a0, prompt
li $v0, 4
syscall
li $v0, 5
syscall
sw $v0, num
move $a0, $v0
la $a0, factMsg
li $v0, 4
syscall
lw $a0, num
jal fact
move $a0, $v0
li $v0, 1
syscall
li $v0, 10
syscall

fact:
li $t0, 1
move $t1 $a0, 
loop:
beq $t1, $zero, exit
mul $t0, $t0, $t1
addi $t1, $t1, -1
j loop

exit:
move $v0, $t0
jr $ra

Simulador MARS 4.0


02/11/2021

Fatorial #1 com MIPS Assembly

.data
promptMessage: .asciiz "Entre com o número do fatorial: "
resultMessage: .asciiz "\nFatorial = "
theNumber: .word 0
theAnswer: .word 0
.text
.globl main
main:
#leia o número do usuário
li $v0, 4
la $a0, promptMessage
syscall
li $v0, 5
syscall
sw $v0, theNumber
#Chama a função fatorial
lw $a0, theNumber
jal findFactorial
sw $v0, theAnswer
#Exibi os resultados
li $v0, 4
la $a0, resultMessage
syscall
li $v0, 1
lw $a0, theAnswer
syscall
#Informa ao sistema que este é o fim do programa
li $v0, 10
syscall
#--------------------
# função findFactorial
.globl findFactorial
findFactorial:
subu $sp, $sp, 8
sw $ra, ($sp)
sw $s0, 4($sp)
#Base caso
li $v0, 1
beq $a0, 0, factorialDone
#findFactorial (o número -1)
move $s0, $a0
sub $a0, $a0, 1
jal findFactorial
#A mágia acontece aqui
mul $v0, $s0, $v0
factorialDone:
lw $ra, ($sp)
lw $s0, 4($sp)
addu $sp, $sp, 8
jr $ra

Saída gerada no MARS 4.5
























Palavras chave:

Factorial with MIPS Assembly
Factorial con ensamblaje MIPS
Faktoriell med MIPS-montering
פקטוריאלי עם MIPS Assembly
Silnia z zespołem MIPS
MIPS সমাবেশের সাথে ফ্যাক্টরিয়াল
Faktorial dengan Majelis MIPS
Факториал с MIPS монтаж
Factorial cu Asamblare MIPS