Forum: Mikrocontroller und Digitale Elektronik Seltsames Problem mit PIC


von Dominik Derigs (Gast)


Lesenswert?

Ich habe eine Platine mit dem Mikrocontroller PIC18F452 aufgebaut.
Die Ports RE0 - RE2 sind als Eingänge definiert, an den Ports RD4 - RD6
sind 3 LEDs angeschlossen.
Das Problem:
Die LEDs gehen aus, wenn RE0 mit +5V verbunden wird. Wenn ich aber RE1
oder RE2 mit +5V verbinde, bleiben Sie weiter an.
Warum gehen die LEDs aus, wenn ich RE0 auf +5V lege?

P.S.: Die Eingänge sind jeweils mit einem 100k-Ohm Widerstand auf Masse
gezogen.

von Schoaschi (Gast)


Lesenswert?

Als blöde antwort würde mit mal einfallen: Vl hast du dein Programm so
geschrieben, dass es genau das macht!
Zeig mal deinen Source-Code.

von Dominik Derigs (Gast)


Lesenswert?

Ich benutze den C18-Compiler.
Hier der Sourcecode:

void wait_zyklus(int d){ // Einfach eine bestimmte Zeit abwarten
  while(d) d--;
}

void main(void){
  ADCON1=0b00000111;
  TRISA=TRISB=TRISC=TRISD=TRISE=0;
  wait_zyklus(4);
  PORTA=PORTB=PORTC=PORTD=PORTE=0;
  wait_zyklus(4);
  TRISA=TRISB=TRISC=TRISD=TRISE=0;
  wait_zyklus(4);
  TRISD = 255-(16+32+64); // LEDs als Ausgänge
  PORTD = 16+32+64; // LEDs: an

  while(1); // Endlos-Schleife

  .. ganz viel anderer Code, aber wegen Endlosschleife überflüssig ..

}

von Schoaschi (Gast)


Lesenswert?

Ich sehe hier aber nirgend wo das du den Port E als Eingang definierst.


>>TRISD = 255-(16+32+64); // LEDs als Ausgänge
>>PORTD = 16+32+64; // LEDs: an
Ich würde das nicht so programmieren, denn damit verbrauchst du unnütz
Ressourcen. Schreibe es in Bit-Darstellung, dann kennt man sich auch
noch sehr gut aus und du sparst drotzdem Ressourcen.

>>wait_zyklus(4);
>> TRISA=TRISB=TRISC=TRISD=TRISE=0;
Die sollte eigentlich auch eher für den Hugo sein. Ausser du willst
Zeit verbratten.

Und wenn man einen Schreibzugriff auf die Ports bei den PIC18 macht,
sollte man auf die LAT-Register schreiben.

von Kai R. (kairiek)


Lesenswert?

>  TRISA=TRISB=TRISC=TRISD=TRISE=0;

Sieht nicht so aus, als ob PORTE ein Eingang wäre. Du solltest TRISE
auf 0x07 setzen.

von Dominik Derigs (Gast)


Lesenswert?

wie peinlich....

Falsch abgetippt:

  TRISA=TRISB=TRISC=TRISD=TRISE=0;
  wait_zyklus(4);
  PORTA=PORTB=PORTC=PORTD=PORTE=0;
  wait_zyklus(4);
  TRISA=TRISB=TRISC=TRISD=TRISE=255;

von Schoaschi (Gast)


Lesenswert?

Das ist dann drotzdem noch Falsch.. denn dann setzt du jeden Port am PIC
als Eingang.

von Dominik Derigs (Gast)


Lesenswert?

Ja, aber es sollen auch alle Eingänge sein, die LEDs sind ja Ausgänge:

 TRISD = 255-(16+32+64); // LEDs als Ausgänge

von Schoaschi (Gast)


Lesenswert?

Wie sind die LEDs eigentlich am PIC angeschlossen?

von Dominik Derigs (Gast)


Lesenswert?

PIC - Widerstand 120 Ohm - LED - Masse

von Kai R. (kairiek)


Lesenswert?

Noch 'ne andere Frage: Was willst du eigentlich machen? So wie das
jetzt da steht macht das insgesamt wenig Sinn.

MFG

Kai

von Kai R. (kairiek)


Lesenswert?

Noch was: Ich würde an deiner Stelle auf Schreibweisen wie
255-(16+32+64) verzichten und stattdessen 0xF8 schreiben, da weis man
dann schneller was im Register steht. Und es ließt sich besser.

von Schoaschi (Gast)


Lesenswert?

Wie siehts eigentlich mit deinen Fuses aus? Hast du LVP aktiviert oder
deaktiviert?

Wie sind die anderen Ports beschalten? Haben die ein fixes Potential
oder sind diese unbeschalten?

von Dominik Derigs (Gast)


Lesenswert?

Ich habe eine Elektronik in der Firma meines vaters, die die
Kälteanlagen und das ganze drumherum kontolliert. In der Firma gibt es
56 solcher Anlagen, an denen jewils 10 digitale Eingänge liegen. Weil
diese Elektronik allerdings nichts anzeigt (nur ne graue Box), sollte
an jeder Anlage ein kl. Display (1x16 Zeichen) angebracht werden.
Zusätzlich sollen die PICs dann noch über ein einfaches Bussystem mit
einem PIC in der Leistelle mit einem Grafikdisplay kommunizieren. Es
funktioniert auch alles wunderbar, nur das bei einer Störung auf Kanal
1 die LEDs ausgehen, was bei der Vorführung ziemlich negativ wäre, und
sich ja irgendwie lösen lassen muss.

LVP: aus
PORTA: mit 6poligen Dip-Schaltern für Adresse verbunden, entweder über
100k an Masse oder direkt an +5V

PORTB:
0 - 3: offen
4: 100k an Masse, oder 5V
5-6: offen
7: Widerstand 120 Ohm - LED - Masse

PORTC:
0-2 + 6: 100k an Masse, oder 5V
3+4: offen, werden extern auf Masse, oder +5V gezogen (für den
Datenverkehr)
5+7: offen

PORTD:
0-3 + 7: 100k an Masse, oder 5V
4-6: Widerstand 120 Ohm - LED - Masse

PORTE:
0+1: 100k an Masse, oder 5V
2: offen

P.S.:
Ich habe gerade gesehen, dass zwar die LEDs an PORTC (4-6) ausgehen,
aber die LED an PORTB (7) nicht !!!

von Dominik Derigs (Gast)


Lesenswert?

Die Configuration-Bits:

Oscillator: EC-OSC2 as clock out (habe Quarzoszillator mit 4. MHz zum
Test dran)
Osc. Switch Enable: Disabled
Power Up Timer: Enabled
Brown Out Detect: Disabled
Brown Out Voltage: 2,5V
Watchdog Timer: Disabled-Controlled by SWDTEN bit
Watchdog Postscaler: 1:128
CCP2 Mux: RB3
Stack Overflow Programm: Disabled
Low Voltage Programm: Disabled
Code Protect: alles Disabled

von Bernd Rüter (Gast)


Lesenswert?

In meinem Datenblatt zu dem PIC hat der PortE.0 noch eine Funktion in
Bezug zum "Parallel Slave Port", den Du aktiviert hast (TRISE.4).
Sieh mal im Datenblatt nach, da steht die Funktion von jedem Pin
aufgeführt und so ein 18F452 hat richtig viele Funktionsgruppen drin.

von Dominik Derigs (Gast)


Lesenswert?

In dem Datenblatt zum PIC18F452 steht für die Pins drin:

RE0: Parallel Read Control  IO  AN5
RD5: Parallel Slave Port Data / IO
RD6: Parallel Slave Port Data / IO
RD7: Parallel Slave Port Data / IO

>>In meinem Datenblatt zu dem PIC hat der PortE.0 noch eine Funktion in
Bezug zum "Parallel Slave Port", den Du aktiviert hast (TRISE.4).

Wo habe ich den aktiviert  ist der von vorherein aktiviert  wie
deaktiviere ich den?

(Würde ja sinn ergeben.. Am Read Control liegt +5V an und somit wird
RD0-7 auf Input geschaltet)

von Dominik Derigs (Gast)


Lesenswert?

Im  Datenblatt steht:
PSPMODE = TRISE<4>

Wenn ich das also auf Null setze (TRISE=0x2, reicht ja für 0+1), sollte
es funktionieren, oder?

von Schoaschi (Gast)


Lesenswert?

Hm.. ich muss sagen... ich habe keine andere Idee... Aber die Lösung
würd mich dann aber auch interessieren ;-).

Frag doch bitte bei Fernando Heitor im Forum nach.
www.fernando-heitor.de dort wird dein PRoblem eher gelöst werden.

mfg SChoasch

von Dominik Derigs (Gast)


Lesenswert?

Ich hab es eben getestet und es funktioniert natürlich.

Vielen Dank nochmal !

von Schoaschi (Gast)


Lesenswert?

Und was war es nun?

von Dominik Derigs (Gast)


Lesenswert?

Der Parallel Slave Port, der alles auf PORTD auf Input geschaltet hat,
wenn an RE0 +5V ist

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.