Pesquisar neste blog

28/09/2022

Inserir linhas com API Google Sheets

Objetivo: Inserir uma quantidade X de linhas em uma aba com base na última linha com dados em outra aba do google sheets.

Código utilizado:

function QtdLinhas2(){
  var planilha = SpreadsheetApp.getActiveSpreadsheet();
  var guiaMenu = planilha.getSheetByName("Dados 1");
  var guiadados = planilha.getSheetByName("Dados 2");
  var ultimaLinha = guiaMenu.getLastRow();

  Browser.msgBox(ultimaLinha);

  for(let i = 0i < ultimaLinhai++){
    guiadados.getRange('1:1').activate();
    planilha.getActiveSheet().insertRowsBefore(guiadados.getActiveRange().getRow(), 1);
    guiadados.getActiveRange().offset(001guiadados.getActiveRange().getNumColumns()).activate();
  }
}































Palavras chave:

Geli safafka Google Sheets API
Chèn hàng bằng API Google Trang tính
Inserere Ordines apud Google rudentis API
Indsæt rækker med Google Sheets API
Inserați rânduri cu API-ul Google Sheets
Google Sheets API yordamida qatorlarni kiriting
गूगल शीट्स एपीआई के साथ पंक्ति डालें
Вставка строк с помощью Google Sheets API
Wstaw wiersze za pomocą interfejsu API Arkuszy Google
Lebokake Rows nganggo Google Sheets API
Rigen ynfoegje mei Google Sheets API

27/09/2022

Timer 0 com PIC 16F877A

O TIMERO está programado para causar uma interrupção a cada certo tempo, neste caso 20 ms. Toda vez que a interrupção ocorre, teste se o botão foi pressionado. No caso de ter sido pressionado, ele com teste se é um toque curto ou mais de 3 segundos. Para este último caso é verificado se o botão é pressionado durante 150 interrupções do TIMER (3s/20ms = 150). Se o botão não foi pressionado, é designado como o Function_D6 = 0, se foi pressionado uma vez por mais de 3 segundos é designado como Função JD 6 = 1, se tiver sido pressionado momentaneamente é designado como Function_D6 = 2 e se foi pressionado por mais de 3 segundos uma segunda vez é designada como o Function_D6 = 3. 
Para distinguir se foi pressionado por mais de 3 segundos uma ou duas vezes, é utilizada uma variável de controle (que se chamará CON_D6) que pode ser zero ou um, dependendo se é a primeira ou a segunda vez que é pressionado.
Para controlar o tempo que o botão é pressionado, é utilizada uma variável (D6) que irá
incrementando se o botão for pressionado e ocorrer uma interrupção TMRO.












26/09/2022

Ultima linha com dados no API Google Sheets

Objetivo: Realizar a quantificação da última linha com dados no Google Sheets

Código 1:

function QtdLinhas() {
  var planilha = SpreadsheetApp.getActiveSpreadsheet();
  var guiaMenu = planilha.getSheetByName("Dados 1");
  
  var ultimaLinha = guiaMenu.getLastRow(); //ultima linha com dados
  Browser.msgBox(ultimaLinha);

}

Saída no Google Sheets

























Palavras chave:

Last line with data in Google Sheets API
Última línea con datos en Google Sheets API
Последняя строка с данными в Google Sheets API
Останній рядок із даними в API Google Таблиць
שורה אחרונה עם נתונים ב-Google Sheets API
Sista raden med data i Google Sheets API
Lescht Zeil mat Daten an Google Sheets API
Zadnji redak s podacima u Google Sheets API-ju
Dòng cuối cùng với dữ liệu trong API Google Trang tính
Khadka u dambeeya ee xogta Google Sheets API

20/09/2022

Servo Motor com CI 555

Software Proteus 7.9



























Componentes:

1 Capacitor 10 uF
1 Capacitor 100 nF
1 Led
1 Potenciômetro
1 Resistor 220 ohms
1 Fonte de alimentação 12V
1 CI 555
1 Servo Motor

11/09/2022

Uso de for no google Sheets

Código na IDE do google sheets em linguagem JavaScript

function debug(){
  var square = 0;
  for(var i = 0; i < 10; i++){
    square = i + 1;
    Logger.log(square);
  }
}







09/09/2022

Notificação no Apps google sheets

Código feito na IDE do google sheets

function MSG(){
  SpreadsheetApp.getActiveSpreadsheet().toast("Atenção !", "NOTIFICAÇÃO");
}














Palavras chave:

Cuadro de mensaje en hojas de Google de aplicaciones
Message box in Apps google sheets
Pole wiadomości w arkuszach Google Apps
Üzenőmező az Apps Google-lapokon
Apps google sheet 中的消息框
תיבת הודעות ב-Google Sheets של Apps
Оквир за поруке у Гоогле табелама за апликације
Hafatra hafatra ao amin'ny Apps google sheets
Meddelelsesfelt i Apps google sheets

06/09/2022

Mensagem box no Apps google sheets

Código feito na IDE do google sheets

function MSG(s1, s2){
  Browser.msgBox("Blog da Engenharia Cotidiana", "Bem Vindo(a)", Browser.Buttons.OK);
}

















Palavras chave:

Cuadro de mensaje en hojas de Google de aplicaciones
Message box in Apps google sheets
Pole wiadomości w arkuszach Google Apps
Üzenőmező az Apps Google-lapokon
Apps google sheet 中的消息框
תיבת הודעות ב-Google Sheets של Apps
Оквир за поруке у Гоогле табелама за апликације
Hafatra hafatra ao amin'ny Apps google sheets
Meddelelsesfelt i Apps google sheets

02/09/2022

Interrupção com PIC 16F877A

Objetivo: Acionar por meio de interrupção uma operação já em andamento

Código feito em CCS C Compiler

#include <16F877A.h>
#use delay(clock = 20MHz)
#fuses XT, NOWDT, PUT, NOWRT
#use fast_io(B)

#INT_EXT
ext_isr(){
   output_toggle(pin_B7);
}

void main(){
   set_tris_B(0x01); //B0 com entrada, B7 como salida
   output_low(PIN_B7);
   port_b_pullups(TRUE);
   enable_interrupts(int_ext);
   ext_int_edge(L_TO_H);
   enable_interrupts(GLOBAL);
   WHILE(1){
            
      for(int i = 0; i < 100; i++){
         output_toggle(PIN_D0);
         delay_ms(500);
      }
   }
   
}


Saída gerada no software Proteus 7.9





30/08/2022

TERMÔMETRO COM PIC 16F877A

(Componente NTSA0WB203)

Código feito em CCS C Compiler

//PÁGINA 136
#include <16F877A.h>
#device adc = 10
#fuses XT, NOWDT
#use delay (clock = 4MHz)
#include <math.h>
#include <lcd.c>

float tv, tr, temp, y;
int16 value;

void main(){
   lcd_init();   
   setup_port_a(ALL_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   delay_ms(10);
   
   while(true){
      value = read_adc();
      tv = 5.0 * value / 1024.0;
      tr = tv * 10000.0 / (5.0 - tv);
      y = log(tr / 20000.0);
      y = (1.0 / 298.15) + (y * (1.0 / 4050.0));
      temp = 1.0 / y;
      temp = temp - 273.15;
      
      printf(lcd_putc, "\f\nT = %04.2fC",temp);
      delay_ms(1000);
   }
}



24/08/2022

Gráfico de barras no google sheets
















Comando utilizado:

=SPARKLINE(B3;{"charttype"\"bar";"max"\1;"color1"\"orange"})
=SPARKLINE(B4;{"charttype"\"bar";"max"\1;"color1"\"red"})
=SPARKLINE(B5;{"charttype"\"bar";"max"\1;"color1"\"7CFC00"})
=SPARKLINE(B6;{"charttype"\"bar";"max"\1;"color1"\"grey"})
=SPARKLINE(B7;{"charttype"\"bar";"max"\1;"color1"\"DeepSkyBlue"})

17/08/2022

Onda senoidal PWM com PIC 16F877A

Código feito em CCS C Compiler

#include <16F877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for

#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock = 20MHz)

//============== TABELA COM VALORES DE UMA ONDA SENOIDAL ================//
const unsigned int seno[73] = { 0,0,1,2,3,5,7,9,12,14,18,21,25,29,33,37,41,
 45,50,54,58,62,66,70,74,78,81,85,87,90,92,94,
 96,97,98,99,99,99,98,97,96,94,92,90,87,85,81,
 78,74,70,66,62,58,54,50,45,41,37,33,29,25,21,
 18,14,12,9,7,5,3,2,1,0};
//======================================================================//

unsigned int8 ii = 0, ton;
#int_RTCC
void RTCC_isr(void){
   ii=ii+1; ton = seno[ii];
   set_pwm1_duty(ton);
   if(ii>71)ii=0;
}

void main(){
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);

   // Programação do Timer 0 - Overflow a cada 819 us
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);

   setup_timer_1(T1_DISABLED);

   // Programação do Timer 2 - usado no PWM
   setup_timer_2(T2_DIV_BY_1,99,1);

   setup_ccp1(CCP_PWM);
   set_pwm1_duty(99); // Ton = 100%
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

    while(true){
      /*
      ii=ii+1; ton = seno[ii];
      set_pwm1_duty(ton);
      if(ii>71)ii=0;
      delay_ms(1);
      */
   
   }
}















06/08/2022

Proporção

1- De cada 10 alunos de uma sala de aula, 6 são do sexo feminino. Sabendo que nesta sala de aula há 18 alunos do sexo feminino, quantos são do sexo masculino ?

Resolução:

6 / (10 - 6) = 18 / x
x = 12 alunos

2- Foram construídos 2 reservatórios de água, a razão entre os valores internos do 1° e do 2° é de 2 para 5, e a soma desses volumes é 14 . Qual é a diferença entre as capacidades desses 2 reservatórios ?

Resolução:

1° --> 2x
2° --> 5x

2x + 5x = 14            2 . 2 = 4
x = 2                        5 . 2 = 10

10 - 4 = 6 m³


3- Manoel vendeu seu carro por 27.000 R$ e teve um prejuízo de 10% sobre o valor de custo do total do veículo, qual o valor do carro ?

Resolução:

100 - 10 = 90%
27.000 ---> 100%
x ----------> 90%

x = 30.000 R$


4- Em um mapa cuja escala era de 1:15104, a menor distância entre dois pontos A e B, medida com a régua, era de 12 cm. Isso significa em real é igual a ?

Resolução:

1 ---> 15104
12 --> x

1 / 15104 = 0,12 / x

x  = 1812,48 m

21/07/2022

Menu com PIC 16F877A

Objetivo: Executar um menu de controle por meio de um botão. O programa deve mostrar um menu de 3 funções. Por meio do botão, um dos os 3 elementos e com outro executar a função (neste caso acender um led).

Código feito em CCS C Compiler

#include <16F877A.h>
#fuses XT, NOWDT
#use delay(clock = 20M)
#include <lcd.c>
#use standard_io(C)
#use standard_io(A)

enum funciones {med, cal, ini }; // atribui um valor a cada elemento: med = 0, cal = 1, ini = 2

void medir(void){
   output_toggle(PIN_C0);
}

void calibrar(void){
   output_toggle(PIN_C3);
}

void inicializar(void){
   output_toggle(PIN_C6);
}

void run_func(int numfunc){
   
   switch(numfunc){
      case med:
         medir();
      break;
      
      case cal:
         calibrar();
      break;
      
      case ini:
         inicializar();
      break;
   }
}

void main(){
   char item;
   char n_menus = 3;
   //bit_set(TRISA, 0);
   lcd_init();
   
   while(TRUE){
      if(input(PIN_A0) == 1){
         item++;
         delay_ms(300);
         lcd_putc('\f');
         
         if(item > (n_menus - 1)) {item = 0;           
         }
      }
      
      switch (item) {
         
         case 0:
            lcd_gotoxy(1, 1);
            printf(lcd_putc,"MEDIR");
            lcd_gotoxy(1, 1);
         break;
         
         case 1:
            printf(lcd_putc,"CALIBRAR");
            lcd_gotoxy(1,1);
         break;
         
         case 2:
            printf(lcd_putc,"INICIALIZAR");
            lcd_gotoxy(1,1);
         break;
      }
      
      if (input(PIN_A4) == 1){
         delay_ms(200);
         run_func(item);
      }
   }
}








15/07/2022

Matriz sequencial por colunas

Objetivo: Somar 16 bits por coluna em uma matriz 10 x 10 e imprimir seu resultado.

Resolução feita C/C++

#include <stdio.h>
#define size 10

int matriz[size][size];
int aux = 0, cont = 0, somador = 0;

int c1 = 2, c2 = 5, c3 = 10, c4 = 13, c5 = 20;

int i, j;

int main(){
    
    for(i = 0; i < size; i++){
        for(j = 0; j < size; j++){
            matriz[i][j] = aux;
            aux = aux + 16;
            cont++;
            printf("%d\t",matriz[i][j]);
            
            if(cont >= size){
                somador++;
                aux = somador;
                cont = 0;
                
            }
        }
        printf("\n");
    }
    return 0;
}

Saída gerada


12/07/2022

Decodificador 4511 com PIC 16F877A usando matriz

Objetivo: Fazer um contador com usando o decodificador 4511 utilizando apenas as portas C do PIC, logo depois utilizar as entradas por byte para identificar seu valor.

Resolução feita em CCS C Compiler

#include <16F877A.h>
#include <math.h>
#use delay(clock = 20M)
#define size 10
#include <lcd.c>

const unsigned char matriz[size][size] = {
    {0, 16, 32, 48, 64, 80, 96, 112, 128, 144},
    {1, 17, 33, 49, 65, 81, 97, 113, 129, 145},
    {2, 18, 34, 50, 66, 82, 98, 114, 130, 146},
    {3, 19, 35, 51, 67, 83, 99, 115, 131, 147},
    {4, 20, 36, 52, 68, 84, 100, 116, 132, 148},
    {5, 21, 37, 53, 69, 85, 101, 117, 133, 149},
    {6, 22, 38, 54, 70, 86, 102, 118, 134, 150},
    {7, 23, 39, 55, 71, 87, 103, 119, 135, 151},
    {8, 24, 40, 56, 72, 88, 104, 120, 136, 152},
    {9, 25, 41, 57, 73, 89, 105, 121, 137, 153}   
};

int a, b, c, d, e, f, g, decimal;
unsigned int8 aux, dezena, unidade;

void main(void){
   
    for(int i = 0; i < size; i++){
      for(int j = 0; j < size; j++){
         output_c(matriz[i][j]);
         delay_ms(100);
      }
    }
    delay_ms(500);
    
    lcd_init();
    
   while(TRUE){      
      
      a = input(PIN_B0);
      b = input(PIN_B1);
      c = input(PIN_B2);
      d = input(PIN_B3);
      e = input(PIN_B4);
      f = input(PIN_B5);
      g = input(PIN_B6);
      
      decimal = (a<<6)|(b<<5)|(c<<4)|(d<<3)|(e<<2)|(f<<1)|(g<<0);
      
      printf(lcd_putc,"\fBINARIO = %u%u%u%u%u%u%u \nDECIMAL = %u"a, b, c, d, e, f, g, decimal);
      delay_ms(100);
      
      aux = decimal / 10;
      dezena = (int)floor(aux);
      
      aux = decimal - (10 * dezena);
      unidade = (int)floor(aux);
      
      output_c(matriz[dezena][unidade]);
      delay_ms(100);
      
   }
}























Palavras chave:

Decoder 4511 with PIC16F877A using array
Декодер 4511 с PIC16F877A с использованием массива
Dekoder 4511 med PIC16F877A som bruker array
Dekoder 4511 z PIC16F877A za pomocą tablicy
מפענח 4511 עם PIC16F877A באמצעות מערך
Decoder 4511 le PIC16F877A sebelisa hlophisitsoeng
어레이를 사용하는 PIC16F877A가 있는 디코더 4511
Dekodētājs 4511 ar PIC16F877A, izmantojot masīvu
Декодер 4511 с PIC16F877A, използващ масив
Dekodér 4511 s PIC16F877A pomocí pole
Bộ giải mã 4511 với PIC16F877A sử dụng mảng

09/07/2022

PF 2021/2

Questão 1) Projetar um sistema com PICSimLab que recebe o sinal do potenciômetro e apresenta o valor de 0 a 99% no LCD e no display de 7 segmentos. (Vale 3,0 pontos)










Resolução:

Código feito no CCS C Compiler

#include <16F877A.h>
#device adc = 8
#include <math.h>
#FUSES NOWDT, HS, NOPROTECT, NODEBUG
#FUSES NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(crystal = 20MHz)

#ifndef lcd_enable
   #define lcd_enable   pin_e1 // pino enable do LCD
   #define lcd_rs       pin_e2 // 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

#include <mod_lcd.c>
unsigned int8 valor, aux, c, d, u;
unsigned int8 vetor[] = {0b00111111, 0b00000110, // 0 a 9
   0b01011011, 0b01001111, 0b01100110, 0b01101101,
   0b01111101, 0b00000111, 0b01111111, 0b01100111 };

void main(){
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   lcd_ini();

   while(TRUE){

      valor = read_adc();
      if(valor >= 99){
         valor = 99;
      }  
      aux = valor/100;     // extrai o primeiro piso das centenas
      c = (int)floor(aux); // converte para inteiro
      
      aux = ((valor/10)-(10*c)); //extrai o primeiro piso das dezenas
      d = (int)floor(aux);       //converte para inteiro
      
      aux = ((valor)-(100*c)-(10*d));  //extrai o primeiro piso das unidades
      u = (int)floor(aux);             //converte para inteiro
      
      printf (lcd_escreve,"\f\t\t\tIFMT\nValor = %u%%",valor);
      delay_ms(20);
      
      output_b(vetor[d]);
      output_c(vetor[u]);
      
   }
}
























Questão 2) Utilize os três timers para fazer três LEDs piscarem com frequência iguais a:

Vermelho (D0) ________________Hz
Azul (D1) _______________ Hz
Amarelo (D2) ________________Hz
Sabendo que no PIC tem um cristal de _______MHz












Resolução:

Aluno1 = 25 Hz, 5 Hz, 12 Hz

Código feito em CCS C Compiler

#include <16F877A.h>
#device adc = 8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, BROWNOUT, NOLVP, NOCPD, NOWRT, NOWRT
#use delay(clock = 20MHz)

unsigned int16 cont1 = 0, cont2 = 0, cont3 = 0;

#int_TIMER0
void TIMER0_isr(void){
   if(++cont1 >= 394)  { cont1 = 0; output_toggle(pin_B0) ; } 
   if(++cont2 >= 1927) {cont2 = 0;output_toggle(pin_B1); }
   if(++cont3 >= 822) {cont3 = 0; output_toggle(pin_B2); }
}

void main(){
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1); // overflow 51,2 us
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   //disable_interrupts(GLOBAL);
   
   while(true);
}

Saída de frequencímetro no Proteus 7.9























04/07/2022

Interrupção no pino B com PIC 16F877A

Código feito em CCS C Compiler

#include <16F877A.h>
#use delay(clock = 20M)

byte i;
#INT_RB
void rb_isr(void){
   i = input_b();
   output_d(i >> 4);
}

void main(){ 
   set_tris_b(0xff);
   clear_interrupt(INT_RB);
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
}





























01/07/2022

View com SQL Server #144

--VIEW CANAL DE VENDAS
CREATE VIEW V_CRM_CANAL_VENDAS
AS
SELECT *FROM MINIERP.DBO.V_CANAL_VENDAS

--VIEW CONTAS A PAGAR
CREATE VIEW V_CRM_CONTAS_RECEBER
AS
SELECT *FROM MINIERP.DBO.V_CONTAS_RECEBER

--VIEW PEDIDO VENDAS DETALHE
CREATE VIEW V_CRM_PED_VENDAS_DETALHE
AS
SELECT A.NUM_PEDIDO, A.DATA_PEDIDO, A.ID_CLIENTE, B.RAZAO_CLIENTE,
A.TOTAL_PEDIDO, A.SITUACAO,
CASE WHEN A.SITUACAO = 'F' THEN 'FATURADO'
WHEN A.SITUACAO = 'P' THEN 'PLANEJADO'
END SITUA
FROM MINIERP.DBO.PED_VENDAS A
INNER JOIN MINIERP.DBO.CLIENTES B
ON A.ID_CLIENTE = B.ID_CLIENTE



30/06/2022

Decodificador display multiplexado com PIC 16F877A

Objetivo: Receber as entradas nos pinos e decodifica -lás no display 7 segmentos (interface do LCD é importante).

Código feito em CCS C Compiler

#include <16F877A.h>
#device adc = 8
#fuses XT, NOWDT, BROWNOUT, NOLVP
#use delay(clock = 20MHz)
#include <math.h>
#use fast_io(b)
#include <lcd.c>
int v1[] = {0b00111111, 0b00000110, 0b01011011,
   0b01001111, 0b01100110, 0b01101101, 0b01111101, 
   0b00000111, 0b01111111, 0b11100111};
   
unsigned int8 a, b, c, d, e, f;   
byte decimal;
unsigned int8 aux, dezena, unidade;

void main(void){
   lcd_init();
   
   while(TRUE){
      
      a = input(PIN_B0);
      b = input(PIN_B1);
      c = input(PIN_B2);
      d = input(PIN_B3);
      e = input(PIN_B4);
      f = input(PIN_B5);
      decimal = (a<<5)|(b<<4)|(c<<3)|(d<<2)|(e<<1)|(f<<0);
      
      aux = decimal/10;           
      dezena = (int)floor(aux);
      
      aux = (decimal)-(10*dezena);
      unidade = (int)floor(aux);
            
      printf(lcd_putc,"\fBINARIO = %u%u%u%u%u%u \nDECIMAL = %u"a, b, c, d, e, f, decimal);
      delay_ms(100);
      
      for(int i = 0; i < 10; i++){
         output_a(0b0000010);
         output_c(v1[dezena]);
         delay_ms(50);
         
         output_a(0b000001);
         output_c(v1[unidade]);
         delay_ms(50);
      }
   }
}







28/06/2022

Decodificador BCD com PIC 16F877A

Objetivo: Receber através de entrada por bits que codifique sua saída para um display de 7 segmentos e exiba seu bit em binário.

CÓDIGO FEITO EM CCS C COMPILER

#include <16F877A.h>
#device adc = 8
#use delay(clock = 20MHz)
#use fast_io(b)
#include <lcd.c>

unsigned int8 a, b, c, d;   
byte decimal;

void main(void){
   lcd_init();
   
   while(TRUE){
      
      a = input(PIN_B0);     
      b = input(PIN_B1);
      c = input(PIN_B2);
      d = input(PIN_B3);
                                    
      decimal = (a<<3)|(b<<2)|(c<<1)|(d<<0);
            
      output_c(decimal);
            
      printf(lcd_putc,"\fBINARIO = %u%u%u%u  \nDECIMAL = %u"a, b, c, d, decimal);
      delay_ms(200);
            
   }
}

Saída gerada no Proteus 7.9




















23/06/2022

Pull-up para interrupção na saída - PIC 16F877A

 Objetivo: Os terminais RB1 são configurados como saída e RBO como entrada. (com resistor de pull-up). A saída deve ter o mesmo valor que a entrada. Usa -se um interruptor na entrada e um led na saída

Código feito em CCS C Compiler

#include <16F877A.h>
#fuses XT, NOWDT
#use delay (clock = 4MHz)
#BYTE TRISB = 0x86   //TRISB em 86h
#BYTE PORTB = 0x06   //PORTB em 06h
#BYTE OPTION_REG = 0x81    //em 81h

void main(){
   bit_clear(OPTION_REG, 7);  //habilita Pull-up
   bit_set(TRISB, 0);         //B0 como entrada
   bit_clear(TRISB, 1);       //B1 como saída
   bit_clear(PORTB, 1);       //Apaga led
   
   while(TRUE){
      if(bit_test(portb, 0)== 1)    //se RB0 == 1, apaga led
         bit_clear(portb, 1);
      else
         bit_set(portb, 1);         //se RB0 == 0, acende led
   }
}
/*
CÓDIGO REESCRITO 
#include <16F877A.h>
#fuses XT, NOWDT
#use delay (clock = 4MHz)
#use fixed_io(b_outputs = pin_b1)
void main(){
   port_b_pullups(TRUE);
   output_low(PIN_B1);
   
   while (TRUE){
      if(input(PIN_B0) == 1)
         output_low(PIN_B1);
      else
         output_high(PIN_B1);
   }
}
#include <16F877A.h>
#fuses XT, NOWDT
#use delay (clock = 4MHz)
//ponteiros
#define TRISB (int*) 0x86
#define PORTB (int*) 0x06
#define OPTION (int*) 0x81
void main() {
   *option &= 0b01111111;
   *trisb = 0x01;
   *portb = 0x00;
   
   while(TRUE){
      if(*portb & 0x01)    //le RB0 se é 1
         *portb = 0x00;
      else
         *portb = 0x02;    // se é 0 entao acende led (RB1 == 1)
   }
}*/




21/06/2022

Check List DBA no SQL Server #119

As atividades de rotina de um DBA podem ser muito repetitivas e monótonas e podem
ser automatizadas !
Desta forma o DBA investe mais seu tempo em análise que na própria execução das
tarefas e com mais disponibilidade para tarefas intermitentes que possam surgir no dia a dia.

CREATE DATABASE CKLIST 
go
USE CKLIST

--Gerando a tabela para armazenar dados de discos
CREATE TABLE dbo.ESPACO_DISCO(
volume nvarchar(256) NULL,
disk_total_size_GB numeric (18, 2) NULL,
disk_free_size_GB numeric (18, 2) NULL,
disk_usado_size_GB numeric (18, 2) NULL,
disk_ocupado_sql_MB numeric (18, 2) NULL,
data_log datetime NOT NULL
)

--Gerando tabelas para armazenar tamanhos de arquivos
CREATE TABLE dbo.TAMANHO_ARQUIVOS (
volume_mount_point nvarchar(256) NULL,
db_nome sysname NOT NULL,
tipo_arquivo nvarchar (60) NULL,
nome_logico sysname NOT NULL,
path nvarchar (260) NOT NULL,
status nvarchar (60) NULL,
tamanho_arquivo_MB numeric (18, 2) NULL,
data_log datetime NOT NULL
)

--Armazena analise de log
CREATE TABLE dbo.ANALISE_LOG (
db_nome varchar (50),
Log_Size numeric (15, 2),
Log_Space_Used_pct numeric (15, 2),
status_log int,
data_log datetime default getdate()
)


--Armazena histórico de backup
CREATE TABLE dbo.LOG_BACKUP (
db_nome NVARCHAR(256),
nome NVARCHAR(256),
backup_start_date DATETIME,
tempo INT,
server_name NVARCHAR(256),
recovery_model NVARCHAR(120),
tamanho NUMERIC (15, 2)
)

--Armazena historico database
USE curso
CREATE TABLE dbo.TAMANHO_DB(
name sysname NOT NULL,
Tamanho numeric (10, 2) NULL,
Tamanho_2 varchar (13) NULL,
data_log datetime NOT NULL
)

--Armazena log de jobs
CREATE TABLE dbo.LOG_JOBS(
name sysname NOT NULL,
step_id int NOT NULL,
message nvarchar (4000) NULL,
Run_duration int NOT NULL,
run_status int NOT NULL,
Status varchar (19) NULL,
data_log datetime NOT NULL
)

--Armazena histórico de tabelas 
CREATE TABLE dbo.HIST_TABELAS (
Tabela nvarchar (128) NULL,
Linhas bigint NULL,
Reservado bigint NULL,
Dados bigint NULL,
Indice bigint NULL,
NaoUtilizado bigint NULL,
data_log datetime NOT NULL
)

--Verifica utilização de log 
CREATE PROCEDURE dbo.Proc_analise_log
as
DBCC SQLPERF (LOGSPACE)




20/06/2022

Fixed DataBase Roles #118

DBA - Segurança-Security

Sysad: Poderes totais sobre os objetos do servidor
Securiyadmin: Pode gerenciar logins do servidor
Serveradmin: Pode configurar a maioria das opções do servidor
Diskadmin: Gerencia os arquivos de um banco de dados
Dbcreator: Cria e altera Banco de Dados.
Processadmin: Gerencia processos rodando no SQL Server
Stupadmin: Pode gerenciar e configurar a reaplicação entre servidores
SQL Server e extender store procedure

db_owner: Tem poderes totais sobe o banco de dados
db_accessadmin: Pode adicionar e remover usuários ao Banco de Dados
db_datareader: Pode ler dados em todas as tabelas de usuário do BD
db_datawriter: Pode adicionar, alterar ou excluir dados em todas as tabelas
de usuário do BD
db_ddladmin: Pode adicionar, modificar ou excluir objetos do BD
db_securityadmin: Pode gerenciar roles e adionar ou excluir usuários às roles do BD
db_backupoperator: Pode fazer o backup do BD
db_denydatareader: Não pode consultar dados em nenhuma das tabelas do BD, mas pode efetuar
alterações na estrutura do BD e de seus objetos.
db_denydatawriter: Não pode alterar dados no BD.





18/06/2022

Schema DBA no SQL Server #117, #118

DBA - Segurança-Security

Principal: Um principal é considerado qualquer objeto que possa solicitar acesso a recursos
do SQL Server, por exemplo, usuários e grupos do windows, logins e roles do SQL Server, e aplicativos
roles.

Schema: Um schema é um conjunto de objetos, sendo que todos os objetos pertencentes a um shema 
têm como dono o mesmo principal. No SQL Server todos os objetos de um Banco de Dados têm com dono 
um schema.

Servidor.Banco_de_Dados.Schema.Objeto

INFINITY\SQLEXPRESS.CURSO.DBO.CLIENTES

Resumo:
Um schema é um container para objetos
Todo objeto pertence a um schema
Todos os objetos de um schema têm o mesmo dono, que é o dono do schema
As permissões podem ser atribuídas para o schema e também para os objetos dentro do schema


*********

Para criar um schema chamado fin e adm, dentro do banco de dados Curso, da instância INFINITY
para isso, siga os passos a seguir

1. Abra o SQL Server Mangement Studio
2. Na janela Object Explorer, navegue até o Banco de Dados Curso.
3. Clique no sinal de + ao lado do Banco de Dados Curso
4. Clique no sinal de + ao lado de Security
5. Clique no sinal de + ao lado de Schema e observe a lista de schemas definidos
6. Clique com o botão direito do mouse na opção Schema e selecione New Schema

--Gerando Schema para a área de Financeira
USE curso

CREATE SCHEMA fin GO

--Gerando Schema para a área de administrativa
CREATE SCHEMA adm GO

--Gerando tabela fluxo_de_caixa no Schema FIN
CREATE TABLE FIN.fluxo(
id int NULL,
clif_for varchar (50) NULL,
valor decimal (18, 0) NULL,
data date NULL
)

--Teste de select no Schema Fin
SELECT * FROM FIN.fluxo_de_caixa

--DROP SCHEMAS
drop schema FIN
DROP SCHEMA ADM

--DROP TABLE
DROP TABLE ADM.fluxo_de_caixa

--VERIFICANDO TODOS SCHEMAS
SELECT *FROM sys.schemas



17/06/2022

Administração de usuários no SQL Server #115

--Listagem 1. Comando para verificar logins de instância

SELECT * FROM sys.sql_logins
SELECT * FROM sys.syslogins
SELECT * FROM sys.sysremotelogins
SELECT * FROM sys.remote_logins
SELECT * FROM sys.linked_logins

--Listagem 2. Comando para verificar acessos concedidos a usuários.

SELECT
S.name,
S.LOGINNAME,
S.denylogin,
S.hasaccess,
S.isntname,
S.isntgroup,
S.isntuser,
S.yssadmin,
S.securityadmin,
S.serveradmin,
S.diskadmin,
S.diskamin,
S.processadmin,
S.diskadmin,
S.dbcreator,
S.bulkadmin
FROM sys.syslogins S 
  LEFT JOIN
  sys.sql_logins L
  ON S.sid = L.sid

--Listagem 3. Comando para verificar informações básicas de usuários 

Sp_helplogins
Sp_helplogins 'TESTEADM'
Sp_helplogins 'infinity\andre'




14/06/2022

Pulso com PIC 16F877A

Ciclo de trabalho para PWM:

set_pwmx_duty(valor);

valor: dados de 8 ou 16 bits que determinam o ciclo de trabalho. Esse valor, juntamente com o valor do TMR2 preescaler, determina o valor do ciclo de trabalho. Na configuração T1MER2, o pós-aquecimento deve ser 1.

Exemplo 1: Meça a largura de um pulso usando o módulo CCP. Componentes ISIS: Utiliza-se o modo de captura do CCP, configurando-o para detectar a borda de subida ou descida do pulso a ser medido. 
Toda vez que ocorre uma detecção de borda, o valor de TMRl irá para o registro do módulo CCP.









CÓDIGO FEITO EM CCS C Compiler

#include <16F877A.h>
#fuses XT, NOWDT
#use delay(clock = 4MHz)

#ifndef lcd_enable
   #define lcd_enable   pin_E1 // pino enable do LCD
   #define lcd_rs       pin_E2 // 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

#include <mod_lcd.c>
#byte PIR1 = 0x0C

int1 nuevopulso = 0;
int16 TFB = 0, TFS = 0, TF = 0;
float AP = 0.0, frequencia;
int1 cambio = 0;

#int_ccp1
void ccp1_int(){
   if(cambio == 0){
      TFS = CCP_1;
      setup_ccp1(CCP_CAPTURE_RE);
      cambio = 1;
   }else{
      TFB = CCP_1;
      setup_ccp1(CCP_CAPTURE_RE);
      cambio = 0;
      
      if(nuevopulso == 0){
         nuevopulso = 1;
      }
   }
}

void main(){
   lcd_ini();
   
   setup_timer_1(T1_INTERNAL);
   setup_ccp1(CCP_CAPTURE_RE);
   cambio = 0;
   enable_interrupts(int_ccp1);
   enable_interrupts(global);
   
   while(TRUE){
      if(nuevopulso >= 1){
         TF = (TFB - TFS);
         AP = TF * 1.0 / 1000.0;
         frequencia = 1.0 / (AP/1000.0);
         printf(lcd_escreve,"\f Pulso = %f ms\n Freq = %01.2f Hz",AP, frequencia);
         nuevopulso = 0;
         //delay_ms(100);
      }
   }
}

Saída de frequência usando CI 555



Observação: O oscilador astável com CI 555 não é preciso, logo haverá inconsistência nos resultados.
Logo, usando um outro exemplo com clock fixo verá que a precisão é siguinificativa.





Administração de usuários no SQL Server 'DBA' #114

USER curso

SEUSER 'TESTEADM'

select SYSTEM_USER
--testando select
select *from funcionarios

--testando insert
insert into funcionarios values ('Jack', 800, 'RH')

--testando update
update FUNCIONARIOS set salario = salario * 1.5

--voltar no usuario que logou

SELECT SYSTEM_USER
SETUSER 'TESTEADM'









13/06/2022

SQLCMD #112

DBA - Utilitário SQLCMD

O sqlcmd utilitário permite que você insira instruções Transact-SQL, procediemntos

do sistema e arquivos de script no prompt de comando

htpps://docs.microsoft.com/pt-br/sql/tools/sqlcmd-utility


-d db_name

-i input_file

-o output_file

-p password

-q "cmdline query"

-Q "cmdline query" (and exit)

-S [protocol:]server[instance_name][,port]

-U Login_id






 

12/06/2022

DBA - DBCC no Microsoft SQL Server #108 #109 #110

DBA - DBCC (DataBase Console Comamands)
DBCC: São comandos que fazem a consitência lógica e física do banco de dados.
Apesar da maioria dos comandos ser somante para retornar informações sobre o banco
existem alguns comandos que podem ajudar a resolver problemas.

DBCC - Manutenção
DBCC TABLE CHECK: A consitência lógica e física dos objetos no banco de dados é verificada
nessa fase.

DBCC TABLE REPAIR: As correções de banco de dados são executadas nessa fase, se REPAIR_FAST,
REPAIR_REBUILD ou REPAIR_ALLOW_DATA_LOSS for especificado e houver erros de objeto que
precisem ser corrigidos.

DBCC SYS CHECK: As tabelas do sistema de banco de dados são verificadas nessa fase.

DBCC SYS REPAIR: As correções de banco de dados são realizadas nessa fase se REPAIR_FAST, REAPIR_REBUILD 
ou REPAIR_ALLOW_DATA_LOSS for especificado e houver erros de tabelas do sistema que 
precisem ser corrigidos.

DBCC FREEPROCCACHE: Limpa cache de procedures


DBCC - Diversas Miscellneous
DBCC HELP: Retorna informações de sintaxe para o comando especificado DBCC.

DBCC dilname(FREE): Descarrega o procedimento armazenado estendido DLL especificado da memória

DBCC TRACEON: Habilita os sinalizadores de rastreamento especificados

DBCC TRACEOFF: Desabilita os sinalizadores de rastreamento especificados.


DBCC - Informações
DBCC SHOWCONTIG: Exibe informaçções de fragmentação para os dados e índices da tabela ou exibição especificada

DBCC SHOW_STATISTICS: Exibe as estatísticas de otimização de consulta atuais de uma tabela ou exibição indexada

DBCC PROCCACHE: Exibe informações em um formato de tabela sobre o cache de procedimento

DBCC OPENTRAN: Ajuda a identificar as transações ativas que podem impedir o truncamento do log


DBCC - Validação
DBCC CHECKDB: Verifica a integridade lógica e física de todos os objetos do banco de dados especificando com
execução das seguintes operações

DBCC CHECKTABLE: Verifica a integridade de todas as páginas e estruturas que compõe a tabela ou a exibição
indexada

DBCC CHECKCONSTRAINTS: Inspeciona a integridade de uma restrição especificada ou de todas as restrições em
uma tabela especificada no banco de dados atual.

DBCC CHECKALLOC: Verifica a consitência de estruturas de alocação de espaço em disco para um banco de dados
especificado


_______________ DBCC PARA OBTER INFORMAÇÕES ____________________

--Link de apoio: https://msdn.microsoft.com/pt-br/library/ms188796(v=sql.120).aspx
USE MASTER
DBCC HELP('?'); -- exibe os comandos para execução
DBCC HELP (SHOW_STATISTICS) --(checkdb),(
--Exibe informações de fragmentação para os dados e índices da tabela ou exibição específica

use curso
DBCC SHOWCONTIG (cidades)

--Exibe as estatísticas de otimização de consulta atuais de uma tabela ou exibição indexada
DBCC SHOW_STATISTICS (cidades)

--Exibe as informações em um formato de tabela sobre o cache de procedimento
DBCC PROCCACHE

--Ajuda a indetificar as transações ativas que podem impedir o truncamento do log
DBCC OPENTRAN


#109_______________DBCC PARA DIVERSOS __________________

--Retorna informações de sintaxe para o comando específico DBCC.
DBCC HELL (?)
DBCC HELP (TRACEON) --(CHECKALLOC)

--Descarrega o procedimento armazenado estendido DLL especificado da memória
DBCC dllname (FREE)

--select *from sys.session
--Habilita os sinalizadores de rastreamento especificados
DBCC TRACEON

--Exibe o status de sinalizadores de rastreamento
DBCC TRACESTATUS

--Desabilita os sinalizadores de rastreamento especificados.
DBCC TRACEOFF

--apoio
--Conexões ativas
SELECT *FROM sys.dm_exec_connections

--Verificando arquivo trave
SELECT TextData,
SPID, 
LoginName,
NTUserName,
NTDomainName,
HostName,
ApplicatinName,
StarTime, ServerName,
DatabaseName,
EventClass,
ObjectType
FROM fn_trace_gettable('C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\Log\log_19.trc',default)


#110____________________
--Verifica a integridade lógica e física de todos os objetos do banco de dados
--especificado com a execução das seguintes operações:

ALTER DATABASE curso SET SINGLE_USER

USE curso
DBCC CHECKDB (curso, REPAIR_FAST)
DBCC CHECKDB (curso, REPAIR_REBUILD)
DBCC CHECKDB (curso, REPAIR_ALLOW_DATA_LOSS)

--Verifica a integridade de todas as páginas e estruturas que compõem
--a tabela ou a exibição indexada

DBCC CHECKTABLE (cidades)
--Inspeciona a integridade de uma restrição especificada ou de todas
--as restrições em uma tabela especificada no banco de dados atual

DBCC CHECKCONSTRAINTS
--Verifica a consistencia de estruturas de alocação de espaço em disco
--para um banco de dados específíco


_____________DBCC DE MANUTENÇÃO____________________
DBCC HELP ('?');
DBCC HELP ('CHECKTABLE');

--A consistência lógica e física dos objetos no banco de dados é 
--verificada nessa fase.

use curso
DBCC CHECTABLE ('pedidos');

--As correções de banco de dados são executados nessa fase, se REPAIR_FAST,
--REPAIR_REBUILD ou REPAIR_ALLOW_DATA_LOSS
--for especificado e houver erros de objeto que precisem ser corrígidos
--DBCC TABLE REPAIR

USE MASTER
ALTER DATABASE curso SET SINGLE_USER;

DBCC CHECKTABLE ('cidades', REPAIR_FAST)
DBCC CHECKTABLE ('cidades', REPAIR_REBUILD)
DBCC CHECKTABLE ('cidades', REPAIR_ALLOW_DATA_LOSS)

DBCC CHECKSYS --As tabelas são verificadas nessa fase