Ir ao conteúdo
  • Cadastre-se

Controlar LED RGB co PIC 16F628A


malepobox

Posts recomendados

Olá pessoal.

Tenho buscado na internet e os esquemas eletronicos e HEX que consegui testar não funcionaram.

Preciso controlar um Led RGB com o pic 16F628A.

Só que a mudança de cores não serve de modo aleatório (ir mudando sozinho).

Pensei em 2 botões para cada cor (um de incremento e o outro de decremento)

Então ficam seis botões e aí dá para resolver o problema.

Alguma santa alma pode ajudar?

Grde abraço e grato pela ajuda.

Malereis

Link para o comentário
Compartilhar em outros sites

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* PROJETO PWM PARA RGB *
* *
* DESENVOLVIDO POR EDUARDO DE SOUZA RAMOS *
* *
* *
* VERSÃO 1.0 14/07/2007 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Projeto para controlar o brilho de um LED RGB (4 terminais) utilizando *
* PWM gerado via software. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include <16F628a.h> //Microcontrolador utilizado
#fuses hs,nowdt,noprotect,put,brownout,mclr,nolvp,nocpd
#use delay(clock=8000000,RESTART_WDT)

// Constante para o uso dos botões
#define t_filtro 400
#define min 0
#define max 10

// Variáveis globais
long int filtro1 = t_filtro; // Filtro do botão 1 (Incremento Vermelho)
long int filtro2 = t_filtro; // Filtro do botão 2 (Decremento Vermelho)
long int filtro3 = t_filtro; // Filtro do botão 3 (Incremento Verde)
long int filtro4 = t_filtro; // Filtro do botão 4 (Decremento Verde)
long int filtro5 = t_filtro; // Filtro do botão 5 (Incremento Azul)
long int filtro6 = t_filtro; // Filtro do botão 6 (Decremento Azul)
int flags = 0; // Flags de controle dos botões
int contador_red = 0; // Contador do período para o LED vermelho
int contador_green = 0; // Contador do período para o LED verde
int contador_blue = 0; // Contador do período para o LED azul
int pwm_red = 0; // Duty Cicle para o LED Vermelho
int pwm_green = 0; // Duty Cicle para o LED Verde
int pwm_blue = 0; // Duty Cicle para o LED Azul

// Definição dos flags de software
#bit botao_red_up_press = flags.0 // Marca se o botão 1 está pressionado
#bit botao_red_down_press = flags.1 // Marca se o botão 2 está pressionado
#bit botao_green_up_press = flags.2 // Marca se o botão 3 está pressionado
#bit botao_green_down_press = flags.3 // Marca se o botão 4 está pressionado
#bit botao_blue_up_press = flags.4 // Marca se o botão 5 está pressionado
#bit botao_blue_down_press = flags.5 // Marca se o botão 6 está pressionado

//Definição e inicialização dos port's
#use fast_io(a)
#use fast_io(
#byte porta = 0x05
#byte portb = 0x06

// Entradas para o microcontrolador
#bit botao1 = porta.2
#bit botao2 = porta.3
#bit botao3 = porta.0
#bit botao4 = porta.1
#bit botao5 = portb.4
#bit botao6 = portb.5

void main()
{
// Inicialização dos pinos de I/O
set_tris_a(0b11101111); //Configuração dos pinos de I/O para o PORTA
set_tris_b(0b11111000); //Configuração dos pinos de I/O para o PORTB

// Inicialização do TIMER0
setup_timer_0(RTCC_INTERNAL);
setup_wdt(WDT_2304MS);

// Inicialização do timer1
// Ele servirá para gerar o "passo" do PWM
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);

// Inicialização do TIMER2
// Ele deve estourar a cada 10ms para gerar um PWM de 100Hz Para efeito de visualização do LED,
// esta freqüência é suficiente para garantir o efeito de persistência da visão.
setup_timer_2(T2_DIV_BY_16,78,16);

// Inicialização das interrupções
enable_interrupts(INT_TIMER1); //Habilita a interrupção de overflow do timer1
enable_interrupts(INT_TIMER2); //Habilita a interrupção de overflow do timer2
enable_interrupts(GLOBAL); //Habilita as interrupções globais (GIE)
#priority timer1, timer2 // Define a prioridade das interrupções

// Limpeza dos PORTs
porta=0x00; //Limpa porta
portb=0x00; //Limpa portb

while(true) //Loop infinito que garante a funcionalidade do uC
{
RESTART_WDT(); // Limpa o Watch Dog timer

//Comandos para o PWM
// Assim que o valor do contador para um LEDs se equiparar ao estabelecido para o seu período,
// desligue o LED (nível lógico 0)
if (contador_red >= pwm_red) output_low(pin_B0);
if (contador_green >= pwm_green) output_low(pin_B1);
if (contador_blue >= pwm_blue) output_low(pin_B2);

// Comandos para o botão 1 (RED_UP)
if (!botao1)
{
if (!botao_red_up_press)
{
if (filtro1 != 0) filtro1--;
else
{
botao_red_up_press = 1;
if (pwm_red != max) pwm_red++;
}
}
}
else
{
filtro1 = t_filtro;
botao_red_up_press = 0;
}


// Comandos para o botão 2 (RED_DOWN)
if (!botao2)
{
if (!botao_red_down_press)
{
if (filtro2 != 0) filtro2--;
else
{
botao_red_down_press = 1;
if (pwm_red != min) pwm_red--;
}
}
}
else
{
filtro2 = t_filtro;
botao_red_down_press = 0;
}


// Comandos para o botão 3 (GREEN_UP)
if (!botao3)
{
if (!botao_green_up_press)
{
if (filtro3 != 0) filtro3--;
else
{
botao_green_up_press = 1;
if (pwm_green != max) pwm_green++;
}
}
}
else
{
filtro3 = t_filtro;
botao_green_up_press = 0;
}


// Comandos para o botão 4 (GREEN_DOWN)
if (!botao4)
{
if (!botao_green_down_press)
{
if (filtro4 != 0) filtro4--;
else
{
botao_green_down_press = 1;
if (pwm_green != min) pwm_green--;
}
}
}
else
{
filtro4 = t_filtro;
botao_green_down_press = 0;
}


// Comandos para o botão 5 (BLUE_UP)
if (!botao5)
{
if (!botao_blue_up_press)
{
if (filtro5 != 0) filtro5--;
else
{
botao_blue_up_press = 1;
if (pwm_blue != max) pwm_blue++;
}
}
}
else
{
filtro5 = t_filtro;
botao_blue_up_press = 0;
}


// Comandos para o botão 6 (BLUE_DOWN)
if (!botao6)
{
if (!botao_blue_down_press)
{
if (filtro6 != 0) filtro6--;
else
{
botao_blue_down_press = 1;
if (pwm_blue != min) pwm_blue--;
}
}
}
else
{
filtro6 = t_filtro;
botao_blue_down_press = 0;
}

} // Fim do while(true)
} // Fim do programa


// Aqui entra a configuração da função de interrupção do TIMER1 (quando ele "estoura").
#int_TIMER1
void TIMER1_isr()
{
contador_red++;
contador_green++;
contador_blue++;
set_timer1(63535); // O TIMER1 vai estourar a cada 1,0ms
}

//Aqui entra a configuração da função de interrupção do TIMER2 (quando ele "estoura").
#int_TIMER2
void TIMER2_isr()
{
if(pwm_red != 0) output_high(pin_B0); // LED RED
if(pwm_green != 0) output_high(pin_B1); // LED GREEN
if(pwm_blue != 0) output_high(pin_B2); // LED BLUE
contador_red = 0;
contador_green = 0;
contador_blue = 0;
set_timer1(63535); // O TIMER1 vai estourar a cada 1,0ms
}

Link para o comentário
Compartilhar em outros sites

Fiz um codigo parecido com esse esses dias.

Criei 8 canais PWM com aproximadamente 200Hz e 100 passos para variação do duty-cicle.....

Achei q ficou até legal....

Qual seria sua sugestão, vtrx? Digo, para otimizar o algoritmo....

Não preciss fazer um codigo completo, mas pelo menos uma ideia.. pois uma coisa q percebi, se eu preciso de maior frequencia, terei que sacrificar nos passos de incremento.

Isso q usei um cristal de 20Mhz....

Falou

Link para o comentário
Compartilhar em outros sites

Hey,calma aí!!

o Jorge sabe que estou tirando um sarro dele pois achei que iria postar em ASM!:D

Em primeiro lugar,ja que a rotina tem que ser por Software,pois usaremos mais de um canal,eu programaria totalmente em ASM.

PWM.jpg

Neste exemplo usando o 16F628A,eu utilizei 14 canais,mas apenas 8 foram para a senoide.

Não utiliza o Timer pois éstá em ASM,logo calculo o tempo das instruções,clock de 4 Mhz oscilador interno.

Segue código completo de 8 canais que gera uma wave.

Sintam-se a vontade para adaptar para 3 canais para ligar a um Led RGB ou outra coisa qualquer.

#INCLUDE <P16F628A.INC>	

__CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ; (COM CRISTAL)

ERRORLEVEL -302
;---------------------------------------------------
CBLOCK 0X0020

PWM0,PWM1,PWM2,PWM3
PWM4,PWM5,PWM6,PWM7
PWM0_CNTR,PWM1_CNTR,PWM2_CNTR,PWM3_CNTR
PWM4_CNTR,PWM5_CNTR,PWM6_CNTR,PWM7_CNTR
SUBE_BORDA
ESTADO_PWM
ENDC

#DEFINE PWM_PORT PORTB

ORG 0X000
GOTO INICIO
ORG 0X004
RETFIE
;------------------------------------------------------------
MULTI_PWM

DECFSZ SUBE_BORDA,F
GOTO PWM_ATUALIZA
PWM_SUBE_BORDA:

MOVF PWM0,W
MOVWF PWM0_CNTR
MOVF PWM1,W
MOVWF PWM1_CNTR
MOVF PWM2,W
MOVWF PWM2_CNTR
MOVF PWM3,W
MOVWF PWM3_CNTR
MOVF PWM4,W
MOVWF PWM4_CNTR
MOVF PWM5,W
MOVWF PWM5_CNTR
MOVF PWM6,W
MOVWF PWM6_CNTR
MOVF PWM7,W
MOVWF PWM7_CNTR
MOVLW 0XFF
GOTO PWM_FIM
PWM_ATUALIZA:
CLRW
DECFSZ PWM0_CNTR,F
IORLW B'00000001'
DECFSZ PWM1_CNTR,F
IORLW B'00000010'
DECFSZ PWM2_CNTR,F
IORLW B'00000100'
DECFSZ PWM3_CNTR,F
IORLW B'00001000'
DECFSZ PWM4_CNTR,F
IORLW B'00010000'
DECFSZ PWM5_CNTR,F
IORLW B'00100000'
DECFSZ PWM6_CNTR,F
IORLW B'01000000'
DECFSZ PWM7_CNTR,F
IORLW B'10000000'
ANDWF ESTADO_PWM,W

PWM_FIM:
MOVWF PWM_PORT
MOVWF ESTADO_PWM
RETURN
INICIO
BSF STATUS,RP0
CLRF PWM_PORT
BCF STATUS,RP0
MOVLW 0
MOVWF PWM0
MOVLW 0X10
MOVWF PWM1
MOVLW 0X20
MOVWF PWM2
MOVLW 0X30
MOVWF PWM3
MOVLW 0X40
MOVWF PWM4
MOVLW 0X50
MOVWF PWM5
MOVLW 0X60
MOVWF PWM6
MOVLW 0X70
MOVWF PWM7

LOOP
CALL MULTI_PWM
GOTO LOOP
;...............................
END

Ae Jorge,voce sabe que estava zuando...

PS:Matheus,no seu caso,não sei no que vai utilizar pois parece que o 'timing' da sua aplicação é crítico,mas o tópico é para se utilizar num Led RGB apenas,mas segue as características deste código;

781.25 Hz máximo com cristal de 20 Mhz.

Duty cycle de 0 a 100%.

8 Bit de resolução.

PWM step size de 1TCY (um ciclo de instrução).

Link para o comentário
Compartilhar em outros sites

Entendi agora....

No meu caso, o timing nao é crítico não. Usei para fazer animações em 8 LEDs.....

A frequencia de 170~200Hz que conesegui foi suficiente para não dar flicker.....

Percebi também q ter o pwm de 0 a 100% em passos de 1 a um, nao fez tanta diferença no brilho. eu poderia dar os passos de 2 em 2. \no final conseguria o dobro da frequencia.....

Mas nao tem como comparar a programaçao em ASM e em C... o no C dá muita perda.....

Falou

Link para o comentário
Compartilhar em outros sites

Mas voce pode usar as rotinas principais em ASM.

Escolha um código que voce possa postar,simples,para a gente fazer um mix com rotinas em ASM.

voce devia ,tambem,começar a usar os compiladores C da Microchip,tipo o HighTech para a linha 16F e o C18 para a linha 18F.

Tem muito material disponível,bibliotecas completas e a otimização é bem perto de um código nativo ASM.

Ja percebí que voce tem facilidade e gosta de microcontroladores,então seria uma mão na roda para voce.

Link para o comentário
Compartilhar em outros sites

Olá Jorgeletronico...

Grato pela força.

Bem, sou iniciante e não nego.

Aqui no código você menciona as entradas dos botões.... Legal.

Mas não consigo ver as saídas no código (pinos que vão os terminais do Led RGB)

Um vai para GND e os outros 3?

Desculpe se não vi no código e falei bobeira.

// Entradas para o microcontrolador (aqui vão os botões no 16F628a)

#bit botao1 = porta.2

#bit botao2 = porta.3

#bit botao3 = porta.0

#bit botao4 = porta.1

#bit botao5 = portb.4

#bit botao6 = portb.5

Grde abraço e grato pela força.

Se precisar de qq coisa em mecânica de precisão para adaptar sua eletrônica, em qq caso, pode escrever sem problemas, aí eu posso contribuir com o que sei.

meu e-mail é, caso precise - [email protected]

Grato + uma vez e se precisar, fique à vontade.

Malereis

AUuaauau,mas este código é ineficiente,então vale...LOL

Esse código não funciona???? ou é uma pegadinha?

Grato.

MAlereis

Link para o comentário
Compartilhar em outros sites

Olá Jorgeletronico.

O código que você postou

Aqui vão os botões para incremento e decremento dos catodos do led.;...Ok!!!

// Entradas para o microcontrolador

#bit botao1 = porta.2

#bit botao2 = porta.3

#bit botao3 = porta.0

#bit botao4 = porta.1

#bit botao5 = portb.4

#bit botao6 = portb.5

void main()

{

// Inicialização dos pinos de I/O

set_tris_a(0b11101111); //Configuração dos pinos de I/O para o PORTA

set_tris_b(0b11111000); //Configuração dos pinos de I/O para o PORTB

Aqui, acho que no portB0, 1 e 2 são as saídas.

E o MCLR? Posso ligá-lo a´+VCC, como em outros esquemas que vi?

Grato.... Desculpe s e falei bobeira

Link para o comentário
Compartilhar em outros sites

É se nao postar outro posta então ,o que importa ne nao (tenso).Pode montar que funciona, porque eu montei e funciona.

Rapaz.... ficou tenso?

Como seu amigo VTRX falou, esse código não funciona mesmo.

Afinal é um repúdio em postar coisas corretas, como ele mesmo afirmou.

Dá um monte de erros no MPLAB.

De qq forma agradeço por sua atenção.

Malereis

Link para o comentário
Compartilhar em outros sites

Olá VTRX.

Baixei o Hex que você passou o link.

Uma vez em HEX, posso gravar com MPLAB ou ICPROG.... certo?

Dá o seguinte erro ao carregar e tentar gravar

Falha no Endereço de código 0000h!

No ICPROG tem uma opção para ver o arquivo em ASM

Abaixo o código..........................................

Mas aqui tá marcado como PIC16F84!!!!

Não é para o PIC16F628A??????????

Grato pela resposta.

Malereis


Generated by WinDis84, (c) Nigel Goodwin 1998.

LIST P=16F84, F=INHX8M
include "P16FXX.inc"
ORG 0x0000

CALL Label_0001
XORLW 0x61
GOTO Label_0002
GOTO Label_0003
GOTO Label_0004
CALL Label_0005
MOVLW 0x39
XORLW 0x68
RETLW 0x74
MOVLW 0x3A
GOTO Label_0006
RETLW 0x74
MOVLW 0x61
CALL Label_0007
CALL Label_0008
GOTO Label_0009
MOVLW 0x68
CALL Label_000A
CALL Label_000B
GOTO Label_0004
GOTO Label_000C
GOTO Label_000D
CALL Label_000E
RETLW 0x2F
RETLW 0x6F
MOVLW 0x72
CALL Label_000F
RETLW 0x2F
RETLW 0x72
CALL Label_0010
GOTO Label_0011
MOVLW 0x2F
MOVLW 0x65
MOVLW 0x75
CALL Label_000E
RETLW 0x2F
CALL Label_0012
GOTO Label_0013
RETLW 0x34
CALL Label_0014
ANDLW 0x30
MOVLW 0x76
RETLW 0x73
ADDWF 0x2D , W
IORLW 0x44
SUBWF 0x6F , W
CALL Label_0015
GOTO Label_0016
MOVLW 0x34
CALL Label_0017
CALL Label_0018
GOTO Label_0019
BSF 0x70 , 00
CALL Label_0007
ANDWF 0x61 , W
RETLW 0x30
CALL Label_001A
MOVLW 0x47
RETLW 0x74
BTFSC 0x63 , 04
CALL Label_001B
MOVLW 0x4B
COMF 0x78 , W
ANDLW 0x48
INCF 0x65 , W
GOTO Label_0008
BSF 0x51 , 04
RETLW 0x3A
CALL Label_001C
GOTO Label_001D
CALL Label_000F
RETLW 0x31
RETLW 0x3A
RETLW 0x77
RETLW 0x2E
RETLW 0x73
GOTO Label_001E
MOVLW 0x65
CALL Label_001F
CALL Label_001C
GOTO Label_0005
MOVLW 0x3A
CALL Label_0020
CALL Label_0021
RETLW 0x69
GOTO Label_0022
CALL Label_0023
CALL Label_0024
CALL Label_0015
MOVLW 0x33
MOVLW 0x35
IORLW 0x38
MOVLW 0x30
MOVLW 0x38
RETLW 0x39
RETLW 0x65
RETLW 0x3A
Label_001E GOTO Label_0025
CALL Label_0026
CALL Label_0027
Label_0023 XORLW 0x6C
Label_002C CALL Label_000F
CALL Label_0028
GOTO Label_0029
RETLW 0x36
Label_0029 MOVLW 0x65
RETLW 0x3A
GOTO Label_002A
GOTO Label_002B
RETLW 0x3A
BCF 0x47 , 04
SUBWF 0x2E , W
GOTO Label_002C
IORLW 0x31
MOVLW 0x3A
MOVLW 0x69
CALL Label_002D
CALL Label_002E
GOTO Label_002F
GOTO Label_0030
RETLW 0x68
GOTO Label_0031
RETLW 0x33
Label_003B CALL Label_0032
XORLW 0x70
GOTO Label_0033
CALL Label_0011
MOVLW 0x32
MOVLW 0x3A
CALL Label_0034
BCF 0x1C , 06
GOTO Label_0035
XORLW 0x7C
MOVF 0x31 , W
DECF 0x1A , f
IORWF 0x21 , W
MOVLW 0x3D
CALL Label_0036
MOVLW 0x56
RETLW 0x3A
MOVLW 0x72
GOTO Label_0037
CALL Label_0024
CALL Label_0015
MOVLW 0x65
MOVLW 0x32
XORLW 0x78
GOTO Label_0038
GOTO Label_0039
MOVLW 0x75
CALL Label_003A
GOTO Label_0011
ANDLW 0x32
MOVLW 0x3A
SUBWF 0x7C , f
CALL Label_003B
RETLW 0x61
SWAPF 0x32 , f
GOTO Label_003C
SUBLW 0xC6
SWAPF 0x35 , W
DECF 0x17 , f
SUBLW 0x6F
GOTO Label_003D
CALL Label_002B
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0013 NOP
NOP
NOP
Label_0031 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_001A NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0010 NOP
NOP
Label_0033 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0025 NOP
NOP
NOP
NOP
Label_000A NOP
NOP
Label_0024 NOP
NOP
Label_0037 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0014 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_003D NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0035 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0012 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0019 NOP
NOP
NOP
Label_0017 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0011 NOP
NOP
NOP
NOP
NOP
NOP
Label_0007 NOP
NOP
NOP
NOP
Label_001C NOP
NOP
NOP
Label_0020 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_001F NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0027 NOP
NOP
Label_0001 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_002F NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0034 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_002E NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0036 NOP
NOP
NOP
Label_003A NOP
NOP
NOP
NOP
Label_0005 NOP
NOP
NOP
NOP
NOP
Label_0032 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_001B NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0021 NOP
NOP
Label_002D NOP
Label_000B NOP
Label_002B NOP
NOP
NOP
NOP
Label_0015 NOP
NOP
NOP
NOP
Label_001D NOP
Label_000F NOP
NOP
NOP
NOP
Label_0008 NOP
Label_000E NOP
NOP
Label_0038 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0009 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0018 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_002A NOP
NOP
Label_0004 NOP
NOP
NOP
NOP
Label_0030 NOP
NOP
Label_0039 NOP
NOP
NOP
NOP
NOP
Label_0002 NOP
Label_0026 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_0006 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_000C NOP
Label_0022 NOP
NOP
NOP
NOP
Label_000D NOP
NOP
Label_0028 NOP
Label_0003 NOP
NOP
Label_0016 NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
Label_003C NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP

ORG 0x2000
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00

ORG 0x2007
DATA 0x00

ORG 0x2100
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00
DATA 0x00

END
*****************************************************

Link para o comentário
Compartilhar em outros sites

  • 8 meses depois...

Pessoa estava atras desse codigo a tempos. Mas quero aprender ou ao menos entender.

esse "long int filtro1 = t_filtro; // Filtro do botão 1 (Incremento Vermelho)" seria uma outra forma de se fazer o debounce via software? porque ele parece ser bem mais eficaz que o que eu aprendi no tecnico por não pedir para o micro esperar e ler novamente.

e o que são esses flags???

Abrass

Link para o comentário
Compartilhar em outros sites

No codigo citado,eu simulei no proteus e ele somente aumenta a largura do pulso pwm e não retorna mais.

É assim mesmo?

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* PROJETO PWM PARA RGB *
* *
* DESENVOLVIDO POR EDUARDO DE SOUZA RAMOS *
* *
* *
* VERSÃO 1.0 14/07/2007 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Projeto para controlar o brilho de um LED RGB (4 terminais) utilizando *
* PWM gerado via software. *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include <16F628a.h> //Microcontrolador utilizado
#fuses hs,nowdt,noprotect,put,brownout,mclr,nolvp,nocpd
#use delay(clock=8000000,RESTART_WDT)

// Constante para o uso dos botões
#define t_filtro 400
#define mim 0
#define max 10

// Variáveis globais
long int filtro1 = t_filtro; // Filtro do botão 1 (Incremento Vermelho)
long int filtro2 = t_filtro; // Filtro do botão 2 (Decremento Vermelho)
long int filtro3 = t_filtro; // Filtro do botão 3 (Incremento Verde)
long int filtro4 = t_filtro; // Filtro do botão 4 (Decremento Verde)
long int filtro5 = t_filtro; // Filtro do botão 5 (Incremento Azul)
long int filtro6 = t_filtro; // Filtro do botão 6 (Decremento Azul)
int flags = 0; // Flags de controle dos botões
int contador_red = 0; // Contador do período para o LED vermelho
int contador_green = 0; // Contador do período para o LED verde
int contador_blue = 0; // Contador do período para o LED azul
int pwm_red = 0; // Duty Cicle para o LED Vermelho
int pwm_green = 0; // Duty Cicle para o LED Verde
int pwm_blue = 0; // Duty Cicle para o LED Azul

// Definição dos flags de software
#bit botao_red_up_press = flags.0 // Marca se o botão 1 está pressionado
#bit botao_red_down_press = flags.1 // Marca se o botão 2 está pressionado
#bit botao_green_up_press = flags.2 // Marca se o botão 3 está pressionado
#bit botao_green_down_press = flags.3 // Marca se o botão 4 está pressionado
#bit botao_blue_up_press = flags.4 // Marca se o botão 5 está pressionado
#bit botao_blue_down_press = flags.5 // Marca se o botão 6 está pressionado

//Definição e inicialização dos port's
#use fast_io(a)
#use fast_io(
#byte porta = 0x05
#byte portb = 0x06

// Entradas para o microcontrolador
#bit botao1 = porta.2
#bit botao2 = porta.3
#bit botao3 = porta.0
#bit botao4 = porta.1
#bit botao5 = portb.4
#bit botao6 = portb.5

void main()
{
// Inicialização dos pinos de I/O
set_tris_a(0b11101111); //Configuração dos pinos de I/O para o PORTA
set_tris_b(0b11111000); //Configuração dos pinos de I/O para o PORTB

// Inicialização do TIMER0
setup_timer_0(RTCC_INTERNAL);
setup_wdt(WDT_2304MS);

// Inicialização do timer1
// Ele servirá para gerar o "passo" do PWM
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);

// Inicialização do TIMER2
// Ele deve estourar a cada 10ms para gerar um PWM de 100Hz Para efeito de visualização do LED,
// esta freqüência é suficiente para garantir o efeito de persistência da visão.
setup_timer_2(T2_DIV_BY_16,78,16);

// Inicialização das interrupções
enable_interrupts(INT_TIMER1); //Habilita a interrupção de overflow do timer1
enable_interrupts(INT_TIMER2); //Habilita a interrupção de overflow do timer2
enable_interrupts(GLOBAL); //Habilita as interrupções globais (GIE)
#priority timer1, timer2 // Define a prioridade das interrupções

// Limpeza dos PORTs
porta=0x00; //Limpa porta
portb=0x00; //Limpa portb

while(true) //Loop infinito que garante a funcionalidade do uC
{
RESTART_WDT(); // Limpa o Watch Dog timer

//Comandos para o PWM
// Assim que o valor do contador para um LEDs se equiparar ao estabelecido para o seu período,
// desligue o LED (nível lógico 0)
if (contador_red >= pwm_red) output_low(pin_B0);
if (contador_green >= pwm_green) output_low(pin_B1);
if (contador_blue >= pwm_blue) output_low(pin_B2);

// Comandos para o botão 1 (RED_UP)
if (!botao1)
{
if (!botao_red_up_press)
{
if (filtro1 != 0) filtro1--;
else
{
botao_red_up_press = 1;
if (pwm_red != max) pwm_red++;
}
}
}
else
{
filtro1 = t_filtro;
botao_red_up_press = 0;
}


// Comandos para o botão 2 (RED_DOWN)
if (!botao2)
{
if (!botao_red_down_press)
{
if (filtro2 != 0) filtro2--;
else
{
botao_red_down_press = 1;
if (pwm_red != mim) pwm_red--;
}
}
}
else
{
filtro2 = t_filtro;
botao_red_down_press = 0;
}


// Comandos para o botão 3 (GREEN_UP)
if (!botao3)
{
if (!botao_green_up_press)
{
if (filtro3 != 0) filtro3--;
else
{
botao_green_up_press = 1;
if (pwm_green != max) pwm_green++;
}
}
}
else
{
filtro3 = t_filtro;
botao_green_up_press = 0;
}


// Comandos para o botão 4 (GREEN_DOWN)
if (!botao4)
{
if (!botao_green_down_press)
{
if (filtro4 != 0) filtro4--;
else
{
botao_green_down_press = 1;
if (pwm_green != mim) pwm_green--;
}
}
}
else
{
filtro4 = t_filtro;
botao_green_down_press = 0;
}


// Comandos para o botão 5 (BLUE_UP)
if (!botao5)
{
if (!botao_blue_up_press)
{
if (filtro5 != 0) filtro5--;
else
{
botao_blue_up_press = 1;
if (pwm_blue != max) pwm_blue++;
}
}
}
else
{
filtro5 = t_filtro;
botao_blue_up_press = 0;
}


// Comandos para o botão 6 (BLUE_DOWN)
if (!botao6)
{
if (!botao_blue_down_press)
{
if (filtro6 != 0) filtro6--;
else
{
botao_blue_down_press = 1;
if (pwm_blue != mim) pwm_blue--;
}
}
}
else
{
filtro6 = t_filtro;
botao_blue_down_press = 0;
}

} // Fim do while(true)
} // Fim do programa


// Aqui entra a configuração da função de interrupção do TIMER1 (quando ele "estoura").
#int_TIMER1
void TIMER1_isr()
{
contador_red++;
contador_green++;
contador_blue++;
set_timer1(63535); // O TIMER1 vai estourar a cada 1,0ms
}

//Aqui entra a configuração da função de interrupção do TIMER2 (quando ele "estoura").
#int_TIMER2
void TIMER2_isr()
{
if(pwm_red != 0) output_high(pin_B0); // LED RED
if(pwm_green != 0) output_high(pin_B1); // LED GREEN
if(pwm_blue != 0) output_high(pin_B2); // LED BLUE
contador_red = 0;
contador_green = 0;
contador_blue = 0;
set_timer1(63535); // O TIMER1 vai estourar a cada 1,0ms
}

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!