Magari questo non è il tuo caso però le tabelle di lookup in assembly bisogna stare attenti a non farle più grandi di 255 istruzioni totali, ma sopratutto ogni tabella non deve stare a cavallo di slot contigui di 255 celle di memoria di flash, questo per far funzionare bene l'istruzione addwf PCL,F poichè il registro PCL è a 8 bit e per non andare a scomodare la parte alta del puntatore indirizzata da PCLATH che per la gestione delle tabelle non è proprio semplice. Motivo per cui le tabelle di lookup si tende a metterle all'inizio del codice e prima di tutto il resto (la prima a 0x0005, le successive dopo la prima, se si sfora con qualche istruzione l'indirizzo 0x0100 si deve "sprecare" qualche locazione di memoria lasciandola inutilizzata e allocare la tabella a 0x0100, e così via). In genere questo discorso sull'allocazione delle tabelle nella memoria flash e la gestione delle pagine sarebbe molto lungo e complesso e se non si sta attenti a quello che si scrive può portare a comportamenti strani e difficili da diagnosticare... ma questa è la "macchinosità" di un linguaggio di basso livello come l'Assembly.
Grazie per il commento molto utile, che se sei d'accordo metterei in pruimo piano per dare questo avvertimento. Nel mio caso ho solo 25 punti e avrei dovuto piazzarle con una direttiva ORG in una locazione per tenerne il controllo
E' anche vero che per programmare in assembly bisogna sempre conoscere il microcontrollore visto che tutti sono registri e hanno zone di rispetto e funzioni. Questo a ricordo di un mio vecchio programmino con il microprocessore Zilog 80 (Z80) di cui viene calcolato un confronto e nei flag mi viene generato un codice errato da manuale, ma in realtà l'errore è quello stampato nel manuale delle istruzioni della Zilog, di cui ringrazio la stessa Zilog della loro disponibilità e verifica e il mio insegnante di elettronica Digitale.
Ottima esposizione, giocare con questi piccoli micro è sempre molto interessante. Sei stato così come sempre chiaro, semplice ed esaustivo. Da ciò è più che evidente la competenza!👍
Spettacolo !!! Io ho programmato in Assembler intorno agli anni 2000, il mio primo lavoro dopo la laurea, sviluppavo firmware per le CPU Motorola famiglia 68000, ne ho un bellissimo ricordo. Grazie Pier, questi video sono bellissimi. 73s Pasquale IW0HEX
Video molto interessante. Sto cercando di guardare tutto il tuo canale... Un'impresa! Troppo contento e sempre interessante! 😃 Sono caduto sulla lunghezza delle operazioni durante il test di un misuratore di consumi fatto con Arduino. Doveva leggere i lampeggi dei led di tre contatori ed ho trovato come limite il debug fatto con serialprint. Ho testato sulla mia pelle come delle istruzioni banali siano dei colli di bottiglia. Il prossimo step sarà pilotare direttamente la comunicazione senza passare da comandi "preconfezionati" . Niente a che fare con quanto hai fatto tu, ma è stato interessante sbattere il naso sul problema dell'ottimizzazione dei tempi e programmare in assembler credo sia il sacro Graal dell'ottimizzazione.
grazie, se ti può fare comodo ecco la mia videolist www.pieraisa.it/videolist. Per quanto riguarda il mondo Arduino prima o poi ci si scontra con i limiti delle librerie e di un ambiente che per mantenere semplicità e compatibilità ha dovuto sacrificare risorse del micro. Oltre certi livelli diventa necessario l'utilizzo in modo tradizionale del micro, con i compilatori a basso livello.
Ahhh Pier....avrei dovuto conoscerti ai tempi...Sei una fonte...Grazie Grazie...magari un giorno ti vengo a trovare (5km)...Sarebbe interessante una spiegazione dei componenti piu' usati( Modelli). La microcon e' stata interessante
Perfetto per il PIC se ci fosse anche con ATMEGA328P per fare il confronto tra i due linguaggi assembly, anche se poi il discorso diviene sempre più complesso con altri microcontrollori.
Si interessante, proprio questa notte ho acceso per la prima volta uPierino32, che ha un STM32F051 M0 Cortex ... ma non vi svelo niente lo vederemo a breve :-D
Ciao Pier! Complimenti sempre per i tuoi video! Vorrei chiederti una cosa: Stò giocherellando con le figure di Lissajous e la famosa oscimusic. Posseggo un oscilloscopio Hantek come il tuo, volevo chiederti se è possibile utilizzare la funzione XY per vederle. Se non ho capito male bisogna spostare la fase su un canale di 90 gradi,magari utilizzando un circuito ... ILLUMINAMI ! :) Grazie!
@@PierAisa Mi torna! :D Però ho provato sull' Hantek e le figure della oscimusic non si vedono giuste.Nel primo esempio hai usato MAtLab con un programma e hai girato la fase di 90 gradi se non sbaglio. Volevo chiederti appunto, se c'è un modo per vederle correttamente su oscilloscopi che non hanno il setup XY. Con un amico abbiamo provato a girare la fase di 90 gradi con un operazionale ma non siamo riusciti ad ottenere un risultato soddisfacente, la fase sembra spostata meno di 90 gradi. Spero di aver inteso correttamente che bisogna spostare la fase di 90 gradi su un canale.
Il marking smd a volte è magia nera sul mio forum trovi questo post www.pieraisa.it/forum/viewtopic.php?p=11747&sid=4f411f7767f2218f0d3666714430c5c4#p11747 dove abbiamo un po' discusso e ci sono diversi riferimenti Dove poter fare ricerca eventualmente se ti va apri un posto dove puoi allegare una foto
Ancora a livello più vicino ai piccoli esserini di calcolo chiamati cpu od altro, ci sarebbe il linguaggio macchina molto più difficile che non l'assembly che introdusse la "semplificazione" consistente nei mnemonici per le istruzioni macchina. Poi per le ISA RISC il relativamente ridotto insieme di istruzioni disponibili e metodi di indirizzamento oltre alla ortogonalità della stessa ISA, è più semplice scrivere programmi che non per una cpu con ISA CISC.
Sì in pratica l'assembly è un linguaggio sequenziale macchina che fa uso di istruzioni mnemoniche. Ti sfido a scrivere un programma anche breve che fa uso di soli codici macchina, cioè numeri codificati. Per questo c'è l'assembly che lo fa al posto tuo
Eppure in epoca di calcolatori mainframe anni '50 e seguenti si scriveva codice direttamente in linguaggio macchina. Oggi sarebbe quasi impossibile ovviamente.
Sì e a tal proposito siccome non esisteva l'architettura computazionale e le memorie di massa di oggi, il codice veniva scritto su dei rotoli di carta su cui venivano eseguiti o meno dei fori che corrispondevano agli attuali 0 e 1. Questi rotoli poi venivano letti dalla macchina che eseguiva le istruzioni riportate
2,5 volte più veloce... era auspicabile. Però, potresti provare a migliorare il codice in C facendo il ciclo for a ritroso con il confronto a zero? Ci metti un secondo e dovrebbe migliorare un pochino... .
Tempo fa scaricai un sistema operativo per PC tutto realizzato in assembly e stava tutto in un floppy! Come mai la prima volta usi sempre tris al posto di mov?
Se non mi sbaglio Tris era un'istruzione di alcuni vecchi pic della famiglia baseline, sulla generazione successiva poi non è più documentata ma il suo codice operativo è rimasto come riservato. Il compilatore la interpreta come una pseudo istruzione (ma l'uso è deprecato) che non fa altro che selezionare il banco del registro TRISx e copiarvi il contenuto di W. Cioè in questo caso si traduce in: BANK1 movwf TRISB BANK0 Dove BANKx è una macro definita in precedenza che va a settare i bit dello STATUS per selezionare il BANKx
@@davidedellapasqua2 giustissimo infatti il compilatore mpasm me lo da come deprecated. Considerate che il codice lo ho ripescato da archivio del 2006 e anche prima..... Comunque Davide anche questo commenta merita il primo piano, ma te lo ho già dato e al massimo 1
@Michele Isoli Vero, intendo come si fa se voglio inserire una parte di Assembly direttamente nel codice C, ci sarà sicuramente un istruzione particolare per fare questo.
Esiste una funzione chiamata asm... All'interno della sua sintassi è possibile includere del codice assembly... Ricordati però che se cambi microcontrollore il tuo codice potrebbe non essere più compatibile 😉
Il PIC16f887 è stato il mio primo microcontrollore in assoluto. Ho usato mplab sia nella versione "vintage" che in quella moderna, sono completamente d'accordo per quanto riguarda la pesantezza delle ultime versioni.
Di solito non è una cosa che si vede fare. Bisogna stare anche un po' attenti però perchè se usi dei registri di sistema (primo fra tutti W) nel codice assembly, non sai cosa stava facendo il compilatore C, per cui potresti andare a "scombinare i calcoli" al compilatore C per quanto riguarda le istruzioni precedenti e successive in C
Però non hai usato lo stesso metodo, hai solo raggiunto lo stesso scopo. La colpa è del C non ottimizzato bene. Dovevi forse usare istruzioni asm per i punti deboli del C, che non è detto sia possibile :)
Però così facendo avrebbe "barato", perchè sarebbe sfumata l'utilità di questo scopo. Al limite avrebbe dovuto utilizzare il decremento nel codice C per rendere i 2 sorgenti più paragonabili.
Magari questo non è il tuo caso però le tabelle di lookup in assembly bisogna stare attenti a non farle più grandi di 255 istruzioni totali, ma sopratutto ogni tabella non deve stare a cavallo di slot contigui di 255 celle di memoria di flash, questo per far funzionare bene l'istruzione addwf PCL,F poichè il registro PCL è a 8 bit e per non andare a scomodare la parte alta del puntatore indirizzata da PCLATH che per la gestione delle tabelle non è proprio semplice. Motivo per cui le tabelle di lookup si tende a metterle all'inizio del codice e prima di tutto il resto (la prima a 0x0005, le successive dopo la prima, se si sfora con qualche istruzione l'indirizzo 0x0100 si deve "sprecare" qualche locazione di memoria lasciandola inutilizzata e allocare la tabella a 0x0100, e così via). In genere questo discorso sull'allocazione delle tabelle nella memoria flash e la gestione delle pagine sarebbe molto lungo e complesso e se non si sta attenti a quello che si scrive può portare a comportamenti strani e difficili da diagnosticare... ma questa è la "macchinosità" di un linguaggio di basso livello come l'Assembly.
Grazie per il commento molto utile, che se sei d'accordo metterei in pruimo piano per dare questo avvertimento. Nel mio caso ho solo 25 punti e avrei dovuto piazzarle con una direttiva ORG in una locazione per tenerne il controllo
@@PierAisa Grazie per aver messo il commento in primo piano. Sono onorato!
@@davidedellapasqua2 per ogni video c'è sempre un commento top in questo caso il tuo lo è Indubbiamente
E' anche vero che per programmare in assembly bisogna sempre conoscere il microcontrollore visto che tutti sono registri e hanno zone di rispetto e funzioni. Questo a ricordo di un mio vecchio programmino con il microprocessore Zilog 80 (Z80) di cui viene calcolato un confronto e nei flag mi viene generato un codice errato da manuale, ma in realtà l'errore è quello stampato nel manuale delle istruzioni della Zilog, di cui ringrazio la stessa Zilog della loro disponibilità e verifica e il mio insegnante di elettronica Digitale.
Ottima esposizione, giocare con questi piccoli micro è sempre molto interessante. Sei stato così come sempre chiaro, semplice ed esaustivo. Da ciò è più che evidente la competenza!👍
Grazie ! Se non la conosci già ecco la mia video list. In cima trovi anche le Playlist , ciao ! www.pieraisa.it/opensource/Channelvideolist.php
Spiegazione semplice ed esaustiva! Grazie!
Bel video! 👍
Ps. non abbandonare del tutto i pic prossimamente..😉
Grazie, ok li infiliamo in maniera periodica
Grazie per l'esempio, (e il paragone col C).
L'assember é più ostico e specifico, ma "rende" di più.
Spettacolo !!! Io ho programmato in Assembler intorno agli anni 2000, il mio primo lavoro dopo la laurea, sviluppavo firmware per le CPU Motorola famiglia 68000, ne ho un bellissimo ricordo. Grazie Pier, questi video sono bellissimi. 73s Pasquale IW0HEX
Sapevo di rivegliare vecchie passioni. Teniamo un livello non troppo spinto per seguire il filo
Bel video e molto chiaro. Voto anche io per qualche ripresa in futuro sarebbe anche interessante una carrellata sulla famiglia pic. Ciao
Una bella lookup-table grande Pier.
Grazie Pier 👍 ☺️ è stato molto interessante
Video molto interessante. Sto cercando di guardare tutto il tuo canale... Un'impresa! Troppo contento e sempre interessante! 😃
Sono caduto sulla lunghezza delle operazioni durante il test di un misuratore di consumi fatto con Arduino. Doveva leggere i lampeggi dei led di tre contatori ed ho trovato come limite il debug fatto con serialprint. Ho testato sulla mia pelle come delle istruzioni banali siano dei colli di bottiglia.
Il prossimo step sarà pilotare direttamente la comunicazione senza passare da comandi "preconfezionati" .
Niente a che fare con quanto hai fatto tu, ma è stato interessante sbattere il naso sul problema dell'ottimizzazione dei tempi e programmare in assembler credo sia il sacro Graal dell'ottimizzazione.
grazie, se ti può fare comodo ecco la mia videolist www.pieraisa.it/videolist. Per quanto riguarda il mondo Arduino prima o poi ci si scontra con i limiti delle librerie e di un ambiente che per mantenere semplicità e compatibilità ha dovuto sacrificare risorse del micro. Oltre certi livelli diventa necessario l'utilizzo in modo tradizionale del micro, con i compilatori a basso livello.
Molto interessante
Ahhh Pier....avrei dovuto conoscerti ai tempi...Sei una fonte...Grazie Grazie...magari un giorno ti vengo a trovare (5km)...Sarebbe interessante una spiegazione dei componenti piu' usati( Modelli). La microcon e' stata interessante
Perfetto per il PIC se ci fosse anche con ATMEGA328P per fare il confronto tra i due linguaggi assembly, anche se poi il discorso diviene sempre più complesso con altri microcontrollori.
Si interessante, proprio questa notte ho acceso per la prima volta uPierino32, che ha un STM32F051 M0 Cortex ... ma non vi svelo niente lo vederemo a breve :-D
Attendo con ansia
Ciao Pier! Complimenti sempre per i tuoi video! Vorrei chiederti una cosa: Stò giocherellando con le figure di Lissajous e la famosa oscimusic. Posseggo un oscilloscopio Hantek come il tuo, volevo chiederti se è possibile utilizzare la funzione XY per vederle. Se non ho capito male bisogna spostare la fase su un canale di 90 gradi,magari utilizzando un circuito ... ILLUMINAMI ! :) Grazie!
Ecco il mio video a riguardo. Fammi sapere se ti torna, ciao ua-cam.com/video/ZAR9ZqjxL_w/v-deo.html ua-cam.com/video/zbrT_7Ijm8o/v-deo.html
@@PierAisa Grande Pier! Lo guardo subito,grazie!
@@PierAisa Mi torna! :D Però ho provato sull' Hantek e le figure della oscimusic non si vedono giuste.Nel primo esempio hai usato MAtLab con un programma e hai girato la fase di 90 gradi se non sbaglio. Volevo chiederti appunto, se c'è un modo per vederle correttamente su oscilloscopi che non hanno il setup XY. Con un amico abbiamo provato a girare la fase di 90 gradi con un operazionale ma non siamo riusciti ad ottenere un risultato soddisfacente, la fase sembra spostata meno di 90 gradi. Spero di aver inteso correttamente che bisogna spostare la fase di 90 gradi su un canale.
@@PierAisa Ecco ,ti lascio questo link come esempio :
ua-cam.com/video/XziuEdpVUe0/v-deo.html
@@LukaNikoTech è geniale, grazie
MUI BUENA APRESENTATION / EXPLICACION, OBRIGADO
ENG° LUIZ
Dipende anche dalle ottimizzazioni del compilatore C, mi pare che la versione gratuita XC8 non sia famoso per dare codice macchina perfetto
Hehehehe, infatti. Ho voluto fare questo test per avere un ordine di grandezza ...
Ciao Pier, scusami sapresti dirmi cosa sono questi componenti smd che non trovo da nessuna parte 43BD, 53W e su un alimentatore Flyback con lnk362nd !
Il marking smd a volte è magia nera sul mio forum trovi questo post www.pieraisa.it/forum/viewtopic.php?p=11747&sid=4f411f7767f2218f0d3666714430c5c4#p11747 dove abbiamo un po' discusso e ci sono diversi riferimenti Dove poter fare ricerca eventualmente se ti va apri un posto dove puoi allegare una foto
Notare la differenza tra "assembler" e linguaggio "assembly".
Si sa più qualcosa per la radio FM grazie 😊😊👍🏼
Ciao Simone, sto valutando che progetto presentare, mentre navigo nelle riparazioni .... non la ho dimenticata :-)
@@PierAisa non vedo l'ora 👍🏼👍🏼😊
Sarebbe interessante fare una comparazione tra il codice assembly scritto da te è quello generato dal compilatore
Bisognerebbe prendere il disassemblato e con i codici macchina vedere cosa è stato generato
Ancora a livello più vicino ai piccoli esserini di calcolo chiamati cpu od altro, ci sarebbe il linguaggio macchina molto più difficile che non l'assembly che introdusse la "semplificazione" consistente nei mnemonici per le istruzioni macchina. Poi per le ISA RISC il relativamente ridotto insieme di istruzioni disponibili e metodi di indirizzamento oltre alla ortogonalità della stessa ISA, è più semplice scrivere programmi che non per una cpu con ISA CISC.
Sì in pratica l'assembly è un linguaggio sequenziale macchina che fa uso di istruzioni mnemoniche. Ti sfido a scrivere un programma anche breve che fa uso di soli codici macchina, cioè numeri codificati. Per questo c'è l'assembly che lo fa al posto tuo
Eppure in epoca di calcolatori mainframe anni '50 e seguenti si scriveva codice direttamente in linguaggio macchina. Oggi sarebbe quasi impossibile ovviamente.
Sì e a tal proposito siccome non esisteva l'architettura computazionale e le memorie di massa di oggi, il codice veniva scritto su dei rotoli di carta su cui venivano eseguiti o meno dei fori che corrispondevano agli attuali 0 e 1. Questi rotoli poi venivano letti dalla macchina che eseguiva le istruzioni riportate
2,5 volte più veloce... era auspicabile. Però, potresti provare a migliorare il codice in C facendo il ciclo for a ritroso con il confronto a zero? Ci metti un secondo e dovrebbe migliorare un pochino...
.
Giusto
@@PierAisa www.ferraraweb.net/wp/?p=2013
Tempo fa scaricai un sistema operativo per PC tutto realizzato in assembly e stava tutto in un floppy! Come mai la prima volta usi sempre tris al posto di mov?
Trias settta la direzione della porta
Se non mi sbaglio Tris era un'istruzione di alcuni vecchi pic della famiglia baseline, sulla generazione successiva poi non è più documentata ma il suo codice operativo è rimasto come riservato. Il compilatore la interpreta come una pseudo istruzione (ma l'uso è deprecato) che non fa altro che selezionare il banco del registro TRISx e copiarvi il contenuto di W. Cioè in questo caso si traduce in:
BANK1
movwf TRISB
BANK0
Dove BANKx è una macro definita in precedenza che va a settare i bit dello STATUS per selezionare il BANKx
@@davidedellapasqua2 giustissimo infatti il compilatore mpasm me lo da come deprecated. Considerate che il codice lo ho ripescato da archivio del 2006 e anche prima..... Comunque Davide anche questo commenta merita il primo piano, ma te lo ho già dato e al massimo 1
@@PierAisa Addirittura! 😆 Bhe sarà per una prossima volta, per ora mi accontento del cuoricino 😁
Spettacolo! 👍👍 Come si fa a includere del codice Assembly nel C?
@Michele Isoli Vero, intendo come si fa se voglio inserire una parte di Assembly direttamente nel codice C, ci sarà sicuramente un istruzione particolare per fare questo.
Esiste una funzione chiamata asm... All'interno della sua sintassi è possibile includere del codice assembly... Ricordati però che se cambi microcontrollore il tuo codice potrebbe non essere più compatibile 😉
@@nicolafranceschinis Perfetto 👍
Il PIC16f887 è stato il mio primo microcontrollore in assoluto. Ho usato mplab sia nella versione "vintage" che in quella moderna, sono completamente d'accordo per quanto riguarda la pesantezza delle ultime versioni.
Di solito non è una cosa che si vede fare. Bisogna stare anche un po' attenti però perchè se usi dei registri di sistema (primo fra tutti W) nel codice assembly, non sai cosa stava facendo il compilatore C, per cui potresti andare a "scombinare i calcoli" al compilatore C per quanto riguarda le istruzioni precedenti e successive in C
Però non hai usato lo stesso metodo, hai solo raggiunto lo stesso scopo.
La colpa è del C non ottimizzato bene. Dovevi forse usare istruzioni asm per i punti deboli del C, che non è detto sia possibile :)
L'idea del video era mettere in evidenza a parità di contesto cosa produce una compilazione standard del C e una standard di Assembly
Però così facendo avrebbe "barato", perchè sarebbe sfumata l'utilità di questo scopo. Al limite avrebbe dovuto utilizzare il decremento nel codice C per rendere i 2 sorgenti più paragonabili.
@@davidedellapasqua2 esattamente