16F876 Usart

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

16F876 Usart

Mensagempor Karel » 01 Fev 2008 07:27

Necessitamos de ajuda para fazer uma transmissão de 16 sensores para 16 led´s, utilizando o usart.
Os conhecimentos são poucos ou nenhuns...
Se puderem dar umas dicas.
Obrigado
Karel
Bit
 
Mensagens: 5
Registrado em: 14 Dez 2007 09:34

Mensagempor xultz » 01 Fev 2008 07:33

Um texto assim resumido e a confissão que o conhecimento é quase nulo, só me resta sugerir ler o livro de C para PIC do Fábio Pereira, e boa sorte...
Porém, se quiser alguma ajuda um pouco mais adequada, descreva com riqueza de detalhes todos os aspectos do projeto.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Este é o programa que já temos...

Mensagempor Karel » 01 Fev 2008 09:23

Temos 2 pics 16f876 onde uma tem a funçao de multiplexer de 16 fios para 1 onde o desmultiplexer de 1 para 16.
A transmissao é feita por rs232
o código do mux é o seguinte:
;**********************************************************************
; TITLE : Multiplexer data ENCODER
;**********************************************************************
; Filename : MUX_EN10.ASM
; Date Started : 17/12/07
; Last edit : 30/1/08
; File Version : 1.0
;
; Author : BRUNO MARQUES
;**********************************************************************
;
; Files required:
; p16F876.inc
;
;**********************************************************************
; Notes:
; ASSUMING 1MHz XTAL CLOCK WHICH GIVES 4us PER INSTRUCTION
;
;**********************************************************************

list p=16F876 ; list directive to define processor
#include <p16F876.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

;***** VARIABLE DEFINITIONS

LOOP1 EQU 0CH ; LOOP VARIABLES
LOOP05 EQU 0DH
LOOP100 EQU 0EH

;**********************************************************************
ORG 0x000 ; processor reset vector - start of code

;******************************* INITIALISATION STUFF
CLRF PORTB ; reset portb
BSF STATUS, RP0 ; select bank 1
MOVLW B'00010000' ; PINS RB0-7=INPUT & RB3=OUTPUT
MOVWF TRISB
BCF OPTION_REG,NOT_RBPU ; ENABLE PULL-UP'S ON PORTB PINS
BCF STATUS, RP0 ; SELECT BANK 0

CLRF PORTC ; reset portc
BSF STATUS, RP0 ; select bank 1
MOVLW B'00001111' ; PINS RB0-7=INPUT
MOVWF TRISC
BCF OPTION_REG,NOT_RBPU ; ENABLE PULL-UP'S ON PORTC PINS
BCF STATUS, RP0 ; SELECT BANK 0



;*******************************
START:
CLRWDT ; RESET WATCHDOG TIMER
BCF PORTB, 3 ; SET SERIAL DATA O/P LOW
CALL DELAY100 ; DELAY 100ms
BSF PORTB, 3 ; SET SERIAL DATA O/P HIGH (START BIT)
CALL DELAY05 ; DELAY 0.5ms
;******************************** SEND BIT 0
BTFSC PORTB, 0 ; CHECK BIT 0 I/P, AND SKIP IF CLEAR
GOTO SET0
BCF PORTB, 3 ; BIT 0 MUST BE LOW, SO SET O/P LOW
GOTO SKIP0
SET0: BSF PORTB, 3 ; BIT 0 MUST BE HIGH, SO SET O/P HIGH
SKIP0: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 1
BTFSC PORTB, 1 ; CHECK BIT 1 I/P, AND SKIP IF CLEAR
GOTO SET1
BCF PORTB, 3 ; BIT 1 MUST BE LOW, SO SET O/P LOW
GOTO SKIP1
SET1: BSF PORTB, 3 ; BIT 1 MUST BE HIGH, SO SET O/P HIGH
SKIP1: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 2
BTFSC PORTB, 2 ; CHECK BIT 2 I/P, AND SKIP IF CLEAR
GOTO SET2
BCF PORTB, 3 ; BIT 2 MUST BE LOW, SO SET O/P LOW
GOTO SKIP2
SET2: BSF PORTB, 4 ; BIT 2 MUST BE HIGH, SO SET O/P HIGH
SKIP2: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 3
BTFSC PORTB, 4 ; CHECK BIT 3 I/P, AND SKIP IF CLEAR
GOTO SET3
BCF PORTB, 3 ; BIT 3 MUST BE LOW, SO SET O/P LOW
GOTO SKIP3
SET3: BSF PORTB, 3 ; BIT 3 MUST BE HIGH, SO SET O/P HIGH
SKIP3: CALL DELAY1 ; DLEAY FOR 1ms
;******************************** SEND BIT 4
BTFSC PORTB, 5 ; CHECK BIT 4 I/P, AND SKIP IF CLEAR
GOTO SET4
BCF PORTB, 3 ; BIT 4 MUST BE LOW, SO SET O/P LOW
GOTO SKIP4
SET4: BSF PORTB, 3 ; BIT 4 MUST BE HIGH, SO SET O/P HIGH
SKIP4: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 5
BTFSC PORTB, 5 ; CHECK BIT 5 I/P, AND SKIP IF CLEAR
GOTO SET5
BCF PORTB, 3 ; BIT 5 MUST BE LOW, SO SET O/P LOW
GOTO SKIP5
SET5: BSF PORTB, 3 ; BIT 5 MUST BE HIGH, SO SET O/P HIGH
SKIP5: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 6
BTFSC PORTB, 7 ; CHECK BIT 6 I/P, AND SKIP IF CLEAR
GOTO SET6
BCF PORTB, 3 ; BIT 6 MUST BE LOW, SO SET O/P LOW
GOTO SKIP6
SET6: BSF PORTB, 3 ; BIT 6 MUST BE HIGH, SO SET O/P HIGH
SKIP6: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 7
BTFSC PORTC, 0 ; CHECK BIT 7 I/P, AND SKIP IF CLEAR
GOTO SET7
BCF PORTB, 3 ; BIT 7 MUST BE LOW, SO SET O/P LOW
GOTO SKIP7
SET7: BSF PORTB, 3 ; BIT 7 MUST BE HIGH, SO SET O/P HIGH
SKIP7: CALL DELAY1 ; DLEAY FOR 1ms
;******************************** SEND BIT 8
BTFSC PORTC, 1 ; CHECK BIT 8 I/P, AND SKIP IF CLEAR
GOTO SET8
BCF PORTB, 3 ; BIT 8 MUST BE LOW, SO SET O/P LOW
GOTO SKIP8
SET8: BSF PORTB, 3 ; BIT 8 MUST BE HIGH, SO SET O/P HIGH
SKIP8: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 9
BTFSC PORTC, 2 ; CHECK BIT 9 I/P, AND SKIP IF CLEAR
GOTO SET9
BCF PORTB, 3 ; BIT 9 MUST BE LOW, SO SET O/P LOW
GOTO SKIP9
SET9: BSF PORTB, 3 ; BIT 9 MUST BE HIGH, SO SET O/P HIGH
SKIP9: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 10
BTFSC PORTC, 3 ; CHECK BIT 10 I/P, AND SKIP IF CLEAR
GOTO SET10
BCF PORTB, 3 ; BIT 10 MUST BE LOW, SO SET O/P LOW
GOTO SKIP10
SET10: BSF PORTB, 4 ; BIT 10 MUST BE HIGH, SO SET O/P HIGH
SKIP10: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 11
BTFSC PORTC, 4 ; CHECK BIT 11 I/P, AND SKIP IF CLEAR
GOTO SET11
BCF PORTB, 3 ; BIT 11 MUST BE LOW, SO SET O/P LOW
GOTO SKIP11
SET11: BSF PORTB, 3 ; BIT 11 MUST BE HIGH, SO SET O/P HIGH
SKIP11: CALL DELAY1 ; DLEAY FOR 1ms
;******************************** SEND BIT 12
BTFSC PORTC, 5 ; CHECK BIT 12 I/P, AND SKIP IF CLEAR
GOTO SET12
BCF PORTB, 3 ; BIT 12 MUST BE LOW, SO SET O/P LOW
GOTO SKIP12
SET12: BSF PORTB, 3 ; BIT 12 MUST BE HIGH, SO SET O/P HIGH
SKIP12: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 13
BTFSC PORTC, 6 ; CHECK BIT 13 I/P, AND SKIP IF CLEAR
GOTO SET13
BCF PORTB, 3 ; BIT 13 MUST BE LOW, SO SET O/P LOW
GOTO SKIP13
SET13: BSF PORTB, 3 ; BIT 13 MUST BE HIGH, SO SET O/P HIGH
SKIP13: CALL DELAY1 ; DELAY FOR 1ms
;******************************** SEND BIT 14
BTFSC PORTC, 7 ; CHECK BIT 14 I/P, AND SKIP IF CLEAR
GOTO SET14
BCF PORTB, 3 ; BIT 14 MUST BE LOW, SO SET O/P LOW
GOTO SKIP14
SET14: BSF PORTB, 3 ; BIT 14 MUST BE HIGH, SO SET O/P HIGH
SKIP14: CALL DELAY1 ; DLEAY FOR 1ms

GOTO START ; CONTINUE LOOPING FOR EVER


;******************************** 1ms DELAY SUBROUTINE
DELAY1:
MOVLW 0x52 ; LOOP COUNT VALUE
MOVWF LOOP1 ; SET LOOP VARIABLE
L1: DECFSZ LOOP1,1 ; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
GOTO L1 ; CONTINUE LOOPING UNTIL ZERO
RETURN

;******************************** 0.5ms DELAY SUBROUTINE
DELAY05:
MOVLW 0x28 ; LOOP COUNT VALUE
MOVWF LOOP05 ; SET LOOP VARIABLE
L05: DECFSZ LOOP05,1 ; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
GOTO L05 ; CONTINUE LOOPING UNTIL ZERO
RETURN

;******************************** 100ms DELAY SUBROUTINE
DELAY100:
MOVLW 0x64 ; LOOP COUNT VALUE (100)
MOVWF LOOP100 ; SET LOOP VARIABLE
L100: DECFSZ LOOP100,1 ; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
GOTO CALL1 ; CONTINUE LOOPING UNTIL ZERO
GOTO ENDLOOP ; FINISHED LOOPING
CALL1: CALL DELAY1 ; DELAY FOR 1ms
GOTO L100
ENDLOOP:
RETURN

END ; END OF PROGRAM


o código do demux:
;**********************************************************************
; TITLE : Multiplexer data DECODER
;**********************************************************************
; Filename : MUX_DE10.ASM
; Date Started : 21/12/07
; Last edit : 31/1/08
; File Version : 1.0
;
; Author : Bruno Marques
;**********************************************************************
;
; Files required:
; p16F876.inc
;
;**********************************************************************
; Notes:
; ASSUMING 1MHz XTAL CLOCK WHICH GIVES 4us PER INSTRUCTION
;
;**********************************************************************

list p=16F876 ; list directive to define processor
#include <p16F876.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC

;***** VARIABLE DEFINITIONS

LOOP1 EQU 110H ; LOOP VARIABLE FOR 1ms ROUTINE
COUNT1 EQU 111H ; DELAY VARIABLE
COUNT2 EQU 112H ; DELAY VARIABLE
OUTP EQU 113H ; TEMP OUTPUT VARIABLE FOR DATA LATCHING
OUTP1 EQU 114H ; TEMP OUTPUT VARIABLE FOR DATA LATCHING
;**********************************************************************
ORG 0x000 ; processor reset vector - start of code

;******************************* INITIALISATION STUFF
CLRF PORTB ; reset portb
BCF STATUS, RP0 ; select bank 0
MOVLW B'01111111' ; PINS RB4=INPUT & ALL OTHERS=OUTPUT
MOVWF TRISB ; UPDATE TRISB REGISTER TO DEFINE I/O PINS
BSF STATUS, RP0 ; SELECT BANK 1

CLRF PORTC ; reset portc
BSF STATUS, RP0 ; select bank 1
MOVLW B'11111111' ; PINS RB4=INPUT & ALL OTHERS=OUTPUT
MOVWF TRISC ; UPDATE TRISB REGISTER TO DEFINE I/O PINS
BSF STATUS, RP0 ; SELECT BANK 1
;*******************************
START:
CLRWDT ; RESET WATCHDOG TIMER
CLRF COUNT1 ; CLEAR LOWER COUNT VARIABLE
CLRF COUNT2 ; CLEAR UPPER COUNT VARIABLE
CLOOP:
INCFSZ COUNT1,1 ; INC LOW COUNTER AND SKIP NEXT STATEMENT IF ZERO
GOTO SKIP1
INCF COUNT2,1 ; INCREMENT THE HIGH COUNT VARIABLE
SKIP1:
BTFSS PORTB,0 ; IF DATA INPUT IF HIGH THEN SKIP NEXT STATEMENT
GOTO CLOOP ; LOOP WHILE DATA INPUT IS LOW
MOVLW 0F0H
ANDWF COUNT2,0 ; MASK OUT LOWER 4 BITS OF HIGH COUNTER (TO SET Z FLAG)
; THIS CHECKS TO SEE IF AT LEAST 16ms HAVE PASSED
BTFSC STATUS,Z ; SKIP NEXT STATEMENT OF ZERO FLAG IF NOT SET
GOTO CLOOP ; CONTINUE TIMING AND CHECKING PORT IF NOT AT LEAST 16ms

CLRF OUTP ; CLEAR TEMP OUTPUT LATCH VARIABLE

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT0
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,0 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,1 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,2 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,3 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT0
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,4 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,5 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,6 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT0
BTFSC PORTB,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,7 ; SET BIT0

MOVF OUTP,0 ; MOVE LATCH VARIABLE INTO W
MOVWF PORTB ; LATCH BIT0-BIT7 ONTO PORT PINS

CLRF OUTP1 ; CLEAR TEMP OUTPUT LATCH VARIABLE

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,0 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,1 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,2 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,3 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT1
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,4 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT2
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,5 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,6 ; SET BIT0

CALL DELAY1 ; DELAY FOR 1ms TO WAIT FOR THE MIDDLE OF BIT3
BTFSC PORTC,0 ; CHECK IF DATA INPUT IS HIGH
BSF OUTP,7 ; SET BIT0

MOVF OUTP1,0 ; MOVE LATCH VARIABLE INTO W
MOVWF PORTC ; LATCH BIT0-BIT7 ONTO PORT PINS

GOTO START ; CONTINUE LOOPING FOREVER

;******************************** 1ms DELAY SUBROUTINE
DELAY1:
MOVLW 0x52 ; LOOP COUNT VALUE
MOVWF LOOP1 ; SET LOOP VARIABLE
L1: DECFSZ LOOP1,1 ; DEC LOOP COUNTER AND SKIP NEXT STATEMENT IF LOOP COUNTER=0
GOTO L1 ; CONTINUE LOOPING UNTIL ZERO
RETURN

END ; END OF PROGRAM

Gostaroa que me dessem uma ajudinha para por isto a funcionar
Karel
Bit
 
Mensagens: 5
Registrado em: 14 Dez 2007 09:34

Mensagempor LUCK » 01 Fev 2008 09:30

a tua descrição do projeto continua muito vaga...
sensores de quê?
A que distância ficam os sensores em relaçâo aos leds?
pra quê dois PICs?
Você já entendeu o que esse programa que acabou de postar faz... cada linha? os comentários estão todos em inglês, então pegou em outro lugar né....
Editado pela última vez por LUCK em 01 Fev 2008 09:36, em um total de 1 vez.
Avatar do usuário
LUCK
Byte
 
Mensagens: 109
Registrado em: 11 Out 2006 14:01

Re: Este é o programa que já temos...

Mensagempor andre_luis » 01 Fev 2008 09:33

Realmente....as pessoas tem que querer ser ajudadas para receberem ajuda. Aqui as pessoas conseguem bons resultados nessa troca mútua de experiencias.

Voce postou o programa inteiro sem sequer dizer o problema que está acontecendo.

Boa sorte pra voce, pois acho que vai precisar. Porque de ajuda mesmo, acho que nao está precisando.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor fabim » 01 Fev 2008 09:39

cblock 0x20
a
b
endc

main:
bank1
movlw 0xFF
movwf trisa
movwf trisb
bank0

movfw porta
movwf a
movfw portb
movwf b

" manda serial A manda serial B"

o receprot recebe os dois bytes pela usart e ..

movfw byte_1_recebido
movwf porta
movfw byte_2_recebido
movwf portb

mais ou menos isso aí encima.. a lógica de programação eu digo!!

agora se o seu problema é como o pic ler os sensores!!!

que tipo de sensor é este? chave na/nf ? passa tensão e voce precisa saber se esta com 0 ou com X Volts ? etc..

explique melhor.

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 ze » 01 Fev 2008 11:01

o mesmo caminho do fabim, mas em C.

sulução simplista (pra 8 bits (1 porta) , tô com preguiça de pensar em mais):

1 fio (desconsiderando o gnd, é lógico) ligando TX (RC6) do uC sensor ao RX (RC7) do uC de led´s.
lado dos sensores: um 876 transmitindo constatemente o valor do PORTB:
for(;;) {TXREG=PORTB;while(!TXIF);}//portb como entrada é lógico.
lado dos leds: outro 876 recebendo constantemente e colocando no PORTB:
for(;;) {while(!RCIF); PORTB=RXREG;}//portb como saída é lógico.

gastando + 1 pouco de fosfato, é possível transmitir o sinal pela alimentação. (Mas pelo jeito, estás longe disso ainda!!!)

pelo menos foi o que o meu lado humano entendeu. Eu quero te ajudar...mas você tem que me ajudar a te ajudar...!!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Alexandre » 01 Fev 2008 14:09

Olá lellis,
Como faz a transmissão pela alimentação, achei interessante.
Alexandre
Bit
 
Mensagens: 35
Registrado em: 29 Jul 2007 16:24
Localização: Sertãozinho, SP

Mensagempor ze » 01 Fev 2008 15:30

e aí xande, se estava pensando que era pela rede ac, esquece. é pela dc mesmo.(pela rede ac não deixa de ser interessante, hein...)

Para uma explicação melhor teria que desenhar. infelizmente não tenho papel e lápis no momento. mas essencialmente (e teoricamente) (e simplisticamente) para a recepção, a alimentação da caixa preta teria que ser p.ex. um sinal de 8 (nivel 0) e 9V (nivel 1). a alimentação do uC propriamente dito seria extraída daí por um 78L05 p.ex. O sinal seria extraído dos níveis 8V e 9V através de um comparador simples. De preferência a caixa preta deve ser de baixo consumo.(vai que quer ligar várias em paralelo?)
Para o transmissor, basta somar o sinal quadrado 1V à alimentação 8V p.ex.
Na prática a teoria é outra. Velocidade, distância, interferências, consistência dos dados, etc deverão ser considerados.
Este é 1 método simplista. Claro há outros + profissionais.

Se achar interessante, abra um tópico, assim alguns especialistas poderão lhe indicar métodos + eficientes, como p.ex. algum sinal modulado em MHz e captado com circuito filtro cerâmico. Mas aí é outra história...(tomei bomba nesta matéria rs).

Desculpe se escrevi muito rápido... afinal é sexta super pré carnavalesca!!! e já está me dando tremedeira!!!! tô precisando tomar uma!!!
fui...............................!
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Bruno Marques » 12 Fev 2008 06:46

Boas, achei interessante fazer o programa para monotorizar os sensores, já fiz o programa mas nao está a funcionar. E nao sei porque

Os pic é o 16F876 utilizando o usart ara fazer uma transmissao de 8 bis, modo assincrono com um baud rate de 9615

A pic do lado dos sensores tem o portb defenido como entrada e sai no tx rc6
Os sensores funcionam da seguinte maneira ou é 5V ou 0V

A pic do lado dos leds tem o portb como saidas e o rc7 como entrada.

O programa dos sensores é o seguinte:


; Files required:
; p16F876.inc
;
;**********************************************************************
list p=16F876
#include <p16F876.inc>

;********************************************************************
ORG 0x000 ;reset á pic
;***************************************;SAiDA
CLRF PORTC
BSF STATUS, RP0
MOVLW B'10111111'
MOVWF TRISc ,tx output
;***************************************;ENTRADAS
CLRF PORTB
BSF STATUS, RP0
MOVLW B'11111111'
MOVWF TRISB
;***************************************;BAUD RATE
BSF STATUS, RP0 ;bank 1
MOVLW D'25' ;baud rate =9615
MOVWF SPBRG ;
BSF STATUS, RP0
BSF TXSTA,BRGH

;***************************************;define modo de transmssao
CLRF TXSTA
movlw B'00100100'
movwf TXSTA
;***************************************;wait tx
BCF STATUS, RP0
WAITTX: btfss PIR1,TXIF
GOTO WAITTX
;***************************************;ENVIAR
BSF STATUS, RP0
movf TRISB,w
BCF STATUS, RP0
movwf TXREG

END




O programa do lado dos leds:


; Files required:
; p16F876.inc
;
;**********************************************************************

list p=16F876
#include <p16F876.inc>


;********************************************************************
ORG 0x000
;***************************************;ENTRADAS
CLRF PORTC ;
BSF STATUS, RP0
MOVLW B'10000000'
MOVWF TRISC
;***************************************;SAIDAS
CLRF PORTB
MOVLW B'00000000'
MOVWF TRISB
;***************************************;BAUD RATE
BSF STATUS, RP0
MOVLW D'25'
MOVLW SPBRG
BSF STATUS, RP0
BSF RCSTA,BRGH

;****************************************;MODO DE RECEPÇÃO
CLRF RCSTA
movlw B'10110000'
movwf RCSTA
;****************************************;wait rx
BCF STATUS, RP0
WAITRX: btfss PIR1,RCIF
GOTO WAITRX
;****************************************;ENVIAR
BSF STATUS, RP0
movf TRISB,w
BCF STATUS, RP0
movwf RCREG

END
Bruno Marques
 
Mensagens: 2
Registrado em: 01 Fev 2008 14:09

Mensagempor ze » 12 Fev 2008 12:50

caro gajo amigo, o seguinte código poderá estar a funcionar. Testei-o na simulação. Entristece-me o facto de que é imenso provável que não te será útil, pois está em C. Mas, se quiseres, compartilho-te os ficheiros .hex gerados para que possas brincar um pouco.
Ah, e desculpa-me se não me fiz entender direito, pois não estou a achar um tradutor de pt-br para pt-pt (o Altavista não o tem! pá) . Não sou muito bom com idiomas estrangeiros.

Código: Selecionar todos
#include <pic.h>
// ************************ configuração ***********************
// proteção do código,4Mhz,powerup,lowvoltagedis,debdis,flaswritedis,wathdogdis,brownouresetdis
//__CONFIG(PROTECT & XT & PWRTEN & LVPDIS & DEBUGDIS & WRTDIS & WDTEN & BOREN); //876
__CONFIG(UNPROTECT & XT & PWRTEN & LVPDIS & DEBUGDIS & WDTDIS & BOREN);   //876a
//***************************************************
static void interrupt
timer_int(void)
{
}
//*********************************************************
void main(void)
{
OPTION=0b00100001; //com pullup, clock ligado em RA4, prescaler/
T1CON=0b00000111; //timer on, prescale 1:1, não sincroniza, clock externo, timer1 on
ADCON1=0b00000110; //AN=digital
TRISA=0b00001001; //RA3, RA1=entrada comparador
//TRISB=0xff; //lado dos sensores
TRISB=0x00; //lado dos leds
CMCON=0b00000001;
T1CON=0B00010101;   // prescaler /2 timer1 on
TMR1IF=0;           //zera flag timer1
TRISC=0b10011111;//RC7,RC6=txrx,RC5=buzzer,RC4,RC3=e2p,RC2=vnr,RC1=por,RC0=comtec1
//------------- interface serial-------
SPBRG=155;    //9600,n,8 @ 24MHz
TXEN=1;       //hab. transmissão
//BRGH=0;     //sel. baud rate baixa 2400bps
BRGH=1;       //sel. baud rate alta  9600bps
SYNC=0;       //assinc.
SPEN=1;       //hab. pinos como int. serial
CREN=1;       //recepção contínua
RCIF=0;       //flag de recepção
RCIE=1;        //hab int serial
//--------------------------------------

for(;;)
{
//   TXREG=PORTB;    //lado dos
//   while(TXIF);    // sensores   

   while(!RCIF);   //lado dos
   PORTB=RCREG;      //leds
}

}


Descomente/comente para compilar em seus respectivos uC´s.

(Cara, tô teno tempo ultimamente...rsrsrs. Favor não se acostumar...)
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Bruno Marques » 12 Fev 2008 22:33

Boas

Caro amigo Lellis muito obrigado pelo código, tenho uma duvida no seguinte código:

OPTION=0b00100001; //com pullup, clock ligado em RA4, prescaler/
T1CON=0b00000111; //timer on, prescale 1:1, não sincroniza, clock externo, timer1 on
ADCON1=0b00000110; //AN=digital
TRISA=0b00001001; //RA3, RA1=entrada comparador


Podias-me dizer qual é o teu programa para compilares de c para hexadeimal?


Já agora se necessitar de enviar mais 7 bits? Ou seja 15 bits ao todo como faria?


Muito Obrigado pela ajuda.

Atensiosamente

Bruno Marques
Bruno Marques
 
Mensagens: 2
Registrado em: 01 Fev 2008 14:09

Mensagempor ze » 13 Fev 2008 07:51

Caro Bruno Marques, já notei que tu chegaste a pôucu de fora. Julgo (e espero) que não sejas "zerado".
Para compilares de C para hex há varios programas. Eu uso o hitech-c. (que infelizmente é pago U$1000) Tu podes baixá-lo para avaliação temporária em www.htsoft.com. Mas é o melhor do universo. Trabalha junto com o Mplab Microchip.
O Mplab também tem seu próprio compilador cuja características iniciais deverás estudar.(Mplab já ouviste falar, pois?)
Há também o mikroC que é + barato e o barato: grátis até 2K de programa. Encontrado em http://www.mikroe.com/en/compilers/mikroc/pic/

Os nomes: OPTION,T1CON,ADCON1,TRISA são registros da PIC, que sinceramente não desejo que tu não os conheças !!! (e linguagem C)

Quanto a transmitir + de 8 bit´s, já está abusando neah? Além do +, minha memória está tão fraca que só lembrei que dia é hoje porque esqueci que dia é hoje. Aí lembrei-me que como só esqueço nas quartas feiras, então hoje é....quarta! Ou seja quase sexta!!

Falando (escrevendo) sério: tente primeiro entender e monitorizar seus 8 bits. Para 15 é um pulinho.(existe uma ridícula minima extremamente baixa e infinetesimal probabilidade pequena minúscula de quem sabe provavelmente eu pensar em tentar algum dia fazer algo assim)

enviei-lhe os .hex

abrç
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor ze » 13 Fev 2008 08:14

ah, já estava a esquecer: os ficheiros .hex foram compilados para PIC16F876A.
abrç++=post++
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

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

cron

x