Morpheus981 Inserito: 1 marzo 2005 Segnala Inserito: 1 marzo 2005 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?
Morpheus981 Inserita: 1 marzo 2005 Autore Segnala Inserita: 1 marzo 2005 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, .!
Morpheus981 Inserita: 1 marzo 2005 Autore Segnala Inserita: 1 marzo 2005 .. 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!!!!
ES200 Inserita: 2 marzo 2005 Segnala Inserita: 2 marzo 2005 Prova a mettere ad "1" sia il TRISB.1 che il TRISB.2;credo che per funzionare l'USART richieda che entrambi gli ingressiPORTB 1(rx) e 2(tx) siano in configurazione di input.Ciao.
Morpheus981 Inserita: 4 marzo 2005 Autore Segnala Inserita: 4 marzo 2005 no, le porte devono essere settate rx come input e ts come output..comunque, per chi è interessato, c'è un 3ad (in inglese) qui:http://www.picbasic.co.uk/forum/showthread...p=6740#post6740
Cesco Inserita: 4 marzo 2005 Segnala Inserita: 4 marzo 2005 (modificato) 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: 4 marzo 2005 da Cesco
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora