Pagina 1 di 1

Dubbi su I/O (AVR)

MessaggioInviato: 29 ago 2014, 18:04
da daniele1996
Salve a tutti, fino a poco tempo fa, sapevo che per dichiarare un PIN come output bisognava mettere nel registro DDRx il bit interessato a 1, al contrario per avere l'input...
spiego meglio:
Codice: Seleziona tutto
int main(){
DDRB |= (1<< 4);
//Output
for(;;){
//fa qualcosa con il pin
}
return 0;
}

e come input:
Codice: Seleziona tutto
int main(){
DDRB &= ~(1<< 4);

for(;;){
//fa qualcosa con il pin
}

return 0;
}


ora leggendo qui mi è sorto un dubbio:
mettere a 1 o a 0 nel DDRx è la stessa cosa? (Nel senso che posso usare sia come Input che come output lo stesso pin)
Lì dice che serve per una resistenza pull-up, cosa cambia se la abilito o no?

Re: Dubbi su I/O (AVR)

MessaggioInviato: 29 ago 2014, 18:19
da emacar
Ciao,
dal tuo link io capisco che mettendo in DDRx il bit interessato a 1 esso viene configurato come output, come appunto pensavi tu.
Per quanto riguarda il pull-up, ti dice che per fare arrivare uno stato logico 0 il pulsante deve permettere un collegamento a massa (o comunque sottosoglia) per far arrivare uno stato logico 1 il pulsante deve permettere un collegamento a Vdd (o comunque soprasoglia).
Il modo classico per ottenere ciò è utilizzare una resistenza di pull-up. Aggiunge inoltre che negli ultimi microcontrollori alcune porte sono provviste di pull-up interno per cui non hai bisogno di aggiungere componentistica esterna per il pull-up, ma basta attivare quello interno configurando gli appositi registri.
Spero di esserti stato d'aiuto.
Emanuele

Re: Dubbi su I/O (AVR)

MessaggioInviato: 29 ago 2014, 18:39
da daniele1996
Mi stranizzano i commenti nel codice:

Codice: Seleziona tutto
// this code sets PB5 to an input with a pull-up enable


#include <avr/io.h>


int main(void)
{
    DDRB &= ~(1 << DDB5); // Clear the PB5 pin
    // PB5 is now an input

    PORTB |= (1 << PORTB5); // turn On the Pull-up                      <----
    // PB5 is now an input with pull-up enabled                              <----


    while (1)
    {
        if( (PINB & (1<<PINB5)) == 0)
        {
            // do something when PD0 is on
        }
    }
}

Questi Pull-up a cosa servono? perché lo scrive nel registro di output?

Re: Dubbi su I/O (AVR)

MessaggioInviato: 29 ago 2014, 18:54
da TardoFreak
Perché funziona in questo modo, ed è scritto nel datasheet. -:-
Se tu hai impostato il pin con ingresso e ci scrivi un 1 sul registro della porta ti si attiva il pullup.
Serve per evitare di metterlo esterno.
Ad esempio, se devi utilizzare un pulsante lo puoi collegare fra l' ingresso e la massa, attivare il pullup (che a riposo ti tiene l' ingresso a 1) senza usare una resistenza di pullup esterna.
Si risparmia una resistenza e lo spazio sul circuito stampato.

Re: Dubbi su I/O (AVR)

MessaggioInviato: 29 ago 2014, 18:59
da daniele1996
Ottimo!!! con questo mi risparmio parecchie resistenze :) una not logica in piu ed il gioco è fatto!!! Grazie :)

Re: Dubbi su I/O (AVR)

MessaggioInviato: 29 ago 2014, 19:16
da emacar
daniele1996 ha scritto:Questi Pull-up a cosa servono?

Ecco forse il problema principale della discussione è questo. Facciamo riferimento allo schema "Figure 2: Pull-up Resistor".
Quando l'interruttore è chiuso il comportamento dovrebbe essere chiaro, viene creato un collegamento verso massa: all'ingresso del MCU il valore logico è 0. Quanto l'interruttore è aperto, se non ci fosse la parte di schema composta da resistenza e alimentazione, il pin rimarrebbe "aperto" e quindi in uno stato indefinito.
Grazie alla parte di schema composta da resistenza e alimentazione (non a caso la resistenza viene in questo caso chiamata di pull-up), quando l'interruttore si apre, viene creato un collegamento verso l'alimentazione: all'ingresso del MCU il valore logico è 1.
Questo MCU ha la possibilità di utilizzare un pull-up interno: grazie a ciò non hai bisogno di inserire la resistenza, ma puoi collegare direttamente l'interruttore perché la resistenza che collega il pin all'alimentazione è interna al MCU. Ovviamente, come ti ho già detto, va attivata configurando gli appositi registri.

Re: Dubbi su I/O (AVR)

MessaggioInviato: 5 set 2014, 2:04
da daniele1996
(riscrivo qui per non riapreire un thread su un argomento simile)

i pin contrassegnati come " AIN0 e AIN1" a cosa servono? non sono ingressi analogici perché quelli sono contrassegnati come "ADCx", mi chiedo a cosa servono e per cosa vengono impiegati... nel DS non ho capito bene...

Re: Dubbi su I/O (AVR)

MessaggioInviato: 5 set 2014, 8:39
da emacar
Ciao, ti consiglio quando hai un dubbio del genere di provare a cercare in rete perché scrivendo an0 avr compaiono una marea di risultati. Sono gli ingressi del comparatore analogico.
Emanuele