Ich habe gelernt (zumindest versucht), wie man mit Bildmikrocontrollern arbeitet, und ich habe dieses Verhalten bemerkt, bei dem ich nicht sicher bin, ob es nur meine Schuld ist oder passieren soll. Ich habe das folgende Programm in der Hoffnung geschrieben, eine LED blinken zu lassen. Es blinkt einwandfrei, wenn es an den Pin mit der Bezeichnung RA2 angeschlossen ist, aber wenn ich die LED an Pin 15 (auf dem Datenblatt mit RA6 / OSC2 / CLKO gekennzeichnet) anschließe, bleibt die LED an, als hätte ich sie an Vdd angeschlossen. Wenn ich es dann wieder in RA2 stecke, wo es hingehört, ist es ausgeschaltet. Die einzige Möglichkeit, es wieder einzuschalten, besteht darin, einen 10k-Widerstand zwischen Vdd und MCLR anzuschließen (wie beim Programmieren). Was passiert hier? MCLR wird auch benötigt, wenn es an einige andere Pins angezapft wird. Verursache ich Schaden?
Die Schaltung besteht aus 3 AA-Batterien, die das Bild mit Strom versorgen, mit einem 330-Widerstand und einer 3-mm-LED in Reihe, die von Pin 1 (RA2) zu Pin 5 (Masse) läuft.
pic16f88 Datenblatt
Code:
#include <xc.h>
__CONFIG(MCLRE_ON & CP_OFF & WDTE_OFF);
void main(){
TRISA = 0x0000;
// RB6 = 0b000010;
for(;;){
RA2 = 1;
Wait();
RA2 = 0;
Wait();
}
}
int Wait(void) // gives me a delay of 1/3rd a second or so
{
for (int i = 0; i < 50; i++)
{
}
}
Sie müssen den MCLR-Pin während des normalen Betriebs hoch binden, sonst wird der Chip im Reset gehalten. Beachten Sie den Balken über MCLR, dies bedeutet, dass er aktiv niedrig ist .
Verwenden Sie einen Widerstand zwischen MCLR und Vdd von etwa 10 kΩ (<40 kΩ)
Siehe S. 132/133 des Datenblatts.
Ihr Problem liegt am !MCLR-Pin. Wenn Sie den PIC programmieren, verwenden Sie die VPP-Funktion, aber derselbe Pin hat die !MCLR-Funktion (Master Clear), und da diese Funktion aktiv niedrig ist, müssen Sie sicherstellen, dass dieser Pin hoch bleibt, damit der PIC Ihren Code ausführen kann. Wie Oli sagte, können Sie dies erreichen, indem Sie einen Pull-up-Widerstand für an den !MCLR-Pin anschließen.
Alternativ können Sie die MCLR-Funktion deaktivieren, indem Sie das MCLRE-Bit im CONFIG1-Register zurücksetzen (eine 0 schreiben).
__CONFIG(MCLRE_OFF & CP_OFF & WDTE_OFF);
Detail des MCLRE-Bits von Seite 130 des Datenblatts:
MCLRE: RA5/MCLR/VPP-Pin-Funktionsauswahlbit
1 = RA5/MCLR/VPP-Pin-Funktion ist MCLR
0 = RA5/MCLR/VPP-Pin-Funktion ist digitale E/A, MCLR intern mit VDD verbunden
Hinzugefügt
In Bezug auf das Read-Modify-Write-Problem tritt dies aufgrund der Funktionsweise des PIC auf. 8-Bit-PICs benötigen vier Taktzyklen für jeden Befehlszyklus. Schreibvorgänge werden im letzten Taktzyklus durchgeführt, während Lesevorgänge im ersten Taktzyklus durchgeführt werden. Dies kann zu Problemen führen, wenn Sie mit verschiedenen Bits desselben Ports arbeiten.
Angenommen, Sie haben den folgenden Code:
RA0 = 1;
RA1 = 1;
Sie würden erwarten, dass sowohl RA0 als auch RA1 hoch sind, nachdem Sie diesen Code ausgeführt haben. Dies kann nicht der Fall sein. Wenn Sie alle Bits auf 0 gesetzt haben , liest der PIC PORTA
bei der Ausführung den Wert auf PORTA im ersten Taktzyklus, setzt das Bit 0 und schreibt das Ergebnis zurück auf . Bisher kein Problem, aber wenn Sie die zweite Anweisung ausführen (RA1 = 1), liest der PIC zuerst den Wert von PORTA, und höchstwahrscheinlich hatte der RA0-Pin keine Zeit, auf 1 zu steigen, dann wird der Wert für diesen Pin gelesen 0 statt 1, dann wird das Bit 1 gesetzt, dann wird das Ergebnis nach PORTA zurückgeschrieben, aber nur das Bit 1 gesetzt.RA0 = 1
PORTA
Um dies zu vermeiden, können Sie Verzögerungen zwischen den Anweisungen wie folgt hinzufügen:
RA0 = 1;
asm("nop"); // No operation
RA1 = 1;
Eine nop
Anweisung sollte ausreichen.
In Ihrem Code sollten Sie dieses Problem aus zwei Gründen nicht haben:
Das Schattenregister, von dem Leon sprach, besteht aus einem Register, in dem die einzelnen Bits modifiziert werden, bevor das gesamte Register in den PORT geschrieben wird.
Möglicherweise möchten Sie sicherstellen, dass Ihre Konfigurationssicherungen so eingestellt sind, dass RA6 ein GPIO-Pin ist und nicht die CLKO-Funktion, die der Pin auch übernehmen kann. Ich bin auf dieses Problem mit einem einfachen Programm und dem Compiler von CCS gestoßen. Der Compiler hat eine so schlechte Dokumentation, dass es unmöglich ist, genau zu wissen, was passiert, ohne sich die Fuse-Bits selbst anzusehen.
Ich hätte erwartet, dass Sie, unabhängig davon, ob die LED auf RA2 oder RA6 steht, ein unberechenbares Verhalten haben würden, wenn MCLR # nicht hochgezogen wird. Vielleicht ist RA6 näher an MCLR# und das Problem wird verschärft; nicht sicher.
ein Sandwich
Oli Glaser
ein Sandwich
Oli Glaser
ein Sandwich
Oli Glaser
Oli Glaser
ein Sandwich
Oli Glaser
ein Sandwich