...si concordo.. ..sicuramente la lettura ai datasheet rimane cosa fondamentale, irrinunciabile, ho appena letto sul datasheet dell' ATmega-328 i moduli Capture e Compare.. ...giusto per realizzare degli appunti personali:
Fino a questo momento con i Pic ho creato segnali digitali per svariate destinazioni, per esempio un segnale digitale PWM tipico per il controllo dei motori elettrici, caratterizzato dal Duty Cycle, ho creato via software un segnale digitale per la comunicazione seriale, segnali digitali per per pilotare dei servo, anche il viceversa leggere il segnale di una Ricevente in modo software ecc.
Sono riuscito a mettere in ascolto via software un pin che se legge un valore alto, inizia a contare finchè lo stesso non raggiunge nuovamente il valore basso. In questa maniera abbiamo grossomodo un idea dellonda quadra che è entrata in INPUT nel nostro Pic. Realizzando un ascoltatore via software, creiamo continuamente delle inevitabili latenze dovute al ritado software delle istruzioni .
Il nostro Pic ha un potenziale da offrirci, ovvero i moduli Capture e Compare. Questi moduli esistono quasi per tutti i Micro della famiglia Microchip, ma in questa sessione studierò quelli dell ATmega328 di Arduino. Rispettivamente il modulo Capture, legge un segnale digitale in ingresso mentre il Compare scrive un segnale digitale in uscita. Il modulo Capture per funzionare ha bisogno degli Interrupt, ovvero sono dei sistemi di interruzione programma che il Processore riesce a mettere in atto e gestire, per risolvere problemi di lettura e scrittura di periferiche. Questo ci fa capire che non dobbiamo più occuparci via software di leggere da un pin, ma deleghiamo al modulo hardware del compito, riducendo al minimo le latenze, ottenendo una lettura precisa del segnale. Il registro a 16 bit incaricato per il modulo Capture è ICR1, esso è composto da due registri esattamente: ICR1H : ICR1L , ma il linguaggio C di Arduino lo tratta come se fosse un unico registro, daltronte, passando ad ATmega328 è come se fossimo passati a un Pic della famiglia 18FXXX per cui non è più consigliabile programmare in Assembler, troppo dispendioso. Quindi quando il bit ICF1 del registro TIFR1 assume valore logico 1 (alto) allora il valore di timer1 TCNT1H : TCNT1L viene copiato in ICR1H:ICR1L in pratica viene catturato, infatti il modulo si chiama Capture.
Quindi dobbiamo impostare il nostro pin 14 come Input, inoltre dobbiamo impostare correttamente il bit ICES1 del registro TCCR1B registro di controllo del Timer/Counter1 per stabilire quando deve occorrere levento per far scattare linterrupt, ovvero quando vi è un fronte di salita o un fronte di discesa. Per quello che ricordo nei Pic anche altre alternative, per esempio ogni 4 fronte di salita oppure ogni 16 fronte di salita, tutte opzioni che possono essere gestite attraverso bit dei registri preposti. Basta leggere il datasheet, il discorso si ripete, cambiano i nomi dei registri ma il concetto è lo stesso, altrettanto dicasi per i linguaggi di programmazione, non importa se ASSEMBLER o linguaggio C.
Allora riprendendo il tema Capture se il bit ICF1 viene settato attraverso il registro WGW allora esso verrà settato a 1 quando TCNT1 raggiunge 65.535 quindi il TOP.
Il bit ICF1 bit viene azzerato quando lInterrupt Vector è in esecuzione. In generale dopo che avviene un interrupt il processore mette nello stack il PC (process counter), come dire metto da parte il lavoro che sto facendo, per occuparmi temporaneamente di qualcosaaltro, automaticamente il processore va ad eseguire Iinterrupt Vector che si occupa di bloccare temporaneamente gli altri interrupt, cerca di capire quale Interrupt ha bloccato il normale flusso e cosi esegue le operazioni definite nel modulo hardware in causa, nel nostro caso il modulo Capture.
Passiamo adesso al modulo Compare ovvero ad un modulo che permette di generare su due linee di output un segnale digitale. Questo modulo esegue la comparazione tra il registro OCR1A con TCNT1 , per il pin OC1A mentre la comparazione tra OCR1B con TCNT1 gestisce l'uscita del pin OC1B.
Ovviamente quelli appena visti sono solo la sintesi dei due, in realtà la comparazione riguarda OCR1AH : OCR1AL con TCNT1H : TCNT1L quindi registri a 16 bit, e lo stesso vale fra OCR1BH : OCR1BL e TCNT1H : TCNT1L.
Quando occorre luguaglianza tra i due registri visti prima il bit OCF1B del registro TIFR1 viene posto a 1 (alto). Questo vale solo se il bit di posto 7 corrispondente all' I-flag del registro SREG è posto a 1 (alto).
Citazione:
Originalmente inviato da romoloman Fai un programma complesso, ma molto complesso in assembler e l'equivalente in C e poi mi dici quanto rimpiangi l'assembler.
Quello in C è mantenibile e se fatto in modo furbo portabile,
quello in assembler te lo dimentichi di portarlo fra CPU diverse...
Giusto per farti un'esempio che conosco da vicino.
Tempo di porting di open9x da AVR a ARM: 3gg
Se fosse stato fatto in assembler probabilmente mesi... |