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


von Burghard B. (punami)


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

von Peter D. (peda)


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

von Burghard B. (punami)


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)

von Gerhard (Gast)


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?IdcService=SS_GET_PAGE&nodeId=1469

Ausserdem gibts noch -falls nicht bekannt-:

http://forum.microchip.com

für konkrete Fragen

Gruß
Gerhard

von Peter D. (peda)


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

von gast (Gast)


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......

von Peter D. (peda)


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

von Igor M. (bastel-wastel)


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.

von Burghard B. (punami)


Lesenswert?

Kann einen PIN mit
1
while(PORTD == 0x01)

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

von Igor M. (bastel-wastel)


Lesenswert?

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

von Burghard B. (punami)


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

von Burghard B. (punami)


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!

von Hmm... (Gast)


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.

von Burghard B. (punami)


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)

von Igor M. (bastel-wastel)


Lesenswert?

In der Simulation funktioniert es ?

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

von Burghard B. (punami)


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:
1
TRISC = 1;
2
TRISD = 0;
3
PORTD = 0x00;
4
delay(10000)
5
if(0x01 == PORTC)
6
{
7
PORTD = 0xFF;
8
}
9
10
else
11
{
12
PORTD = 0x0F;
13
}
14
delay(10000)

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

von Igor M. (bastel-wastel)


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?

von Burghard B. (punami)


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.

von Igor M. (bastel-wastel)


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?

von Burghard B. (punami)


Lesenswert?

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

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.