Ir ao conteúdo
  • Cadastre-se

UART PIC18F4550 <--> PC [Ajuda]


LEOPUENA

Posts recomendados

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.

Link para o comentário
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.

Link para o comentário
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.

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

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