Vai al contenuto
PLC Forum


Pic 16f876 - Seriale asincrona


Calerasso

Messaggi consigliati

Salve! Da qualche tempo lavoro dietro ad un progetto per l'automatizzazione di due serre gestite via pc (sono uno studente di un itis). Il mio problema è che non riesco ad ottenere alcuna risposta dal micro uno voolta programmato e collegato. Il pic è montato su una basetta che implementa il max232. Il quarzo è da 20 mega e la connessione pc>pic avviene tramite sessione di hyper terminal di windows (com1). Aiuto! Dato che programmo da poco tempo e da autodidatta non riesco a trovare l'errore nel prog. Ve lo allego, è ridotto all'osso e mi serve da prototipo solo per vedere se il pic risponde. Non fate caso ai nomi delle etichette che si riferiscono ai vari trasduttori delle serre... Grazie , federico (consiglio di ricopiare il prog in notepad per una facile lettura) PROCESSOR 16F876 ;PIC usato 16F876

RADIX DEC ;sistema numerico decimale

INCLUDE "P16F876.INC" ;importa libreria del PIC 16F876

__CONFIG 3FF1H ;configurazione 3FF1H

;-------------------------------------------------------------------------------------------------------------

;-------------- ASSEGNAZIONE REGISTRI ------------------------------------------------------------------------

;-------------------------------------------------------------------------------------------------------------

lett_a equ 'A' ;registro per la lettera A (ascii)

lett_t equ 'T' ;registro per la lettera T (ascii)

lett_u equ 'U' ;registro per la lettera U (ascii)

lett_l equ 'L' ;registro per la lettera L (ascii)

org 20H ;partenza lettura EEPROM registro 20H

reg_a res 1 ;registro per salvataggio dati seriale 2°byte

reg_b res 1 ;registro per salvataggio dati seriale 1°byte

org 00H ;partenza lettura EEPROM registro 00H

bsf RCSTA,7 ;Abilitazione porta seriale

bsf RCSTA,4 ;Abilitazione della ricezione

goto start ;vai a start

;-------------------------------------------------------------------------------------------------------------

;-------------- INTERRUPT SERIALE ----------------------------------------------------------------------------

;-------------------------------------------------------------------------------------------------------------

org 04H ;partenza lettura EEPROM registro 04H

goto ricezione ;se RCIF=1 vai a ricezione

fine retfie ;se RCIF=0 esci dall'interrupt

;-------------- RICEZIONE ------------------------------------------------------------------------------------

ricezione movf RCREG,reg_a ;sposta il contenuto di RCREG in reg_a

nop

movf RCREG,reg_b ;sposta il contenuto di RCREG in reg_b

goto confronto ;vai a confronto

;-------------- CONFRONTO ------------------------------------------------------------------------------------

confronto movf lett_a,W ;copia il contenuto del registro lett_a in W

xorwf reg_a,W ;confronta se "lett_a" è uguale alla lettera A

btfsc STATUS,Z ;controlla il flag di ZERO

goto tx_all ;se ZERO=1 (i registri sono uguali) vai a tx_all

;se ZERO=0 (i registri sono diversi)

movf lett_t,W ;copia il contenuto del registro lett_t in W

xorwf reg_a,W ;confronta se "lett_t" è uguale alla lettera T

btfsc STATUS,Z ;controlla il flag di ZERO

goto rx_temp ;se ZERO=1 (i registri sono uguali) vai a check_1

;se ZERO=0 (i registri sono diversi)

movf lett_u,W ;copia il contenuto del registro lett_u in W

xorwf reg_a,W ;confronta se "lett_u" è uguale alla lettera U

btfsc STATUS,Z ;controlla il flag di ZERO

goto rx_umid ;se ZERO=1 (i registri sono uguali) vai a check_2

;se ZERO=0 (i registri sono diversi)

movf lett_l,W ;copia il contenuto del registro lett_l in W

xorwf reg_a,W ;confronta se "lett_l" è uguale alla lettera L

btfsc STATUS,Z ;controlla il flag di ZERO

goto rx_lumi ;se ZERO=1 (i registri sono uguali) vai a check_3

;se ZERO=0 (i registri sono diversi)

;-------------- TRASMETTI TUTTO ------------------------------------------------------------------------------

tx_all movlw 01010101B

movwf PORTB

goto fine

;-------------- RICEVI ISTRUZIONI TEMPERATURA ----------------------------------------------------------------

rx_temp movlw 11111111B

movwf PORTB

goto fine

;-------------- RICEVI ISTRUZIONI UMIDITA' -------------------------------------------------------------------

rx_umid movlw 11110000B

movwf PORTB

goto fine

;-------------- RICEVI ISTRUZIONI LUMINOSITA' ----------------------------------------------------------------

rx_lumi movlw 00001111B

movwf PORTB

goto fine

;-------------------------------------------------------------------------------------------------------------

;-------------- CONFIGURAZIONE PIC ---------------------------------------------------------------------------

;-------------------------------------------------------------------------------------------------------------

start bsf STATUS,RP0 ;RP0=1 (passa al 2° banco di memoria)

bcf STATUS,RP1 ;RP1=0 (passa al 2° banco di memoria)

movlw 00010111B ;carica 00010111B in W

movwf TRISA ;USCITA=RA0,RA1,RA2,RA4/INGRESSO=RA3,RA5,RA6,RA7

movlw 00000000B ;carica 00000000B in W

movwf TRISB ;USCITA=RB0,RB1,RB2,RB3,RB4,RB5,RB6,RB7

movlw 10000001B ;carica 10000001B in W

movwf TRISC ;USCITA=RC1,RC2,RC3,RC4,RC5,RC6/INGRESSO=RC0,RC7

movlw 11000000B ;carica 11000000B in W

movwf INTCON ;GIE=1 (int.attivo),PEIE=interrupt evento esterno att

movlw 10000001B ;carica 10000001B in W (129)

movwf SPBRG ;FOSC/[16(129+1)]=9615 bps

movlw 00100000B ;carica 00100000B in W

movwf PIE1 ;attivo interrupt su ricezione BIT5 di RCIE

clrf RCREG

bcf STATUS,RP0 ;RP1=0 (passa al 2° banco di memoria)

bcf STATUS,RP1 ;RP0=0 (passa al 2° banco di memoria)

;-------------------------------------------------------------------------------------------------------------

;-------------- MAINLOOP -------------------------------------------------------------------------------------

;-------------------------------------------------------------------------------------------------------------

mainloop movlw 10101010b ;Esecuzione programma

movwf PORTB

goto mainloop

end

Link al commento
Condividi su altri siti

  • 2 weeks later...

Ciao

Ho dato uno sguardo veloce al codice che hai scritto...per quel che riguarda la comunicazione hai settato solo L'SPBRG....ti mando un esempio di un codice che ho utilizzato io, ci sarà qualche banksel di troppo...comunque per settare correttamente il modulo di comunicazione seriale del PIC t consiglio di consultare i datasheets. Vai sul sito della microchip.... www.microchip.com

 banksel SPBRG
movlw 25                ;velocità 9600 BAUD
movwf SPBRG    
bsf TXSTA,BRGH            ;High Speed
bcf TXSTA,SYNC           ;Modo Asincrono
banksel RCSTA             ;abilitazione porta seriale
bsf RCSTA,SPEN    ;Porta Seriale abilitata
banksel TXSTA
bsf TXSTA,TXEN            ;abilitazione trasmissione

;qui carichi il valore su W da trasmettere
banksel TXREG
movwf TXREG;passando il valore al TXREG si da inizio alla trasmissione 
banksel TXSTA  
loop_tx   btfss TXSTA,TRMT               ;attesa trasmissione dato
goto loop_tx

dovresti visualizzare il carattere trasmesso sull'hyperterminal

ciao

Pablo

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...