CORREZIONE COMPITO RECUPERO FEBBRAIO 2017


risposta 1: per completare lo schema di oscillazione devo aggiungere 2 condensatori dello stesso valore. Il valore dei condensatori dipende dalla frequenza del quarzo, e mediante quest'ultimo valore si ricava la capacità da una tabella sul datasheet del microcontrollore. Lo schema completo è il seguente:



risposta 2: lo schema dei due tipi di comando è riportato sotto:



A sinistra (S1 e R1) formano il comando con resistenza di pull-down (resistenza a massa e interruttore NO collegato ai +5Vdc). In questo caso sono collegati all'ingresso RA2, come si vede l'ingresso citato è collegato tra la resistenza e l'interruttore (S1 e R1). Con l'interruttore non premuto, lo stato logico dell'ingresso RA2 è '0' logico, mentre se si preme l'interruttore si fornisce '1' logico all'ingresso. Quindi nel programma, per vedere se ho premuto S1, devo leggere il bit che fa riferimento a RA2 (bit 2 del registro PORTA, ovviamente il bit 2 del TRISA è impostato a '1' per settare come ingresso il pin RA2), e se questo pin è a '1' logico allora l'interruttore è premuto, altrimenti se è a '0' logico non è premuto.

A destra (S2 e R2) formano il comando con resistenza di pull-up (resistenza collegata a +5Vdc e l'interruttore NO collegato a massa). In questo caso sono collegati all'ingresso RA4, come si vede l'ingresso citato è collegato tra resistenza e interruttore (S2 e R2). Con l'interruttore non premuto, lo stato logico dell'ingresso RA4 è '1' logico, mentre se si preme l'interruttore si fornisce '0' logico all'ingresso. Quindi nel programma per vedere se ho premuto S2 devo leggere il bit che fa riferimento a RA4 (bit 4 del registro PORTA, ovviamente il bit 4 del TRISA è impostato a '1' per settare come ingresso il pin RA4), e se questo pin è a '0' logico allora l'interruttore è premuto, altrimenti se è a '1' logico non è premuto.


Oss. 1 – ricordo agli studenti che se uso il PORTA come ingresso devo caricare con il valore 0x07 o 0x06 il registro ADCON1, questo perché di default i pin di questa porta sono impostati come analogici, e caricando i valori suddetti imposto questi ingressi come lettori digitali.


Oss. 2 – è consigliato usare BTFSS per leggere un ingresso con resistenza di pull-down, perché vado a vedere se l'ingresso è a '1', mentre è consigliato usare BTFSC per leggere un ingresso con resistenza di pull-up, perché vado a vedere se l'ingresso è a '0'.


risposta 3 (sezione B): lo schema del circuito di reset hardware è formato dalla rete resistenza e dal condensatore. Quindi appena alimento il circuito, il micro non comincia a leggere il programma perché è in stato di reset (in pratica rimane fisso sulla riga 0 della program memory). Poi, dopo un certo tempo, cioè quando il condensatore si è caricato e ha portato l'ingresso MCLR a '1' logico, il micro esce dallo stato di reset e comincia ad eseguire il programma.


risposta 3 (sezione C): lo schema del circuito di reset hardware è formato dalla sola resistenza che mantiene a livello alto l'ingresso MCLR. Quindi appena alimentato, il microcontrollore comincia subito ad eseguire il programma caricato nella program memory.


risposta 4 (sezione B): dallo schema si può dedurre che

  1. gli ingressi sono di tipo resistenza di pull-up

  2. le uscite hanno il led collegato per accendersi quando l'uscita a lui riferita va a '1' logico

  3. l'interruttore S1 è collegato all'ingresso RB1, mentre l'interruttore S2 è collegato all'ingresso RB3

  4. il led DL1 è collegato all'uscita RB2, mentre il led DL2 è collegato all'uscita RB0

  5. stando ai punti precedenti, si usa solo la PORTB, quindi per impostare questi pin per lo schema, devo caricare il registro TRISB con il byte 111111010 (ricordo che i pin I/O non usati, per nostra convenzione, vanno impostati come ingressi). Il valore esadecimale da caricare è 0xFA.


posso costruirmi una tabella di verità del funzionamento richiesto al mio circuito

riga

S1 - RB1

S2 - RB3

DL1 - RB2

DL2 - RB0

RICHIESTE

1

0

1

1

0

SE PREMO S1 E NON PREMO S2 SI ACCENDE DL1 E SI SPEGNE DL2

2

1

0

1

0

SE PREMO S2 E NON PREMO S1 SI ACCENDE DL1 E SI SPEGNE DL2

3

1

1

0

0

SE NON PREMO S1 E NON PREMO S2 SI SPENGONO SIA DL1 CHE DL2

4

0

0

0

1

SE PREMO SIA S1 CHE S2 ALLORA SI ACCENDE DL2 E SI SPEGNE DL1


PREMUTO – '0'

NON PREMUTO - '1'

PREMUTO – '0'

NON PREMUTO - '1'

ACCESO – '1'

SPENTO - '0'

ACCESO – '1'

SPENTO - '0'



Svolgimento firmware:




risposta 4 (sezione C): dallo schema si può dedurre che

  1. gli ingressi sono di tipo resistenza di pull-down

  2. le uscite hanno il led collegato per accendersi quando l'uscita a lui riferita va a '0' logico

  3. l'interruttore S1 è collegato all'ingresso RB1, mentre l'interruttore S2 è collegato all'ingresso RB3

  4. il led DL1 è collegato all'uscita RB2, mentre il led DL2 è collegato all'uscita RB0

  5. stando ai punti precedenti, si usa solo la PORTB, quindi per impostare questi pin per lo schema, devo caricare il registro TRISB con il byte 111111010 (ricordo che i pin I/O non usati, per nostra convenzione, vanno impostati come ingressi). Il valore esadecimale da caricare è 0xFA.

posso costruirmi una tabella di verità del funzionamento richiesto al mio circuito

riga

S1 - RB1

S2 - RB3

DL1 - RB2

DL2 - RB0

RICHIESTE

1

1

0

0

1

SE PREMO S1 E NON PREMO S2 SI ACCENDE DL1 E SI SPEGNE DL2

2

0

1

0

1

SE PREMO S2 E NON PREMO S1 SI ACCENDE DL1 E SI SPEGNE DL2

3

0

0

1

1

SE NON PREMO S1 E NON PREMO S2 SI SPENGONO SIA DL1 CHE DL2

4

1

1

1

0

SE PREMO SIA S1 CHE S2 ALLORA SI ACCENDE DL2 E SI SPEGNE DL1


PREMUTO – '1'

NON PREMUTO - '0'

PREMUTO – '1'

NON PREMUTO - '0'

ACCESO – '0'

SPENTO - '1'

ACCESO – '0'

SPENTO - '1'



Svolgimento firmware:





OSS. 3 – ovviamente entrambi i codici sopra, hanno senso se copiati all'interno del codice base di assembler presentato nelle lezioni. Questo file contiene la parte di intestazione del codice e la parte finale con l'istruzione END;.