BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Assembler per PIC (https://www.baronerosso.it/forum/circuiti-elettronici/73653-assembler-per-pic.html)

faustog 11 dicembre 07 18:49

Assembler per PIC
 
non so chi di voi si occupa di programmazione dei PIC..
premetto che io sono un programmatore : JAVA, C, C++, PHP, Visual Basic ecc
insomma solo linguaggi ad alto livello... .l'assembler dell' 8088 studiato solo teoricamente all'Università
..con i PIC sto iniziando da poco ..però non ho il programmatore.. vorrei acquistarlo più in là quando avrò acquisito una certa dimestichezza..
la mattina mi alzo alle 6:00 e prima di andare a lavoro mi faccio un oretta.. stamani mi sono assegnato l'esercizio di realizzare la divisione.. ..vorrei sapere da qualche anima buona se per il 16F84 è giusta la seguente routine,
ovvero se c'è qualcuno che la provi per me che non ho appunto il programmatore!

a dopo
faustog:

;-----------------------------------------------------
; Divisione = numero di volte che il DIVIDENDO puo essere
; sottratto dal DIVISORE. per esempio 8:3
; by FaustoG
;-----------------------------------------------------
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84.INC"

ORG 0

EQU RISULTATO 18
EQU DIVISORE 20
EQU DIVIDENDO 22

CLRF RISULTATO
MOVLW 8
MOVWF DIVIDENDO ;carica 8 nel registro DIVIDENDO
MOVLW 3 ;carica il DIVISORE nell accumulatore
AA SUBWF DIVIDENDO, F ; sottrae al DIVIDENDO il DIVISORE
BTFSC STATUS, C ;se C=0 allora salta alla FINE perche
GOTO INCR ;il DIVIDENDO ha raggiunto lo zero oppure
GOTO FINE ;e negativo
INCR INCF RISULTATO
GOTO AA
FINE BSF STATUS, PR0
CLRF TRISB
BCF STATUS,RP0
MOVF RISULTATO, W
MOVWF PORTB
SLEEP

Invece il resto rimane nel registro DIVIDENDO.

a dopo
fausto

ElNonino 11 dicembre 07 19:23

Guarda che se usi l'ambiente di sviluppo MPLAB della Microchip con il relativo assembler, puoi testare il tuo programma anche senza possedere il programmatore.

Personalmente, poichè utilizzo i PIC professionalmente e per applicazioni piuttosto complesse, programmo in C ed utilizzo l'assembler solo per alcune routine molto critiche come temporizzazione. Esistono anche molte librerie ben testate anche per l'assembler.

Buoni esperimenti.

:yeah:

faustog 11 dicembre 07 22:57

grazie..
 
grazie non lo sapevo. ...appunto da vero neofita non so le cose più banali.. .il
MPLAB è gratuito oppure serve la licenza?
bene penso che comunque mi piacerebbe affrontare la programmazione in assembler ...visto che i PIC hanno un numero ridottissimo di risorse... e poi magari dopo che avrò cazzeggiato abbastanza in assembler passerò al C ..che sicuramente è più familiare..

..ti spiego il mio obbiettivo è quello di realizzare un insieme di librerie JAVA o meglio classi Java per palmari.. .i quali attraverso la USB pilotano i servi di un aereo..

http://www.pololu.com/products/pololu/0390/

Quindi l'utente finale potrebbe in futuro scaricare da Internet software per computer palmari .. .installare su l proprio aeromodello il palmare più il servocontroller e ...via.... ..altro che UAV!!

a dopo
fausto






Citazione:

Originalmente inviato da ElNonino
Guarda che se usi l'ambiente di sviluppo MPLAB della Microchip con il relativo assembler, puoi testare il tuo programma anche senza possedere il programmatore.

Personalmente, poichè utilizzo i PIC professionalmente e per applicazioni piuttosto complesse, programmo in C ed utilizzo l'assembler solo per alcune routine molto critiche come temporizzazione. Esistono anche molte librerie ben testate anche per l'assembler.

Buoni esperimenti.

:yeah:


MSchiepp 11 dicembre 07 23:42

Citazione:

Originalmente inviato da faustog
MPLAB è gratuito oppure serve la licenza?

E' gratuito! Lo scarichi dal sito Microchip e hai sia la funzione simulatore che ti permette di vedere passo passo o a blocchi il funzionamento del programma, con la trace dei registri/variabili che ti interessano e con la funzione 'logic analyzer' vedi anche lo stato dei pin del micro proprio come se stessi usando un analizzatore logico!

Michele

jijuja 12 dicembre 07 00:12

Citazione:

Originalmente inviato da faustog
grazie non lo sapevo. ...appunto da vero neofita non so le cose più banali.. .il
MPLAB è gratuito oppure serve la licenza?
bene penso che comunque mi piacerebbe affrontare la programmazione in assembler ...visto che i PIC hanno un numero ridottissimo di risorse... e poi magari dopo che avrò cazzeggiato abbastanza in assembler passerò al C ..che sicuramente è più familiare..

..ti spiego il mio obbiettivo è quello di realizzare un insieme di librerie JAVA o meglio classi Java per palmari.. .i quali attraverso la USB pilotano i servi di un aereo..

http://www.pololu.com/products/pololu/0390/

Quindi l'utente finale potrebbe in futuro scaricare da Internet software per computer palmari .. .installare su l proprio aeromodello il palmare più il servocontroller e ...via.... ..altro che UAV!!

a dopo
fausto

Ciao,a parte le tue idee sull'UAV che risultano a questo punto chiare
ti posso dire che esistono già molti software per palmari
che "pilotano" dei servo,in Germania ho visto molte volte
modellisti che mettevano a punto il proprio modello al campo
utilizzando il palmare,adirittura ti posso dire che ci sono delle riceventi
in commercio che si interfacciano con il palmare via Usb ed anche wireless.
Passando al sodo ti confermo che Mplab è gratuito,si scarica dal sito
della Microchip ed è integrato (ultime versioni) con Picc Lite della Hitech
cioè ti permette di utilizzare tale software (già compreso) per programmare
nello stesso ambiente di sviluppo in Ansi C i Pic, tale è Free fino a 2K linee
di codice (tradotte in assembler) quindi è praticamente senza limitazioni con il
16F84.
Io,su tali piccoli micro uso di default l'assembler proprio per
l'ottimizzazione che riesci a raggiungere (usandolo correttamente)
e lavori in modo trasparente quando la gestione dei tempi,
come detto sopra,è critica.
Per quanto riguarda la divisione il codice,mi dispiace dirtelo,è
assolutamente inuttilizzabile messo giù così,sembra più "C" che assembler.
Ti consiglio di andarti a vedere "Pic By Exemple" corso veramente
fatto bene per capire l'assembler.
Lì trovi anche degli esempi di codice per divisione a 8 bit e 16 bit con
Micro a 8 bit quali sono i Pic serie 16.
Il C,che stò prendendo in considerazione in questo periodo,
non perchè ne senta l'esigenza ma perchè dicono tutti essere "migliore"
quindi a mio avviso và provato ti permette di sviluppare molto + velocemente
i software senza complicazioni ma a livello di codice
(provato) non ti permette di ottenere la stessa compattezza e velocità che ti permette l'assembler.
Ho provato ad utilizzare gli LCD con il C ed il Basic per confrontare
il software che avevo sviluppato a suo tempo in assembler...
praticamente il codice prodotto è 1/3 più grande in C e circa 3 volte in Basic...
certo che in C o in Basic ci vogliono 20 minuti (senza utilizzare
i comandi pre-compilati) ed in Assembler all'epoca ci sono voluti giorni di lavoro...

Ciao!

faustog 12 dicembre 07 19:38

ok
 
grazie a tutti..
x jijuja.. ... si in effetti il discorso dei palmari è azzeccato.. ..però vorrei sapere se esiste già un driver per JAVA tale che attraverso l'import del pakage pre-posto posso utilizzaree delle classi che comunicano con il servo controller.. dal palmare ovviamente.. ..penso che ciò sarebbe fantastico.. .

Per il corso consigliato da te ..sto proprio seguendo quello da te suggerito..


a dopo
fausto

Citazione:

Originalmente inviato da jijuja
Ciao,a parte le tue idee sull'UAV che risultano a questo punto chiare
ti posso dire che esistono già molti software per palmari
che "pilotano" dei servo,in Germania ho visto molte volte
modellisti che mettevano a punto il proprio modello al campo
utilizzando il palmare,adirittura ti posso dire che ci sono delle riceventi
in commercio che si interfacciano con il palmare via Usb ed anche wireless.
Passando al sodo ti confermo che Mplab è gratuito,si scarica dal sito
della Microchip ed è integrato (ultime versioni) con Picc Lite della Hitech
cioè ti permette di utilizzare tale software (già compreso) per programmare
nello stesso ambiente di sviluppo in Ansi C i Pic, tale è Free fino a 2K linee
di codice (tradotte in assembler) quindi è praticamente senza limitazioni con il
16F84.
Io,su tali piccoli micro uso di default l'assembler proprio per
l'ottimizzazione che riesci a raggiungere (usandolo correttamente)
e lavori in modo trasparente quando la gestione dei tempi,
come detto sopra,è critica.
Per quanto riguarda la divisione il codice,mi dispiace dirtelo,è
assolutamente inuttilizzabile messo giù così,sembra più "C" che assembler.
Ti consiglio di andarti a vedere "Pic By Exemple" corso veramente
fatto bene per capire l'assembler.
Lì trovi anche degli esempi di codice per divisione a 8 bit e 16 bit con
Micro a 8 bit quali sono i Pic serie 16.
Il C,che stò prendendo in considerazione in questo periodo,
non perchè ne senta l'esigenza ma perchè dicono tutti essere "migliore"
quindi a mio avviso và provato ti permette di sviluppare molto + velocemente
i software senza complicazioni ma a livello di codice
(provato) non ti permette di ottenere la stessa compattezza e velocità che ti permette l'assembler.
Ho provato ad utilizzare gli LCD con il C ed il Basic per confrontare
il software che avevo sviluppato a suo tempo in assembler...
praticamente il codice prodotto è 1/3 più grande in C e circa 3 volte in Basic...
certo che in C o in Basic ci vogliono 20 minuti (senza utilizzare
i comandi pre-compilati) ed in Assembler all'epoca ci sono voluti giorni di lavoro...

Ciao!


faustog 12 dicembre 07 19:46

ops!
 
[...Per quanto riguarda la divisione il codice,mi dispiace dirtelo,è
assolutamente inuttilizzabile messo giù così,sembra più "C" che assembler.]

Si in effetti era un programma in C che faccio ai ragazzi diciamo che ho usato lo stesso diagramma di flusso solo che mi hanno consigliato di
cambiare il salto con questo che in effetti dovrebbe essere più ottimale perchè
la BTFSS salta se la C = 1 e siccome per la sottrazion la C vale = 1 fin quando il risultato è maggiore di zero quindi salta ed esegue l'incremento ..... fino a quando la sottrazione non produce un numero negativo a quel punto esegue il GOTO per chiudere


AA----SUBWF DIVIDENDO, F
------BTFSS STATUS, C
------GOTO FINE
------INCF RISULTATO,F
------GOTO AA
FINE-- BSF STATUS, PR0

==============================================






Citazione:

Originalmente inviato da faustog
grazie a tutti..
x jijuja.. ... si in effetti il discorso dei palmari è azzeccato.. ..però vorrei sapere se esiste già un driver per JAVA tale che attraverso l'import del pakage pre-posto posso utilizzaree delle classi che comunicano con il servo controller.. dal palmare ovviamente.. ..penso che ciò sarebbe fantastico.. .

Per il corso consigliato da te ..sto proprio seguendo quello da te suggerito..


a dopo
fausto


jijuja 13 dicembre 07 01:15

Ciao,
Premessa :
Io,ogni volta che creo una parte di codice per "dividere" mi viene diverso...non lo sò perchè ma ti posso dire che ci sono molti modi per farlo
ed in base a dove và utilizzata la ottimizzo.
Certo è che molto deriva dal fatto che in assembler si utilizzano solo variabili globali,problema che con il C non C'è!
Pensa che adirittura io non uso quasi mai la direttiva "Include" ma definisco programma per programma i registri,definizioni e variabili che mi servono
sempre in base a cosa devo fare.
potrei indicarti come procederei io per creare una divisione in assembler come credo la abbia pensata tù :
serve un registro uso contatore (risultato),c'è un dividendo,un divisore ed un eventuale resto...approposito,di solito uso un bit di un registro
anche per definire condizioni di errore tipo divisione per 0 (che non è possibile)
L'ambiente che definisco è 8 bit,numero intero senza virgola e segno. Volendo prevedere ciò o divisioni 16-32 o esagerando 64 bit le cose si complicano non poco.
Allora,prendo il valore da dividere e lo carico in un registro,il valore per il quale dividere e lo carico in un altro registro,
controllo se è 0 ed in caso esco con errore altrimenti eseguo la sottrazione...verifico con il flag appropriato se sono passato per lo 0,in questo caso
la divisione ha solo resto altrimenti carico il risultato nel registro del valore da dividere,incremento il contatore e rieseguo la sottrazione con questo nuovo valore,
ripeto il controllo,eventualmente esco con risultato altrimenti incremento il contatore,ricarico ecc....
Con questo volevo solo renderti l'idea di come procederei!
Pensa (lo sai) che con il C o con il Basic....pensi divido e dividi!!!!
Per questo molti non prendono in considerazione l'assembler...

Ciao!

Ps. se trovassi il tempo ti scriverei un pò di codice ma sono incasinatissimo,in caso chiedi che ti dò le indicazioni che posso!
Approposito,per quanto riguarda il discorso dei palmari,se ricordo bene
una delle ditte che produce le riceventi con ingresso USB per
interfacciarsi con tali è la ACT (.de)
e visto il trattamento ricevuto in alcune occasioni da loro penso che se chiedi
ti darebbero sicuramente i parametri per scambiare i dati con esse,da lì puoi realizzare il Software che ti serve.

faustog 13 dicembre 07 16:48

grazie..
 
grazie jijuja..

no preoccuaprti.. ..qui nel forum ci basta scambiare due chiacchiere.. ..la divisione la faccio fare ai ragazzi di terza in C dicendo loro che possono usare solo incrementi e decrementi e controllare se una variabile sia maggiore di zero oppure no con i cicli while o for.. ..

l'idea di base è che dividendo - divisore ..per n volte fin quando > 0
ogni ciclo si incrementa RISULTATO

per esempio se devo fare 10 : 3 devo pensare di fare:

------10 - 3 = 7 // 7 - 3 = 4 // 4 - 3 = 1 // 1 è < 3 quindi STOP
R=0 // 1 // 2 // 3 //

allora abbiamo 3 con il resto di uno . Ovvero la divisione è ottenuta dalla variabile che incremento ogni ciclo.. . il resto è il valore che rimane del dividendo

va be adesso scendo giu e mi faccio un voletto con l'easy glider ..prima che fa buio

a dopo
fausto




Citazione:

Originalmente inviato da jijuja
Ciao,
Premessa :
Io,ogni volta che creo una parte di codice per "dividere" mi viene diverso...non lo sò perchè ma ti posso dire che ci sono molti modi per farlo
ed in base a dove và utilizzata la ottimizzo.
Certo è che molto deriva dal fatto che in assembler si utilizzano solo variabili globali,problema che con il C non C'è!
Pensa che adirittura io non uso quasi mai la direttiva "Include" ma definisco programma per programma i registri,definizioni e variabili che mi servono
sempre in base a cosa devo fare.
potrei indicarti come procederei io per creare una divisione in assembler come credo la abbia pensata tù :
serve un registro uso contatore (risultato),c'è un dividendo,un divisore ed un eventuale resto...approposito,di solito uso un bit di un registro
anche per definire condizioni di errore tipo divisione per 0 (che non è possibile)
L'ambiente che definisco è 8 bit,numero intero senza virgola e segno. Volendo prevedere ciò o divisioni 16-32 o esagerando 64 bit le cose si complicano non poco.
Allora,prendo il valore da dividere e lo carico in un registro,il valore per il quale dividere e lo carico in un altro registro,
controllo se è 0 ed in caso esco con errore altrimenti eseguo la sottrazione...verifico con il flag appropriato se sono passato per lo 0,in questo caso
la divisione ha solo resto altrimenti carico il risultato nel registro del valore da dividere,incremento il contatore e rieseguo la sottrazione con questo nuovo valore,
ripeto il controllo,eventualmente esco con risultato altrimenti incremento il contatore,ricarico ecc....
Con questo volevo solo renderti l'idea di come procederei!
Pensa (lo sai) che con il C o con il Basic....pensi divido e dividi!!!!
Per questo molti non prendono in considerazione l'assembler...

Ciao!

Ps. se trovassi il tempo ti scriverei un pò di codice ma sono incasinatissimo,in caso chiedi che ti dò le indicazioni che posso!
Approposito,per quanto riguarda il discorso dei palmari,se ricordo bene
una delle ditte che produce le riceventi con ingresso USB per
interfacciarsi con tali è la ACT (.de)
e visto il trattamento ricevuto in alcune occasioni da loro penso che se chiedi
ti darebbero sicuramente i parametri per scambiare i dati con esse,da lì puoi realizzare il Software che ti serve.


jijuja 13 dicembre 07 19:16

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 13 dicembre 07 20:52

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 13 dicembre 07 22:43

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...


ElNonino 13 dicembre 07 23:35

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.

:yeah:

jijuja 14 dicembre 07 01:07

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?

jijuja 14 dicembre 07 15:23

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!

ElNonino 14 dicembre 07 17:48

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.

:yeah:

Claudio_F 14 dicembre 07 18:50

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 :wink:

MSchiepp 14 dicembre 07 19:56

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

jijuja 15 dicembre 07 09:27

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!

faustog 16 dicembre 07 12:14

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?


Claudio_F 16 dicembre 07 15:10

Citazione:

Originalmente inviato da faustog
.....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 lettura/generazione impulsi servi c'e' qualche idea su:
http://stor.altervista.org/elettroni...ci/eliluci.htm
http://stor.altervista.org/pic/servo/servo.htm
http://stor.altervista.org/elettroni...regolatore.htm

Per la $+1 e' una cosa un po'impropria:
http://stor.altervista.org/pic/page1..._1.htm#ritardi

@jijuja
Grazie, quello di essere piu'chiari e usabili possibile e'lo scopo con cui li ho scritti... anche perche' io stesso mi dimentico le cose che faccio e cosi' andarle a ricordare e' piu' semplice :P

faustog 17 dicembre 07 00:49

grazie Claudio
 
ciao Claudio..
sono andato a vedere i link che mi suggerivi.. sono veramente chiari e ho capito i salti fittizi.. .per avere i giusti ritardi.. per cui alla fine la formula per sapere quale valore dare alla variabile contatore
n = ( µS - 1 ) / 3 con questa è possibile ottenere un numero di cicli macchina tale che avremo bisogno di integrare qualche NOP giusto per ottenere il ritardo desiderato

grazie a presto
fausto

Citazione:

Originalmente inviato da Claudio_F
Per lettura/generazione impulsi servi c'e' qualche idea su:
http://stor.altervista.org/elettroni...ci/eliluci.htm
http://stor.altervista.org/pic/servo/servo.htm
http://stor.altervista.org/elettroni...regolatore.htm

Per la $+1 e' una cosa un po'impropria:
http://stor.altervista.org/pic/page1..._1.htm#ritardi

@jijuja
Grazie, quello di essere piu'chiari e usabili possibile e'lo scopo con cui li ho scritti... anche perche' io stesso mi dimentico le cose che faccio e cosi' andarle a ricordare e' piu' semplice :P



Tutti gli orari sono GMT +2. Adesso sono le 17: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