Tutorials zu PIC C Syntax und co.

#840730
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
#840748
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
#840757
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)
Gast #840762
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
#840782
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
Gast #840794
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......
#840951
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.
#840981
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!
Gast #841026
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.
#841244
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren