Ich bin völlig neu in der Welt der PIC-Mikrocontroller und der Elektrotechnik, also gehen Sie bitte einfach :)
Wie auch immer, ich habe es geschafft, meinen PIC 16f627 so zu programmieren, dass er drei LEDs einschaltet, wenn der Druckknopf (Auslöseknopf) gedrückt wird, und eine Abschaltsequenz startet (im Grunde schaltet jede LED nacheinander mit einer Verzögerung von 5 Sekunden dazwischen aus), wenn ein anderer Druckknopf ist gedrückt (Reset-Taste). Ich habe dies auf einem K8048 PIC-Programmier- / Experimentierboard von Velleman getestet. Die PINs RA0 und RA2 sind die Eingänge für die Trigger- bzw. Reset-Tasten, während die Pins RB0, RB1 und RB2 die Ausgangspins für die LEDs sind.
Die Arbeit mit dem Experimentierboard ist großartig, aber ich möchte dies auf eine tatsächliche Schaltung übertragen. Das Problem ist, dass ich keine Ahnung habe, wo ich anfangen soll. Ich habe 3 LEDs (jeweils 3,3 Volt), einige Drucktasten und Kabel gekauft und folgende Schaltung aufgebaut:
(sorry für den schrecklichen Schaltplan)
In der von mir konstruierten Schaltung habe ich zuerst getestet, ob die LEDs mit 3 1,5-Volt-AA-Batterien funktionieren würden, und sie funktionierten gut, also dachte ich, dass Widerstände nicht notwendig wären.
Dies funktioniert jedoch nicht und ich bin völlig verloren. Als Referenz ist hier mein Code für den PIC. Es ist in C mit MikroC geschrieben. Es funktioniert auf dem Experimentierboard, also denke ich nicht, dass es ein Problem ist
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;
}
}
}
Jede Hilfe wäre sehr willkommen. Vielen Dank!
Erstens braucht man immer Vorwiderstände mit den LEDs, wenn sie von einer Spannungsquelle (z. B. Batterie, Gleichstromversorgung usw.) angesteuert werden.
Dies liegt daran, dass LEDs eine nichtlineare IV-Kurve haben, die bis zur Schwellenspannung wie eine hohe Impedanz aussieht LED steigt dann sehr stark an, dh bei einer sehr geringen Spannungsänderung ändert sich der Strom stark, so dass es fast unmöglich ist, den Strom auf diese Weise auf einen stabilen Wert einzustellen.
Durch die Verwendung von Vorwiderständen mit dem richtigen Wert stellen Sie sicher, dass der Strom nicht so stark ansteigen kann, dass die LED beschädigt wird.
Um den Widerstandswert zu berechnen, müssen Sie die LED-Durchlassspannung (Vf) kennen, dann Vf von der Versorgungsspannung subtrahieren und durch den gewünschten Strom dividieren, z. B. für eine 5-V-Versorgung, eine 2-V-Vf und 15 mA:
(5 V - 2 V) / 0,020 A = 200 Ω (Der Standardwert von 220 Ω reicht aus. Wenn Sie dies nicht haben, streben Sie einen Wert zwischen 150 Ω und 600 Ω für einen Bereich von 20 mA bis 5 mA an.)
Dies setzt eine typische 5-mm- oder 3-mm-LED voraus von 20 mA max. Betriebsstrom.
Obwohl in Ihrem Schaltplan "3 x 1,5-V-Batterie in Reihe" steht, sehen die Batterien so aus, als wären sie tatsächlich parallel geschaltet. Zur Bestätigung müssen die Batterien Ende an Ende wie im unteren Diagramm in diesem Bild verbunden werden:
Sie benötigen Entkopplungskondensatoren , die zwischen dem Mikrocontroller Vdd und Masse vorhanden sind. Ich werde nicht ins Detail gehen (suchen Sie hier weiter, es gibt viele gute Antworten zu diesem Thema), aber sie sollen dem Mikrocontroller im Grunde eine niederohmige lokale Energiereserve für den hochfrequenten Strombedarf bieten, auf den die Stromversorgung nicht schnell reagieren kann genug.
Idealerweise sollten Sie einen (100 nF oder 1 uF Keramik ist ziemlich Standard) über die Strom- und Erdungsstifte so nah wie möglich an den Stiften platzieren.
Stellen Sie sicher, dass Sie den internen Oszillator verwenden, wenn kein Quarz vorhanden ist. Ihr Code zeigt die Config-Bit-Einstellungen nicht an, wenn Sie sie ausgelassen haben, müssen Sie sie hinzufügen, um sicherzustellen, dass der Mikrocontroller korrekt eingerichtet ist. Das CCS-Handbuch sollte Ihnen sagen, wie das geht. Stellen Sie auch in den Konfigurationsbits sicher, dass der Watchdog-Timer ausgeschaltet ist, da Ihr Mikro sonst ständig zurückgesetzt wird (es sei denn, Sie rufen regelmäßig den WDT-Löschbefehl auf).
Stellen Sie sicher, dass Sie die LEDs richtig herum haben.
Stellen Sie sicher, dass Sie den MCLR-Pin hoch gebunden haben, sonst wird Ihr PIC im Reset gehalten (es sei denn, Sie schalten MCLR in den Konfigurationsbits aus). Dies geschieht normalerweise mit einem Widerstand gegen Vdd, Wert um 10 kΩ. Das Datenblatt enthält im Abschnitt „Zurücksetzen“ ein Beispiel dafür. (Danke an ajs410 für die Erwähnung)
Ich empfehle das Buch der O'Reilly-Reihe "Designing Embedded Systems" von John Catsoulis für jemanden in Ihrer Position. Es gibt ein „Electronics 101“-Kapitel, das Sie ziemlich schnell auf funktionale Geschwindigkeit bringen wird, und ein weiteres Kapitel über praktische Konstruktionen.
Überschreiten Sie nicht 5 V, Ihr PIC könnte über 5 V Spannungspegel verbrannt werden. Sie können 9-V-Batterien oder einen AC/DC-Adapter mit einem linearen Spannungsregler wie dem LM7805 verwenden, um 5 V für Ihre Schaltung zu erzeugen. Wie zu verdrahten:
http://stuff.nekhbet.ro/2006/06/18/how-to-build-a-5v-regulator-using-78l05-7805.html
Wie die meisten gesagt haben: Vergessen Sie nicht, den MCLR-Pin mit einem Serienwiderstand zu versorgen. Sie können die Pullup-Konfiguration verwenden, um Ihren PIC zurückzusetzen. Hier ist der Link für das Schema: http://www.mcuexamples.com/push-buttons-and-switch-debouncing-with-PIC.php
Verwenden Sie immer einen Serienwiderstand vor einer LED. Es schützt die LED vor dem Verbrennen und verringert den Stromverbrauch. Für 3,3-V-LEDs wären 220 oder 330 Ohm in Ordnung.
Die Tastenfunktion ist einfach. Wenn wir einen Knopf drücken, werden zwei Kontakte miteinander verbunden und die Verbindung hergestellt. Trotzdem ist es nicht ganz so einfach. Das Problem liegt in der Natur der Spannung als elektrische Größe und in der Unvollkommenheit mechanischer Kontakte. Das heißt, bevor der Kontakt hergestellt oder unterbrochen wird, gibt es einen kurzen Zeitraum, in dem Vibrationen (Oszillationen) aufgrund von Ungleichmäßigkeiten bei mechanischen Kontakten oder aufgrund unterschiedlicher Geschwindigkeit beim Drücken einer Taste auftreten können (dies hängt davon ab Person, die den Knopf drückt). Der diesem Phänomen gegebene Begriff heißt SWITCH (CONTACT) DEPRALL. Wenn dies beim Schreiben des Programms übersehen wird, kann ein Fehler auftreten, oder das Programm kann mehr als einen Ausgangsimpuls für einen einzelnen Tastendruck erzeugen. Um dies zu vermeiden, können wir eine kleine Verzögerung einführen, wenn wir das Schließen eines Kontakts erkennen. Dadurch wird sichergestellt, dass der Tastendruck als einzelner Impuls interpretiert wird. Die Entprellverzögerung wird in Software erzeugt und die Länge der Verzögerung hängt von der Taste und dem Zweck der Taste ab. Das Problem kann teilweise durch Hinzufügen eines Kondensators über der Taste gelöst werden, aber ein gut gestaltetes Programm ist eine viel bessere Antwort. Das Programm kann angepasst werden, bis eine Fehlerkennung vollständig eliminiert ist. Das Bild unten zeigt, was tatsächlich passiert, wenn die Taste gedrückt wird. Das Programm kann angepasst werden, bis eine Fehlerkennung vollständig eliminiert ist. Das Bild unten zeigt, was tatsächlich passiert, wenn die Taste gedrückt wird. Das Programm kann angepasst werden, bis eine Fehlerkennung vollständig eliminiert ist. Das Bild unten zeigt, was tatsächlich passiert, wenn die Taste gedrückt wird.
Lesen Sie mehr: http://romux.com/tutorials/pic-tutorial/push-buttons#ixzz43cAbVcWR
Zusätzlich zu dem, was die anderen geschrieben haben: Weisen Sie nicht einzelnen PIC-Ausgangspins zu, wie zum Beispiel "PORTB.RB0 = 1;". Nehmen Sie stattdessen die Bitänderung in einer Variablen in Bytegröße vor und schreiben Sie diese Variable dann in den Port.
Du kannst entweder
Ignacio Vazquez-Abrams
Olin Lathrop
ajs410
stevenvh
capcom