Come posso leggere l'ingresso digitale su ATmega16?


18

Cosa devo fare per leggere un ingresso digitale (pulsante) su ATmega16 ? Devo abilitare i resistori pullup o posso usarne uno da 10 kohm? Quale sarebbe un semplice codice? Basta un semplice "Accendi il LED quando viene premuto".

Esiste un tutorial per principianti? Ho provato a cercare su Google e AVR Freaks , ma tutto si evolve in un combattimento lì e non ho la mia risposta. Non ho davvero trovato tutorial su queste cose. Tonnellate di cose specifiche ma niente di semplice sul mio microcontrollore AVR ...


4
Questa sarebbe una risposta praticamente in ogni tutorial per principianti, e temo che una risposta completa qui minerebbe la tua comprensione più che un aiuto. Quali sforzi precedenti hai fatto per imparare?
Yann Vernier,

Non sono sicuro se hai visto il mio post o sei in grado di vederlo (mi dispiace ancora un po 'confuso su questo sito ...) Ma conosco il codice, diciamo che la mia domanda è: devo solo collegare un pin a GND ed è basso?
curioso

2
Perché non modificare i tuoi post per riflettere in modo più accurato e includere anche il post qui sotto nel post originale.
Amos,

Prova il tutorial AVR From-Scratch in questa pagina Freaks di AVR. Troverai molte più cose lì.
Leon Heller,

Risposte:


24

Saluti brasiliani!

Prima di tutto grazie Joby per il tuo esempio. In secondo luogo, il suo esempio ha solo un piccolo errore. Il numero 0x20 non è corretto. Dovrebbe essere 0x04. Inoltre, come suggerimento, non userei numeri esadecimali come 0xFB, 0x20 o 0x04 nel codice. Suggerirei di utilizzare le definizioni della porta PIN presenti in io.h e altre a cui fa riferimento il file di intestazione. Ho riscritto l'esempio di Joby di seguito, con alcuni commenti per i principianti.

# include <avr/io.h>

int main (void)
{
    // set all pins on PORTB for output
    DDRB = 0xFF;

    // set port pin PORTD2 as input and leave the others pins 
    // in their originally state (inputs or outputs, it doesn't matter)
    DDRD &= ~(1 << PD2);        // see comment #1

    while (1) 
    {
        if (PIND & (1<<PD2))    // see comment #2
            PORTB |= (1<<PB2);  // see comment #3
        else
            PORTB &= ~(1<<PB2); // see comment #4
    }
    return 0;
}

/ *

commenti per principianti

commento n. 1: (1 << PD2) genera il binario 00000100. L'operazione "~" inverte tutte le cifre, ovvero il binario ora è 11111011. Infine il & = applica la logica "AND" tra DDRD e 11111011 e il risultato viene nuovamente inserito nella memoria DDRD. Nota: ciò che l'operatore "AND" fa è per ciascun bit nella memoria DDRD, confronta con il numero binario sopra. Se il bit in DDRD è 0 e il bit nel binario nella stessa posizione del morso è 1, il bit risultante è 0, se il DDRD è 1 e il bit nel binario è 1, il bit risultante è 1, e se il bit nel DDRD è 1 o 0 e il bit nel binario è 0, quindi il bit risultante è sempre 0. In breve, il comando DDRD & = ~ (1 << PD2) cambia solo il bit PD2 in zero e lascia intatti gli altri (zeri o quelli). Sembra un po 'complicato, ma dopo esserti abituato, è il modo migliore per cambiare un po' in un morso senza cambiare gli altri bit.

commento # 2 : (1 << PD2) genera il binario 00000100. Usando la stessa logica "AND" descritta nel commento # 1, il comando "PIND & 0000100" controlla solo se il PIND2 (il nostro pin di input a cui è collegato il pulsante a) è impostato su alto o no. Tutti gli altri pin saranno FALSE poiché i bit binari sono impostati su 0 e poiché il bit binario n. 2 è impostato su 1, l'istruzione IF sarà TRUE solo se l'ingresso PD2 è impostato su alto o FALSO se l'ingresso PD2 è impostato su basso.

commento n. 3 : seguendo la logica spiegata nel commento n. 1, questo comando imposta il pin di uscita PINB2 nella porta PORTB su alta tensione. Se il LED è collegato correttamente a questa porta pin con una resistenza di ~ 300 ohm e quella resistenza è collegata a terra, il LED dovrebbe accendersi.

commento n. 4 : il LED dovrebbe spegnersi per gli stessi motivi spiegati nei commenti precedenti.

Considerazioni finali:

a) Per evitare oscillazioni di tensione nel pin di ingresso PD2 quando il pulsante non viene premuto (circuito aperto), si consiglia vivamente di posizionare una resistenza di pull-down (1 kOhm o superiore), in modo che il LED non si accenda accidentalmente a causa di a questa oscillazione di tensione casuale.

b) Una nota di esclusione di responsabilità: le idee qui descritte devono essere utilizzate solo a scopo didattico e NON devono essere utilizzate in alcun sistema reale prima di consultare un esperto in elettronica.

* /


3
Non ti incoraggio a fornire la tua e-mail perché la corrispondenza tramite e-mail rende la comunicazione privata. Quindi nessun altro può trarne beneficio. Ma se vuoi davvero fornire la tua e-mail per comunicazioni private, il posto migliore per farlo è nel tuo profilo.
Daniel Grillo

Non è viceversa - # 3 spegne il led, # 4 accende il led?
sitilge,

2

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

https://www.mainframe.cx/~ckuethe/avr-c-tutorial/#digital-in

#include <avr/io.h>

/*
 * Assumptions:
 *  - LED connected to PORTB.2
 *  - Switch connected to PORTD.2
 */

int main (void)
{
    /* set PORTB for output*/
    DDRB = 0xFF;
    /* set PORTD for input*/
    DDRD &= 0xFB;
    PORTD |= 0x04;

    while (1) {
        if (PIND & 0x04)
            PORTB &= ~0x20;
        else
            PORTB |= 0x20;
    }
    return 0;
}

Grazie a @joby Taffey per il link fornito. Stavo cercando le funzioni EEPROM e ho ricevuto molto aiuto da: mainframe.cx/~ckuethe/avr-c-tutorial/lesson11.c Grazie mille.
Bishal Paudel,



0

Qualcos'altro da considerare quando si ha a che fare con un ingresso digitale da un interruttore meccanico sono i contatti che rimbalzano - cambiando quello che dovrebbe essere un singolo pulsante in quello che sembra più push.

Per qualcosa come accendere un LED quando si tiene premuto il pulsante, probabilmente non devi preoccuparti del rimbalzo. Per qualcosa di un po 'più complicato (come attivare o disattivare il LED sulla pressione del pulsante), è necessario rimbalzare.

Jack Ganssle ha una buona guida al rimbalzo

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.