Message[306]Crossing page boundary -- ensure page bits are set

Aperto da Santo iw9hlk, 27 Dicembre 2011, 07:12:51

Discussione precedente - Discussione successiva

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

Santo iw9hlk

Salve a tutti, mi è comparso questo messaggio, è un warning dove mi dice che la memoria della pagina è finita e che probabilmente non funzionerà quello che ho scritto in più. Per risolvere il problema si deve utilizzare il registro  PCLATH ma non ho capito precisamente come...  ???
Nulla è per caso


Lino

Ciao Santo.

E' un messaggio di attenzione (warning); MPLab ti avvisa che c'è un'istruzione di "goto" o "call" che potrebbe crearti un errore d'indirizzamento nel proseguo delle istruzioni; per esempio un'istruzione che punta a delle locazioni che non fanno parte della pagina corrente.
Un problema del genere mi è capitato con la gestione degli array e l'ho risolto spostando l'array in altra parte del listato.
Se nel tuo caso è fosse la routine richiamata a generare il warning, spostala in altra zona del listato.

Ciao, Lino

Santo iw9hlk

Ciao Lino, si ma qui la cosa è lunga, ancora devo inserire tutti i comandi della tastiera quindi mi serviva capire come fare i salti da una pagina all'altra. Cioè se nella prima ho goto prova
e prova è nella seconda pagina come si fa capire al pic??
ho trovato questo:
prima:

;-------------------------------------------------------------
   task1      movf  stat,w    ;carica in w la variabile stat
              addwf PCL,f     ;somma al program counter
              goto  routine0  ;goto eseguito se stat=0
              goto  routine1  ;goto eseguito se stat=1
              goto  routine2  ;goto eseguito se stat=2

   routine0   .....
              .....
              return

   routine1   .....
              .....
              return

   routine2   .....
              .....
              return
   ;-------------------------------------------------------------


Un modo per risolvere il problema delle pagine è quello di impostare correttamente il registro PCLATH, che contiene i bit più significativi dell'indirizzo di memoria programma quando vengono effettuate operazioni che coinvolgono direttamente il registro PCL. Nell'esempio seguente si usano le direttive per il compilatore HIGH e LOW per indicare la parte più alta e più bassa dell'indirizzo della memoria programma a cui iniziano le istruzioni di salto. A questo indirizzo viene sommato lo stato corrente aggiustando il PCLATH se la parte bassa dell'indirizzo supera il valore 255:
dopo:

   ;-------------------------------------------------------------
   task1      movlw HIGH Ttask1  ;carica in w parte alta indirizzo Ttask1
              movwf PCLATH       ;la mette nel PCLATH
              movlw LOW  Ttask1  ;carica in w parte bassa indirizzo Ttask1
              addwf stat,w       ;la somma allo stato
              btfsc STATUS,C     ;se non overflow skip
              incf  PCLATH,F     ;altrimenti incrementa PCLATH
              movwf PCL          ;mette parte bassa indirizzo nel program counter
   Ttask1     goto  routine0     ;goto eseguito se stat=0
              goto  routine1     ;goto eseguito se stat=1
              goto  routine2     ;goto eseguito se stat=2

   routine0   .....
              .....
              return

   routine1   .....
              .....
              return

   routine2   .....
              .....
              return
   ;-------------------------------------------------------------

quindi non ho capito il mio goto prova come va  ???


Nulla è per caso

Lino

Ciao Santo,

lo so che il detto "prevenire è meglio che curare" resta sempre valido ma in questo caso lo metterei da parte.
Nell'esecuzione normale delle istruzioni la parte alta del registro si aggiorna da solo; io non mi preoccuperei del cambio pagina se non quando riscontro delle anomalie nell'esecuzione del programma; l'intervento esterno su quel registro (fino ad ora non ho avuto la necessità di farlo) dicono che è abbastanza critico e va effettuato con molta attenzione.

Ciao, Lino


Santo iw9hlk

Capisco che non è cosa buona spostarsi di registro, ora vedo di eliminare qualche routine e di fare spazio ma penso che non basterà perchè già gli ultimi 3 tasti non mi funzionano...  :sfiga:
Nulla è per caso

Lino

Citazione di: Santo il 28 Dicembre 2011, 06:08:05
Capisco che non è cosa buona spostarsi di registro, ora vedo di eliminare qualche routine e di fare spazio ma penso che non basterà perchè già gli ultimi 3 tasti non mi funzionano...  :sfiga:

Io ho dei dubbi che la causa del non funzionamento della routine controllo tastiera dipenda da quel registro; se vuoi fare la controprova spostala all'inizio del listato e se l'esito fosse negativo mandami via mail la routine completa.

Ciao, Lino


Santo iw9hlk

Ci sono tante routine, quelle del display non li posso spostare quelle dei ritardi no quelli dei tasti e memorie no mi sa che devo capire come utilizzare i salti di pagina... ora studio...
Nulla è per caso


Lino

Citazione di: Santo il 29 Dicembre 2011, 06:26:26
Ci sono tante routine, quelle del display non li posso spostare quelle dei ritardi no quelli dei tasti e memorie no mi sa che devo capire come utilizzare i salti di pagina... ora studio...

Mi riferivo a quella del controllo tastiera; mi sembra che hai detto che è durante l'esecuzione di questa routine che si blocca.

Io sono arrivato massimo a 1700 righe di listato col PIC16F877A per il controllo rotore e non ho mai dovuto affrontare questo problema; anche li c'è il display, tastiera, il modulo TX/RX da gestire, etc.

Un altro aspetto da tenere sotto controllo è il rientro dal "call"; se da qualche parte la routine non si chiude ne perdi il controllo.

Ciao, Lino

Santo iw9hlk

Il problema è semplice, c'è la routine del display, poi c'è la routine del controllo dei tasti della tastiera, quando premi il tasto avvengono due condizioni:
1) se premuto per un istante richiama la memoria del tasto
2) se premuto per 4 secondi memorizza il valore nella memoria eeprom.
quindi va a leggere e scrivere sulla eeprom, calcola che sono 16 tasti per tutte quelle istruzioni, poi c'è il reset totale dei tasti, il controllo dei finecorsa, ecc.
Non sò, sono arrivatoa far entrare solo 7 tasti su 16 se continuo il pic da i numeri ma fino a 7 funziona perfetto. mi sorge una domanda, per cancellare una allocazione di memoria della eeprom utilizzo questa routine:
BSF STATUS, RP1 ;
      BSF STATUS, RP0 ;Bank 3
      BTFSC EECON1, WR ;Wait for
      GOTO $-1 ;write to finish
      BCF STATUS, RP0 ;Bank 2
      MOVLW 0000H
      MOVWF EEADRH
      MOVLW 0006H
      MOVWF EEADR
      BCF STATUS,RP1
      CLRW
      MOVLW b'00000000'   ;NumH,0
      BSF STATUS,RP1
      MOVWF EEDATA
      BSF STATUS,RP0
      BCF EECON1,EEPGD
      BSF EECON1,WREN
      MOVLW 0X55
      MOVWF EECON2
      MOVLW 0XAA
      MOVWF EECON2
      BSF EECON1,WR

      BTFSC EECON1,WR
      GOTO $-1
      BCF EECON1,WREN

      BCF STATUS, RP0
      BCF STATUS, RP1
      
per semplificare la cosa cioè cancellarle quasi tutte ad esempio da 003H a 015H cosa posso fare?? Perchè io utilizzo questa per ogni allocazione, e mi occupa spazio.
Nulla è per caso


Lino

La routine standard di scrittura/cancellazione mi sembra corretta.

Per cancellare quelle memorie in sequenza creerei una variabile che assume ciclicamente i valori da da 03 a 15 con incremento di 1; ad ogni ciclo richiamerei la routine di cancellazione dove questa variabile rappresenta anche l'indirizzo della memoria da cancellare; quando la variabile diventa maggiore di 15 significa che hai finito di cancellare.

Spero di essermi spiegato in modo chiaro.

Ciao, Lino





Santo iw9hlk

Nulla è per caso


Santo iw9hlk

Grazie Lino, sono riuscito a creare quella routine, per cancellare tutte le allocazioni di memoria, ma ho dovuto anche spostare l'istruzione BCF STATUS, RP0 ;Bank 2 perchè non mi riconosceva il registro che "decrementava" ad ogni passaggio. Ora vedo il link...
Nulla è per caso


Lino

Citazione di: Santo il 31 Dicembre 2011, 07:46:21
Grazie Lino, sono riuscito a creare quella routine, per cancellare tutte le allocazioni di memoria, ma ho dovuto anche spostare l'istruzione BCF STATUS, RP0 ;Bank 2 perchè non mi riconosceva il registro che "decrementava" ad ogni passaggio. Ora vedo il link...


Si, li dovevi fare giocoforza un doppio passaggio; purtroppo il numero delle istruzioni è limitato è bisogna regolarsi di conseguenza.

Auguri di Buon Anno, Lino