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
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
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)
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
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
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......
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
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.
Kann einen PIN mit
1 | while(PORTD == 0x01) |
abfragen? Oder muss ich da über die Interrupts gehen, wenn ja wie?
Ja, einen Port kannst du so abfragen. Wie kommst du hier auf Interrupts? Weißt du was das ist?
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
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!
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.
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)
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.
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?
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.