uart

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

uart

Mensagempor chipselect » 11 Nov 2009 10:34

Estou com um problema na UART do PIC, tem um caracter que ele não recebe direito (0x80) e alguns falham ocasionalmente (0x10, 0xC2, 0x08).

O maior problema é o 0x80, porque os demais (0x10, 0xC2...) a flag FERR é ativa e eu consigo tratar o erro, mas o 0x80 recebe "normalmente" como 0x00... parece que o PIC perde o start bit, acha que o primeiro 1 ainda é space e que o primeiro bit 0 é start bit e o resto ele, de alguma forma, encara como 7 bits 0 e 1 stop bit correto)

Demais caracteres recebe normalmente, principalmente 0xAA

Microcontrolador: PIC16F914

Teste efetuado:
PC enviando o mesmo caracter a cada 0,1 segundos para teste.
O microcontrolador somente envia o que recebe de volta (echo).
Compilador: Hitec PICC em Lite Mode

Fiz o teste para cada caracter problemático e para alguns caracteres que não deram problemas (como 0xaa, 0x55, 0xff)

Código de inicialização:
[code]
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);

// Peripheral initialization function
void init(void){
/***** Common Code ****
* Timer 1 interrupt enabled.
* Timer 2 interrupt disabled.
* Usart TX interrupt disabled.
* Usart RX interrupt enabled.
*/
PIE1 = 0b00100001;
/*
* Timer 0 interrupt disabled.
* Peripheral interrupts enabled
* Global interrupt disabled during initialization
*/
INTCON = 0b01000000;
/*
* Timer 0 is prescaled by 1:2
* Timer 0 is clocked internally.
*/
OPTION = 0b00000000;

/***** 16F914 Code ****
* Internal oscillator set to 8MHz
*/
OSCCON = 0b01110000;

/***** Timer 1 Code ****
* Timer is active and running
* Timer prescaler is 1:8
* Timer 1 gate control is not selected
* Gate control signal is not inverted
*/
T1CON = 0b00110001;

/***** Timer 2 Code ****
* Prescale ratio is 1:1
* Timer 2 is suspended
* Postscale ratio set to 1:1
*/
T2CON = 0b00000000;
/*
* Period register set to 0xFF
*/
PR2 = 0b11111111;

/***** Usart Code ****
* High speed baud rate generator enabled
* Usart in Asynchronous mode
* Usart transmission enabled
* TX in eight bit format
*/
TXSTA = 0b00100100;
/*
* Usart reception enabled
* RX in eight bit format
* Usart module enabled
*/
RCSTA = 0b10010000;
/*
* Baud rate is 9600
*/
SPBRG = 0b00110011;
//SPBRG = 0b00101111;

ei(); // Global interrupts enabled

}
[/code]


Código da rotina de interrupção para testes:
[code]
void interrupt my_isr(void){
if (RCIF){
if (FERR){
c = RCREG;
TXREG = 0x22;
} else {
c = RCREG;
TXREG = c;
}
}
if((TXIE)&&(TXIF)){
TXIF=0; // clear event flag
}

}
[/code]

Poderia ser a variação do oscilador interno que faz com que a UART do pic sofra variações no seu baudrate, mas isso não explica porque a uart consegue receber 0xAA sem falhar e 0x80 falhando a maior parte das vezes sem dar frame error.

No laço main tem só um "if (OERR) {CREN=0;CREN=1;}" mas o overrun não deveria acontecer no teste porque os dados são enviados em intervalos mínimos de 0,1 segundos a 9600bps (9600,8,n,1).

Fiz o mesmo teste utilizando outro microcontrolador que não da Microchip e funcionou perfeitamente com o mesmo sw de teste do pc... logo o meu erro tá no pic e não no pc.

Alguém já passou por algum problema similar? Seria o caso de afirmar que a UART do PIC é um esterco e não funciona direito com oscilador interno e usar logo um outro micro?

O problema é que estou corrigindo um projeto de hw que usa esse pic, e mudar o micro é tipo jogar fora o projeto do cara e fazer tudo de novo...
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor fabim » 11 Nov 2009 11:00

quer saber se ele é esterco ou não ?
Coloca o cristal externo, e faz o teste.
Funcionou lindamente.?
sim.
Então o erro é a pecinha.; :)

Meu caro, eu por exemplo ja fiz um projetinho com 12F675 e uart, só que de 6.X segundos em 6.X segundos, eu fazia o alto call para o cristal de 4mhz interno.

Agora se existir um uC com cristal RC interno, que a variação seja despresivel em temperatura, e variação de tensão. Por favor me indique, que eu quero começar a mexer com ele :)

Abraços

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor chipselect » 11 Nov 2009 12:32

sinceramente esperava que existisse um problema com o código, porque o teste feito com fonte estabilizada e em sala climatizada (com controle de temperatura) falharam...

O mc56f8013 com rc interno não dá tanto pau na usart assim não.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor chipselect » 11 Nov 2009 14:20

acho que esse pic não gosta do 0x80 não.

Coloquei um cristal de 11.058M com os pinos de cristal do PIC levantados na placa e fica a mesma coisa. Usei cap. de 33pf.

Configuração
__CONFIG(HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);

SPBRG = 0b01000111

Sintoma é exatamente o mesmo com RC interno a 8MHz.

Os bytes 0x00, 0x01, 0x02 e 0x04 dá erro de frame.

O byte 0x80 recebe como 0x00 sem dar pau.

Todos os outros bytes (entre 0x00 e 0xff) recebe corretamente.

Trocando os 5V do 7805 por uma fonte de 5.7V funciona... talvez o problema seja no max232 da placa.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor fabim » 11 Nov 2009 14:23

chipselect escreveu:acho que esse pic não gosta do 0x80 não.

Coloquei um cristal de 11.058M com os pinos de cristal do PIC levantados na placa e fica a mesma coisa. Usei cap. de 33pf.

Configuração
__CONFIG(HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & UNPROTECT & BORDIS & IESODIS & FCMDIS & DEBUGDIS);

SPBRG = 0b01000111

Sintoma é exatamente o mesmo com RC interno a 8MHz.

Os bytes 0x00, 0x01, 0x02 e 0x04 dá erro de frame.

O byte 0x80 recebe como 0x00 sem dar pau.

Todos os outros bytes (entre 0x00 e 0xff) recebe corretamente.

Trocando os 5V do 7805 por uma fonte de 5.7V funciona... talvez o problema seja no max232 da placa.


tititi, intão faz assim, baixe de 9600 para por exemplo 2400, e refaça o teste. Se der zebra, aumente para 19200, resolveu ? sim.
MAX ta com pau no charge pump de V+ e V-, isso ja foi muito discutido aqui.,...

Um cabra passou réiva igualim oC.

abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor vtrx » 11 Nov 2009 18:47

Um detalhe,como esta lendo na serial,digo,qual programa esta lendo?
Tive um problema assim ha um tempo atraz com um 16F628 quando usava a leitura da serial pelo PC com programas comuns de leitura de serial.
Como eu programei as rotinas de leitura da serial no PC em ASM,eu não percebí nada de errado.
Quando testei ler a serial no PC com programas 'comuns',dava erro quase que toda hora,como ja tinha vendido muitas peças e vendia ja com um programa próprio,(HardLock),eu não me importei pois era até melhor que ficasse dependente do programa que vendia junto,mas fiquei intrigado.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2240
Registrado em: 20 Abr 2008 21:01

Mensagempor chipselect » 12 Nov 2009 07:14

Eu fiz um programa de testes no pc. Utilizei esse programa de testes com outro microcontrolador só pra testar o programa e funcionou legal, só não funcionou com esse pic.

Também descartei o max232 pq removi o PIC, fechei um curto nos pinos de rx e tx do pic na placa e funcionou 100%, daí creio que o problema é com o pic mesmo... já usei 3 pics e deu na mesma, mesmo byte 0x80, parece que foi programado para dar esse pau.

Vou montar no protoboard pra ver se essa placa está influenciando no pic de alguma forma, apesar de que já rompi quase todas as trilhas dela pra fazer teste, só tem praticamente o pic e o max232 ligado.

Outra coisa que notei é esse compilador C da Hitech integrado no MPLAB, ele faz umas coisas muito estranhas, tipo compila código com erro, gera o hexa e nem te avisa (tipo macro RUNNING digitado errado como RUNING...), esse compilador rodando dentro do mplab é meio doidão... parece que tem um limite bem baixo de "ifs" aninhados (2 ou 3)... tipo quando passa do limite, ele executa tanto o caso verdadeiro como falso, tô "adorando" esse cara... bem feito pra eu largar de ser mão de vaca, comprar a versão PRO e jogar no lixo essa versão lite (free).
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor fabim » 12 Nov 2009 07:22

titia, façamolos o seguinte.

me manda um email, fabioriksilva@hotmail.com.
Baixa aí da net.
MikroC Pro 2009 V 2.5...

aí depois tu faz um testim, e compara se da este tipo de pau.

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor chipselect » 12 Nov 2009 09:21

fabim

Montei no protoboard o circuito e funcionou, o layout da placa tá interferindo... como não tenho o projeto completo dessa placa, vou fazer outra placa mesmo.

Infelizmente não vai dar pra aproveitar essas 400 placas.

Pessoal, obrigado pela ajuda
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor fabim » 12 Nov 2009 09:24

chipselect escreveu:fabim

Montei no protoboard o circuito e funcionou, o layout da placa tá interferindo... como não tenho o projeto completo dessa placa, vou fazer outra placa mesmo.

Infelizmente não vai dar pra aproveitar essas 400 placas.

Pessoal, obrigado pela ajuda

Calma tio, né assim não.
me manda o email com um print do layout.

Teve amigo meu que estava se descabelando com 5000 contos de placa que ia pro lixo, e 3 capacitores 0805 de 100nF e 2 resistores de 2.5K sanou os problemas, literalmente.

MAnda o esqueminha base, e o print do layout.

Abraços
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor vtrx » 12 Nov 2009 12:00

Pegue a carcaça do cristal,e aterre.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2240
Registrado em: 20 Abr 2008 21:01

Mensagempor chipselect » 24 Nov 2009 08:07

Eu resolvi usando pacote de dados com checagem de erros, causa um terrível overhead na serial, mas pelo menos eu minimizo as chances de receber algo errado.

Notei também que o compilador usa a stack para divisão, ou seja, vou ter que fazer um código tipo minhocona mesmo, eheheh.

Agradeço a todos pelas dicas.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x