Vai al contenuto
PLC Forum


Comunicazione Tra Due Pic - Prova per far comunicare due PIC


Ulisse D.J.

Messaggi consigliati

Salve a tutti.

Per fare un pò di pratica con i PIC ho voluto realizzare un semplice circuitino su breadbord per far comunicare 2 PIC. In casa avevo solo un 16f84A e un 16f876, così li ho usati.

Mi sono "inventato" una specifica di comunicazione ed ho realizzato il source in assembler per il master (16f84A che comunica una stringa di 4 bit) e lo slave (16f876 che riceve la stringa e la visualizza accendendo 4 LED).

Realizzato il tutto l'ho testato ma non funziona. Ammettendo che i collegamenti siano corretti (li ho verificati più volte), ho guardato e riguardato i due source per capire come mai non funziona ma mi sembra tutto in regola.

Il funzionamento è semplice:

premendo 1 dei 4 pulsanti il master mette a 1 la linea RA1 per 5 ms dopo di che, tramite la linea RA0, trasmette i 4 bit in seriale con durata del singolo bit di 5ms.

Niente di complicato ma non va sad.gif . Sicuramente ho sbagliato qualcosa nello scrivere i source.

Se avete voglia e tempo di darci un'occhiata potete dirmi dove ho sbagliato.

Vi incollo i due listati, grazie.

MASTER:

PROCESSOR 16F84A

RADIX DEC

INCLUDE "P16F84A.INC"

__CONFIG 3FF1H

pausams macro arg1

local ciclo1

local dechi

local ritardo1ms

local ciclo2

local Kraj

ifndef OSC

#define OSC 4

endif

movlw high (arg1*OSC/4)

movwf HIcnt

movlw low (arg1*OSC/4)

movwf LOcnt

ciclo1

movf LOcnt,f

btfsc STATUS,Z

goto dechi

call ritardo1ms

decf LOcnt,f

goto ciclo1

dechi

movf HIcnt,f

btfsc STATUS,Z

goto Kraj

call ritardo1ms

decf HIcnt,f

decf LOcnt,f

goto ciclo1

ritardo1ms:

movlw .100

movwf LOOPcnt

ciclo2:

nop

nop

nop

nop

nop

nop

nop

decfsz LOOPcnt,f

goto ciclo2

return

Kraj

endm

ORG 0CH

Conta RES 1

Dato RES 1

HIcnt RES 1

LOcnt RES 1

LOOPcnt RES 1

ORG 00H

bsf STATUS,RP0

movlw 00000000B ;Linea A tutte uscita

movwf TRISA & 7FH

movlw 11111111B ;Linea B tutte ingresso

movwf TRISB & 7FH

bcf STATUS,RP0

Main

btfss PORTB,4

goto Prima_stringa

btfss PORTB,5

goto Seconda_stringa

btfss PORTB,6

goto Terza_stringa

btfss PORTB,7

goto Quarta_stringa

goto Main

Prima_stringa

btfss PORTB,4

goto Prima_stringa

bsf PORTA,1 ;Bit 1 a 1 per comunicare la trasmissione

pausams .5 ;Attendi 5ms

bcf PORTA,1 ;Bit 1 a 0 per cominciare a trasmettere

movlw 00001111B ;Stringa da trasmettere

movwf Dato ;Variabile che contiene il dato da trasmettere

goto Trasmetti

Seconda_stringa

btfss PORTB,5

goto Seconda_stringa

bsf PORTA,1 ;Bit 1 a 1 per comunicare la trasmissione

pausams .5 ;Attendi 5ms

bcf PORTA,1 ;Bit 1 a 0 per cominciare a trasmettere

movlw 00001010B ;Stringa da trasmettere

movwf Dato ;Variabile che contiene il dato da trasmettere

goto Trasmetti

Terza_stringa

btfss PORTB,6

goto Terza_stringa

bsf PORTA,1 ;Bit 1 a 1 per comunicare la trasmissione

pausams .5 ;Attendi 5ms

bcf PORTA,1 ;Bit 1 a 0 per cominciare a trasmettere

movlw 00000011B ;Stringa da trasmettere

movwf Dato ;Variabile che contiene il dato da trasmettere

goto Trasmetti

Quarta_stringa

btfss PORTB,7

goto Quarta_stringa

bsf PORTA,1 ;Bit 1 a 1 per comunicare la trasmissione

pausams .5 ;Attendi 5ms

bcf PORTA,1 ;Bit 1 a 0 per cominciare a trasmettere

movlw 00000101B ;Stringa da trasmettere

movwf Dato ;Variabile che contiene il dato da trasmettere

goto Trasmetti

Trasmetti

bcf STATUS,C

btfsc Dato,0

bsf PORTA,0

btfss Dato,0

bcf PORTA,0

pausams .5 ;Attendi 5ms

rrf Dato,F

decfsz Conta,1

goto Trasmetti

movlw 00000100B

movwf Conta

bcf PORTA,0

movlw 00000000B

movwf Dato

goto Main

END

SLAVE:

PROCESSOR 16F876

RADIX DEC

INCLUDE "P16F876.INC"

__CONFIG 3FF1H

pausams macro arg1

local ciclo1

local dechi

local ritardo1ms

local ciclo2

local Kraj

ifndef OSC

#define OSC 4

endif

movlw high (arg1*OSC/4) ;1

movwf HIcnt ;1

movlw low (arg1*OSC/4) ;1

movwf LOcnt ;1

ciclo1

movf LOcnt,f ;1

btfsc STATUS,Z ;1

goto dechi ;2

call ritardo1ms ;2

decf LOcnt,f ;1

goto ciclo1 ;2

dechi

movf HIcnt,f ;1

btfsc STATUS,Z ;1

goto Kraj ;2

call ritardo1ms ;2

decf HIcnt,f ;1

decf LOcnt,f ;1

goto ciclo1 ;2

ritardo1ms:

movlw .100 ;1

movwf LOOPcnt ;1

ciclo2:

nop ;1

nop ;1

nop ;1

nop ;1

nop ;1

nop ;1

nop ;1

decfsz LOOPcnt,f ;1

goto ciclo2 ;2

return ;2

Kraj

endm

ORG 0CH

Conta RES 1

Dato RES 1

HIcnt RES 1

LOcnt RES 1

LOOPcnt RES 1

ORG 00H

bsf STATUS,RP0

movlw 00000000B ;Linea A tutte uscita

movwf TRISA & 7FH

movlw 11111111B ;Linea B tutte ingresso

movwf TRISB & 7FH

bcf STATUS,RP0

Main

btfsc PORTB,1

goto Attendi_ricez

goto Main

Attendi_ricez

pausams .5 ;Attendi 5ms

Ricevi_dato

bcf STATUS,C

btfsc PORTB,0

bsf Dato,3

btfss PORTB,0

bcf Dato,3

pausams .5 ;Attendi 5ms

rrf Dato,F

decfsz Conta,1

goto Ricevi_dato

movlw 00000100B

movwf Conta

Accendi_LED

movlw Dato

movwf PORTA

goto Main

END

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