Vai al contenuto
PLC Forum


16f628 Usart - riconoscimento dell'indirizzo


Morpheus981

Messaggi consigliati

perchè non mi funziona l'address detect?

questo è il mio codice:

INCLUDE "MODEDEFS.BAS"

TRISA=%11110000    'setta la porta A
TRISB=%00000010    'setta la B, con RB2 settato come uscita(visto che uso l'usart

cmcon=7  ' predispone la portaA come I/O digitali

DEFINE HSER_RCSTA %11011001    ' abilito la ricezione su seriale, la ricezione del nono bit,il continous receive, l'address detect, il "9th bit of receive data"
DEFINE HSER_TXSTA 24h    ' Set transmit register to transmitter enabled
DEFINE HSER_BAUD 38400    ' Set baud rate
DEFINE HSER_SPBRG 15    ' Set SPBRG directly (normally set by HSER_BAUD)
'DEFINE HSER_BITS 9  ' per usare il 9° bit

DEFINE OSC 10                      'l'oscillatore a 10 mhz

Enable interrupt         'abilito l'interrupt


i VAR WORD
led1 VAR BIT
led2 VAR BIT



on interrupt GoTo indirizzo           



ricevi:                       'un loop che accende e spegne un led che dovrebbe essere interrotto dall'interrupt sull' usart(cioè  quando ricevo il 9° bit a 1)

    For i=1 to 65000
    Next    

  IF led1=1 Then 
      PORTB.6=0:led1=0
  Else
      PORTB.6=1:led1=1
  EndIF
GoTo ricevi


indirizzo:               'eseguito quando vado in interrupt, accende o spegne un led
                 

                                'HSerin 1,avanti,[ric1,ric2] 'riceve 2 caratteri da seriale

  IF led2=1 Then 
      PORTA.0=0:led2=0
  Else
      PORTA.0=1:led2=1
  EndIF
GoTo ricevi

da seriale invio (controllato con l'oscilloscopio) un carattere di 8 bit con il nono bit a 1 e un secondo carattere con il nono bit a 0.

teoricamente, quando riceve il primo carattere, e vede il nono bit a 1, dovrebbe andare in interrupt ed accendere (o spegnere) il secondo led. in realtà sembra fregarsene dell'interrupt.

i miei dubbi sono: nell'rcsta, devo abilitare il continous receive? (4° bit) e il "9th bit of receive data"?(8°bit, l'LSB)

anche se l'hserin per il momento è remmato, l'interrupt dovrebbe essere generato lo stesso, no?

Link al commento
Condividi su altri siti


forse ho trovato! però non so come settarlo! mi spiego meglio:

c'è un registro, il PIE1, al quale devo abilitare il bit RCIE. ora, per gli altri registri ho utilizzato l'istruzione DEFINE in PicBas,(DEFINE HSER_RCSTA %11011001) ma il registro PIE1 non è riconosciuto dal picbasic.

conoscendo la locazione di memoria del registro che mi interessa, come faccio a scriverlo?

in picbasic o in assembler, fa lo stesso, ma non so come fare.. vi prego, .!

Link al commento
Condividi su altri siti

.. il tutto si è evoluto:

INCLUDE "MODEDEFS.BAS"

TRISA=%11110000
TRISB=%00000010

cmcon=7  ' predispone la portaA come I/O digitali


'INTCON ( Interruption Control register ) 
intcon.7=1    'GIE : Global Interrupt Enable bit
intcon.6=1    'PEIE : Peripheral Interrupt Enable bit ( This bit should be set when using the CCP interruption so on )
intcon.5=0    'T0IE : TMR0 Overflow Interrupt Enable bit
intcon.4=0    'INTE : RB0/INT Interrupt Enable bit
intcon.3=0    'RBIE : RB Port Change Interrupt Enable bit
intcon.2=0    'T0IF : TMR0 Overflow Interrupt Flag bit
intcon.1=0    'INTF : RB0/INT Interrupt Flag bit
intcon.0=0    'RBIF : RB Port Change Interrupt Flag bit

'definisco il registro di ricezione RCSTA
rcsta.7=1    'SPEN serial port enable bit
rcsta.6=1    'RX9 9-bit receive enable bit
rcsta.5=0    'SREN single receive enable bit
rcsta.4=1    'CREN continous receive enable bit
rcsta.3=1    'ADDEN address detect enable bit
rcsta.2=0    'FERR framing error bit(read only)
rcsta.1=0    'OERR overrun error bit(read only)
rcsta.0=0    'RX9D 9th bit of receive data (read only)


'definisco il registro di trasmissione TXSTA
txsta.7=0    'CSRC : Clock Source Select bit
txsta.6=0    'TX9 : 9-bit Transmit Enable bit
txsta.5=1    'TXEN : Transmit Enable bit
txsta.4=0    'SYNC : USART Mode Select bit 0=asincrono
txsta.3=0    ' N/A
txsta.2=1    'BRGH : High Baud Rate Select bit
txsta.1=0    'TRMT : Transmit Shift Register Status bit ( Read only )
txsta.0=0    'TX9D : 9th bit of transmit data. Can be parity bit.


'PIE1 ( Peripheral Interrupt Enable register ) 8Ch
PIE1.7=0    'EEIE : EE Write Complete Interrupt Enable Bit 
PIE1.6=0    'CMIE : Comparator Interrupt Enable bit 
PIE1.5=1    'RCIE : USART Receive Interrupt Enable bit 
PIE1.4=0    'TXIE : USART Transmit Interrupt Enable bit 
PIE1.3=0    ' N/A
PIE1.2=0    'CCP1IE : CCP1 Interrupt Enable bit 
PIE1.1=0    'TMR2IE : TMR2 to PR2 Match Interrupt Enable bit 
PIE1.0=0    'TMR1IE : TMR1 Overflow Interrupt Enable bit


'azzera tutti i flag di interrupt
PIR1.7=0
PIR1.6=0
PIR1.5=0  'azzera l'RCIF
PIR1.4=0
PIR1.3=0
PIR1.2=0
PIR1.1=0
PIR1.0=0



'DEFINE HSER_BAUD 38400    ' Set baud rate
'DEFINE HSER_SPBRG 15    ' Set SPBRG directly (normally set by HSER_BAUD)

'setta la velocità a 38800
SPBRG.7=0
SPBRG.6=0
SPBRG.5=0
SPBRG.4=0
SPBRG.3=1
SPBRG.2=1
SPBRG.1=1
SPBRG.0=1



DEFINE OSC 10




Enable interrupt


i VAR WORD
led VAR BIT
led2 VAR BIT
ric VAR BYTE



on interrupt GoTo indirizzo

GoTo ricevi


indirizzo:

'  HSerin [ric]'riceve un carattere da seriale
'  IF led2=1 Then 
'      PORTA.0=0:led2=0
'  Else
'      PORTA.0=1:led2=1
'  EndIF
PORTB.7=1

Resume


ricevi:

    For i=1 to 65000
    Next    

  IF led=1 Then 
      PORTB.6=0:led=0
  Else
      PORTB.6=1:led=1
  EndIF
GoTo ricevi

risultato: quando il pic riceve un indirizzo, il led che lampeggia rimane nello stato (acceso o spento) per circa il doppio del tempo e poi riparte.

il led che si dovrebbe accendere con l'interrupt, invece, rimane muto.

non capisco perchè non entra in interrupt!!!!

Link al commento
Condividi su altri siti

Prova a mettere ad "1" sia il TRISB.1 che il TRISB.2;

credo che per funzionare l'USART richieda che entrambi gli ingressi

PORTB 1(rx) e 2(tx) siano in configurazione di input.

Ciao.

Link al commento
Condividi su altri siti

Ciao Morpheus,

ho lavorato parecchio anche io su uC (non PIC... ma i concetti non cambiano)...

e ho incontrato parecchie difficoltà per quello che riguarda la com seriale.

Per quello che ho visto io, ho capito che,

essendo spesso i quarzi che si utilizzano non di valore "perfetto" per raggiungere determinate velocità di comunicazione, il uC introduce implicitamente una percentuale di errore più o meno bassa rispetto alla velocità teorica.

Considera anche che spesso le schede per PC per comunicazione seriale hanno qualche errore in velocità... e quindi può succedere che gli errori si compensino.

Se la velocità non è per te vincolante (e siccome trasmetti pochi byte, non mi sembra il tuo caso),

io proverei a cambiarla (tipo 9600) e vedere come si comporta il sistema.

Se il problema persiste... prova a cambiare PC, se puoi.

...E se ne hai la possibilità,

potresti provare a comunicare con quel PIC... con un altro PIC con lo stesso quarzo e le stesse impostazioni sulla seriale, in modo da riuscira, teoricamente, a compensare gli eventuali errori.

Sappimi dire.

Ciao,

Cesco.

Modificato: da Cesco
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...