n° 219
Novembre 2017
Dicembre 13, 2017, 01:53:01 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: [RISOLTO]mplementare l'effetto Supercar in assembly con PIC16F84A e RLF RRF  (Letto 2543 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
ubuntumate
Newbie
*

Karma: +10/-0
Scollegato Scollegato

Messaggi: 39


Mostra profilo
« inserita:: Giugno 02, 2016, 10:20:45 »

Devo scrivere un programma per PIC16F84A in Assembly che accenda in sequenza i LED collegati alle linee di PORTB in modo tale da ottenere l'effetto presente in Kitt, famosa macchina parlante del celebre telefilm Supercar. Vorrei usare le istruzioni RRF e RLF in questo esercizio per evitare di produrre un hex di un terabyte per accendere mezza dozzina di LED inserendo tonnelate di BSF e BCF o di MOVLW e MOVWF. Il problema è che non riesco a far cambiare direzione allo shift con riporto una volta che PORTB vale 1 o 128. Nell'ISA del 16F84A non esiste alcuna istruzione per comparare valori interi perciò non so come fare, sicuramente sbaglio approccio e non mi viene in mente nessuna idea per ottimizzare il codice per dimensione. Qualche trucchetto bitwise da suggerire?
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #1 inserita:: Giugno 02, 2016, 11:27:32 »

Nell'ISA del 16F84A non esiste alcuna istruzione per comparare valori interi perciò non so come fare

Ne sei proprio sicuro? Qual è il magico operatore booleano che risponde alla truth table seguente, e che può essere quindi usato per controllare l'eguaglianza di bit, registri, e quant'altro?

 A | B | F
-----------
 0 | 0 | 0
 0 | 1 | 1
 1 | 0 | 1
 1 | 1 | 0



Tra l'altro, in un caso del genere è pressoché obbligatorio dal punto di vista didattico realizzare un vero e proprio unrolling preliminare del main loop, dividendolo in due metà sequenziali (scorrimento a DX, sorrimento a SX) gestite direttamente tramite BTFSS applicato rispettivamente al MSB e LSB del registro target, senza fare ricorso a confronto con XOR e salto BTFSS applicato al flag di zero.


PS: il vero effetto supercar richiederebbe dell'elettronica aggiuntiva, perché realizza un fading analogico dei led rispettivamente a SX/DX di quello correntemente acceso alla massima luminosità, creando una simpatica "coda" luminosa, realizzabile con dei banali gruppi RC o emulabile in modo un po' più sofisticato con un DAC multiplo esterno o un PWM (eventualmente multiplexato).

Diciamo allora, per correttezza, che vuoi realizzare un più semplice gioco di luci a scorrimento "con rimbalzo" ossia con cambio di direzione. Un tempo tali giochi si realizzavano memorizzando (manualmente...) in una banalissima EPROM le sequenze binarie corrispondenti allo stato di ogni uscita, e la EPROM medesima veniva poi letta iterativamente grazie ad un vibratore astabile a frequenza variabile... in versione più semplice, si usavano dei contatori Johnson come il venerabile CD4017 e tutti i suoi succedanei, o anche dei demultiplexer.


PPS: Prova a scrivere due righe a Stevens per capire come procurarti una copia usata di "PIC'n'up the pace" e affini, nei quali tali idiomi fondamentali sono analizzati nei dettagli, con relativa analisi e confronto dei tempi di esecuzione.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
ubuntumate
Newbie
*

Karma: +10/-0
Scollegato Scollegato

Messaggi: 39


Mostra profilo
« Risposta #2 inserita:: Giugno 03, 2016, 12:09:39 »

No, non sono sicuro  Bocca cucita Non so in base a quale principio credevo di dover testare un bit alla volta di PORTB per decidere se tale registro fosse uguale a 128 o a 1  Che?!? Bastava fare 128 e 1 XOR PORTB per verificare l'eguaglianza. Poco importa, oramai non è inusuale che io mi incagli in simili banalità. Alla fine ho scritto la versione da te consigliata MAW.
Codice:
PROCESSOR       p16f84a
    RADIX       dec
    INCLUDE     "p16f84a.inc"
    __CONFIG    0xFFF9
    ;---------------------------------------------------------------------------
    ORG     0
    goto    SETUP
    ;---------------------------------------------------------------------------
    ORG     4
    
    ;---------------------------------------------------------------------------
    SETUP
    bsf        STATUS,RP0  ; banco 1
    clrf        TRISA             ; tutte uscite PORTA
    clrf        TRISB             ; tutte uscite PORTB
    movlw   0x07           ; configurazione OPTION_REG
    movwf   OPTION_REG  ; """""""""""""""""""""""""
    bcf        STATUS,RP0  ; banco 0
    movlw   0x01        
    movwf   PORTB
    ;delay

    goto    MAIN
    ;-----------------------------------------------------------------------
    MAIN
    GO_LEFT
    rlf     PORTB,1
    ; delay
    btfss   PORTB,RB7
    goto    GO_LEFT
    GO_RIGHT
    rrf     PORTB,1
    ; delay
    btfss   PORTB,RB0
    goto    GO_RIGHT
    goto    MAIN
END

Comunque sì, diciamo che non è proprio il vero Supercar. Si tratta, come dici, di uno scorrimento con rimbalzo. Saprei realizzare il gioco di luci di Kitt solo con circuiti RC, ma diversamente no. Non ho avuto l'occasione di baloccarmi con ADC/DAC avendo usato solo il semplice 16F84A e non so cosa sia un PWM.
Contatterò Stevens e ti farò sapere la risposta.
PS: un bel corso di inglese non mi farebbe male.
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #3 inserita:: Giugno 03, 2016, 02:27:20 »

PWM è l'acronimo di Pulse Width Modulation. Si tratta di una grezza ma efficace tecnica di conversione intrinseca da impulso digitale ad analogico (tensione continua) sfruttando la naturale capacità di integrazione delle forme d'onda di carichi altamente capacitivo/induttivi, eventualmente accoppiata ad un blando ed economico filtraggio RC. In tale modo, variando semplicemente il rapporto impulso/pausa di un'onda quadra a frequenza prefissata, si ottiene una grossolana ma utile parcellizzazione della tensione efficace Veff sul carico, con tutto ciò che ne consegue (tipicamente, variazione della velocità di rotazione di un motore).

Quasi tutti i microcontroller integrano periferiche PWM indipendenti, talune anche molto sofisticate (duali, quadruple, in quadratura...), esistono ovviamente chip PWM standalone controllabili con i soliti elementari bus intra/IC (SPI, I2C, OneWire, e più in generale ogni tipo di seriale [LV]TTL sincrona, self-clocked o asincrona...) e convertitori frequenza/tensione vecchi quanto l'elettronica integrata. In ogni caso, tale tipologia di output è banalissimamente implementabile in bitbang su praticamente ogni tipo di output TTL/CMOS compatibile.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
ubuntumate
Newbie
*

Karma: +10/-0
Scollegato Scollegato

Messaggi: 39


Mostra profilo
« Risposta #4 inserita:: Giugno 04, 2016, 12:21:19 »

Più si studia e più si scopre che non si sa nulla di quel che c'è da sapere.

Il PWM non mi è chiaro sinceramente. Ho capito cos'è, ma non il perché un diodo vede una tensione ai suoi capi pari al duty cycle * la tensione di lavoro del microcontrollore.  Tra l'altro se si hanno LED di colore differente bisognerà generare un'onda rettangolare diversa per ogni LED dato che a colore diverso corrisponde tensione di soglia differente, oppure si usano resistenze di valore adeguato per ciascun diodo luminoso. La soluzione con circuiti RC mi sembra più fattibile per un novizio, si tratta solo di applicare un paio di formule preconfezionate  che non richiedono un PhD per essere usate.

BTW Stevens ha risposto e sostanzialmente ha detto che è possibile reperire alcune copie cercando su Amazon ed EBay e che ritiene che la sua serie di libri  sia adatta per studenti e amatori.
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +224/-19
Scollegato Scollegato

Messaggi: 2988


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #5 inserita:: Giugno 04, 2016, 02:42:23 »

I libri di Stevens sono probabilmente i più adatti in assoluto a studenti e hobbisti DIY, per stile e contenuti. Se e quando la questione dei diritti sarà sistemata, sarebbe bello vederli rilasciati in PDF. Quando sono stati scritti erano praticamente l'unico riferimento entry level presente sul mercato oltre alla letteratura ufficiale, assieme agli ottimi lavori di Predko e Brey, molto prima dell'alluvione di testi su PIC e AVR scritti da "autori" da dieci centesimi la dozzina.  Occhi al cielo

Ovviamente lo stile di codifica Assembly di Stevens è totalmente obsoleto, ma costituisce sempre un ottimo punto di partenza didattico.

Per il PWM, avrai tempo e modo di digerire il concetto di valore efficace per le grandezze elettriche.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
ubuntumate
Newbie
*

Karma: +10/-0
Scollegato Scollegato

Messaggi: 39


Mostra profilo
« Risposta #6 inserita:: Giugno 04, 2016, 05:36:13 »

Grazie ancora una volta M.A.W.
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines