I registri e le porte AVR devono essere inizializzati a zero?


9

Durante la routine di inizializzazione del mio codice utilizzo per fare cose come:

clr    r0  ; will always stay zero

e:

out    PORTA, r0; initialize ports
out    DDRA, r0
out    PORTB, r0
...

Questo è effettivamente necessario? O posso essere sicuro che ciò avvenga automaticamente al ripristino? In particolare, posso fare affidamento sul fatto che tutte le porte siano impostate come input per impostazione predefinita, quindi non ci sono problemi con le votazioni esterne quando non viene eseguito alcun codice?

Risposte:


6

Le porte I / O di un AVR sono impostate su INPUT / Tri-State / Hi-Z (DDRx = 0x00) al ripristino. La maggior parte dei microcontrollori (se non tutti?) Hanno questo comportamento. È lo stato più sicuro in cui si trova un pin. Quindi sì, puoi fare affidamento sulle porte da impostare automaticamente come input.

Alcuni estratti su ATmega16 mostrano esattamente che:

inserisci qui la descrizione dell'immagine

I pin della porta C vengono dichiarati quando si attiva una condizione di ripristino, anche se l'orologio non è in esecuzione.


1
Questo è esattamente quello che stavo cercando :)
Stefan Paul Noack

per quanto ricordo, se lasci un input flottante, ottieni un rumore casuale su di esso, quindi lo stato iniziale può essere zero, va bene, ma potrebbe diventare diverso da zero dopo il primo ciclo di clock.
miceuz,

@miceuz Il punto non è avere output in uno stato sconosciuto . Potrebbero avere un effetto indesiderato sul circuito esterno collegato al microcontrollore
m.Alin

1
@miceuz ti riferisci ai registri di input delle porte, giusto? questi hanno N / A come stato iniziale (il che ha senso, poiché riflettono semplicemente tutto ciò che viene applicato al pin). Ma mi riferivo ai registri di direzione dei dati. Volevo solo essere sicuro di non avere accidentalmente la porta impostata come uscita, probabilmente in conflitto con le tensioni applicate al pin.
Stefan Paul Noack,

oh sì, davvero, scusa per il rumore ..
miceuz,

4
  • L'inizializzazione delle porte è SEMPRE una buona idea, indipendentemente da ciò che dice la scheda tecnica.

  • Se il foglio dati non dice nulla, allora è un'idea assolutamente vitale.


Devi solo definire il contenuto dei dati della porta se ti preoccupi di cosa accadrà quando il tuo programma verrà eseguito.

Se non ti interessa il risultato non devi impostare i bit di dati della porta :-).

Se i produttori dichiarano esplicitamente nelle schede tecniche che i bit di dati delle porte sono impostati o cancellati, allora potrebbero essere MA È ANCORA un'ottima idea inizializzarli da soli. Le "condizioni al contorno" sono dove la maggior parte delle cose va storta - ad es. Inizio di un loop, fine di un loop, punto circolare di avvolgimento del buffer circolare, .... L'avvio del processore è un equivalente hardware. In un mondo reale con rumori, difetti e persone, essere davvero responsabile del destino dei tuoi programmi è una buona idea. L'inizializzazione delle porte è una parte facile di questo.


Completamente concordato Ho appena pensato che, invece di un reset hardware, potrebbe esserci un salto all'avvio del programma o - quello che mi è successo di recente quando i salti indiretti sono andati male - il Program Counter è semplicemente traboccato e ha raggiunto nuovamente 0x0000. Chissà in quale stato saranno i porti dopo quello ...
Stefan Paul Noack,

1

Né i registri né SRAM vengono inizializzati al ripristino, solo alcuni dei registri periferici. Dovresti inizializzare le cose che usi.


Conoscete o avete un collegamento con una perdita di quali registri periferici si applica? Ho trovato "valori iniziali" per alcuni come UCSRCnel foglio dati. E le porte I / O, in particolare la direzione dei dati?
Stefan Paul Noack,

2
Le porte I / O sono impostate per l'ingresso. È tutto nella scheda tecnica.
Leon Heller,

@LeonHeller oh grazie, ora lo vedo. Proprio lì nelle descrizioni del registro. In qualche modo mi è mancato ...
Stefan Paul Noack

@ noah1989, Leon ha ragione, i valori iniziali per i registri periferici sono sempre specificati sotto la visualizzazione del registro (o come si chiama quell'immagine con nomi di singoli bit :)).
avakar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.