Ir ao conteúdo
  • Cadastre-se
LEOPUENA

UART PIC18F4550 <--> PC [Ajuda]

Recommended Posts

Ola pessoal,,,,

estou com um problema ao comunicar o PIC18F4550 com o PC. Fiz a simulação no proteus e tudo funciona como deve ser. Quando passo pra placa o ciruito funciona excepto a parte da comunicação. Parece ser um problema geral porque acontece em todos programas e em todos PICs.

A principio Fiz programas no CCS. Depois fiz um teste básico no MikroC e aconteceu o mesmo. Tentei fazer em ASM mas nem consigo compilar um programa para essa família :confused: ....

Aqui tem o código feito no CCS



///////////////////////////////////////////////////////
// ELECTROPUBLITEC //
// TESTE PARA COMUNICAÇÃO NO PIC18F4550 //
// CRIADO POR LEOPUENA AOS 28-07-2013 //
///////////////////////////////////////////////////////


#include <18F4550.h>
#FUSES INTRC_IO
#FUSES NOMCLR

#use fast_io(C)
#use delay(clock=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#byte porta=0xf80
#byte portb=0xf81
#bit led1=porta.0
#bit led2=porta.1
#bit bt1=portb.6
#bit bt2=portb.7

////////////////////////////////////////////////////////////////////////////////
void main()
{

set_tris_a(0x00);
set_tris_b(0xff);
set_tris_c(0x80);
port_b_pullups(TRUE);
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
puts("LEOPUENA");

while(true)
{

if(kbhit()){
output_high(pin_a2);
switch(getc())
{
case '1': led1=!led1; break;
case '2': led2=!led2; break;
default: puts("COMANDO INVALIDO");
}
output_low(pin_a2);
}

if(!bt1){ led1=!led1; puts(" LED1 "); delay_ms(400); }
if(!bt2){ led2=!led2; puts(" LED2 "); delay_ms(400); }
}

}

O código no MikroC



///////////////////////////////////////////////////////
// ELECTROPUBLITEC //
// TESTE PARA COMUNICAÇÃO NO PIC18F4550 //
// CRIADO POR LEOPUENA AOS 28-07-2013 //
///////////////////////////////////////////////////////

sbit led1 at RA0_bit;
sbit led2 at RA1_bit;
sbit bt1 at RB6_bit;
sbit bt2 at RB7_bit;

////////////////////////////////////////////////////////////////////////////////
void main()
{

trisa=(0x00);
trisb=(0xff);
trisc=(0x80);
intcon2=0;
ADCON1=0B00001111;
UART1_Init(9600); // Initialize UART module at 9600 bps
Delay_ms(100); // Wait for UART module to stabilize

UART1_Write_Text("LEOPUENA");
UART1_Write(13);
led1=led2=0;
while(1)
{
if (UART1_Data_Ready()) { // If data is received,
switch(UART1_Read())
{
case '1': led1=!led1; break;
case '2': led2=!led2; break;
default: UART1_Write_Text("COMANDO INVALIDO");
}
}

if(!bt1){ led1=!led1; UART1_Write_Text(" LED1 "); delay_ms(400); }
if(!bt2){ led2=!led2; UART1_Write_Text(" LED2 "); delay_ms(400); }
}

}

E o código em assembly. Não consigo compilar esse programa. Se puder postem um programa básico em ASM.





LIST P=18F4550, F=INHX32

#include "P18F4550.INC"


CONFIG PWRT=ON ; Power on timer
CONFIG BOR=OFF ; Brown out off
CONFIG WDT=OFF ; Watch dog off
CONFIG PBADEN=OFF ; Port B en digital IO
CONFIG LVP=OFF ; Pas de prog single supply
CONFIG ICPRT=OFF ; Port de debug off
CONFIG DEBUG=OFF ; Debug off
CONFIG MCLRE = OFF; MCLEAR Pin on
CONFIG FOSC = INTOSCIO_EC


ATRASO1 RES 1
ATRASO2 RES 1
#DEFINE LED1 PORTA,0
#DEFINE LED2 PORTA,1
#DEFINE BT1 PORTB,6
#DEFINE BT2 PORTB,7

org 0
goto INICIO



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INICIO


MOVLW B'00000000'
MOVWF TRISA ; DEFINE OS PINOS DO PORTA COMO ENTRADA
MOVLW B'11111111'
MOVWF TRISB ; DEFINE OS PINOS DO PORTB COMO SAIDA
MOVLW B'10000000'
MOVWF TRISC ; DEFINE OS PINOS DO PORTC COMO SAIDA

MOVLW D'6'
MOVWF SPBRG ;DEFINIÇÃO DE BAUD-RATE PARA 9600
MOVLW B'00100000'
MOVWF TXSTA ;HABILITA E CONFIGURA O MODULO USART (ASSINCRONO, 8-BIT, LOW SPEED)

MOVLW B'10000000'
MOVWF RCSTA ;HABILITA AS PORTAS SERIAIS

CLRF PORTC
CLRF PORTB
CLRF PORTA

CLRF ATRASO1
CLRF ATRASO2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN

BTFSS BT1
GOTO FUNCAO1

BTFSS BT2
GOTO FUNCAO2

GOTO MAIN


;««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
FUNCAO1

BTFSS LED1
GOTO $+3

BCF LED1
GOTO $+2

BSF LED1

MOVLW D'33' ;b
MOVWF TXREG
CALL PAUSA

GOTO MAIN

;««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
FUNCAO2

BTFSS LED2
GOTO $+3

BCF LED2
GOTO $+2

BSF LED2

MOVLW D'34' ;b
MOVWF TXREG
CALL PAUSA

GOTO MAIN



;---------------------------------------------------------------------------
PAUSA


DECFSZ ATRASO1,1 ;Decrement Delay1 by 1, skip next instruction if Delay1 is 0
GOTO PAUSA
DECFSZ ATRASO2,1
GOTO PAUSA
RETURN



;********************************************************************
END ;FIM DA COMPILACAO


O compilador não indica a linha onde está o erro e eu não consegui interpreta-lo. Tentei no MPLAB 8.83 e MPLABX. Aqui está o log do MPLABX, o erro está negritado.


make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory `D:/PICANDO 2013/TESTE 4550/TESTE_ASM.X'
make -f nbproject/Makefile-default.mk dist/default/production/TESTE_ASM.X.production.hex
make[2]: Entering directory `D:/PICANDO 2013/TESTE 4550/TESTE_ASM.X'
"C:\Program Files (x86)\Microchip\MPLABX\mpasmx\mplink.exe" -p18f4550 -w -z__MPLAB_BUILD=1 -odist/default/production/TESTE_ASM.X.production.cof "build/default/production/TESTE ASM.o"
MPLINK 4.48, Linker
Device Database Version 1.13
Copyright (c) 1998-2011 Microchip Technology Inc.
[B]Error - file './build/default/production/TESTE ASM.o', section '.org_0', Symbol '_.org_0_0038' is not word-aligned.
It can not be used as the target of a call or goto instruction.
Errors : 1
[/B]
make[2]: Leaving directory `D:/PICANDO 2013/TESTE 4550/TESTE_ASM.X'
make[1]: Leaving directory `D:/PICANDO 2013/TESTE 4550/TESTE_ASM.X'
make[2]: *** [dist/default/production/TESTE_ASM.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 9s)


E ainda o circuito feito no proteus

1005781_4563637627250_1696306657_n.jpg

Agradeceria muito que dessem uma olhada.

Editado por LEOPUENA

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leo, como está realizando a parte de ligação física ao computador?

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou a usar um conversor USB-TTL. E testei com vários programas, alguns feitos por mim no C#.

Este é o conversor. tenho as drive e já uso com outros PICs como o PIC18F4520.

conversor-usb-ttl-rs232-pic-avr-micro-controladore-e-ou_MLB-O-3047285517_082012.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leo,ja que voce programou nestas versões,voce poderia considerar a aprender a programar em Delphi,no PC.

É uma linguagem muito estruturada e fácil.

Assim voce pode aposentar a serial e usar USB nativo muito mais fácil que o próprio programa no PIC,deste modo poderia te passar tanto o software do pic como o do PC e voce nunca mais iria ficar limitado a nada realcionado a PIC/PC.

Poderia usar o Delphi 7,leve e completo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma boa dica vtrx. Eu comecei a aprender programação em C# exactamente pra isso, comunicação USB, e compramos o 4550 por possuir o modulo USB. Mas por estar a aprender C# agora fiquei um pouco limitado em relação a esse tipo de comunicação. Será que programando em Delphi ficaria mais viável??

Eu tenho varias apostilas sobre Delphi mas não tenho ainda o compilador. Vou ver se arranjo. Contudo, não sei se terei tempo e vou continuar a tentar resolver esse problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Será que programando em Delphi ficaria mais viável??

Todas as bobliotecas de uso com o hardware do PC são facilmente usadas no Delphi/PIC.

Pode-se dizer que o Delphi é o CCS do PC:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, já tenho o delphi em mão :cool:

Porém, ainda preciso resolver esse problema. Fiz alguns testes e notei que se fazer o programa para o 18F4520 e enviar para o 18F4550 ele responde normalmente.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Ok, já tenho o delphi em mão

Qual a versão?

Depois poderemos criar uma interface em USB nativo para voce se livrar da serial.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É a versão 7.0. Mas Preciso primeiro aprender alguns conceitos básicos porque nunca programei em delphi nem em pascal.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Mas Preciso primeiro aprender alguns conceitos básicos porque nunca programei em delphi nem em pascal

o que não vai faltar para voce são exemplos completos na net,no youtube está cheio de exemplos para iniciantes.

É só clicar no .DPR que o projeto inteiro ja abre,aí é só clicar na 'seta verde' la em cima a direita no Delphi para testar o projeto e gerar um .exe único.

Quando estiver mais a vontade,te passo como instalar o componente de acesso a USB nativo.

Editado por vtrx

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×