Hardware XOR per perni di output su AVR Microcontrollers
Sapevi che molti chip AVR hanno un tipo di opzione esclusiva di hardware o (XOR) quando riguarda i livelli logici dei perni di uscita? Se si guarda nel foglio di dati (l’immagine sopra è uno screenshot da una scheda tecnica Attiny13) troverai una sezione attivando il PIN. Si scopre che se si imposta una porta come uscita, scrivere la logica sul corrispondente registro PIN alternano i livelli logici di questo. Questo è davvero facile da trascurare se stai scrivendo in c, ma ho lavorato ad imparare un po ‘di un linguaggio di assembler e ho trovato che questo è molto utile. Continua a leggere dopo la pausa e ti dirò come mi è successo su queste informazioni e cosa è buono per.
Quindi prima spento, parliamo del perché non importa molto se stai scrivendo in codice C. Tipicamente se si desidera attivare alcuni perni di output che scriverai solo un one-liner che Xor è con una bellomask:
1.
Portb ^ = 0xff;
Questo è un po ‘di stento C (impara molto di più dalla mia serie tutorial) che esegue il XOR sui livelli di uscita correnti e scrive il risultato torna alla porta. Ma la stessa cosa può essere eseguita nell’hardware scrivendo la bitmask sul registro Pinb:
1.
Pinb = 0xff;
Non ti importa davvero, perché è solo una linea di codice. In effetti è probabilmente più semplice a Xor il Portb perché rende molto più senso concettualmente. Ma il compilatore potrebbe finire per usare molti altri cicli che se avessi scritto nel registro PIN.
Mi è capitato in questa caratteristica perché stavo lampeggiando dei LED come un modo per imparare l’assemblatore. Ho avuto questo miscuglio del codice in una routine di servizio di interrupt:
1.
2.
3.
4.
ldi myreg, 0xff
in Intreg, Portb
EOR INTREG, MYREG
fuori Portb, Intreg
Carica una mascherata in un registro, carichi nella logica corrente da Portb a un altro registro, esegue un XOR dei due e scrive il risultato Torna a Portb. Questo richiede quattro cicli e richiede due registri. Attivando i bit è un’operazione così rudimentale sono stato stupito, non c’era un comando a Xor bit direttamente, quindi ho iniziato a cercare. Mi sono imbattuto in questo breve articolo su AVR Freaks che mi ha indifferente nella funzione Bit Toggle. Ora sono stato in grado di diminuire il mio codice assembler come segue:
1.
2.
LDI INTREG2, 0xFF; TEMPORARY UTILIZZA INTREG2 come maschera bit
fuori Pinb, INTREG2; Scrivere a Pinb Ectivley fa un esclusivo o su Portb
Ciò si traduce nello stesso effetto commutabile, ma richiede solo due cicli e richiede l’uso di un solo registro.
Quello che ho trovato molti interessanti è che non importa quanto uso chip AVR, non c’è mai una carenza di sorprese in attesa di essere trovata nella scheda tecnica.