Ola Claudio, o programa esta rodando só não aparece nada no display!
Ola de novo Claudio, rrsrs resolvi o problema do display troquei o driver dele no ccs e funcionou! ela ocupa um pouco mais de rom mas ta funcionando agora!! Tenho outro probleminha agora mas é no hardware, coloquei o driver pra acionar a bobina e o ruido de chaveamento esta travando ou alterando as funções do pic, alguma sugestão para minimizar isso?
Com a bobina desconectada funciona tudo certinho!
segue o driver que utilizei e deu certo!
Abraço!
// flex_lcd.c
// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver. Change these
// pins to fit your own board.
#define LCD_DB4 PIN_b4
#define LCD_DB5 PIN_b5
#define LCD_DB6 PIN_b6
#define LCD_DB7 PIN_b7
#define LCD_E PIN_b0
#define LCD_RS PIN_b1
#define LCD_RW PIN_b2
// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.
//#define USE_LCD_RW 1
//========================================
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line
int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};
//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note: !! converts an integer expression
// to a boolean (1 or 0).
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E);
delay_us(2);
output_low(LCD_E);
}
//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine. For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.
#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3
retval = 0;
output_high(LCD_E);
delay_cycles(1);
retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
output_low(LCD_E);
return(retval);
}
#endif
//---------------------------------------
// Read a byte from the LCD and return it.
#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;
output_high(LCD_RW);
delay_cycles(1);
high = lcd_read_nibble();
low = lcd_read_nibble();
return( (high<<4) | low);
}
#endif
//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);
#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif
output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//----------------------------
void lcd_init(void)
{
int8 i;
output_low(LCD_RS);
#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif
output_low(LCD_E);
delay_ms(15);
for(i=0 ;i < 3; i++)
{
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
for(i=0; i < sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte(0, LCD_INIT_STRING[i]);
// If the R/W signal is not used, then
// the busy bit can't be polled. One of
// the init commands takes longer than
// the hard-coded delay of 60 us, so in
// that case, lets just do a 5 ms delay
// after all four of them.
#ifndef USE_LCD_RW
delay_ms(5);
#endif
}
}
//----------------------------
void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
if(y != 1)
address = lcd_line_two;
else
address=0;
address += x-1;
lcd_send_byte(0, 0x80 | address);
}
//-----------------------------
void lcd_putc(char c)
{
switch(c)
{
case '\f':
lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1,2);
break;
case '\b':
lcd_send_byte(0,0x10);
break;
default:
lcd_send_byte(1,c);
break;
}
}
//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;
lcd_gotoxy(x,y);
// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);
return(value);
}
#endif
Olá Sergio!
Você descobriu um ponto fraco do pic : Não funciona com EMI (Interferência Eletromagnética)!
Considere o seguinte:
Se ele é sensível a EMI então tente não produzir a EMI ou reduzi-la ao máximo, ou afastá-lo de fontes que a produzem.
Tente:
Use fontes de alimentação diferentes para o pic e para o driver da bobina. Nada de fio ligando uma a outra de forma direta.
Coloque bem junto dos pinos + e - do pic vários capacitores de cerâmica de 100nF, 10nF,1nF. As trilhas do impresso tem que ser feitas de forma a não facilitar a captação da interfêrencia.
Para conectar o pic com o driver use fotoacopladores para isolar.
Monte um placa para o pic e outra para o driver. Cada placa deverá ficar em caixas metálicas separadas.
A bobina deve ser colocado dentro de caixa metálica se possível.
Use cabo resistivo (cabo de velas) de 1 a 5 k para ligar a saída da bobina com a pistola de pintura.
Se puder usar C.C. na alta tensão, use um diodo de alta tensão e um capacitor de 470 a 5 k de filtro (capacitor especial de alta isolação para 20 Kv no mínimo), montados logo na saída da bobina dentro da caixa metálica.
Outros já tiveram este problema sem uma solução específica. Pesquise no forum da Mosaico, ASm_51 e outros.
O que funciona para um talvez não de certo para outros.
Terá que tentar até que encontre uma solução.
Desejo que tenha sucesso nesta desafiadora empreitada.
Ola Claudio, tudo certo? espero que sim, então eu uso um foto acoplador pc817 interligando o pic com o fet, só que estão na mesma placa( "que burro da zero pra ele" rsrs), imaginei que fosse isso a interferência usei oscilador separado com 555 e fontes separadas e usei o relé pra ligar e deu o mesmo problema. Então resolvi fazer uma caixa (ou quase rsrs) de alumínio fechando toda a bobina, e parece que resolveu, estou fazendo uns testes ainda pra ter certeza (posto resultados depois).
Agora outra coisa que não estou conseguindo resolver, o driver só funciona se eu usar um irf740, tentei usar um irfz44 e um ifr 1404 que tem correntes muito maiores e não funciona, oscilam a bobina bem fracos e esquentam muito! vou mandar o esquema que estou usando do driver.
Está indo! rs aos solavancos mas está indo!
Muito obrigado pela sua paciência! Deus abençoe muito você
Verifique se na prática você realmente está ligando a bobina no pino dreno para o positivo. A tensão na base tem que ser maior que o source em 10 a 15 volts para plena condução de corrente, se não me engano. Verifique o datasheet para tirar duvidas.
Bom dia Claudio, o positivo da bobina vai no +12v e o negativo vai no dreno do fet, como uso um fet canal N o source vai no terra da fonte, medi no gate a tensão usando esse driver que postei anteriormente, a tensão varia com o ciclos do pwm, ciclo mais baixo exemplo 10% tesão menor no gate e maior no ciclo mais alto mas acredito que não chega à 10v...
tem algo errado nesse driver? Mesmo no ciclo de 10% teria que ter 10v ou 15?
Quando se usa multímetro para medir esta tensão, ele dará diferente do que você usar um osciloscópio. Se tiver um, use e veja a forma de onda que chega na gate do transistor. Pode estar ocorrendo alguma atenuação ou atraso. Tente testar o funcionamento com uma carga resistiva, como uma ou mais lampadas de farol em paralelo. Desta forma você tira a dúvida se é ou não um problema com alta tensão gerada pela bobina. Este é outro problema que tem que ser levado em conta: será gerado alta tensão no dreno do transistor FET. Esta alta tensão poderá disparar correntes de avalanches no FET e aquece-lo tremendamente. Nos esquemas de ignição eletrônica geralmente consta alguns capacitores, resistores e zeners ligados ao transistor para sua proteção e bom funcionamento.
Pegue um esquema de ignição eletrônica de carro e tente fazer um driver similar. Aí você estará garantindo um boa vida útil dos componentes. Use transistores apropriados para o trabalho como este aqui. (BU941P) ou com tensão superior de trabalho.
Ola Claudio, então é por isso que só funciona com o irf 740, vou analisar a forma de onda com o osciloscópio e ver se não tem nada errado!
Retorno com resultados!
Abraço!
Ola Claudio, separei o driver da placa do pic e fiz uma caixa de metal para a bobina e resolveu o problema do pic ficar louco! agora está funcionando beleza!
Medi a forma de onda no fet e esta tudo certo, deve ser a tensão muito baixa do irfz44 que causa o problema! com o irf 740 tudo funciona bem!
Abraço!
Parabéns por sua persistência em atingir objetivos! Desejo sucesso em seus empreendimentos futuros!
Bom dia Claudio, agradeço grandemente à você pela paciência. Deus proteja sempre você e sua família!
Abraço!