Forum: Mikrocontroller und Digitale Elektronik PIC18F4550 minimale Beschaltung mit maximaler Portanzahl möglich?


von Christian J. (chris8210)


Lesenswert?

Hallo Gemeinde...
ich bin ganz neu hier und ersuche um Hilfe da ich mit meinem PIC18F4550 
schon graue Haare bekomme!
Leider fand ich nach tagelanger Suche hier im Forum nichts um mein 
Problem zu lösen :-(

Ich möchte einfach nur den PIC mit internen Quarz laufen lassen und die 
maximale Anzahl von digitalen I/O Pin's realisieren...
Ich nutze MPLAB v8.80 und den C18-Compiler...
Leider wird mir im MPLAB immer angezeigt (Watch-Funktion) das ich nicht 
jeden Pin von einem Port als Eingang oder Ausgang zuweisen kann...
also ich schreibe zB. TRISA = 0xFF aber der schaltet mir nur PIN RA0-RA5 
als Eingang und RA6-RA7 bleibt unverändert...
Beim PORTB, PORTD und PORTE funktioniert das alles wunderbar...
Nur beim PORTA und PORTC lassen sich einige Pin's nicht schalten...
Beim PORTC denke ich dass es an den Pin's für den USB liegt, aber den 
brauche ich nicht bei meinem Vorhaben...

Kann mir vllt. hier jemand helfen und sagen wie ich die Grundeinstellung 
in der p18f4550.h ,oder wo auch immer, zu machen habe das ich den 
internen Quarz nutze und nur der MCLR am RE3??? Der Rest soll dann 
Eingang bzw. Ausgang sein...

Achja, meine Kenntnisse über den PIC und die Programmierung sind eher 
schlecht aber ich lese seit 4 Wochen täglich in Foren und im Datenblatt 
(englisch :-() und habe mir daher etwas Wissen angeeignet aber leider 
komme ich nicht mehr weiter :-(

MfG Christian

von Stefan (Gast)


Lesenswert?

Datenblatt nicht gelesen ?
RA6 ist nur Ausgang. RA7 gibt es nicht.

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Angehängte Dateien:

Lesenswert?

Hallo,

also ich würde erstmal Datenblatt studieren, da brauchst du nicht mal 
englisch Kenntnisse. Guck dir das Bild mal an, und genauer gesagt die 
Pfeilrichtungen.

von Christian J. (chris8210)


Lesenswert?

OK..
Habe das mit den Pfeilen im Datenblatt völlig überlesen...
Danke...
Ich dachte das man den OSC1 Pin als RA7 nutzen kann???
Trotzdem bekomme ich den RA6 nicht als Ausgang geschaltet...
Wird warhscheinlich blockiert da der noch als CLKO geschaltet ist???
Weiß aber nicht wie ich den nun als digitalen Ausgang schalten kann...
Hat jemand anderes eine Lösung für meine Probleme???

MfG Christian

von Master S. (snowman)


Lesenswert?

schau mal, was du an config-bits setzen kannst. ich würde vermueten, 
dass du da die pin-funktionen definieren kannst.

#pragma config OSC = ...

von slow (Gast)


Lesenswert?

>Ich dachte das man den OSC1 Pin als RA7 nutzen kann???

Wieso hast Du das gedacht? Gibts Anlaß zur Hoffnung?

von Christian J. (chris8210)


Lesenswert?

\main.c:12:Error [1224] configuration setting 'OSC' not recognized

der fehler kommt wenn ich #pragma config OSC = INTOSC_HS schreibe :-(
habe ein beispiel wo #pragma config FOSC = INTOSC_HS steht...weiß aber 
nicht ob das so richtig ist...zumindest kommt da kein fehler...

naja dachte das PORTA, B, C, und D jeweils 8 Pin's haben ;-)

MfG Christian

von Master S. (snowman)


Angehängte Dateien:

Lesenswert?

nur weil du irgendwo irgendetwas liesst, heisst das noch lange nicht, 
dass es auch beim PIC18F4550 gibt. nur weil du glaubst, es müsste etwas 
so sein, wie du vermutest, heisst das noch lange nicht, dass der 
hersteller es auch so implementiert hat. nur weil....
mann, echt! ich lege dir wärmstens http://pic-projekte.de/ ans herz, 
dort einfach mal ein tutorial durch zu machen. anbei noch ein bildchen 
aus "MPLAB C18 Config Settings" bezüglich dem clock. auch interessant 
dürfte für dich später "MPLAB C18 Libraries" sein.
bezüglich deinem "OSC = INTOSC_HS" scheint mir, dass da was beim 
MPLAB/C18 falsch eingestellt ist. -> ein grund mehr mal ein tutorial 
durchzumachen, das du - wenn es denn mal läuft - abändern kannst. ps: es 
sollte zumindest FOSC.. heissen

von Christian J. (chris8210)


Lesenswert?

Das ist ja mein großes Problem...
Man ließt überall ein bischen aber nirgends bekommt man alle Info's...
Natürlich ist bei 1000 Seiten auch viel Müll dabei bzw. Zeug was ich 
garnicht benötige...
Deswegen ist das Forum hier meine letzte Hoffnung auf schnelle Hilfe...
Habe nun in der Zeit aber schon eine Matrix gefunden und geschrieben wo 
ich 16 LED's an 8 Ausgängen leuchten lassen kann...zumindest in der 
MPLAP (WATCH)...ist nicht viel aber für mich schonmal ein großer Schritt 
für das was ich eigentlich vor habe :-D

MfG Christian

von Master S. (snowman)


Lesenswert?

dein grösstes problem hier ist: du sagst nicht, was dein ziel ist. wenn 
es dir z.b. darum geht 100 LEDs unabhängig voneinander 
ein/auszuschlaten, dann brauchst du lediglich 3 pins deines PICs. -> 
stichwort: schieberegister
wenn es dir z.b. darum geht, so wenig bauteile zu verbrauchen und du 
darum den internen oscillator willst, ist's was anderes.

von Christian J. (chris8210)


Lesenswert?

Naja ich wollte niemanden hier mit meinem Projekt belasten :-(

OK dann schreib ich einfach mal was ich vor habe:

1. Im Prinzip möchte ich mit dem PIC eine Siemens SPS an einem Laufband, 
mit Sensoren und Motoren, ersetzen.
Als Vorgabe habe ich 16x Eingänge (Sensoren) und 16x Ausgänge 
(Aktoren)...
Die Ausgänge sollen mit jeweils mindestens 500mA belastbar sein...
Die Sensorsignale sollen jeweils anderes Ausgangssignale liefern...
Das heißt der PIC übernimmt die komplette Steuerung des Laufbandes...

2. Das Laufband sollte zusätzlich noch mit einer bereits entwickelten 
Software vom PC aus über USB gesteuert werden können, also sollte der 
PIC die Sensorsignale über USB zum PC schicken und die Daten vom PC über 
den PIC an das Laufband...( von der Idee habe ich mich aber so langsam 
verabschiedet da ich das alles kaum bis Ende Januar 2012 schaffen werde, 
da ich nun schon seit mitte Oktober an der Sache arbeite und fast nichts 
geschafft habe... )

So...das ist mein irgendwie unlösbares Projekt...

Wer Lösungsansätze hat der kann mir natürlich schreiben :-)

MfG Christian

von Master S. (snowman)


Lesenswert?

na, dann kommen wir zum budels kern :-) wieso nicht gleich so?!

zum 1:
digitale oder analoge signale? wenn es digitale signale sind, hast du's 
in einer halben woche. um welche spannungen handeln es sich, und wie 
stark dürfen die ausgänge der sensoren belastet werden?

zum 2:
kommt halt darauf an, ob es einfach über HID gemacht werden darf (wäre 
zeitlich schaffbar), oder über einen USB-RS232-treiberbaustein gemacht 
werden darf (zeitlich auch möglich), oder ob es mit der bestehenden 
software zusammen funktionieren soll (dürfte sehr(!) schwierig sein 
sofern nicht gut dokumentiert und nicht customiced USB-treiber verwendet 
werden). schau mal
http://www.waitingforfriday.com/index.php/Building_a_PIC18F_USB_device
und
http://www.waitingforfriday.com/index.php/Open_Source_Framework_for_USB_Generic_HID_devices_based_on_the_PIC18F_and_Windows

dein "auftragsgeber" ist sich bewusst, dass SPS sehr idiotensicher 
bezüglich kurzschluss etc. ist, was vermutlich deine schaltung dann 
nicht sein wird. wie tolerant und zuverlässig muss deine schaltung sein?

von Christian J. (chris8210)


Lesenswert?

Master Snowman schrieb:
> zum 1:

digitale Signale 24V DC...
Wie stark die Sensoren belastet werden dürfen weiß ich garnicht...habe 
ich noch garnicht geschaut :-D ;-)

Master Snowman schrieb:
> zum 2:

also es sollte über eine normale USB 2.0 Schnittstelle am PC gesteuert 
werden...aber da ist das Problem die Daten vom PC auszulesen( hatte ich 
schon ohne Erfolg versucht mit einer Testschaltung) und dann muss der 
PIC die Sensordaten an den PC schicken( keine Ahnung ob und wie das 
gehen soll)...
die Software die bereits entwickelt wurde, wurde von jemanden 
geschrieben der auch an den Projekt mit arbeitet und die soll wohl ohne 
Probleme die USB Daten vom PIC auswerten können( aus Mangel 
funktionierender Hardware nicht testbar ;-) )...
Die beiden Link's werden mir sicherlich sehr gut weiterhelfen ( Dicken 
Daumen HOCH!!! )...Danke!!!

Warum finde ich nie solche Seiten :-(

Danke Danke Danke bisher :-)
Morgen früh mach ich mich gleich wieder an die Arbeit...nun ists Zeit 
fürs Bett :-D

MfG Christian

von Master S. (snowman)


Lesenswert?

bitte, gern geschehen.

USB: lies mal nachfolgender link durch; im speziellen die verschiednen 
klassen von USB-kommunikationsmöglichkeiten. wenn du von der PC-software 
nicht weisst, wie sie kommuniziert, ist es absolut unmöglich(!), dass 
dein PIC mit dieser software kommunizieren kann.
http://www.sprut.de/electronic/interfaces/usb/usb.htm
ok, digital ist machbar. die frage ist noch, ob die ausgänge (deiner 
schaltung) nur pull-down (nach ground durchschalten (=strom ziehen)) 
müssen können, oder push/pull (sowohl strom ziehen als auch liefern).
zu der frage von bezüglich der belastbarkeit deiner sensoren: wenn du 
5mA belasten darfst, vereinfacht dies deine schaltung.

allgemeine frage: wie idiotensicher muss die schaltung abgesichert sein? 
müssen deine eingänge abgesichert sein gegen überspannung oder wird sie 
im KFZ-bereich eingesetzt?

von usuru (Gast)


Lesenswert?


von Christian J. (chris8210)


Lesenswert?

@Master Snowman:

also das mit den USB haben wir nach hinten geschoben da ich erst mal die 
16x Buchsen an den Tablo schalten und die 16x Schaltersignale vom Tablo 
auswerten möchte...
Habe nun die Matrix mit den 16x LED's an 4 Ausgängen und 4 Eingängen 
aber weis nicht wie ich da die 16X Buchsen so dran bekommen soll das nur 
jeweils die angesteuerte Buchse die 24V über einen ULN2803A 
bekommt...Denn wenn ich an der Matrix die Signale abgreife habe ich ja 
immer gleich 4 Buchsen mit den 24V versehen, oder ich bin zu blöd um das 
gedanklich zu realisieren???
Also muss ich nun doch mit 16x Ausgängen und 16x Eingängen am PIC 
arbeiten???
Ich bekomme nur leider nicht die Pin's von PortC als Ausgang oder 
Eingang verschalten da irgendwie immernoch der D+ , D- und VBUS da 
initialisiert ist und daher komme ich nicht auf 32 Pin's...
Ich habe nun aber auch wieder den 20MHz Quartz dran mit 15pF...

Also die Ausgänge zum Tablo bzw. zum ULN2803A müssen Strom liefern um 
den ULN2803A zu schalten...
Leider komme ich erst morgen an das Laufband ran um wegen der 
Sensorstrombelastung zu schauen...

Absicherung??? Naja, es werden wohl nach mir dann einige Schüler mit den 
Tablo arbeiten...aber dann bin ich nicht mehr an der Schule :-D also 
nach mir die Sinnflut ;-)
Die Eingänge am Tablo bekommen maximal 24V DC, über den Schalter am 
Tablo oder extern, die dann vor dem PIC auf 5V DC gesenkt werden mit 
einem ???-Bauteil das ich mir noch nicht überlegt habe...

Ich hoffe ich hab nicht wieder was vergessen zu beantworten???

@all:

Also kurz und knapp...
Kann mir jemand eine Möglichkeit zeigen wie ich 16x Eingänge (von 16 
Schaltern mit je einer Status-Led) und 16x Ausgänge (über 2x ULN2803A an 
16 Buchsen mit je einer Status-Led) an den PIC18F4550 bekomme ohne 32 
Pin's zu nutzen???

MfG Christian

von Master S. (snowman)


Lesenswert?

wie sollen wir dir helfen, wenn du weder ganze sätze noch interpunktion 
gebrauchst?! ich kann dir fast nicht folgen. und wenn ich dir nicht 
folgen kann, muss ich raten, und raten ist mir zu ineffizient.

lies mal hier den artikel "Porterweiterung" durch
http://www.mikrocontroller.net/articles/Porterweiterung_mit_SPI
du brauchst von deinem PIC lediglich SDO, SDI, SCL und ein ENABLE-pin 
(letzterer irgendein pin deiner wahl). damit kannst du mehr oder weniger 
beliebig viele input- und output-pins generieren.
lies dazu auch durch: 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister

> die dann vor dem PIC auf 5V DC gesenkt werden mit
> einem ???-Bauteil das ich mir noch nicht überlegt habe...
zwei widerstände in serie nach ground - nennt sich auch spannungsteiler 
;-)

also:
spannungsteiler von deinen 24V-quellen, so dass du 5V-ausgänge hast, von 
da an die eingänge deiner beiden 74HCT165 am SPI-bus. am selben SPI-bus 
hängst du zwei 74HCT595, an dessen ausgängen kannst du vorerst deine 16 
LEDs anhängen und beliebig ansteuern.

von Potter (Gast)


Lesenswert?

Wenn Du wenig Ahnung hast, empfehle ich Dir ein fertiges Projekt vom 
Hersteller. Da gibt es sehr viele gute USB-Demos, die genau das machen, 
was Du möchtest (Stichwort generic HID). Kauf Dir ein Testboard und 
flash das vorhandene Projekt drauf. Die Demo eignet sich dann auch 
hervorragend als Ausgangspunkt für alles andere.

Deine Port-Ansteuerung kann man auch über Porterweiterungen komfortabel 
lösen (Stichwort I²C).

von Christian J. (chris8210)


Lesenswert?

@Master Snowman:

sorry, ich beende oft (meistens), beim schreiben im Netz meine Sätze mit 
3 Punkten :-D werde ich versuchen hier zu unterlassen :-)

der Artikel "Porterweiterung mit SPI" ist sehr Hilfreich und wird wohl 
nun auch meine Lösung sein. Ich habe deswegen nun auch schon das 
Datenblatt durchforstet aber finde nicht ganz die Lösung wie ich den PIC 
sage das er in den SPI "Modus" gehen soll. Die Pin's dazu kenne ich aber 
an der Programmierung im MPLAB hängt es noch. Ich weiß zB nicht wie ich 
es umsetzen soll den Befehl "TRISD<7:0>" zu realisieren bzw. was das 
überhaupt heißt.
Soll das heißen das TRISD = 0x00 bzw 0xFF haben soll?
(Datenblatt Seite 187):
• Bits TRISD<7:0> must be set (= 1)
• Bits TRISE<2:1> must be cleared (= 0)
  If CK1SPP is to be used:
• Bit TRISE<0> must be cleared (= 0)
  If CSPP is to be used:
• Bit TRISB<4> must be cleared (= 0)

Hat vllt. jemand einen C Befehlssatz für die SPI Verwendung vom PIC?

wegen der Wandlung von 24V DC auf 5V DC wollte ich evtl. auch einen IC 
verwenden, das mit dem Spannungsteiler kenn ich aus meinen Grundlagen 
;-)


@Potter:

ich habe eine Testschaltung mit USB usw., ich habe auch die USB Software 
drauf und der PIC wird am USB erkannt, aber ich muss doch in meinem 
Programm schreiben welche Daten er vom USB an den Ausgang schicken 
sollund umgekehrt.
Aber man erkennt in den Programmen nicht wo die USB Daten ausgelesen 
werden bzw. wie ich meine Eingangsdaten zum USB sende.

MfG Christian

von usuru (Gast)


Lesenswert?

wenn Du Schieberegister 74HCT595 oder TPIC6B595 nimmst, muss es aber 
nicht der 18F4550 sein, es tut dann auch der 18F2550 oder brauchst Du 
die Pins auch noch anderweitig ?

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Oje, Entwicklungshilfe!!

Ich habe gerade so ein paar Projekte mit der Kragenweite gestemmt.

Ich nehme einen PIC mit viel RAM und ROM (18FxxK20, kostet ja nix), aber 
notfalls kannst Du bei den 18F4550 oder so bleiben. Viele Pins brauchst 
Du nicht, Du brauchst eine Erweiterung per Schieberegister!

Digitale Ausgänge 24V:
Du kannst einfachste Schieberegister nehmen und dann per BTS452 digitale 
Ausgänge (kurzschlußfest) schalten, die 24V bis zu naja 0,7A liefern 
können (0,5A sollte die Grenze sein). Mehr wird größer...

Digitale Eingänge 24V:
Mit einem 1-100nF 50V Keramik-Kondensator gegen Masse schalten um EMV 
abzublocken,
mit einem 30V Varistor versehen um Spannungsspitzen abzubauen,
mit einem Spannungsteiler 8,2k oben und 4,7k unten reduzieren,
und das Signal mit einer 5,1V-Zenerdiode gegen Masse begrenzen.
Ich denke, das belastet einen Sensor nicht zu sehr und läßt etwas Strom 
fließen, um Schaltkontakte etwas Belag abbrennen zu lassen.

Und alles auch per Schieberegister einlesen.

Ich nehme hier die MCP23S17, weil die etwas eigene Fähigkeiten haben 
(wie die Register eines PICs) und sich adressieren lassen.

Dann schreibst Du ein paar Routinen, die alles rein- und rausschieben 
und hast ein paar Variablen in denen du alles findest und änderst.
Dafür braucht es keine Pins.

Du nutzt dann die Hardware-SPI des uC und nimmst ein paar Ports als 
CE-Ausgänge um die Bausteine zu adressieren.

Brauchst Du mehr, setzt Du das nächste Schieberegister dazu und 
erweiterst die Software, so machen die SPSes es auch.

von Master S. (snowman)


Lesenswert?

@ Christian J.
> Ich weiß zB nicht wie ich es umsetzen soll den Befehl "TRISD<7:0>" zu
> realisieren bzw. was das überhaupt heißt.
wieso liest du nicht die lektüre, die ich erwähnte? im besagten "MPLAB 
C18 Libraries" findest du OpenSPI und ähnliche funktionen. fixfertig 
einfach aufzurufen und deine SPI-Schnittstelle ist im nu konfiguriert. 
und dann einfach putcSPI, getcSPI und DataRdySPI aufrufen um deine 
2x16bits einzulesen und auszugeben. so schwierig kann das doch nicht 
sein?! deine 2x2 schieberegister auf einem steckbrett und diese 4 
funktionen aufrufen brauchen jetzt wirklich nicht mehr als 1h, auch wenn 
man null ahnung hat.
edit: MCP23S17 ist wirklich unnötig, da du die richtung der portbins 
nich umschalten willst. vergiss diesen mehraufwand und bleib bei der 
1h-lösung mit den schieberegistern.

von Master S. (snowman)


Lesenswert?

sollte hoffentlich funktionieren, dafür noch etwas eifacher als mit oben 
erwähnten funktionen (jedoch ohne gewähr). dieser code liest die 16 
eingänge ein und gibt sie an die 16 ausgänge aus (später musst du halt 
da was gescheiteres machen - aber zum testen allemal hilfreich). jetzt 
musst du nur noch die schieberegister an deinen PIC anschliessen.

----- code -----
#include <p18F4550.h>
#include <spi.h>


unsigned char
   SendByte1, SendByte2, ReceiveByte1, ReceiveByte2;


void main (void) {

   OpenSPI(SPI_FOSC_4, MODE_00, SMPEND);
   ReceiveByte1 = SSPBUF; // dummy-read

   while(1) {

      SendByte1 = ReceiveByte1;
      SendByte2 = ReceiveByte2;

      SSPBUF = SendByte1;
      while(!SSPSTATbits.BF);
      ReceiveByte1 = SSPBUF;

      SSPBUF = SendByte2;
      while(!SSPSTATbits.BF);
      ReceiveByte2 = SSPBUF;

   }

}
----- code end -----

von Potter (Gast)


Lesenswert?

>Aber man erkennt in den Programmen nicht wo die USB Daten ausgelesen
>werden bzw. wie ich meine Eingangsdaten zum USB sende.
Bei lvr.com findest Du unter USB/Human Interface Device unzähligen 
Source Code für die Ansteuerung vom PC aus. Im Grunde reduziert sich der 
Aufwand dann auf das Einstellen der VID/PID, der Endpunkt Puffer- bzw. 
Report-Größe und einer Report ID ggf. - mit etwas rumspielen sollte das 
machbar sein.

von Christian J. (chris8210)


Angehängte Dateien:

Lesenswert?

Hallo, ich melde mich auch mal wieder.
Ich habe leider erst nach einigen Wochen herraus gefunden das ich 
Mode_10 anstatt Mode_00 Programmieren muss, sonst gibt mir der PIC das 
MSB Bit nicht aus :-(

Ich habe nun nach langem hin und her endlich eine 16Bit Anzeige am SDO 
Pin vom PIC mit dem Oszi messen können und es ist sind auch die 16Bit's 
die ich mittels Schaltern über zwei 74HC165 eingebe.

Nun bekomme ich es aber einfach nicht hin die 16 Bit mit den 74HC595 
auszulesen. Ich möchte einfach nur die 16Bit von den Schaltern an meinen 
16 LED's nach 2x 74HC595 angezeigt bekommen, als stehendes Bild ohne das 
ich Schiebereaktionen sehe.

Ich weiß das ich den Takt-Mode umschalten muss für den SHCP Takt vom 
74HC595, aber wie soll ich das mit den Takt für den STCP Takt 
realisieren?

Kann mir vllt jemand genau erklären wie ich was am 74HC595 und PIC 
anzuschließen habe damit das endlich funktioniert? Da es eine 
Projektarbeit ist habe ich ja versucht selbst dahinter zu steigen, aber 
ich weiß nun nicht mehr weiter und bin im Zeitdruck :-(

Mit den Datenblättern komme ich leider nicht weiter und in verschiedenen 
Foren wird das auch nur halb erklärt.

MfG CJ

von Christian J. (chris8210)


Lesenswert?

So ich habs nun endlich rausgefunden :-)
Also es funktioniert nun alles...
Danke @ all

OpenSPI(SPI_FOSC_64, MODE_11, SMPMID);

anstatt

OpenSPI(SPI_FOSC_64, MODE_10, SMPEND);


MfG CJ

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.