Ir ao conteúdo

Pic e ci mt8870


robinson0031

Posts recomendados

Postado

Boa tarde a todos,estou fazendo um projeto de um bloqueador veicular via DTMF,porém estou tendo dificuldade em criar um sistema de senha,para gerenciar a autorização de bloqueio e desbloqueio,resumindo:

Preciso de um codigo em C para PIC16F628A que tenha uma senha de 4 digitos e que possa ser alterada a qualquer momento.

obs:Estou utilizando um CI MT8870 que ao reconhecer uma tecla digitada ele gera um codigo BCD de 4 bits.

se alguem puder me ajudar ficarei grato!!!

Postado

A minha duvida é a seguinte:

O CI mt8870 ao receber o tom de uma tecla ele gera um codigo binario de 4 bits,e gera um pulso em um pino chamado STD.

Estou tendo dificuldades em fazer um sistema de senha utilizando esses codigos binarios,no qual eu gostaria que fosse da seguinte maneira.

Quero que meu sistema tenha uma senha de 4 digitos e que essa senha seja cadastravel,por exemplo:Ao ligar o circuito pela primeira vez ele tenha por padrão a senha "0000",e que eu possa altera-la quando quiser,e que essa senha fique guardada na EEPROM do PIC,para que mesmo na ausencia de alimentação essa senha nao se apague.

A minha maior duvida é, como fazer tudo isso?

desde ja agradeço!!

Postado

Como já dizia Jack, o Estripador, vamos por partes !!!!!

Nado do que estás pedindo é difícil ! Ou seja, nao se trata de "como fazer tudo isso" e sim começar a fazer uma coisa de cada vez !

Primeiro, o que te diz o "tal pino STD" ???? Simplesmente que um tom válido foi detectado e que voce pode ler esse tom !!!! ou seja, se voce tratar 4 vezes a leitura, irá obter o seu código de 4 dígitos !

Amigo, aqui nós queremos que voce MESMO seja o executor final, nós estamos dispostos a esclarecer suas dúvidas, mas o trabalho e aprendizado tem de ser SEU !

Somos uma grande comunidade de profissionais , mas nosso objetivo é ENSINAR A QUEM QUER APRENDER, e não apenas fornecer a solução pronta.

Faça a sua parte, e garanto que muitos irão aparecer para te ajudar, ok ?

Um abraço, e desculpe a "sacudidela" !

Paulo

Postado

Eu compreendi o que você disse,mas ainda ainda falta um start para que eu possa começar a fazer,na verdade eu estou tendo dificuldade em criar a logica para tudo isso.Muito obrigado pela sacudida,concordo com você o esforço tem que ser meu.

começei a fazer o programa da seguinte maneira:

criei um laço de repetição que fica lendo o pino STD o tempo todo,e quando esse pino vai para o nivel logico 1,o micro le o codigo binario gerado pelo MT8870,mas agora como faço para ler quatro vezes e armazenar cada um em uma posição de memoria?

Postado

Legal que voce entendeu !

Infelizmente eu não entendo patavina de C , mas posso te ajudar na elaboração do programa e no hardware.

Em primeiro lugar, faça uma rotina que verifica o estado do STB, e leia a saída do MT se tiver um byte válido.

Depois, faça uma outra rotina que leia quatro vezes a saída do MT, urilizando a rotina anterior !

Vai perceber que as coisas vão ficando mais fáceis conforme voce progride, ok ?

Se tiver dúvidas, poste que alguém vai te ajudar !

P.S. : acho melhor voce aprender os fundamentos do C, escolha um compilador, e veja como criar as variáveis de memória RAM e EEPROM no Pic !

Paulo

Postado

Caro colega robinson0031,

Seu problema não é um bicho de 7 cabeças não. A princípio o que lhe interessa no MT8870 é sua tabela verdade abaixo:

True_table_MT8870.png

Não tem mistério, para cada tecla que você aperta no telefone, ele te dá na saída um código binário de 0 até 16.

Para compor a senha, você deve apenas ler essas saídas e armazenar em variáveis ou uma variável.

Mas você precisa saber programar. Acredito que ninguém irá te dar um código pronto.....

Falou

Postado

Estou seguindo a risca todas as instruções que vocês estão me passando,e tudo esta indo muito bem.

Ja consegui fazer a leitura do STD,e a cada vez que esse pino vai para o nivel alto é efetuada a leitura do MT8870,e os dados estão sendo armazenados em quatro variaveis diferentes.

acredito,que agora eu tenho que criar uma rotina de gravação de dados na EEPROM e depois outra rotina que compara os dados das variaveis com os dados da EEPROM.

Se alguem tiver alguma sugestão,sera muito bem aceita.

Muito obrigado a todos!!!

Postado

Há uma maneira mais fácil de você gravar as entradas nas variáveis. Ao invés de ler cada entrada, leia as 4 juntas. Algo do tipo:

if (!input(Q4) && !input(Q3) && !input(Q2) && input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 1");
}

if (!input(Q4) && !input(Q3) && input(Q2) && !input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 2");
}

Sendo !input(x) = 0 e input (x) = 1

Falou

Postado

entendi valeu muito obrigado!!!

aqui ta indo um trecho do codigo,é a parte que le o STD e os pinos do MT8870.

quando o STD vai para 1,o programa chama le_senha,depois pega o valor do porta e coloca na variavel depois retorna e espera o STD ir para 1 de novo!

post-932973-13884962269213_thumb.jpg

Postado

Grande Matheus,

Obrigado pela ajuda ao amigo !!! Em C eu fico bastante limitado, mas estou acompanhando para ver se posso ajudar em alguma dúvida, ok ?

Paulo

Postado

Mais uma dica robinson0031,

Quando você receber seus 4 dígitos correspondentes à senha, pode guardá-los em uma variável do tipo vetor de 4 posições.

Dessa forma fica fácil você conferir posteriormente.

Ou seja, ao invéz de ter uma senha do tipo: "1234", você terá um vetor mais ou menos assim:

vetor[4] = { "1", "2", "3", "4"};

Aí imagine que o usuário digitou:

vetor_2[4] = { "4", "7", "3", "4"};

Veja como é fácil você comparar as posições dos vetores para certificar que a senha seja a mesma.

Claro que você precisa guardá-la na eepron e ler de lá quando for comparar.. isso deixo com você juntamente com o algoritimo de comparar os dois vetores......

Bons estudos.

Falou

Postado

valeu pela dica,vou tentar criar algo em cima disso!!

valeu pela dica,vou tentar criar algo em cima disso!!

A parte de ler a senha ja esta funcionado,um pedaço do codigo foi postado anteriormente.porém agora frente a um novo desafio,o que fazer com a senha que ja foi lida e armazenada em quatro variaveis ?.

preciso criar uma rotina de forma que a quando o usuario ligar uC pela primeira vez,a senha padrão seja "0000",e que o mesma possa ser alterada,como se fosse um celuar novo que você compra que tem uma senha padrão de fabrica,que você entra com a senha antiga e cadastra uma senha nova!

Se alguem tiver alguma sugestão ou um exemplo bem simples,ficaria muito grato!!

Postado

Robinson, use uma posição na memória eeprom como um flag.

Por exemplo, quando inicia seu programa, leia essa posição, se ela conter algo diferente de 55h, assuma que a senha ainda é a senha padrão, e caso o usuário alterar a senha, grave 55h nesse posição, ou seja, essa posição é um FLAG que te indica se já tem uma senha feita pelo usuário !

Grave a senha também na memória eeprom.

Fácil, não é ?

Paulo

Postado

Entendi sim Paulo,muito obrigado pela dica,agora falta pouco para eu terminar esse programinha.

Para mim ta sendo otimo,estou adquirindo conhecimento,e melhorando o pouco que eu ja sabia,e devo isso a vocês do forum.

Quero agradecer a todos,valeu mesmo o pessoal aqui são todos bacanas.

Agora espero que eu consiga finalizar tudo,e que funcione bem!!

valeu mesmo,obrigado a todos que estão colaborando!!!

Postado

Pessoal estou tendo outro problema com o programa,fiz o que nosso amigo Paulo exeplificou ,deu certo!

porém agora nao estou conseguindo,fazer o tratamento de duas rotinas,São elas:

1°-Depois que os 4 digitos sao lidos e armazenados,eu utilizei o exemplo do Paulo,utilizei uma posição da memoria EEPROM com um valor:Ex se o valor for zero,a senha padrão sera ="0000" e se for diferente de zero sera = ao valor da senha nova que o usuario cadastrou.

2°-Não estou conseguindo criar uma rotina de Gravar uma nova senha,alterar o valor da memoria citado acima.

Se alguem tiver uma maneira mais fácil de fazer tudo isso,peço que me ajude porque ja to ficando louco com isso.

valeu!!!

Postado

Hehehe tá vendo onde voce já conseguiu chegar , Robinson ?

Legal né !!!!

Bom, agora nisso eu não posso te ajudar, pois é C ..... vamos esperar o Matheus com as dicas, ok ? Creio que a sua dificuldade é saber os comandos de definição de memória normal e memória EEPROM com o C, certo ?

Um abraço e parabéns !

Paulo

Postado

Acredito que seja isso tambem!!!

Mas o que esta me tirando o sono,é que nao estou conseguindo fazer com que o programa faça as coisas da maneira que eu quero.

Ou melhor,nao estou conseguindo passar para o programa o que eu penso,

Ex:

Quero apenas que ele tenha uma senha e quando eu digitar essa senha ele permita que eu faça uma função ou acione um rele,ate ai tudo bem,consegui fazer isso tranquilamente,o que eu nao estou conseguindo é implementar uma função que me permita alterar a senha quando quiser.

Mais uma vez,Muito obrigado pela atenção.

falou!

Postado

Vi que você utiliza o MikroC...

Uso o CCS... posso fazer um pseudo-codigo para você...

Amanha quando tiver tempo faço.

Mas para mudar a senha quando quiser, pode colocar um botao e ficar monitorando o mesmo o tempo todo. Quando ele for apertado, por exemplo a tecla (*), você chama uma rotina para configurar a senha.

Falou

Postado

MatheusLPS,valeu pela força,consegui fazer o programa,ficou +ou- como eu queria,ainda tem alguns probleminhas que preciso resolver,mas tem um que eu acredito que alguem com certeza vai saber me dizer,bom vou tentar explicar de uma forma bem clara:

Estou usando o PIC16F628A,e esse pic so tem dois port A e B certo?,para fazer o que estou querendo ele serve,porém estou tendo um problema relacionado ao port A.

No meu pro grama eu configurei as entradas e saidas pino a pino ex: trisa.ra0=1; e assim por diante.

Como ja havia dito anteriormente esse pic so tem port A e B,e eu estou usando o port A como entrada,e na hora de fazer a leitura,estou lendo o port A inteiro ex: if(porta ==?){}.

O problema é o seguinte "Quando ligamos o microcontrolador temos que ligar o pino MCLR no VCC certo? Mas como no PIC16F628 esse pino fica no RA5,na hora em que vou ler o PORT A,ele acaba alterando o valor do port A"ex:O MT8870 envia o valor 2, que deveria ser (00000010),mas o pic le (00100010).

ja tentei de tudo e nao consegui resolver,a unica coisa que deu certo foi passar a entrada para o PORT B,mas ai eu vou perder pinos,porque nao vou poder usar o restante do port B senão vai acontecer a mesma coisa que aconteceu no port A.

Se alguem tiver uma solução!!!

  • 2 semanas depois...
Postado
Vi que você utiliza o MikroC...

Uso o CCS... posso fazer um pseudo-codigo para você...

Amanha quando tiver tempo faço.

Mas para mudar a senha quando quiser, pode colocar um botao e ficar monitorando o mesmo o tempo todo. Quando ele for apertado, por exemplo a tecla (*), você chama uma rotina para configurar a senha.

Falou

Boa noite Matheus_LPS. Inicialmente você deu a dica para ler as 4 variaveis de uma só vez, seria assim desta forma

#include <16f628A.h>[/COLOR]
[COLOR=black]#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection[/COLOR]
[COLOR=black]#use delay (clock=4000000)[/COLOR]
[COLOR=black]#include <LCD.c>[/COLOR]
[COLOR=black]#define Q1 PIN_C0
#define Q2 PIN_C1
#define Q3 PIN_C2
#define Q4 PIN_C3
#define LED0 PIN_B0
#define LED1 PIN_B1[/COLOR]
[COLOR=black]int16 senha;[/COLOR]
[COLOR=black] void main()
{
lcd_init();

while (TRUE)
{
if (!input(Q4) && !input(Q3) && !input(Q2) && input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 1");
delay_ms (200);
}

if (!input(Q4) && !input(Q3) && input(Q2) && !input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 2");
delay_ms (200);
}
if (!input(Q4) && !input(Q3) && input(Q2) && input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 3");
delay_ms (200);
}

if (!input(Q4) && input(Q3) && !input(Q2) && !input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 4");
delay_ms (200);
}
if (!input(Q4) && input(Q3) && !input(Q2) && input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 5");
delay_ms (200);
}

if (!input(Q4) && input(Q3) && input(Q2) && !input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 6");
delay_ms (200);
}
if (!input(Q4) && input(Q3) && input(Q2) && input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 7");
delay_ms (200);
}

if (input(Q4) && !input(Q3) && !input(Q2) && !input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 8");
delay_ms (200);
}
if (input(Q4) && !input(Q3) && !input(Q2) && input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 9");
delay_ms (200);
}

if (input(Q4) && !input(Q3) && !input(Q2) && input(Q1))
{
printf(lcd_putc,"Tecla Apertada: 0");
delay_ms (200);
}
if (input(Q4) && !input(Q3) && input(Q2) && input(Q1))
{
printf(lcd_putc,"Tecla Apertada: *");
delay_ms (200);
}

if (input(Q4) && input(Q3) && !input(Q2) && !input(Q1))
{
printf(lcd_putc,"Tecla Apertada: #");
delay_ms (200);
}
}
}

Estou curioso por saber o pseudo-codigo que você postará para o robinson0031 achei a ideia muito interessante e gostaria de saber como ficaria!

Postado

Uai.....

Crie um vetor chamado senha[4].

Configure o módulo CCP como capture.

Toda ve que você receber uma transição de 0 para 1 no CCP1, trate uma interrupção para incrementar uma variável auxiliar para do tipo: senha[x].......

Toda vez que a interrupção ocorrer, o dígito da senha será guardado no vetor senha, na posição X de 0 a 3.

Quando X for igual a 3, você tem a senha preenchida. Pode tratar o resto do algoritimo.....

Já volto com o código.............

Falou

Postado

Boa noite! Tentei simular no circuito mas não sei fazer a implementação correta do código, tentei de varias maneiras, como implementar corretamente o vetor, fiz a configuração do modo CCP1 e como tratar a interrupção afim de fucionar corretamente sem contar a gravação da senha na EEPROM.


#include <16F877A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
//#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000) // clock do PIC
#include <LCD.c>
#define STD PIN_C2
#define Q4 PIN_C7 //Definição dos Pinos de Entrada do PIC/Saída do CI 8870
#define Q3 PIN_C6
#define Q2 PIN_C5
#define Q1 PIN_C4
#define LED1 PIN_B0 //Led senha_1 correta
#define LED2 PIN_B1 //Led senha_1 e senha_2 errada
#define LED3 PIN_B2 //Led senha_2 correta

int8 senha;
int1 aux;
#int_CCP1
void trata_interupcao()
{

}
void main()
{
lcd_init(); //Inicializa o LCD (obrigatório)!

unsigned int8 i=0;
char senha[4]= {1,2,3,4};

setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts (INT_CCP1);
enable_interrupts (GLOBAL);

while(true) //Rotina Principal
{
if (!input(Q4) && !input(Q3) && !input(Q2) && input(Q1)) //Início das condições
{
delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:1");
}

if (!input(Q4) && !input(Q3) && input(Q2) && !input(Q1))
{

delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:2");
}

if (!input(Q4) && !input(Q3) && input(Q2) && input(Q1))
{
delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:3");
}

if (!input(Q4) && input(Q3) && !input(Q2) && !input(Q1))
{
delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:4");
}

if (!input(Q4) && input(Q3) && !input(Q2) && input(Q1))
{

delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:5");
}

if (!input(Q4) && input(Q3) && input(Q2) && !input(Q1))
{

delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:6");
}

if (!input(Q4) && input(Q3) && input(Q2) && input(Q1))
{
delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:7");
}

if (input(Q4) && !input(Q3) && !input(Q2) && !input(Q1))
{

delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:8");
}

if (input(Q4) && !input(Q3) && !input(Q2) && input(Q1))
{
delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:9");
}

if (input(Q4) && !input(Q3) && input(Q2) && !input(Q1))
{
delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:0");
}

if (input(Q4) && !input(Q3) && input(Q2) && input(Q1))
{
delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:*");
}

if (input(Q4) && input(Q3) && !input(Q2) && !input(Q1))
{
delay_ms (50);
lcd_gotoxy (1,1);
lcd_putc("Tecla Apertada:#");
}
}

} //Fim do Programa


Postado

Circuito de teste:

circuito-1.jpg

Funcionamento do circuito:

Os LOGIC STATE simulam a saída do 8870. Da esquerda para a direita: Q4, Q3, Q2 E Q1.

Código:

Funcionamento do código: Quando o PIC inicia, acende um LED vermelho dizendo que a senha não foi configurada. Quando você aperta a tecla "*" (1011), o LED começa a piscar.

Aí você aperta alguma tecla, a variável será armazenada no vetor DESDE que você aperte o botão no pino B0. Esse botão está na simulando o pino STD do 8870....

Não testei o código na prática. Como as saídas do 8870 e o PINO STD vão à nível 1 ao mesmo tempo, não sei se o timing será suficiente para funcionar, ilustrando:

AnimaCM8870.gif

Quando a senha for preenchida, acenderá um LED verde. Pronto, sua senha está gravada. Só falta colocar na eepron..... Deixo isso com você.

#include <16F877A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection

#use delay(clock=8000000)

#define Q4 PIN_A0
#define Q3 PIN_A1
#define Q2 PIN_A2
#define Q1 PIN_A3

int8 aux;

int8 senha[4];

int n;
int8 digito = 50;

int8 senha_ok = 1;

int8 tempo;

void digita_senha()
{
if (!input(Q4) && !input(Q3) && !input(Q2) && input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 1");
digito = 1;
}

if (!input(Q4) && !input(Q3) && input(Q2) && !input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 2");
digito = 2;
}

if (!input(Q4) && !input(Q3) && input(Q2) && input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 3");
digito = 3;
}

if (!input(Q4) && input(Q3) && !input(Q2) && !input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 4");
digito = 4;
}

if (!input(Q4) && input(Q3) && !input(Q2) && input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 5");
digito = 5;
}

if (!input(Q4) && input(Q3) && input(Q2) && !input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 6");
digito = 6;
}

if (!input(Q4) && input(Q3) && input(Q2) && input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 7");
digito = 7;
}

if (input(Q4) && !input(Q3) && !input(Q2) && !input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 8");
digito = 8;
}

if (input(Q4) && !input(Q3) && !input(Q2) && input(Q1))
{

//printf(lcd_putc,"Tecla Apertada: 9");
digito = 9;
}

if (input(Q4) && !input(Q3) && input(Q2) && !input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: 0");
digito = 0;
}

if (input(Q4) && !input(Q3) && input(Q2) && input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: *");
}

if (input(Q4) && input(Q3) && !input(Q2) && !input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: #");
}

if (digito != 50)
{
senha[n] = digito;
n++;

if (n > 3)
{
senha_ok = 1;
n = 0;
output_high (PIN_D1);
disable_interrupts(INT_TIMER1);
}
}
}

#INT_EXT
void trata_pulso()
{
if (senha_ok == 1)
{
aux = 0;
}
else
{
aux = 1;
}
}

#int_timer1
void trata_tempo()
{
output_toggle (PIN_D0);
set_timer1 (3036);
}

void main()
{
enable_interrupts(INT_EXT);
EXT_INT_EDGE(L_TO_H);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
set_timer1 (3036); //Preload do Timer1
disable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

output_high (PIN_D0);

while(true)
{

if (input(Q4) && !input(Q3) && input(Q2) && input(Q1))
{
//printf(lcd_putc,"Tecla Apertada: *");
senha_ok = 0;
enable_interrupts(INT_TIMER1);
}

if ((aux == 1) && (senha_ok == 0 ))
{
aux = 0;
digita_senha();
}
}
}

Falou

Postado

Meu caro amigo, quando a senha é gravada ela fica armazenada na variavel digito é isto mesmo? E para gravar a senha é desta forma?


if (digito != 50)
{
senha[n] = digito;
n++;
write_eeprom (1, digito);

if (n > 3)
{
senha_ok = 1;
n = 0;
output_high (PIN_D1);
disable_interrupts(INT_TIMER1);
}
}

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...