Newsgroup: it.hobby.elettronica.digitale
Titolo: interrupt usart pic16f877 e RS232 [lungo]

ho una piccola stazione meteo che trasmette i dati rilevati su porta RS232 e
precisamente sul RX.
Vorrei che il mio pic memorizzasse nella sua eeprom dati (per ora) questi
dati.
Ho quindi collegato questo filo ad un MAX232 per la conversione della
tensione e poi al RC7/RX
(inoltre il pin 5 della seriale=gnd a massa del mio circuito)
ho quindi programmato l'USART come ricevente asincrono a 9600, no parity 1
bit stop (come la staz meteo) ed attivato la generazione degli interrupt
quando viene ricevuto un carattere.
Quando arriva un carattere e viene generato un interrupt, lo memorizzo nella
eeprom dati  ed accendo/spengo un led su RB7. Eseguo il tutto fino a che
questa non è piena (ovvero ho scritto 256 caratteri) e termino il programma
ed accendo un ulteriore led su RB0
Ovviamente non risco a farlo funzionare.
verifiche effetuate:
1) il max232 funziona correttamente: valori negativi---->+5V; val
positivi--->0V
2) la stazione effettivamente trasmette sul RX in quanto ho verificato che
con un programma in vbasic se interrompo il pin 2 della rs232 non ricevo i
dati.
3) dato che non so che tipo di handshake esiste ho realizzato un cavo
seriale a T con le estremita collegate al PC, alla staz. meteo ed al mio
circuito (cosi il pic , per ora,  "copia" solo i dati inviati al pc)
4)la routine che scrive nella eeprom l'ho copiata funzionante da un altro
prog.
Una cosa ho notato: ho provato ad attaccare/staccer il cavo d'ingresso del
MAX per simulare l'arrivo di un carattere, alcune volte il led si è acceso e
nella eeprom ho trovato dei dati, altre volte si è acceso ma non è stato
memorizzto niente ( o forse FF) altre volte non si è acceso niente!
Errore nella gestione interrupt? o nella programmazione della USART?
realizzazione/logica del circuito?
Ho inserito il listato (semplificato) del prog.
Ringrazio fin d'ora chi mi darà una mano e per la pazienza di aver letto
tutto!
saluti
stefano
ORG 0x20
pausa RES 1     ; VARIABILI
fine res 1
   ORG 0x0000
   goto start
   ORG 0x04
      bank_0
      btfsc PIR1,RCIF         ; ricevuti 8 bit?
      goto intcar
esci   retfie
fineint bank_0
      btfss PORTB,7       ;se led gia acceso lo spengo e viceversa
      goto accendi
      movlw B'00000000'
      goto next
accendi movlw B'11000000'
next   movwf PORTB
      bsf PIE1, RCIE          ;abilita interrupt x ricezione carattere
      goto esci
intcar  bank_0
   movf RCREG,W  ; leggo carattere
   bank_2
   movwf EEDATA      ;dato eeprom
   incfsz EEADR    ;eeprom piena?
   goto scrivi
   bank_0
   bsf fine,1       ; flag per avvisare memoria piena
   goto fineint
scrivi  call eeprom  ;scivi in eeprom
      goto fineint
; SCRITTURA EEPROM
eeprom
......
.......
start
   bank_1   ; configurazione porte
   movlw B'00000000'
   movwf TRISB
   movlw B'10000000'   ;pin  RX
   movwf TRISC
   bank_0
   movlw B'00000000'
   movwf PORTB    ; spengo tutti i led
   bsf INTCON, PEIE ; abilitazione interrupt periferiche
; CONFIGURAZIONE RS232
        bank_1
        movlw 25
        movwf SPBRG  ; 9600 baud, no parity, bit stop
        movlw b'00100100'
        movwf TXSTA  ; enable Async Tx, BRGH=1
        movlw b'10010000'
        bank_0
        movwf RCSTA  ;ricezione Async e continua
        bank_1
        bsf PIE1, RCIE  ;abilitazione interrupt x ricezione carattere
; ATTESA CONFIGURAZIONE
        clrf pausa
wait    decfsz pausa,F
        goto wait
        movf RCREG,W
        movf RCREG,W
        movf RCREG,W
   bank_0    ;inizializzazione variabili
   bcf fine,1
   bank_2
   clrf EEADR
   bsf INTCON, GIE  ; abilitazione interrupt generale
ciclo   btfss fine,1  ;attendo eeprom piena
        goto ciclo
   bcf INTCON, GIE  ;disabilita interrupt
   bank_0
   movlw B'00000011'
   movwf PORTB  ;accendo led memoria piena
led   nop
   goto led
        end

Non ho seguito il listato del tuo programma, cmq hai tenuto conto del tempo di programmazione della EEPROM, vero ?

 ha scritto nel messaggio
<news:UddD8.47895<$zW3.6...@news1.tin.it...
<Non ho seguito il listato del tuo programma, cmq hai tenuto conto del tempo
di programmazione della <EEPROM, vero ?
no sinceramente non ci ho pensato....
quanto tempo ci impiega a memorizzare un dato?
grazie
stefano

 quanto tempo ci impiega a memorizzare un dato?
mi rispondo da solo:
4-8 ms ! troppooooooo lentaaaaaa!
con la seriale ad una velocità di 9600 bps 8,N,1 contando pure i bit di
controllo ricevo un byte ogni
1.09 ms!
devo trovare qualche memoria più veloce
Avete suggerimenti in proposito?
saluti
stefano

Stefano Banfi Gaslini ha scritto nel messaggio ...

Usa le eeprom seriali, ce ne sono (forse tutte?)
che possono scrivere in un solo colpo molti
bytes, mi sembra che si chiami page write mode.
L'operazione dura sempre tempi dell'ordine dei
millisecondi pero' la velocita' media per byte
risulta molto maggiore di quanto serve a te.
Ciao
Luigi

 ha scritto nel messaggio
news:4RhD8.46289$5k4.1...@twister2.libero.it...
