
![]() | #1 (permalink) Top |
User Data registr.: 20-12-2006
Messaggi: 252
| 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 |
![]() | ![]() |
![]() | #2 (permalink) Top |
User Data registr.: 28-05-2005 Residenza: Roma
Messaggi: 660
|
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. |
![]() | ![]() |
![]() | #3 (permalink) Top | |
User Data registr.: 20-12-2006
Messaggi: 252
| Citazione:
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 | |
![]() | ![]() |
![]() | #4 (permalink) Top |
User Data registr.: 10-06-2007 Residenza: Sansepolcro (Ar)
Messaggi: 1.948
|
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 Ultima modifica di marcosinatti : 20 marzo 09 alle ore 19:35 |
![]() | ![]() |
![]() | #5 (permalink) Top | |
User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| Citazione:
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
__________________ __________________________________________________ The worst day flying is better than the best day working. | |
![]() | ![]() |
![]() | #6 (permalink) Top |
User Data registr.: 20-12-2006
Messaggi: 252
|
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 |
![]() | ![]() |
![]() |
Bookmarks |
| |
![]() | ||||
Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
PIC, LCD & assembler... | lorenzobonciani | Circuiti Elettronici | 3 | 14 febbraio 08 19:14 |
Assembler per PIC | faustog | Circuiti Elettronici | 21 | 16 dicembre 07 23:49 |
i pic.????????? | pilo | Circuiti Elettronici | 12 | 24 gennaio 05 19:07 |
pic | Bissi | CNC e Stampanti 3D | 5 | 25 maggio 04 09:39 |
Pic, mio caro Pic.... | fai4602 | Circuiti Elettronici | 7 | 24 novembre 03 19:34 |