[C][ASM] Programmazione PIC 16F84A

Qui vengono spostati discussioni e messaggi ritenuti inadeguati per il contenuto o la forma con cui sono stati espressi.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da Claudio_F »

Non sono sicuro di aver capito la domanda, se non ricordo male ricaricando il TMR0 si perde il conteggio del prescaler (riparte da zero). Che io sappia non c'è soluzione, o si usa il TMR0 in modo "one shoot", oppure, se serve produrre un tempo periodico preciso, lo si lascia andare in "free running" come un normalissimo contatore, eventualmente si usa un quarzo di frequenza adeguata (es 4.096MHz).
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da gila75 »

Se non ricordo male testi il bit in polling di tmr0 e di conseguenza si aggiunge un clock o altrimenti interrupt del tmr0.
Logicamente dipende da ciò che devi fare.
Al limite tieni scarso il timer (per conpensare i vari test (btfsc...se non ricordo ora) ) e poi compensi con dei nop.
Ho tutti i programmi\esempi su un'altro pc purtroppo !!!
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da gila75 »

@Ubuntu: ho riguardato un po' gli appunti...non mi ricordo una mazza di asm...comunque
Ho rivisto un mio vecchio progetto: un radar e usavo timer1 per il conteggio del tempo tra l'impulso di andata e ritorno.
Testavo il bit del timer.
Riflettendo però non corretto ciò che hai supposto: anche se testi
TIMER ON
TEST_TIMER
non alteri nulla, il timer è un modulo hardware e continua per i fatti suoi.
Per assurdo tu potresti far partire il timer, poi fare un loop via software di ritardo, ma il timer conterà sempre e comunque.
Io attivavo il timer quando il partiva l'impulso e si fermava quando ritornava, poi mi smazzavo i calcoli
sulla velocità del suono e risalivo alla distanza.
Quindi col timer anche se testi non hai problemi. Logico l'interrupt sarebbe meglio, ma quello viene più in la.
Se t'interessa ecco il risultato (mi faccio pubblicità :D :D )
www.youtube.com/watch?v=O8HBpK6vbdQ
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da ubuntumate »

Ho sperimentato col timer e dovrebbe andare. Nel codice che riporto ci sono un paio di errori (wait undefined) e non re-imposto il prescaler-

Codice: Seleziona tutto

 ;-----------------------------------------------------------------------
   ; DEFINIZIONI
   ;-----------------------------------------------------------------------
              PROCESSOR       p16f84a    ;clock  4 Mhz
              RADIX           DEC
              INCLUDE         "p16f84a.inc"
              __CONFIG        11101010b

   #define    Bank0   bcf STATUS,RP0
   #define    Bank1   bsf STATUS,RP0
   #define    COUNT1  0Ch
   #define    COUNT2  0Dh
   #define    COUNT3  0Eh
   #define    COUNT4  0Fh
   #define    COUNT5  10h
   #define    COUNT6  11h
   #define    COUNT7  12h
   #define    COUNT8  13h
   #define    COUNT9  14h
   #define    COUNT10 15h
   ;-----------------------------------------------------------------------
   ; PROGRAMMA
   ;-----------------------------------------------------------------------
              ORG     0
              goto inizio

   ;----------INTERRUPT HANDLER (se usato)
              ORG     4

              ...                     ;qui vanno le eventuali istruzioni
              ...                     ;per la gestione degli interrupt
 

   ;----------PREDISPOSIZIONE HARDWARE

   inizio     Bank1                   ;attiva il banco 1
              clrf TRISB              ;Predispone porta B come uscite
	      bsf OPTION_REG,PS0      ;Imposta il prescalare a 128
	      bsf OPTION_REG,PS1
	      bsf OPTION_REG,PS2
	      bcf OPTION_REG,PSA      ;Assegna il prescalare a TIMER0
	      bcf OPTION_REG,T0CS     ;Seleziona il quarzo come fonte di clock
              Bank0                   ;attiva il banco 0
 

   ;----------CICLO PRINCIPALE DEL PROGRAMMA

   mainloop
	    movlw 0x01		    ;RB0 = H
	    movwf PORTB
	    movlw 20 
	    movwf COUNT1
    asp	    call wait
    	    decfsz COUNT1,1
	    goto asp
	    movlw 0x00
	    movwf PORTB
	    
	    movlw 20 
	    movwf COUNT1
    as	    call wait
    	    decfsz COUNT1,1
	    goto as
	    
	    goto mainloop
		
   END

;attende circa 50 ms
wait
	 movlw 61
         movwf TMR0
redo	 btfsc INTCON,T0IF
	 goto exit
	 goto redo
exit	 return
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da Claudio_F »

Urge impostare l'editor per evitare le tabulazioni e sanitizzare il sorgente ;)

Qualche semplificazione (compila, ma non testato per mancanza hardware :p):

Codice: Seleziona tutto

;------- DEFINIZIONI -----------------------------------------------------------

  PROCESSOR p16f84a
  RADIX     DEC
  INCLUDE   "p16f84a.inc"
  __CONFIG  11111111111001b     ; no code protect, no pwrt, no wdt, XT oscill.
  
;------- PREDISPOSIZIONE HARDWARE ----------------------------------------------

  ORG       0                   ; codice inizia all'indirizzo 0

  bsf       STATUS,RP0          ; attiva il banco 1
  clrf      TRISB               ; porta B tutte uscite
  bcf       OPTION_REG,T0CS     ; timer mode (quarzo/4 = 1MHz)
  bcf       OPTION_REG,PSA      ; prescalar assegnato a TIMER0
  bsf       OPTION_REG,PS0      ; prescalar divide per 256 (3906.25Hz = 256us)
  bsf       OPTION_REG,PS1
  bsf       OPTION_REG,PS2
  bcf       STATUS,RP0          ; attiva il banco 0

;------- CICLO PRINCIPALE DEL PROGRAMMA ----------------------------------------

loop

  bsf       PORTB,0             ; PORTB,0 = 1
  call      wait50ms
  bcf       PORTB,0             ; PORTB,0 = 0
  call      wait50ms
  goto      loop

;------- Attende 49.92 ms ---------------------------------------------------

wait50ms

  bcf       INTCON,T0IF         ; azzero flag timeout
  movlw     61                  ; 256 - (50 ms / 0.256 ms)
  movwf     TMR0
  btfss     INTCON,T0IF         ; se non timeout
  goto      $-1                 ; indietro di una istruzione
  return                        ; altrimenti ritorna
  
;-------------------------------------------------------------------------------

  END
In particolare rivisti i "configuration bits" (oscillatore XT per quarzo 4MHz e non HS) e aggiunto il clear del flag timeout.
Ultima modifica di Claudio_F il lunedì 18 gennaio 2016, 20:03, modificato 1 volta in totale.
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da ubuntumate »

Nemmeno io ho l'hardware,uso PicSimLab che non è il massimo ma funziona. Adesso lo provo e vedo,ma almeno è ben ordinato e fatto bene.
Thanks
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da ubuntumate »

Funziona bene il codice adesso. Ho provato a fare un timer che conta da 9 a 0 e visualizza le cifre su un display a sette segmenti.
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da ubuntumate »

Usare float su un PIC16F84A......
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
Avatar utente
M_A_W_ 1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 856
Iscrizione: venerdì 15 febbraio 2013, 3:57
Desktop: KDE
Distribuzione: SuSE
Sesso: Maschile
Località: Un luogo geometrico
Contatti:

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da M_A_W_ 1968 »

...comporta ipso facto la crocefissione in sala mensa con somminstrazione di 128 scudisciate e clisterone purificatore da litri 8. :lol:
Sì, un blog ce l'ho perfino io: gli è che mi manca il tempo...

"...in una società che sembra sempre più spaventata dai problemi troppo articolati e che rigetta come un corpo estraneo ogni elemento di complessità, sapremo ancora come utilizzare il parere degli esperti?"
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da ubuntumate »

:lol: :lol: :lol:

Venerdì l'insegnante riceverà una pena esemplare :sisi:

EDIT: ah! Non dimentichiamo poi la pena che le spetta per aver scelto di programmare in C una MCU con RAM < 512 byte ed E2PROM < 4K :D
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da Claudio_F »

Calcolo reale che ho dovuto fare con un PIC (con N da 1200 a 42800):

Codice: Seleziona tutto

      1          60
R =  --- * ----------------
      2       N  *  7e-6
Soluzione con sola aritmetica intera (troncata a numero intero):

Codice: Seleziona tutto

      4285714
R = -----------
         N
Ok, in questo caso è semplice, ma per dire il principio.
Avatar utente
ubuntumate
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1180
Iscrizione: giovedì 28 maggio 2015, 18:18
Distribuzione: Windows 7
Sesso: Maschile
Località: Milano

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da ubuntumate »

Non ho capito @Claudio
Software engineers shall participate in lifelong learning regarding the practice of their profession and shall promote an ethical approach to the practice of the profession.
ACM/IEEE Code of ethics.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da Claudio_F »

Altro esempio: l'ADC dei PIC è un convertitore a 10 bit (la tensione letta viene suddivisa in 1024 step). Posso ottenere il valore di tensione con:

Codice: Seleziona tutto

V = N * (Vrif/1024)
dove N è il valore restituito dall' ADC tra 0 e 1023 e Vrif è la tensione di riferimento del converitore, diciamo i soliti 5V. Ora, Vrif/1024 è pari a 0.0048828125, quindi la nostra tensione "float" si ottiene con:

Codice: Seleziona tutto

V = N * 0.0048828125
MA, posso usare la sola aritmetica intera se ad esempio moltiplico quel 0.004... per un valore abbastanza grande, diciamo 65536, considerandone il solo valore intero, e alla fine divido il risultato di nuovo per quel 65536 (sedici shift a destra):

Codice: Seleziona tutto

V = int(N * int(65536*Vrif/1024) / 65536)
Il valore V che ottengo è la parte intera del float della prima formula. Se mi sevono anche dei decimali, ad esempio tre, basta moltiplicare per 1000:

Codice: Seleziona tutto

V = int(N * int(1000*65536*Vrif/1024) / 65536)
Ad esempio, con N = 850 (tensione 4.15 volt):

Codice: Seleziona tutto

V = (N * 320000) >> 16
Si ottiene 4150, che sono appunto 4.15V espressi con un numero intero le cui tre cifre meno significative rappresentano i decimali.
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da gila75 »

Mai usati nemmeno i float in asm
Se per esempio devo fare 47/3=15.66
Posso fare benissimo 470/3=156 e poi tener conto e diventa 15.6
Con il radar e i vari calcoli avevo fatto così. In fase di stampa su lcd correggevo
Non usavo ai tempi(per ignoranza mia) gli shift come detto da Claudio
Ultima modifica di gila75 il giovedì 4 febbraio 2016, 12:33, modificato 2 volte in totale.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da Claudio_F »

Beh, gli shift servono per far "tornare i conti", ma lavorando in asm molti shift si semplificano o diventano virtuali, ad esempio invece di shiftare a destra 16 volte un numero a 32 bit, basta copiare il byte 2 nel byte 0, il byte 3 nel byte 1, e azzerare i due più significativi, o, ancora più spiccio, si prendono come risultato direttamente i due byte più significativi.
Avatar utente
M_A_W_ 1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 856
Iscrizione: venerdì 15 febbraio 2013, 3:57
Desktop: KDE
Distribuzione: SuSE
Sesso: Maschile
Località: Un luogo geometrico
Contatti:

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da M_A_W_ 1968 »

Vediamo un altro esempio, estremamente semplificato ma enormemente efficace dal punto di vista didattico, che serve ad insegnare come si ragiona in termini di codesign e cosa distingue definitivamente l'approccio amatoriale da quello professionale.

Consideriamo il più banale dei sensori di temperatura a stato solido, il vetusto LM35DZ con output in DC da 10mV/°C nel range 0÷5V, per la più stupida delle applicazioni: la misura di temperature in ambienti chiusi abitabili, con la precisione di ±1°C.

Naturalmente nessun progettista industriale considererebbe l'idea di connettere direttamente l'uscita del sensore all'ingresso dell'ADC integrato (in questo caso consideriamo un 8 bit), a maggior ragione se il sensore è cablato esternamente alla scheda. Si usa come minimo un opamp, anche mediocre, come buffer, o in casi più seri un INA. Se si parla di opamp è meglio che sia moderno, quindi full swing, in grado di fornire in output i medesimi 5V dell'alimentazione in saturazione, a meno di pochissimi mV di caduta. Ma anche se così non fosse, si impiega il più classico dei rimedi: sovralimentazione di +1,2V rispetto all'ADC Vref, per compensare il dropout in saturazione, in modo da sfruttare al massimo il range. E naturalmente ampio uso di condensatori di diverse tipologie (poliestere metallizzato, tantalio, elettrolitici in alluminio) in parallelo tra massa e segnale, oltre agli usuali device di protezione da EMI e sovratensioni permanenti, irradiate, indotte e condotte (diodi volano veloci, zenamic, transil, transzorb e affini).

A proposito di range, per l'applicazione in questione, un range 0÷50°C sarebbe già assolutamente esorbitante: d'altro canto, l'ADC integrato ha un passo di quantizzazione pari a 5'000 / 256 = 19,53mV/bit, quasi doppio rispetto ai 10mv/°C del sensore e quindi alla precisione di 1°C richiesta. Il che porta immediatamente all'esigenza di amplificare il segnale, invece di limitarsi ad un buffering. Un tipico fattore di amplificazione è pari a circa 4, anche se vi sarebbe molto più margine, ma consideriamolo sensato per questioni di rumore e immunità EMI.

Fissato dunque il guadagno del buffer di ingresso pari a 4, si ha: 19,53[mV/bit] / (4 * 10[mV/°C]) = 0,48828125[°C/bit].
Eseguendo il banale calcolo inverso, impostando come target 0,5°C/bit, ne deriva un guadagno G = 3,90625, facilmente ottenibile con una appropriata combinazione di resistori a strato metallico serie E96 e un trimmer multigiri in cermet di piccolo valore, se parliamo di applicazioni industriali: oppure si approssima grezzamente il guadagno a 4,0 usando comunissimi resistori al 5%, come avviene quasi sempre negli apparati consumer. :lol:

La conseguenza immediata di tutto ciò (due minuti di riflessione e una manciatina di componenti il cui costo industriale difficilmente raggiunge la soglia di un paio di euro) è che il firmware può semplicemente permettersi di dimezzare con uno shift il valore letto dall'ADC e inviare al display la temperatura convertita in BCD. In realtà, per mantenere intatto anche il bit meno significativo della misura, è preferibile operare su due byte e moltiplicare per cinque (sommando al valore originale il medesimo valore shiftato due volte a sinistra), il che è esattamente equivalente alla divisione per due in ambito fixed point, con uno spostamento della virgola.


Nel frattempo il classico dilettante allo sbaraglio ha invece prontamente "risolto" il problema linkando la libreria floating point e inserendo moltiplicazioni e chiamate alla funzione logaritmo per determinare il numero delle cifre prima della stampa, sprecando così un 45% della preziosa memoria di programma on chip, dopo avere causato thread di cinque o sei pagine perché ovviamente "non gli tornano i conti", "non visualizza i decimali", "la temperatura è sbagliata". :muro: :o :cry: :nono:
Sì, un blog ce l'ho perfino io: gli è che mi manca il tempo...

"...in una società che sembra sempre più spaventata dai problemi troppo articolati e che rigetta come un corpo estraneo ogni elemento di complessità, sapremo ancora come utilizzare il parere degli esperti?"
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da vbextreme »

[@MAW$ guarda che bel cielo che c'è fuori\n]
Se si ha ad esempio un atmega328p e poca esperienza di elettronica si collega direttamente l'uscita del lm35 al pin analogico, oppure se si ha nel cassetto una resistenza da 2k(come da datasheet) la si mette in serie.
Infine si imposta AREF a quello interno da 1.1v cosi si potranno leggere temperature tra lo 0 e i 110°C.
Naturalmente non dovrà mai e poi mai essere visto da @MAW...
[/@MAW]
Easy framework per il linguaggio C.
vbextreme hack your life
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da gila75 »

M_A_W hai ragionissima, ma si sincero: secondo te un hobbista, anche se talentuoso può sapere certe cose?
Ammiro molto di più il classico hobbista sopra citato che in qualche modo riesce a tira fuori qualcosa di funzionante, che studenti
d'ingegneria che dopo anni non sanno fare nulla...e fidati che ne ho incontrati su altri forum.
con questo non sto inneggiando a fare le cose un tot al kg...
Avevo fatto esperimenti con la sonda di temperatura, ma non ricordo se avevo usato un oamp...forse un lm358 si adesso che mi fai venire in mente,
ma non ricordo.
Avatar utente
M_A_W_ 1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 856
Iscrizione: venerdì 15 febbraio 2013, 3:57
Desktop: KDE
Distribuzione: SuSE
Sesso: Maschile
Località: Un luogo geometrico
Contatti:

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da M_A_W_ 1968 »

gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4850082#p4850082][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:M_A_W hai ragionissima, ma si sincero: secondo te un hobbista, anche se talentuoso può sapere certe cose?
Certo che sì. E' sufficiente che abbia frequentato le scuole dell'obbligo con profitto e che abbia letto almeno un paio di questi testi (sezione "Firmware, applicazioni e patatine fritte"). :lol:

Poi voglio vedere come i vari geni affrontano lo step successivo: LM35CAZ, in grado di misurare anche temperature negative, ma solo con una appropriata polarizzazione per lo shift nel range 0÷+5V... :o :sisi:
Sì, un blog ce l'ho perfino io: gli è che mi manca il tempo...

"...in una società che sembra sempre più spaventata dai problemi troppo articolati e che rigetta come un corpo estraneo ogni elemento di complessità, sapremo ancora come utilizzare il parere degli esperti?"
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C][ASM] Programmazione PIC 16F84A

Messaggio da gila75 »

ok...recepito.
Scrivi risposta

Ritorna a “Quarantena”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite