Ir ao conteúdo
  • Cadastre-se

CeDahmer

Membros Plenos
  • Total de itens

    213
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

1

Sobre CeDahmer

  • Data de Nascimento 03/11/1976 (42 anos)

Informações gerais

  • Cidade e Estado
    Pérola d'Oeste - PR
  1. Estive precisando comunicar dois projetos independentes, um deles que tem tem inúmeras outras funções e utiliza da porta USB para comunicação com supervisórios, sendo composto por um microcontrolador 18F4550, já com a função meste pois utilizava outros dispositivos I2C como memórias, relógios. E outro projeto sendo um pequeno web servidor com o microcontrolador PIC18F4620. Este último com a função simples de hospedar uma página HTML que na verdade é a forma do supervisório acessar as informações e, afinal de contas interagir através de um browser. Bem, é fácil de imaginar o porque de integrar os dois projetos. E como é possível de várias formas, preferi fazer por I2C, pois não preciso fazer grandes modificações no hardware desenvolvido, apenas um novo plugue para a conexão. Deixando essa explicação de lado, e explicando o porque desta postagem: O mestre (18F4550), envia as informações dos estados das entradas (sensores) e saídas (equipamentos), para o escravo (18F4620), que imediatamente disponibilizará para o browser na web, da mesma forma o escravo enviará ao mestre as alterações que o usuário fizer. Assim desenvolvi um código simples tanto ao mestre como ao escravo, com um esquemático simples, onde tudo funciona perfeitamente, como teste apenas: o mestre envia ao escravo uma sequencia numérica, onde o escravo o lê e imprime em um LCD, já o escravo envia ao mestre a informação de um simplório sensor de temperatura (LM35), claro que precisa de 2 bytes para isso, ao menos, pois não utilizei float, apenas uma multiplicação por 10, assim abrangendo qualquer valor possível, dentro de 16 bits. No início de cada informação transmitida é enviado a barra invertida "\" para sinalização do início, conforme o protocolo"zinho", que desenvolvi para isso. Neste pequeno teste tudo funciona perfeitamente transmissão/recepção e vice versa, porém quando coloco este código a rodar dentro de um programa maior com muitas outras funções, a recepção não encontra valores corretos, e muitas vezes "se perde". Portanto gostaria muito de uma boa alma para fazer uma análise do código e me ajudar a sair desse embaraço. Abaixo está os códigos, primeiro do mestre e em seguida do escravo, também coloquei em anexo os arquivos do proteus (versão 8) e os código em C (compilador CCS). Se algum administrador puder colocar os códigos dentro daquelas caixinhas "bonitinhas", pois não sei fazer isso. //=====================firmware para o mestre com PIC18F4550==================// #include <18F4550.H> #device adc=8 #fuses HSPLL,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV4,VREGEN,NOMCLR,PUT #use delay(clock=48000000) #use i2c(MASTER,sda=pin_b0, scl=pin_b1) #include <lcd_flex20X4.c> int8 dadoM; int8 matrizEscravo[6]; int8 adc_result; int8 matrizMestre[10]; int8 indiceMestre=0; int8 indiceEscravo=0; int8 a; void enviar_i2c(){ if (indiceMestre==0) matrizMestre[indiceMestre]="/"; else matrizMestre[indiceMestre]=indiceMestre; indiceMestre++; if (indiceMestre>9) indiceMestre=0; i2c_start(); i2c_write(0x12); dadoM=matrizMestre[indiceMestre]; i2c_write(dadoM); i2c_stop(); delay_ms(10); } void receber_i2c(){ i2c_start(); i2c_write(0x13); a = i2c_read(0); if (a=='/') { indiceEscravo=0; matrizEscravo[0]="/";} else { //if (g>0 && g%2==0) { matrizEscravo[indiceEscravo]=a; //} } indiceEscravo++; i2c_stop(); delay_ms(10); } //==================================== void main() { setup_adc_ports(AN0); setup_adc(ADC_CLOCK_DIV_8); set_adc_channel(0); lcd_init(); lcd_putc("Master"); delay_ms(10); while(1){ adc_result=read_adc()*2; receber_i2c(); enviar_i2c(); printf(lcd_putc,"\fMestre %u\nEscravo %c%u%u - %lu \n%u",dadoM,matrizEscravo[0],matrizEscravo[1],matrizEscravo[2],((matrizEscravo[1]*256)+matrizEscravo[2]),a); } } Aqui código para o escravo. //=================firmware para o escravo com PIC18F4620====================// #include <18F4620.h> #device adc=10 #fuses XT,NOWDT,PUT,BROWNOUT,NOLVP #use delay(clock=4000000) #use i2c(SLAVE, SDA=PIN_c4, SCL=PIN_c3, address=0x12,force_hw) #include <lcd_flex20X4.c> int16 adc_result; int8 dadoM; int8 matrizEscravo[4]; int8 matrizMestre[10]; int8 indiceEscravo=0; int8 indiceMestre=0; int8 state; #INT_SSP void comunicacao_i2c(){ if(i2c_poll()){ state=i2c_isr_state(); dadoM = i2c_read(0); if (dadoM=='/') {indiceMestre=0; } else {indiceMestre++;} if (dadoM!=18 && indiceMestre%2==0) {matrizMestre[indiceMestre/2]=dadoM;} } } void enviar_i2c(){ if (indiceEscravo==0) { matrizEscravo[0]="/";} if (indiceEscravo==1) { matrizEscravo[1]=make8(adc_result,1);} if (indiceEscravo==2) { matrizEscravo[2]=make8(adc_result,0);} i2c_write(matrizEscravo[indiceEscravo]); delay_ms(10); indiceEscravo++; if (indiceEscravo>3) { indiceEscravo=0;} } //====================================== void main() { setup_adc_ports(AN0); setup_adc(ADC_CLOCK_DIV_8); set_adc_channel(0); delay_us(10); enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); lcd_init(); lcd_putc("Slave"); while(1){ adc_result = (float)(read_adc()/2.0)*10; delay_ms(10); enviar_i2c(); printf(lcd_putc,"\f%c%u%u%u%u%u%u%u%u%u \n\nEscravo %c%u%u \n%lu",matrizMestre[0],matrizMestre[1],matrizMestre[2],matrizMestre[3],matrizMestre[4],matrizMestre[5],matrizMestre[6],matrizMestre[7],matrizMestre[8],matrizMestre[9],matrizEscravo[0],matrizEscravo[1],matrizEscravo[2],adc_result); } } I2C_1.rar
  2. Ah... estou usando o CCS, desculpe não ter postado isso. Mas estou querendo saber mais sobre o protocolo, e indiferente o compilador o funcionamento deve ser semelhante. Se tiver alguma coisa acho que me ajudará muito, pois estou achando pouco material na internet, e não tráz nada específico, ou que possa me ajudar.
  3. Boa tarde... Uso um PIC 18f4550, onde está conectado um 24C256 e um Ds1307 por I2C, pelos pinos B1 e b0, ou seja por software, pois os outros estavam ocupados, tudo funciona, mas agora ao adicionar um 16F877A, estou tendo sérios problemas, a comunicação até ocorre, mas as respostas não são as que eu solicito, e o funcionamento da memório e do RTC, são alteradas. A seguir o código usado nos PICs: Linhas do I2C do escravo 16F877A #use i2c(Slave, slow, SCL=PIN_b1, SDA=PIN_b0, address=0x80)#INT_SSPvoid ssp_interupt(){ int8 incoming, state; state = i2c_isr_state(); if(state <= 0x80) //if Master está enviando dados { incoming = i2c_read(); if(state == 1) {address = incoming;} //Primeira recepção é o byte de endereço if(state == 2) {buffer[address] = incoming;} //Segundo byte recebido é o dado } if(state == 0x80) //if master está requisitando dados { i2c_write (read_adc()); //enviar dados requisitados, neste caso a leitura do ADC } //output_d(buffer[address]);// liga os leds da porta D para testar a comunicação} Linhas do I2C do mestre 18f4550 #use i2c(master, sda=PIN_b0, scl=PIN_b1, ADDRESS = 0X01, Slow)void Receber_I2c2()//Chamado pelo loop infinito{ i2c_start (); i2c_write (0x80); i2c_write (2); i2c_write(result); i2c_stop(); delay_ms(50); i2c_start (); i2c_write (0x81); result = i2c_read(0); i2c_stop ();} Existem pouco material sobre comunicação entre microcontroladores por este protocolo. Se alguém pudesse me ajudar com algumas dicas para o correto funcionamento. Tenho algumas dúvidas também: 1- Onde é armazenado o byte enviado do mestre para o escravo? 2-Teria alguma forma de acessar a EEPROM do escravo? 3-Ao escrever os dados namemória o endereço é 16bits, e são mandados 4 comandos de escrita, um com o endereço +0, a parte alta do endereço, mais o byte baixo do endereço, e o dado a ser armazenado. Já no RTC, são enviados apenas 3 comandos, pois o endereço é de 8bits. Agora como tenho que enviar entre a comunicados dos PICs?
  4. Não sei se já resolveu o problema, mas comigo também acontecia essas mensagens de erro, e o problema estava no microcontrolador, troquei o mesmo e não tive mais essas mensagens, eu utilizo o gravador clone do K150.
  5. Muito interessante as idéias e opiniões colocadas pelos amigos. Realmente não posso usar algo grande pois, além da limitação financeira, tem a limitação de espaço, pois pretendo colocar tudo em uma plaquinha de 10x10 cm, os 20 sensores, o microcontrolador 18F452, sua alimentação, além da interface de comunicação i2c. Eu já tinha pensado em rele externo ou uma contactora de baixa corrente, mas é muito grande e caro. Portanto vou criar dois protótipos para testar, um com um divisor de tensão, e outro com um optoacoplador. Mas vou precisar ainda muito da ajuda dos amigos, pois tenho muito ainda a aprender. Para o protótipo com divisor de tensão, seguindo a ideia do felipefpt, bolei um esquemático, e gostaria que apreciassem pois não sei se os componentes estão corretos. Pelo cálculo o divisor daria com 100K e 3K em 127V = 3,69V - 0,7V do diodo = 2,99V * 1,42V do capacitor = 4,24Volts, dando boa margem de segurança. neste caso usei os 127V, pois realmente não posso ter uma fase ligada no neutro do pic para servir de referência, pois o mesmo já está aterrado com o neutro, assim apenas uma fase já indica se tem corrente ou não. Não sei se a disposição dos componentes seria assim e se os cálculos estão corretos. No outro protótipo com o optoacoplador, pesquisei e não encontrei nenhum capaz de suportar mais de 300V. Se souberem o modelo e onde posso encontrá-lo muito me ajudará.
  6. Obrigado pelas respostas, e desculpem por não ter me esclarecido o suficiente. Aqui no estado do Paraná a COPEL disponibiliza as tensões 127V e 254V para áreas rurais, onde o circuito será usado. O funcionamento é o seguinte; ao final de uma rosca sem fim, existe um sensor de fim de curso NC, quando a rosca sem fim estiver cheia de ração, a mesma pressiona a membrana do sensor que abrirá, e não conduzirá mais, no momento em que o nível da ração baixar, o sensor fecha os contatos e conduzirá os 254V até uma contactora que ligará um motor que aciona a rosca sem fim, enchendo novamente de ração. O que eu quero fazer: Um controle mais preciso deste processo, com o uso de um microcontrolador, como são várias roscas sem fim, uma alimentando a outra, caso ocorra um problema em alguma, as demais ficarão ligadas e nunca desligarão, por isso preciso ter controle sobre isso. Preciso apenas saber qual sensor fim de curso está conduzindo e qual não, por isso o microcontrolador precisa ler a tensão conduzida, este microcontrolador comunicará com um sistema maior que tem a disposição uma sirene que será disparada caso um motor esteja acionado por mais de 5 minutos. O resto está tudo pronto, o que está faltando fazer é apenas a leitura se tem tensão ou não. Espero ter sido mais preciso. E obrigado pela atenção.
  7. Boa noite pessoal... Mais uma vez venho pedir ajuda aqui neste fórum aos amigos que tanto já me ajudarão. Pesquisei aqui no fórum e na internet, porém não encontrei nada sobre o que eu preciso, mas eu queria umas opiniões sobre uma ideia que tive. Preciso que um microcontrolador, saiba se um sensor fim de curso está conduzindo ou não, esse sensor conduz em 254V, como a tensão suportada pelo microcontrolador pode ser no máximo 5V e contínuo para o mesmo não queimar, preciso tornar esse sinal compatível, então pensei no seguinte: Usar um divisor de tensão e em seguida um diodo para conduzir apenas a fase positiva, pelo cálculo eu teria de usar um resistor de 100K e outro de 2K para baixar a tensão de 254V para 4,98V pela fórmula, e em seguida o diodo baixaria mais 0,7V, dando uma certa margem, porém não sei o quanto aqueceria os resistores. Pois neste caso o controlador precisa apenas saber se existe tensão ou não, e o sistema não pode retificar ou baixar a tensão antes do sensor de fim de curso. Também não posso usar transformador pela limitação do preço, pois são 20 sensores em cada dispositivo. Se alguém conhecer outro método, ou puder me ajudar a melhorar esta minha ideia, muito me ajudará. E peço desculpas pelo baixo conhecimento que tenho em eletrônica analógica.
  8. Bom dia pessoal. Mais uma vez neste fórum que tanto me ajudou, venho pedir mais uma ajuda aos amigos. Tenho uma placa que usa um PIC 18f4550 e monitora sensores e liga alguns motores, até aí tudo bem, tudo funcionando perfeitamente, o problema é que ao ligar um motor específico o PIC reinicia, e esse motor não é ligado pelo microcontrolador, ele está fora deste sistema, e olha que é um motor de apenas 1CV. Eu acredito que o PIc esteja reinciando por sobre tensão, pois algumas vezes ele trava e reinicia quando esse motor é desligado. Claro que o problema é o travamento, o watchdog está programado para reiniciá-lo, caso isso aconteça, mas ao reiniciar, a comunicação USB para e todo o controle volta ao zero. Lembro que os outros 15 motores que o PIC liga e desliga não travam o mesmo de jeito nenhum. Gostaria que os amigos analizasem o cabeçalho e os fuses para me ajudar: Ia me esquecendo a programação é feita em C no CCS. Obrigado. #include <18F4550.h> #device adc=10 #use delay(clock=48000000) #fuses HSPLL,WDT,WDT2048,PROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV4,VREGEN,MCLR,PUT, nobrownout #DEFINE USB_HID_DEVICE TRUE #define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT #define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT #define USB_EP1_TX_SIZE 8 #define USB_EP1_RX_SIZE 8 #use i2c(master, sda=PIN_b0, scl=PIN_b1, ADDRESS = 0X01, Slow) #include "lcd_flex20X4.c" #include "ds1307.c" #include "24c256.c" #include <pic18_usb.h> #include <usb_desc_hid 8-byte.h> #include <usb.c>
  9. O coletor do Q1 liga ao pino do microcontrolador, que monitora a falta ou não de alimentação. Lembrado que D11 existe apenas no esquemático. Neste mesmo pino do microcontrolador, também está conectado um resistor de 10K ao +5V funcionando como pull-up.
  10. Desculpe, o correto é Q1 e Q2.
  11. Obrigado amigo Faller, mas o led D11, não é montado na PCI, ele apenas está aí para que eu possa testar a funcionalidade do sistema, pois ele é do tipo active, pode observar que ali está package=null, ele nem irá para o ARES, por isso nem o marquei. Mas o problema é a queima dos transistores Q10 e Q12. Mas mesmo assim agradeço pela atenção.
  12. Boa noite... Desenvolvi uma placa que usa um microcontrolador. Vou descrever apenas a parte do circuito onde está o problema. A alimentação é por 12V alternado, mas existe uma conexão com um bateria externa também de 12V. Caso falte a alimentação alternada, automaticamente o circuito passa a operar com a bateria, mas para que o microcontroador saiba disso, e acione um alarme, existe um circuito específico que envia um sinal negativo para um pino do mesmo, assim, contando com a alimentação normal, o pino receberá sinal positivo proveniente de um resitor de pull-up de 10K, caso essa alimentação seja cortada, será enviado o sinal negativo. O problema é que os transistores destinados a fornecer esse sinal a passar alguns meses acabam queimando, enquanto o restante da placa funciona perfeitamente. Abaixo está uma imagem do esquema no ISIS. Marquei com um círculo os componentes desta parte do circuito. Indo por partes: Ao ficar sem alimentação o diodo D5 permite a passagem de energia da bateria para o circuito, o resistor R2 serve para carregar a bateria quando a alimentação está sendo fornecida. O circuito conta com uma retificação de meia onda D10, D12 e C9 para apenas alimentar o transistor quando a alimentação estiver normal. O D13 e R3 direcionam e imitam a corrente para a base do transistor Q2, que caso recebam essa alimentação positiva, enviam o sinal negativo para o Q1, que será cortado, ou seja não terá condução de sinal para o microcontrolador, pois a base deste último transistor receberá o sinal positivo limitado pelo resistor R4. Caso a base do Q2, não receba sinal positivo, permitirá que o Q1 forneça sinal negativo para o pino do microcontrolador, que disparará um alarme. Bom o problema está nos transistores Q1 e Q2, que estão queimando com o uso. A montagem final difere apenas que optei por usar transistor BC337, no lugar dos BC457, como está no projeto, pois os primeiros suportam correntes mais altas, e quis padronizar com um tipo só de transistor, pois o circuito complete possui mais 13 BC337. O texto foi longo, mas se alguém se interessou e leu até aqui, peço que me ajude a solucionar este problema, pois não faço a mínima ideia da origem do problema, já pesquisei mas não encontrei nada que pudesse me dar alguma ideia do que está errado. Obrigado pela atenção...
  13. Boa noite... Um dispositivo LCD 20X4 quando fica ligado por algum tempo (algumas horas ou dias), começa a exibir uns caracteres estranhos incompreensíveis e aparentemente jogam todos os caracteres em apenas 1 ou duas linhas. Fiz todos os testes possíveis e que eu sabia no código, e nada de resolver o problema, mas ao pesquisar outras coisas no google, me deparei com um fórum que sugeria colocar capacitores no display. Portanto acho que o problema não está no código, pois se eu resetar o microcontrolador, ele não corrige os caracteres, apenas de desligar e voltar a religar. Eu nunca tinha pensado nisso, apesar de estar usando capacitores de 100nF junto a todos os CIs e microcontrolador, além de alguns outros espalhados pela placa, não uso nenhum ligado ao LCD. Agora minha dúvida em que lugar coloco esses capacitores, junto a alimentação? ou em quais pinos? e devo colocar junto ao LCD, pois ele está ligado a placa, por fios de 20 cm. Se alguém puder me ajudar, fico muito agradecido.
  14. Bom quanto as soluções dos amigos Matheus e Nélio. Não possuo osciloscópio, mas testando com o multímetro ele corresponde registra a oscilação de leitura, apesar de ser mais difícil perceber, pois meu multímetro é digital e o nível 0 mal apenas é percebido pois demora até o multímetro registrar. A leitura é feita lendo o sinal baixo emitido pelo sensor, a cada 0 é somado um incremento e depois dividido por 7,5 para obter l/min Quanto a ar na tubulação, até pode ser, pois estive olhando no google algumas instalação de hidrômetros e verifiquei que não é recomendado o mesmo estar na parte superior da tubulação, como rotineiramente é feita por justamente ficar bolhas de ar presas, e imagina se isso acontecer dentro do rotor do sensor pode mesmo estar fazendo as leituras erôneas. Quanto a instalação, está montado em um cavalete em formato de n na horizontal superior, como todos os hidrômetros que conheço são instalados, a tubulação de entrada e saída é 32mm, a pressão é baixa, pois está ligada a uma caixa de água a uns 10 metros de altura de coluna de água.
  15. Boa tarde... Comprei um sensor de fluxo de água modelo FS300A G3/4, e instalei em uma tubulação que passa em torno de 2 litros por minuto, conectei ele a um microcontrolador PIC, para fazer a leitura deduzi por um manual em mandarim que ele emite 7,5 pulsos a cada litro de água. Liguei um resistor de 10K como pushdown entre o pino de sinal e a alimentação positiva, até aí tudo bem. Realmente ele envia pulsos ao passar da água, mas o problema está na grande oscilação, pois em alguns minutos ele registra 50 l/min, em outros 0,2 l/min, sendo que a passagem de água é constante sem variação. Alguém conhece este sensor ou teria alguma ideia para me ajudar a afinar o funcionamento dele?

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!