Forum: Mikrocontroller und Digitale Elektronik PIC Pin kaputt?


von Tine S. (tine)


Lesenswert?

Hmm, der PD.0 von meinem fabrineuen dsPIC zappelt beim Umschalten vom 
ganzen PortD auf ca. 4 Volt mit einer Amplitude von 3.8-4.2 Volt (0,4 
Volt) herum. Alle anderen tun was sie sollen. Der PD.0 sollte eigentlich 
eine LED schalten, tut er aber nicht. Ist das eine bekannte Fehlfunktion 
(Überspannung, Ausschuss, etc...)?

von Anja (Gast)


Lesenswert?

Tine Schwerzel schrieb:
> Hmm, der PD.0 von meinem fabrineuen dsPIC zappelt beim Umschalten vom
> ganzen PortD auf ca. 4 Volt mit einer Amplitude von 3.8-4.2 Volt (0,4
> Volt) herum. Alle anderen tun was sie sollen.

Das nennt man galvanische Kopplung. (bei den Frequenzen spielt die 
Induktivität des Masse-Pins bereits eine Rolle). Evtl läßt sich durch 
bessere Abblockung die Amplitude noch ein klein wenig verbessern.

Tine Schwerzel schrieb:
> Der PD.0 sollte eigentlich
> eine LED schalten, tut er aber nicht. Ist das eine bekannte Fehlfunktion
> (Überspannung, Ausschuss, etc...)?

Ich tippe auf Software-Bug in Zeile 42 (Verwendung von PORTD anstelle 
LATD).

Gruß Anja

von (prx) A. K. (prx)


Lesenswert?

Von welchem dsPIC ist hier die Rede? Hast du vielleicht noch nicht 
gemerkt, aber davon gibt es mehrere Typen.

von Tine S. (tine)


Lesenswert?

dsPIC30F6014
Ich verstehe nicht genau, was PORTD im Vergleich zu LATD macht. Wenn ich 
PORTD setze, ändere ich doch auch die Portpins, oder nicht?

von (prx) A. K. (prx)


Lesenswert?

Der Unterschied ist hier vielleicht nicht relevant, wird es aber 
spätestens dann, wenn man mit bidirektionalen Pins (z.B. 1-Wire) am 
gleichen Port zu tun hat, daher wird empfohlen, für Ausgabepins stets 
LATx zu verwenden.

Zur Zeile 42: 
http://www.mikrocontroller.net/articles/Netiquette#.C3.84u.C3.9Fere_Form

von Tine S. (tine)


Lesenswert?

Hier ist mal der Programmcode. Bit 1 bis 7 alternieren zwischen 0 und 5 
Volt, nur eben Bit 0 bleibt bei 4 Volt +-0.2V

1
// Test Hello World
2
3
#include <p30f6014.h>
4
5
void main(void)
6
{
7
TRISD = 1;
8
while(1)
9
{
10
PORTD=0xFF;
11
PORTD=0;
12
13
}
14
}

von (prx) A. K. (prx)


Lesenswert?

> TRISD = 1;

Bedeutet:
  TRISD = 0x01; // 0b00000001
also Pins 1-7 sind Ausgang, Pin 0 ist Eingang.

Du meinst vermutlich TRISD = 0xFF.

von holger (Gast)


Lesenswert?

>Hier ist mal der Programmcode. Bit 1 bis 7 alternieren zwischen 0 und 5
>Volt, nur eben Bit 0 bleibt bei 4 Volt +-2V

Was soll der auch schon machen wenn du ihn nicht
auf Ausgang schaltest.

>Du meist vermutlich TRISD = 0xFF.

Du meinst vermutlich TRISD = 0x00.

von (prx) A. K. (prx)


Lesenswert?

holger schrieb:

> Du meinst vermutlich TRISD = 0x00.

Ja klar - warum müssen die auch unbedingt alles anders machen als der 
Rest der Welt. ;-)

von Tine S. (tine)


Lesenswert?

Ah Mist. Ich dachte das Direction register würde den ganzen Port setzen. 
Mein Fehler. Das erklärt das hochohmige Verhalten. Danke! Ich habe einen 
Teil der Sachen aus dem Buch "Programming 16-bit Microcontrollers in C: 
Learning to fly the PIC24". Da wird LATx gar nicht verwendet und unter 
TRISA=1; steht, dass das den PORTA auf Ausgang setzen würde. Naja. 
Danke!

von Tine S. (tine)


Lesenswert?

Noch eine generelle Frage: ich habe bisher hauptsächlich AVRs mit Bascom 
(sehr einfach zu bedienen :-) und Assembler prorammiert. Da gibt es ja 
eine Compilerreferenz mit in der Hilfe. In MPLAB gibt es das aber nicht, 
oder? Wo findet man denn mal eine komplette Übersicht mit Beschreibung 
(englisch) der ganzen Befehle?

von Meister E. (edson)


Lesenswert?

A. K. schrieb:
> holger schrieb:
>
>> Du meinst vermutlich TRISD = 0x00.
>
> Ja klar - warum müssen die auch unbedingt alles anders machen als der
> Rest der Welt. ;-)

Stellt sich die Frage warum der Rest der Welt mit 1 für Input und 0 für 
Output nicht warm werden wollte... ;)

von (prx) A. K. (prx)


Lesenswert?

Meister Eder schrieb:

> Stellt sich die Frage warum der Rest der Welt mit 1 für Input und 0 für
> Output nicht warm werden wollte... ;)

Stellt sich die Frage, warum Microchip diesen Unterschied überhaupt erst 
Jahrzehnte nach dem der Rest der Welt gemacht hat ;-).

von Anja (Gast)


Lesenswert?

Meister Eder schrieb:
> Stellt sich die Frage warum der Rest der Welt mit 1 für Input und 0 für
> Output nicht warm werden wollte... ;)
>
Genau weil das ist genau das was ich erwarte wenn ich einen Open-Drain 
Pin mit dem Tris-Register simuliere. Das Latch bleibt dabei auf Low. Mit 
Tris = 0 schalte ich dann den Port-Pin auf Low mit Tris = 1 schalte ich 
den Port-Pin auf hohe Impedanz (oder High falls ein Pull-up dran hängt).

Gruß Anja

von AkkiSan (Gast)


Lesenswert?

Anja schrieb:
>> Stellt sich die Frage warum der Rest der Welt mit 1 für Input und 0 für
>> Output nicht warm werden wollte... ;)
>>
> Genau weil das ist genau das was ich erwarte wenn ich einen Open-Drain
> Pin mit dem Tris-Register simuliere. Das Latch bleibt dabei auf Low. Mit
> Tris = 0 schalte ich dann den Port-Pin auf Low mit Tris = 1 schalte ich
> den Port-Pin auf hohe Impedanz (oder High falls ein Pull-up dran hängt)

Stellt sich die Frage, ob das nicht alles viel zu kompliziert
gedacht ist ;-)

Mit "TRIS" als Abkürzung für "tristate", "0" für "AUS" und
"1" für "AN", sieht das Ganze schon viel logischer aus, gell?

Die alten N-MOS Dinger, so auch der erste PIC,
General Instruments' PIC1650 (so Ende der 70er), hatten keine
push-pull Stufen und ebensowenig einen "dritten Zustand".
Um Pins als Eingänge nutzen zu können, mußte das latch
auf "1" gesetzt sein (nur ein weak-pull aktiv).

Als man wenig später, dank C-MOS Technologie einen
neuen, dritten Zustand "erfunden" (...) hat:
Gäbe es zur Aktivierung desselben eine geschicktere Variante
als "TRISTATE = 1"?

Vielleicht gibts aber auch bald ein neues config-bit:
"TRISREVERSE: 0=classic; 1=modern" ;-)

von (prx) A. K. (prx)


Lesenswert?

AkkiSan schrieb:

> Als man wenig später, dank C-MOS Technologie einen
> neuen, dritten Zustand "erfunden" (...) hat:

NMOS Technik passt zwar recht gut zu einer bidirektionalen 
Portkonfiguration wie in 8051 und den ursprünglichen PICs, 
Push/Pull-Stufen und Tristate lassen sich aber auch in NMOS 
implementieren - immerhin arbeiten Datenbusse so. Die I/O-Bausteine der 
Prozessorkonkurrenz besassen auch bereits eine Richtungskontrolle (6820, 
8255), ebenso andere Mikrocontroller der NMOS-Ära (Z8).

von Michael R. (mexman) Benutzerseite


Lesenswert?

Hallo Tine,


hat sich Dein Problem also erledigt?

> oder? Wo findet man denn mal eine komplette Übersicht mit Beschreibung
> (englisch) der ganzen Befehle?

Eine kleine und gute Referenz der Befehle gibt es in den Datenblaetern 
der PICs.
Die Hilfe in MPLAB ist m.E. auch nicht schlecht.
Ausserdem gibt es ein seeeeeehr gutes Forum auf der 
Wicrochip-Webseite...wenn Du Englisch schreiben kannst.

Bei den PICs ist durch die hohe Peripheriedichte und Mehrfachverwendung 
der Portpins eine richtige Initialisierung der Ports wichtig, aner auch 
das steht in den Datenblaettern und wenn Du einen Peripheriebaustein 
einmal drauf hast, gibt es nichts problematisches mehr.


Gruss

Michael

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.