BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Help assembler pic (https://www.baronerosso.it/forum/circuiti-elettronici/125800-help-assembler-pic.html)

Milus 20 marzo 09 15:24

Help assembler pic
 
Mi arrendo e chiedo lumi!!!

Sono due giorni che tento disperatamente di compilare un programma assembler e non riesco a capire:

ho fatto un primo programmino che legge una tensione, la converte via ADC e visualizza il risultato su una serie di led... fin qui tutto bene... compilato, caricato sul pic (pic16f877a), provato e funziona.

Adesso volevo complicare il programma e per farlo ho la necessita di definire delle variabili e qui mi incarto: uso la direttiva org appropriata, definisco le variabili, poi, altra direttiva org a zero e scrivo il programma ma...

in fase di compilazione mi da degli errori di overwrithing a partire dall'indirizzo della prima variabile... come se le variabili le avesse definite nella program memory e non nel file register... aiuto, aiuto, aiuto

grazie

SoldatoSemplice 20 marzo 09 16:57

Org vuol dire origine, per ogni variabile che tu pensi di aver dichiarato con org in realta hai detto al PIC di cominciare a scrivere in quella posizione, le variabili si usano con res:

Variabile res 1

Vuol dire che devi riservare 1 byte alla variabile Variabile (cioè 8 bit).

E poi non devi dare org 0 altrimenti comincia a scrivere il tuo programma nella posizione 0 dove ci sono i registri del PIC, devi scaricarti il datasheet del pic che usi e vedere dove comincia la program memory (mi pare 0x20) allora dai org 0x20 e comincia a scrivere il programma.

Milus 20 marzo 09 19:19

Citazione:

Originalmente inviato da SoldatoSemplice (Messaggio 1419048)
Org vuol dire origine, per ogni variabile che tu pensi di aver dichiarato con org in realta hai detto al PIC di cominciare a scrivere in quella posizione, le variabili si usano con res:

Variabile res 1

Vuol dire che devi riservare 1 byte alla variabile Variabile (cioè 8 bit).

E poi non devi dare org 0 altrimenti comincia a scrivere il tuo programma nella posizione 0 dove ci sono i registri del PIC, devi scaricarti il datasheet del pic che usi e vedere dove comincia la program memory (mi pare 0x20) allora dai org 0x20 e comincia a scrivere il programma.

Intanto grazie per la risposta.
Ma io non ho definito le variabili con org, in pratica questo e' il codice:

PORTB EQU 0x06 ********qui ci sono le varie definizioni
PORTC EQU 0x07 dei nomi mnemonici dei registri
ADCON0 EQU 0x1F
ADRESH EQU 0x1E

__CONFIG 0x3d32 *** imposta configurazione pic

ORG 0x20 ****qui intendo spostarmi per non usare la prima
parte riservata
DH res 1 **** prima variabile
DL res 1 *** seconda variabile

ORG 0x00 ****qui intendo posizionarmi all'inizio della program
memory

****qui inizia il programma
BANKSEL TRISA ; Select TRISA <BANK1> ----seleziona banco 1
;imposta porte input/output
MOVLW B'11111111'
MOVWF TRISA ; Port A = input

Il problema e' che mi riserva le variabili nella program memory
anziche' nel file register... in effetti non capisco come faccia l'assembler
a capire che con il primo org intendo lavoare sulla ram e con il secondo
nella program memory...

Oh, puo darsi che farnetico ma...

Grazie ancora

marcosinatti 20 marzo 09 19:28

Sono arruginito in assembler, ma io utilizzavo sempre la direttiva EQU invece che RES, con la EQU specifichi propio l'indirizzo di memoria dove mettere la viariabile, così sei sicuro.
Se per dire il pic che usi ha la ram per le variabili che va da 0x20 puoi scrivere

DH equ 0x20
DL equ 0x21

Ricordati che se usi variabili diverse dal banco 0 devi fale lo switch dei bank.

Guida pratica al PIC 16F84 - Memoria RAM/FLASH/EEPROM

EDIT:Avevo sbagliato, ho corretto il messaggio e aggiungo un esempio Guida pratica al PIC 16F84 - Esempio pratico: led lampeggiante

MSchiepp 20 marzo 09 21:40

Citazione:

Originalmente inviato da Milus (Messaggio 1419297)
in effetti non capisco come faccia l'assembler
a capire che con il primo org intendo lavoare sulla ram e con il secondo
nella program memory...

In effetti non serve che lo capisca... quando definisci una variabile tu in realtà definisci l'indirizzo (cioè la cella di memoria) della variabile in cui scriverai e leggerai dei valori. Quando usi ad esempio l'istruzione movf xx,w il processore sa che deve prendere il valore contenuto nella locazione xx e metterlo nel registro w. Sono le istruzioni che usi che interpretano il valore come una locazione di memoria o una locazione di programma, non l'assemblatore!
Per definire le variabli hai tanti modi:
definire il valore assoluto di ogni variabile (dici tu dove è la variabile):
1) Dato EQU 0x12 vuol dire che la variabile Dato è nella locazione di memoria (dati) n. 0x12. sistema assolutamente sconsigliato.

2) Definire con ORG 0x0C l'inizio dell'area dati ed elencare le variabili specificando la direttiva RES n che riserva una o più locazioni di memoria
es:
ORG 0x0C ; inizio file register
Dato_1 res 1 ;locazione 0x0C
Dato_2 res 1 ;locazione 0x0D
... ecc. sistema comodo, ma non ottimale

3) Usare le direttive CBlock/endc che definiscono l'area variablili e che permettono di associare il nome delle variabili alle finestre di watch per il debug e permettono di creare una lista di simboli che aiuta nel debug del software. Es.

CBlock 0x0C ;inzio blocco
Dato_1
Dato_2
Dato_3
...
Dato_N
endc

Altro consiglio: invece di ridefinire i registri di sistema, includi il file del processore che stati usando (o quello generico pic.inc nelle ultime versioni) che contiene già tutti i nomi e gli indirizzi corretti dei registri per tutti i pic!

Michele

Milus 23 marzo 09 11:35

Grazie a tutti: problema risolto.

Studiando approfonditamente le guide di "mplab ide" e "mpasm" si scopre che
la definizione di variabili attraverso RES puo essere fatta solo per aree in 'program memory' (e non so a cosa possa servire) e anche in area 'file register' ma solo se si compila il source direttamente in codice 'absolute' al contrario se vuol generare un codice 'relocatable' o conunque un 'absolute' passando attraverso il linker le variabili devono essere definite con CBLOCK .

Ho provato e cosi' e': dunque mi sembra conveniente usare sempre e solo
CBLOCK

Grazie ancora per i suggerimenti


Tutti gli orari sono GMT +2. Adesso sono le 20:59.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002