www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tutorials zu PIC C Syntax und co.


Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hab gerade angefangen mich mit PIC zu beschäftigen.

Ich kann C Prorammieren, jedoch fehlen mir die PIC Befehle. Ein paar 
einfache wie TRIS(PORT x) und so wieter konnt ich schon mit viel mühe 
aus irgendwelchen Beispielen suchen.

Gibts vielleicht irgendwo ne übersicht für die PIC Syntax?
Code Beispiele (mit einfachem Codes wie lauflicht und co.) in PICC NICHT 
Assembler?
Erklärungen zu verschiedenen Einfachen Themen (z.B. Wenn Taster gedrück, 
dann LED an, usw)

Ich benutzen im moment Microchip MPLAB 8.00 und den C18 Compiler, sowie 
PIC18F4550 und 18F4680, falls das weiterhilft.

Die Hilfedateien vom C18 und dem MPLAB find einfach nur grauenhaft 
schlecht...

Mfg

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Asdf Asdf wrote:
> Ich kann C Prorammieren, jedoch fehlen mir die PIC Befehle.

Der Witz bei C ist doch, daß es CPU-unabhängig ist. Es gibt also 
grundsätzlich unter C keine speziellen Befehle.

Eine Ausnahme sind Interrupthandler, da diese nicht durch den C-Standard 
abgedeckt sind.
Die Syntax, um eine Routine als Interrupthandler zu kennzeichnen 
unterscheidet sich also leicht bei den verschiedenen MC-Compilern.


> Ein paar
> einfache wie TRIS(PORT x) und so wieter konnt ich schon mit viel mühe
> aus irgendwelchen Beispielen suchen.

Die Großschreibung deutet darauf hin, daß sich da nur jemand ein Macro 
geschrieben hat.
Wodurch diese Macro ersetzt wird, muß also irgendwo in einem 
includierten *.h-File stehen.
Die Macroexpansion funktioniert nach den ganz normalen C-Regeln, ist 
also kein spezielles PIC-Feature.

Was Du Dir beim PIC anschauen mußt, ist die Bedeutung der Register, um 
z.B. nen Timer einzustellen.
D.h. C erspart Dir nicht den Blick ins Datenblatt genau des PIC, den Du 
gerade verwendest.
Du mußt also die gleichen Zuweisungen durchführen, wie in Assembler, um 
etwas einzustellen. Der C-Compiler sollte Dir allerdings das Banking und 
Paging abnehmen.


> Die Hilfedateien vom C18 und dem MPLAB find einfach nur grauenhaft
> schlecht...

Kann ich nicht beurteilen, da ich keine PICs benutze.
Aber Datenblatt spezifische Informationen sollten da nicht zu finden 
sein (wie auch beim AVR oder 8051 C-Compiler nicht).


Peter

Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das mit den Datenblättern ist intressant, bringt mich aber auch 
nicht viel weiter.

Im moment bräucht ich vor allem Code um mir mal anzuschauen wie man was 
verwenden muss. Ein einfaches Lauflicht krieg ich schon hin, aber z.B. 
versuch ich im moment PIN's als eingänge zu definieren und auszulesen.

Im Datenblatt steht da nur welches Register ich setzen muss, was aber 
konkrett danach alles gemacht werden muss um an denn Wert ranzukommen 
find ich nirgends. (Hab schon mehrere Tage ge googlt und mir fast die 
komplette Hilfe durchgelesen, die beim c18 dabei ist)

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Burghard

in der Tat, das sehe ich auch so, dass Microchip seine neuen Kunden da 
etwas im regen stehen lässt. Die Beispiele sind ein schlechter Witz, die 
beim C18 mitgeliefert werden.

Die Datenblätter beinhalten eigentlich alle Informationen die du 
brauchst.

Dann bietet Microchip noch Beispiel-Code Online:

http://www.microchipc.com/sourcecode/

und

http://www.microchip.com/stellent/idcplg?IdcServic...

Ausserdem gibts noch -falls nicht bekannt-:

http://forum.microchip.com

für konkrete Fragen

Gruß
Gerhard

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Burghard B. wrote:
> Im moment bräucht ich vor allem Code um mir mal anzuschauen wie man was
> verwenden muss. Ein einfaches Lauflicht krieg ich schon hin, aber z.B.
> versuch ich im moment PIN's als eingänge zu definieren und auszulesen.

Sollte eigentlich im Datenblatt stehen, welche Register einen Pin als 
Ausgang definieren (TRISx).


> Im Datenblatt steht da nur welches Register ich setzen muss, was aber
> konkrett danach alles gemacht werden muss um an denn Wert ranzukommen
> find ich nirgends.

IMHO heißen die beim PIC gleich, also einfach

i = PORTx;

zum Einlesen und

PORTx = i;

zum Ausgeben.


Peter

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo liegt eigentlich dein Problem ?

1) C kannst Du programmieren, da es unabhängig vom µC ist, wirst du 98% 
deines Vorhaben schon erledigen können.

2) Die noch fehlenden 2% findest du in der entsprechenden SFR-Datei / 
IO-Datei und im zugehörigem Datenblatt.

=> 100% , also alles was du brauchst

Die ggf. noch nötigen Compilerspezifischen Befehle sind irgendwo im 
Compilerhandbuch versteckt.

Also auf gehts......

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt bei den PICs einige Gemeinheiten, z.B. sind manche Pins nach dem 
Reset als Analog Inputs definiert.

Dann muß man das erst abschalten, sonst kann man da nie was 
aus-/eingeben.

Auf der Sprut Webseite findet man die Fallgruben.


Peter

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie oben schon geschrieben wurde, fehlen dir nur Register des PICs. 
Diese sind in den Datenblättern aber wirklich gut beschrieben - auch 
optisch gut sortiert  (was man von den Fließtext-Datenblättern von ATMEL 
nicht bahaupten kann).
Wenn du jetzt etwas bestimmtes mit deinem PIC anstellen willst, dann 
schau einfach ins Datenblatt. Dort steht dann, welche Register für deine 
Aktion zuständig sind, was welches Bit bedeutet und zudem noch eine 
kurze Todo-Liste, was du alles machen musst.
Ich weiß dass man sich anfangs mit den Datenblättern schwer tut. Ist 
auch kein Wunder bei über 400 Seiten Technik-Englisch. Mit der Zeit 
kommt man aber schon dahinter. Die PIC- Datenblätter sind wirklich 
strukturiert und übersichtlich aufgebaut.


Zu deinem Problem:
Jeder Port des PIC ist ein I/O Port. Das Register TRISA definiert hier, 
ob der PORTA Eingang oder Ausgang ist. Eine 1 ist Eingang, eine 0 ist 
Ausgang. Das Gleiche gilt für PORTB -> TRISB und PORTC -> TRISC, usw.
Nach einem Reset/Boot ist jeder Port als Eingang geschaltet.
Beim PORTA (PIC16Xxxx) musst du zusätzlich noch wählen, ob dieser Analog 
sein soll. Das betreffende Register findest du unter dem Kapitel 
Analog-Digital-Wandler. Die PIC18Fxxxx definieren alle Pins, die 
digital, sowie Analog-Pin sein können, als analogen PIN. Diese musst du 
vorher umschalten. Beim PIC2550 z.B. musst du  hierfür das Register 
ADCON1 umstellen.

Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann einen PIN mit
while(PORTD == 0x01)

abfragen? Oder muss ich da über die Interrupts gehen, wenn ja wie?

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, einen Port kannst du so abfragen.
Wie kommst du hier auf Interrupts? Weißt du was das ist?

Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur im zusammenhang mit PC-Technik, hab in nem anderen Tutorial gelesen, 
das man für sowas über die Interrupts gehen soll bei den pic18fxxxx ... 
Mehr nicht

Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So noch ne kurze Frage, hat einer schon mal mit dem "Data Monitor and 
Control Interface" gearbeitet? Wo find ich dazu vernünftige Anleitungen?

Oder irgend nen anderes Programm mit dem man nen PIC am Simuliren kann, 
sodass man lose Kontakte und alles ausschliessen kann, wenn man testet 
ob das Programm läuft.

Vielen Dank bis jetzt an alle!

Autor: Hmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Grunde ist es bei allen Controllern das selbe, man weißt einem 
Special-Function-Register (SFR) einen Wert zu:

SFR = Wert;

Aus dem Datenblatt des verwendeten Controllers kann man dann erkennen, 
wie das Register heißt und welcher Wert hinein gehört, damit der Chip 
tut was man möchte. Ein wenig Compiler-spezifisches Wissen gehört dann 
noch dazu, um raus zu bekommen, wie man eine Funktion zum Interrupt 
macht bzw. wie man dem konkreten Compiler mitteilt, dass genau diese 
Funktion aufgerufen werden soll, wenn ein Interrupt auftritt.

Das einzig kniffelige ist nun, dem Datenblatt zu entlocken welche 
Register nun welchen Inhalt haben müssen, um das gewünschte zu 
erreichen. Wenn das Datenblatt gut geschrieben ist (z.B. die 
Atmel-Datenblätter find ich recht gelungen), genügt ein Blick in das 
Kapitel mit der gewünschten Peripherie um jene zum fliegen zu bringen. 
Bei den meisten Controllern genügen 4,5 Register um etwas (z.B. UART, 
A/D-Wandler,...) zum laufen zu bekommen.

Einzig die Interrupts sind hier wieder eine Ausnahme, da muss man in der 
Regel noch 1 oder 2 globale Register beschreiben um sie zu aktivieren.

Such dir doch einfach mal im Datenblatt deines PIC die Register raus, 
die in den Makros die du nimmst verwendet werden. Nach dem Studium des 
Kapitels, in welchem diese genauer erläutert werden, wird dir sicherlich 
einiges klarer.

Überleg dir dann, welches Register du mit welchem Inhalt beschreiben 
würdest, um z.B. eine LED an einem Port-Pin zum leuchten zu bringen oder 
einen Taster abzufragen.

Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab selber noch ne Seite gefunden:
http://techtrain.microchip.com/webseminars/Archived.aspx

So nun noch mal ne konkrete Frage:

Das Programm läuft im Simulator, d.h. wenn PORTC=0x01 dann geht PORTD 
auf 0x0F, sonst auf 0xFF.

In der Theorie funzts nur auf dem Bread Board nicht. Woran kann das 
liegen?

(ich leg den PIN 0 vom PORT C auf VDD, also +5V)

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Simulation funktioniert es ?

Läuft dein PIC auch? Was genau macht dein Aufbau?

Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Aufbau versorgt den PIC mit Strom(Festspannungsregler 5V) und es 
hängen LED an allen PIN des PORT D (mit Vorwiderstand). Port B ist per 
Taster auf VDD zu schalten.(Jeder Pin einzeln).

Programm wie folgt:
TRISC = 1;
TRISD = 0;
PORTD = 0x00;
delay(10000)
if(0x01 == PORTC)
{
PORTD = 0xFF;
}

else
{
PORTD = 0x0F;
}
delay(10000)

Hab die definitionen und die delay routine weglassen, sollten ja allgeim 
bekannt sein.

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du den PORTC (den du einzeln über Taster auf VDD legst) über 
Pull-down Widerstände auf einen definierten Pegel gelegt?

Nochmal: Was macht deine Schaltung? Welche LEDs leuchten?

Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach so tschuldigung.

Es blinken alle LED's.

Das mit den Pull down Widerständen hab ich nicht gemacht, ich dachte das 
wär im PIC eingebaut? Ich versuchs jetzt mal mit 1K Ohm Pulldown gegen 
GND.

Autor: Igor Metwet (bastel-wastel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der PIC kann intern Pull-up Widerstände (auf VDD) setzen. Das musst du 
aber über das entsprechende Register selbst machen.

Als Pull-up-down Widerstände haben sich 10k bewährt, mit 1k gehts aber 
auch.


Läufts jetzt?

Autor: Burghard B. (punami)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, es läuft, wenn auch nicht immer, dass liegt aber an nem Wckelkontakt 
in meinem Bread Board... Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.