Assembler per PIC - Pagina 2 - BaroneRosso.it - Forum Modellismo

Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 13 dicembre 07, 20:52   #11 (permalink)  Top
User
 
L'avatar di faustog
 
Data registr.: 28-02-2006
Messaggi: 1.059
a parte gli inconvenineti dovuti al poco tempo a disposizione .. trovo piuttosto chiaro l'argomento assembler sul tanzilli .. è solo una questione di esperinza .. per esempio lavorare con numeri a 16 bit.. se lo fai una volta e capisci il meccanismo il gioco è fatto.. ..oppure costruire un array oppure le if fatte attraverso somme o sottrazioni e controllo dei bit C e Z di STATUS ..insomma sono 4 cose che occorre farsele bastare per far tutto..
comunque facendo bene il diagramma di flusso il lavoro viene facilitato..

invece ti posso assicurare che è traumatico passare dalla programmazione in C classica strutturata a quella Orientata agli Oggetti.. tempo fà feci veramente fatica..... capire le associazioni tra classi le interfacce e i tutti i Java Design Patterns.. ...molto faticoso..

comunque mi fa piacere intraprendere l'assembler per PIC e mi fa piacere di poter scambiare opinioni

..GRAZIE per la tua disponibilità

a dopo
fausto

Citazione:
Originalmente inviato da jijuja
Ok,comunque mi interessa continuare questa discussione,
se posso commentarti ti duco che tu pensi in C,
devi pensare in assembler per lavorare con l'assembler...
Il contrario di quello che faccio io!
Penso in assembler e vorrei lavorare in C BENE...
Sto cercando di cambiare il mio modo di pensare anzi espanderlo...
faustog non è collegato   Rispondi citando
Vecchio 13 dicembre 07, 22:43   #12 (permalink)  Top
User
 
L'avatar di faustog
 
Data registr.: 28-02-2006
Messaggi: 1.059
rimanendo in tema ho trovato qualcosa che non mi spiego..


nel tanzilli c'è un capitolo che riguarda la porta seriale trovo strane le seguenti istruzioni:

#DEFINE PULS PORTA,0 ;Pulsante (a riposo=1)
;-----------------------------------------------------
ORG 0
MOVLW 7
MOVWF CMCON ;PORTA=I/O digitali

MAINLOOP BTFSC PULS ;Attende pressione pulsante

la BTFSC PORTA, 0 come fa a funzionare se non c'è a monte un istruzione di somma o differenza.. ..a monte vi è una istruzione MOVWF che però non cambia i valori dei bit C o Z..

riesci a spiegarlo ..perchè io questo non lo capisco!!

a dopo
fausto





Citazione:
Originalmente inviato da jijuja
Ok,comunque mi interessa continuare questa discussione,
se posso commentarti ti duco che tu pensi in C,
devi pensare in assembler per lavorare con l'assembler...
Il contrario di quello che faccio io!
Penso in assembler e vorrei lavorare in C BENE...
Sto cercando di cambiare il mio modo di pensare anzi espanderlo...
faustog non è collegato   Rispondi citando
Vecchio 13 dicembre 07, 23:35   #13 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Usando i PIC e simili micro con poche risorse e privi di fpu è bene effettuare tutti i calcoli usando interi e non floating point.

Per le divisioni poi è molte volte conveniente utilizzare una combinazione di shift right + sottrazione, in tal modo si risparmia tempo di elaborazione e spazio di memoria.

Comunque sviluppare applicazioni complesse magari in multi-tasking o deterministiche in assembler è decisamente time-consuming.

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 14 dicembre 07, 01:07   #14 (permalink)  Top
jijuja
Guest
 
Messaggi: n/a
L'istruzione BTFSC PORTA,0 ha questo significato:

testa il bit del registro "f" cioè PORTA e salta la prossima
istruzione se questo bit vale 0.
Fino a quì sembra chiaro,lo "0" che segue la virgola stà ad indicare
il primo bit (meno significativo) quindi,essendo la PORTA una delle due porte
"esterne" (cioè per precisione il registro PORTA prende il valore
della porta A se questa è configurata come ingresso)
del 16F84 e se guardi sulla descrizione dei "piedini" equivale a RA0.
riassumendo se su questo piedino si presenta un valore 0V
viene ignorata l'istruzione successiva.
Il tuo discorso sui Flag sarebbe corretto se al posto di prendere PORTA
come parametro "f" fosse stato preso STATUS che è il registro che contiene
i flag z,c ecc...
Nota che le istruzioni di salto usano 2 cicli per essere eseguite,
per l'architettura del Pic queste istruzioni,non sapendo quale è l'indirizzo della seguente fino a che non viene svolta praticamente usa 2uS
a 4 Mhz per essere eseguita. (curiosità che mi sembra il sito di tanzilli non
prenda in considerazione (ho detto mi sembra))

In risposta a ElNonino :

Certamente hai ragione e sai quello che dici,
io personalmente non uso numeri a virgola mobile
ne con segno in assembler
(se non convertendogli in numero intero)
comunque quello che dici è perchè conosci anche l'assembler.
Il giorno d'oggi tutti vengono indirizzati verso linguaggi ad alto livello
senza farsi le ossa con l'asm e questo lo trovo sbagliato perchè,
ad alto livello si tende a trascurare l'architettura delle macchine che si usano.
Sicuramente a livello didattico è importante capire tali micro e poi
si possono sfruttare meglio conoscendo l'architettura.
Potrei dirti che anche i programmatori ad alto livello
in gamba sanno usare l'asm perchè per risolvere alcuni problemi
in real time non c'è altra soluzione.
Se tutto quello che si vuole è il risultato senza approfondire
sarebbe convegnente usare esempio un 16F870 a 20 Mhz
in Basic strutturato tipo Microbasic e nonostante la non ottimizzazione
del codice si raggiungerebbero risultati in poco tempo
poi vista la maggior memoria e velocità...
non sò se mi spiego...
Certamente il C è più vicino all'assembler del Basic
e specialmente se usato senza comandi speciali cioè solo Ansi C...
Penso anche io sia la migliore soluzione ma sul 16F84
trovo l'asm con il quale 1000 istruzioni di capacità permettono di arrivare
molto lontano,esempio il Basic consente di andare ben poco lontano.

Concordi?
  Rispondi citando
Vecchio 14 dicembre 07, 15:23   #15 (permalink)  Top
jijuja
Guest
 
Messaggi: n/a
Ciao,
dopo le nostre discussioni questa notte mi sono letto il corso di Tanzilli...
(sinceramente a parte una visione molto superficiale non lo avevo mai letto...)
Effettivamente non c'è un esempio di divisione...chissà dove lo avevo visto...?!?!?!?
Poi ho cercato di approfondire la programmazione con MPLAB (ultima versione)
ed ho fatto quello che,sono convinto,pochi di noi (primo io) fanno cioè
leggere il manuale!!!!!!!!!!!!!!!!!!!!!!!!!!!!! (Help on line).
Ovviamente mi sono accorto che oltre alle 35 istruzioni (uniche in qualsiasi caso alla fine entranti nel Micro)
ed alcune direttive usate sempre ci sono un totale di 64 (se non ricordo male) direttive per l'assembler.
Con queste (ho dato una letta sommaria) si può lavorare veramente "ad alto livello"
e mi correggo anche sull'uso delle variabili che effettivamente usando le direttive si possono usare
anche a livello non globale...
Ovviamente la sintassi resta quella dell'Assembler ma le direttive rendono la programmazione del micro
+ simile a quello che si fà con il C.
Ora resta il grosso dilemma...approfondisco l'Assembler (MPLAB rivolto ai Pic)
o mi imparo per bene il C ???
Si,perchè il C poi posso sfruttarlo anche sugli altri micro (portabilità del codice)
mentre l'Assembler del Pic è del Pic (comunque importante da sapere)
Specifico che per utilizzare il Basic non ce ne frega niente della struttura interna del micro
mentre il C usato come Ansi richiede la conoscenza della "macchina" su cui lavoriamo essendo
che i vari registri speciali e non gli configuriamo manualmente.

Mà...farò qualche prova cioè programmi usando anche le direttive in Mplab ed usando il C
per poi compilargli in assembler puro ed andare a vedere le differenze come codice!

Penso comunque che il linguaggio vada scelto in base alle proprie esigenze,cosa si fà con il micro
e perchè nò preferenze personali.
Dubito che si possa dire (è meglio questo o è meglio quello)
dipende da cosa si vuole fare ed ottenere.
Certo è che un buon programma buttato giù in assembler
non ha nulla da invidiare a software scritti in C se non il tempo di "scrittura"
(((vedete che mi stò mordendo la coda???)))

Curiosità: ho confrontato il Pr di tanzilli per scrivere sull'LCD con il mio (scritto ancora anni fà)
e posso dire che anche se ovviamente molto diversi come stesura + o - le istruzioni sono quelle
ma VINCO IO!!! perchè poi 1 lettera in + da stampare per Tanzilli sono 2 istruzioni mentre io ne uso una!!!
Un'altra cosa,il mio è ottimizzato per "ricevere" numeri in ASCII
da visualizzare anzi dirò di +,oltre a questo modulo ho inserito un altro modulo per la conversione di numeri in binario da 16 bit
con il quale faccio la conversione in caratteri decimanli ASCII poi verso l'LCD...

Conclusioni?
Consiglio in assembler di procedere a moduli (così gli chiamo) inserendogli poi nel Pr
come sottoroutine perchè lavorare a moduli indipendenti permette di riutilizzargli in altri programmi
e comunque di lavorare su piccole parti di programma quindi facilmente e testarle separatemente.

Ciao!
  Rispondi citando
Vecchio 14 dicembre 07, 17:48   #16 (permalink)  Top
User
 
L'avatar di ElNonino
 
Data registr.: 06-05-2007
Residenza: Tre Ville (Preore)
Messaggi: 3.605
Invia un messaggio via MSN a ElNonino
Diciamo che quelli che tu chiami moduli in realtà in assembler si chiamano macro.

Infatti quello da microchip è un macro assembler, inoltre se guardi l'Application Maestro vedrai che il tuo concetto è usato e spiegato.

Personalmente mi son creato una libreria di macro in assembler che utilizzo in caso di risorse ridotte all'osso e necessità di velocità d'esecuzione particolari.

In genere preferisco il C ANSI poichè dovendo spesso utilizzare altri tipi di processori il codice risulta essere più portatile.

Poichè per quanto riguarda l'interfaccia utente dei micro collegati ad un PC utilizzo da moltissimi anni DELPHI, mi piacerebbe trovare un compilatore Pascal anche per i micro; quelli attuali sono pieni di bug e generano codice non molto ben ottimizato.

__________________
Peace & Love
Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein)
ElNonino non è collegato   Rispondi citando
Vecchio 14 dicembre 07, 18:50   #17 (permalink)  Top
User
 
L'avatar di Claudio_F
 
Data registr.: 02-04-2005
Messaggi: 2.050
Citazione:
Originalmente inviato da jijuja
Effettivamente non c'è un esempio di divisione...chissà dove lo avevo visto...?!?!?!?
Magari era il mio: http://stor.altervista.org/pic/div/div.htm (dovrebbero funzionare, non le ho mai testate a fondo, quella che sicuramente funziona e' quella modificata per dividere un numero da 24 bit per un numero da 16 con risultato da 16 nel programma del contagiri)

Citazione:
Originalmente inviato da faustog
l'idea di base è che dividendo - divisore ..per n volte fin quando > 0 ogni ciclo si incrementa RISULTATO
E' un sistema sicuramente funzionante ma decisamente inefficiente (parlando di tempi di esecuzione) se il dividendo e' molto grande e il divisore molto piccolo, ad esempio dividere 65535 per 1 col tuo sistema richiede 65535 sottrazioni, mentre con un altro algoritmo (scorrimento e sottrazione) ne bastano 16
Claudio_F non è collegato   Rispondi citando
Vecchio 14 dicembre 07, 19:56   #18 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Visto che siamo in argomento 'operazioni matematiche' sul sito Microchip ci sono queste application notes con routine già fatte (e bene!) per le operazioni matematiche sia in virgola fissa che mobile: c'è sempre qualcosa da imparare...

AN526 PIC16C5x/PIC16Cxx Utility Math Routines
AN544 Math Utility Routines
AN575 IEEE 754 Compliant Floating Point Routines
AN617 Fixed Point Routines
AN660 Floating Point Routines
AN670 Floating Point to ASCII Conversion
TB040 Fast Integer Square Root


Michele
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 15 dicembre 07, 09:27   #19 (permalink)  Top
jijuja
Guest
 
Messaggi: n/a
ElNonino :
In genere preferisco il C ANSI poichè dovendo spesso utilizzare altri tipi di processori il codice risulta essere più portatile.

Sotto questo punto di vista concordo pienamente!

Claudio_F :
Magari era il mio: http://stor.altervista.org/pic/div/div.htm

Sì! era proprio il tuo!
Lo avevo notato nel periodo che ho implementato le varie operazioni a 16 Bit com MCU a 8 Bit in Assembler.
Intanto ti faccio i complimenti perchè quei pezzetini di codice sono proprio scritti bene,cioè chiunque
riesce ad utilizzargli su di un proprio programma viste la caratteristiche di chiarezza!!!

Il mio codice per effettuare le stesse operazioni funziona nel modo tutto similare,
sono andato a rivedermelo e ricordo pure come ho fatto ad arrivarci :

Quando ho pensato di implementare le operazioni ho fatto una ricerca su come si eseguivano
in binario,su di un sito ho trovato la spiegazione e c'èra indicato un modo per svolgerle a mano su carta...
Praticamente è lo stesso sistema implementato a codice "shift register" e permette,come dici,con un numero di cicli limitato
di arrivare al risultato...

MSchiepp :
visto che siamo in argomento 'operazioni matematiche' sul sito Microchip ci sono queste application notes con routine già fatte (e bene!)
per le operazioni matematiche sia in virgola fissa che mobile: c'è sempre qualcosa da imparare...

Sono andato a vedermele,buona segnalazione,ad occorrenza vedrò di sfruttarle anche se a quel punto (es. virgola mobile)
si prevede di utilizzarle per software un pò + raffinati quindi in linea di massima su Micro con + di 2K memoria...
A quel punto risulta sicuramente convegnente lavorare in C e non in Assembler,
a mio avviso quando la complessità ed il codice cresce oltre i 2-3K è l'ora di utilizzare un altro linguaggio almeno per la propria salute mentale
nonostante sia convinto (oggettivamente è così) che l'unico linguaggio che prevede il controllo completo, sui tempi e sulla
singola allocazione di memoria nonchè ottimizzazione spintissima dle codice sia l'Assembler.

Ciao!
  Rispondi citando
Vecchio 16 dicembre 07, 12:14   #20 (permalink)  Top
User
 
L'avatar di faustog
 
Data registr.: 28-02-2006
Messaggi: 1.059
grazie a tutti ...grazie a jijuja..

ho appena letto.. purtroppo in modo superficiale.. ..aimè per mancanza di tempo ...in questi ultimi due giorni ho avuto molto da fare e non ho potuto leggere le vostre risposte, molto precise e chiare..
..non appena finirò di leggere le risposte con calma mi rimetterò a leggere il manuale di assembler. ...però da quello che ho appreso è che non avevo contemplato l'idea di eseguire la divisione in binario..

Il discorso della divisione era un pretesto per fare un esercizio.. per
non avevo contemplato l'idea di lavorare direttamente in binario.. ..comunque lo affronterò, appena ne avrò il tempo, e poi voglio provare con numeri a 16 bit.. in modo che maturo anche questa esperienza.. come per esempio sono curioso di implementare gli array..

.....la finalità però deve essere riuscire a leggere i segnali che vanno ai servi ed eventualmente pilotare i servi....

ho già letto qualcosa ho trovato delle istruzioni strane!! tipo
GOTO $+1 .....però devo ammettere che non ho letto con attenzione e non ho fatto nessuna prova.. ..per cui meglio riprendere il discorso dopo aver fatto una lettura più consona.. ..

grazie ancora e a dopo
fausto


Citazione:
Originalmente inviato da jijuja
L'istruzione BTFSC PORTA,0 ha questo significato:

testa il bit del registro "f" cioè PORTA e salta la prossima
istruzione se questo bit vale 0.
Fino a quì sembra chiaro,lo "0" che segue la virgola stà ad indicare
il primo bit (meno significativo) quindi,essendo la PORTA una delle due porte
"esterne" (cioè per precisione il registro PORTA prende il valore
della porta A se questa è configurata come ingresso)
del 16F84 e se guardi sulla descrizione dei "piedini" equivale a RA0.
riassumendo se su questo piedino si presenta un valore 0V
viene ignorata l'istruzione successiva.
Il tuo discorso sui Flag sarebbe corretto se al posto di prendere PORTA
come parametro "f" fosse stato preso STATUS che è il registro che contiene
i flag z,c ecc...
Nota che le istruzioni di salto usano 2 cicli per essere eseguite,
per l'architettura del Pic queste istruzioni,non sapendo quale è l'indirizzo della seguente fino a che non viene svolta praticamente usa 2uS
a 4 Mhz per essere eseguita. (curiosità che mi sembra il sito di tanzilli non
prenda in considerazione (ho detto mi sembra))

In risposta a ElNonino :

Certamente hai ragione e sai quello che dici,
io personalmente non uso numeri a virgola mobile
ne con segno in assembler
(se non convertendogli in numero intero)
comunque quello che dici è perchè conosci anche l'assembler.
Il giorno d'oggi tutti vengono indirizzati verso linguaggi ad alto livello
senza farsi le ossa con l'asm e questo lo trovo sbagliato perchè,
ad alto livello si tende a trascurare l'architettura delle macchine che si usano.
Sicuramente a livello didattico è importante capire tali micro e poi
si possono sfruttare meglio conoscendo l'architettura.
Potrei dirti che anche i programmatori ad alto livello
in gamba sanno usare l'asm perchè per risolvere alcuni problemi
in real time non c'è altra soluzione.
Se tutto quello che si vuole è il risultato senza approfondire
sarebbe convegnente usare esempio un 16F870 a 20 Mhz
in Basic strutturato tipo Microbasic e nonostante la non ottimizzazione
del codice si raggiungerebbero risultati in poco tempo
poi vista la maggior memoria e velocità...
non sò se mi spiego...
Certamente il C è più vicino all'assembler del Basic
e specialmente se usato senza comandi speciali cioè solo Ansi C...
Penso anche io sia la migliore soluzione ma sul 16F84
trovo l'asm con il quale 1000 istruzioni di capacità permettono di arrivare
molto lontano,esempio il Basic consente di andare ben poco lontano.

Concordi?
faustog non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato




Tutti gli orari sono GMT +2. Adesso sono le 14:11.


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