Come collegare un microcontrollore PIC?


8

Sono completamente nuovo nel mondo dei microcontrollori PIC e dell'ingegneria elettrica, quindi per favore andate piano :)

Ad ogni modo, sono riuscito a programmare il mio PIC 16f627 per accendere tre LED quando si preme il pulsante (pulsante di attivazione) e avviare una sequenza di spegnimento (praticamente ogni LED si spegne uno dopo l'altro con un ritardo di 5 secondi in mezzo) quando un altro pulsante è premuto (pulsante di ripristino). Ho provato questo su una scheda di programmazione / sperimentazione PIC K8048 di Velleman. I PIN RA0 e RA2 sono gli ingressi per i pulsanti di trigger e reset rispettivamente mentre i pin RB0, RB1 e RB2 sono i pin di uscita per i LED.

Lavorare con la scheda di sperimentazione è grandioso, ma voglio spostarlo su un circuito reale. Il problema è che non ho idea da dove cominciare. Ho comprato 3 LED (3,3 volt ciascuno), alcuni pulsanti e filo e ho costruito il seguente circuito:

Circuito

(scusa per l'orrendo schema)

Nel circuito che ho costruito, ho prima provato per vedere se i LED avrebbero funzionato con 3 batterie AA da 1,5 Volt e funzionavano bene, quindi ho pensato che i resistori non sarebbero stati necessari.

Questo non funziona, tuttavia, e sono totalmente perso. Per riferimento, ecco il mio codice per il PIC. È scritto in C usando MikroC. Funziona sul pannello di sperimentazione, quindi non penso che sia un problema

void main() {
    TRISB.RB0 = 0;
    TRISB.RB1 = 0;
    TRISB.RB2 = 0;
    PORTB.RB0 = 0;
    PORTB.RB1 = 0;
    PORTB.RB2 = 0;
    CMCON = 0x07;
    TRISA = 255;

    for(;;){
            if(PORTA.RA0 == 1 && PORTB.RB0 == 1 && PORTB.RB1 == 1 && PORTB.RB2 == 1){
                         delay_ms(5000);
                         PORTB.RB0 = 0;
                         delay_ms(5000);
                         PORTB.RB1 = 0;
                         delay_ms(5000);
                         PORTB.RB2 = 0;
            }
            if(PORTA.RA2 == 1){
                         PORTB.RB0 = 1;
                         PORTB.RB1 = 1;
                         PORTB.RB2 = 1;
            }
    }
}

Qualsiasi aiuto sarebbe molto apprezzato. Grazie!


3
Per favore, per favore, usa Fritzing . È gratuito, fa il 90% del lavoro per te e facilita la lettura dei diagrammi schematici.
Ignacio Vazquez-Abrams,


7
Penso che avere un account per 10 giorni e che questa sia la prima domanda di Shahmeer sia una scusa per "scaricare cazzate come questa su di noi". Certamente l'approccio di Ignacio di chiedere bene è più probabile che ottenga una risposta positiva rispetto a rimproverare il nuovo ragazzo ... a meno che il tuo obiettivo sia quello di impedire a nuove persone di rimanere in giro.
ajs410,

5
@ ajs410 - sappiamo tutti che questa è la pipì per animali di Olin, e anche se non sono sempre d'accordo con la sua formulazione, sono d'accordo con il suo principio. Il fatto che OP si scusa per l'orrendo (le sue stesse parole) "schematico" significa che sa bene che non va bene. Allora perché pubblica ancora questa cosa? Per me non deve essere creato dall'EDA, penso che preferirei vedere un disegno a matita.
Stevenvh,

2
È nuovo, come molti altri nuovi membri qui (me compreso). Dagli una pausa. Shahmeer, prova Fritzing. È bello e facile da usare e ti aiuterà a spiegare meglio la tua domanda. In un'altra nota, sono fortemente contrario alla scelta delle parole di Ignacio.
capcom,

Risposte:


11
  1. In primo luogo, sono sempre necessari resistori in serie con i LED quando pilotati da una fonte di tensione (ad es. Batteria, alimentazione CC, ecc.)
    Questo perché i LED hanno una curva IV non lineare, che sembra un'alta impedenza fino alla tensione di soglia del Il LED quindi si alza molto bruscamente, quindi significa che con una leggera variazione di tensione la corrente cambia molto, rendendo quasi impossibile impostare la corrente su un valore stabile in questo modo.
    Utilizzando i resistori della serie di valori corretti, si garantisce che la corrente non possa aumentare abbastanza da danneggiare il LED.
    Per calcolare il valore della resistenza è necessario conoscere la tensione diretta del LED (Vf), quindi sottrarre Vf dalla tensione di alimentazione e dividere per la corrente desiderata, ad esempio per un'alimentazione a 5 V, 2 V V e 15 mA:

    (5 V - 2 V) / 0,020 A = 200 Ω (Il valore standard di 220 Ω farà - se non si dispone di questo, puntare a qualcosa tra 150 Ω e 600 Ω per un intervallo da 20 mA a 5 mA)
    Si presuppone un tipico LED da 5 mm o 3 mm di corrente di funzionamento massima di 20 mA.

  2. Sebbene nello schema sia scritto "Batteria da 3 x 1,5 V in serie", le batterie sembrano effettivamente essere collegate in parallelo. Confermare, le batterie devono essere collegate da un capo all'altro come il diagramma in basso in questa immagine:

    Collegamenti paralleli e in serie

  3. È necessario disaccoppiare i condensatori presenti tra il microcontrollore Vdd e la terra. Non entrerò nei dettagli (cerca qui, ci sono molte buone risposte su questo argomento) ma sono fondamentalmente per fornire al microcontrollore una riserva di energia locale a bassa impedenza per la richiesta di corrente ad alta frequenza, a cui l'alimentatore non può rispondere rapidamente abbastanza.
    Idealmente dovresti posizionarne uno (100nF o 1uF in ceramica è piuttosto standard) attraverso i pin di alimentazione e di messa a terra, il più vicino possibile ai pin.

  4. Assicurati di utilizzare l'oscillatore interno se non hai cristalli presenti. Il tuo codice non mostra le impostazioni del bit di configurazione, se le hai lasciate fuori devi aggiungerle per assicurarti che il microcontrollore sia configurato correttamente. Il manuale CCS dovrebbe dirti come fare. Inoltre, nei bit di configurazione, assicurarsi che il timer del watchdog sia disattivato, altrimenti il ​​micro verrà ripristinato continuamente (a meno che non si chiami regolarmente il comando di cancellazione WDT)

  5. Assicurati di avere i LED nel modo giusto.

  6. Assicurati di avere il pin MCLR legato in alto, altrimenti il ​​tuo PIC verrà tenuto in reset (a meno che non disattivi MCLR nei bit di configurazione) Questo di solito viene fatto con un resistore su Vdd, valore circa 10kΩ. Il foglio dati ne avrà un esempio nella sezione reset. (grazie ad ajs410 per averlo menzionato)


Grazie mille per i commenti, sono stati davvero utili. Tutti quelli a parte comunque, dovrei aver collegato il PIC in qualche altro modo o le aggiunte che hai elencato sono tutto ciò di cui ho bisogno?
Shahmeer Navid,

2
Un'altra cosa è che probabilmente hai bisogno di resistori di pulldown sui pin dei pulsanti, per assicurarti che il pin sia logicamente basso quando il pulsante non viene premuto (a meno che tu non abbia i pulldown interni attivi, ma penso che PIC avrà solo pullup disponibili) È difficile essere sicuri delle cose con lo schema così com'è (ad es. simboli non standard, nessun numero / nome pin, ecc.) Mi prenderei qualche software di acquisizione PCB / schematico (es. Eagle [popolare / gratuito per non commerciale], Kicad [popolare / gratuito], Diptrace [economico], Altium [££££], ecc.) e utilizzarlo in futuro.
Oli Glaser,

1
6. Non dimenticare una resistenza di pull-up sul pin MCLR. Oppure imposta il bit di configurazione che utilizza il pull-up interno, se disponibile.
ajs410,

2

Consiglio vivamente il libro della serie O'Reilly "Designing Embedded Systems" di John Catsoulis per qualcuno nella tua posizione. C'è un capitolo "Elettronica 101" che ti porterà alla velocità funzionale abbastanza rapidamente, e altro sulla costruzione pratica.


2
  1. Non superare i 5 V, il PIC potrebbe scottarsi al di sopra del livello di tensione di 5 V. È possibile utilizzare batterie da 9 V o un adattatore CA / CC con un regolatore di tensione lineare come LM7805 per produrre 5 V per il circuito. Come cablare:

    http://stuff.nekhbet.ro/2006/06/18/how-to-build-a-5v-regulator-using-78l05-7805.html

  2. Come molti hanno detto: non dimenticare di fornire al pin MCLR un resistore seriale. È possibile utilizzare la configurazione pull-up per ripristinare il PIC. Ecco il link per lo schema: http://www.mcuexamples.com/push-buttons-and-switch-debouncing-with-PIC.php

  3. Utilizzare sempre una resistenza seriale prima di un led. Salverà il led dal bruciarsi e ridurrà il consumo di energia. Per i LED 3.3V 220 o 330 ohm andrebbero bene.


2

La funzione pulsante è semplice. Quando si preme un pulsante, due contatti vengono uniti e viene stabilita la connessione. Tuttavia, non è poi così semplice. Il problema risiede nella natura della tensione come dimensione elettrica e nell'imperfezione dei contatti meccanici. Vale a dire, prima che il contatto venga interrotto o interrotto, vi è un breve periodo di tempo in cui possono verificarsi vibrazioni (oscillazioni) a causa di irregolarità dei contatti meccanici o a causa della diversa velocità nella pressione di un pulsante (dipende sulla persona che preme il pulsante). Il termine dato a questo fenomeno si chiama SWITCH (CONTACT) DEBOUNCE. Se questo viene trascurato durante la scrittura del programma, può verificarsi un errore o il programma può produrre più di un impulso di uscita per una singola pressione di un pulsante. Per evitare ciò, possiamo introdurre un piccolo ritardo quando rileviamo la chiusura di un contatto. Ciò garantirà che la pressione di un pulsante sia interpretata come un singolo impulso. Il ritardo di debounce viene prodotto nel software e la durata del ritardo dipende dal pulsante e dallo scopo del pulsante. Il problema può essere parzialmente risolto aggiungendo un condensatore attraverso il pulsante, ma un programma ben progettato è una risposta molto migliore. Il programma può essere regolato fino alla completa eliminazione del falso rilevamento. L'immagine sotto mostra cosa succede realmente quando si preme il pulsante. Il programma può essere regolato fino alla completa eliminazione del falso rilevamento. L'immagine sotto mostra cosa succede realmente quando si preme il pulsante. Il programma può essere regolato fino alla completa eliminazione del falso rilevamento. L'immagine sotto mostra cosa succede realmente quando si preme il pulsante.

Per saperne di più: http://romux.com/tutorials/pic-tutorial/push-buttons#ixzz43cAbVcWR


1

Oltre a ciò che hanno scritto gli altri: non assegnare a singoli pin di uscita PIC, come ad esempio "PORTB.RB0 = 1;". Invece, modifica il bit in una variabile di dimensioni in byte, quindi scrivi quella variabile sulla porta.

Puoi farlo

  • credimi sulla parola,
  • leggere sul problema "leggi-modifica-scrivi", oppure
  • subire le conseguenze
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.