Hallo, ich bin seit ein paar Tagen dabei mir an zu eignen, wie ich mit C einen Pic programmiere. Nun jetz habe ich schon einige Tuturials durch gearbeitet aber ich werde noch immer nicht ganz schlau draus, wie ich bei den Pic die einzelnen Ports und Pins anspreche. Diese als Ausgänge def. und als Eingänge genauso. Es wird immer nur erklärt wie ich z.B. ne Schleife schreibe etc. aber nie wie ich nen Port richtig beschreibe. Hoffe ihr könnt meine Wissenlücke füllen Zwinkernd^^. schönen Dank schonmal Mfg
Port A: TRISA = 0x00; // Alles Ausgänge LATA = 0x00; // Ausgänge low
okey danke ehm. dieses LATA ist das jetz für PORTA ne? und wenn ich z.B. PORTA,5 auf 1 haben will, dann muss ich das binär für mich machen b'00001000'und das dann in ne hex umwandeln? und das dann beo TRISA 0x08 schreiben? Oder wie
#include <pic16f887.h> void main (void); { TRISB 0x00; int 1,2,3,4,5,6,7,8,9; for (i=0;i<=8;i++) { TRISB 0x00=1; TRISB 0x01=2; TRISB 0x02=3; TRISB 0x03=4; TRISB 0x04=5; TRISB 0x05=6; TRISB 0x06=7; TRISB 0x07=8; TRISB 0x08=9; } } So hab ich jetz jeden Pin einzeln ne Zahl zugewiesen oder ist das falsch? Oh man es tut mir leid das ich so dumm frage. :(
LATA und TRISA sind für Port A gedacht, ja. Mit TRIS legst du fest ob der Pin ein Eingang oder Ausgang ist. Mit LAT gibst du ein high oder low aus. Du musst es nicht in hex zahlen machen, binär geht auch. Ich nehm mal an dass du Anfänger bist. Für den Einstieg mit PIC und C Programmierung empfehl ich immer wieder gern sprut.de
Dein Code wird so nicht funktionieren. Du kannst einem Pin keine Zahl zuweisen. Ein einzelner Pin kann nur einen high oder low Pegel ausgeben. Dieses High oder Low setzt man mit LAT
Ja also Anfänger schon, habe aber bereits C für Pc anwendungen kennen gelernt und komme da eingermaßen klar. Jetz will ich das nur auf nen Pic anwenden. :) Ja gut binär oder hex is egal das stimmt^^ aber hex sieht professioneller aus findsch xD. Und wie mach ich es wenn ich nur einen Pin dann ansprechen will? will z.b. mit PIN4 von PORTA ne LED leuchten lassen wenn da ein Signal anliegt.
ah okey also schreibe ich bsp. LATBbits.Lat4 für den Pin4 von PORTB? So wie bei dem PIC C-Tuturial? :) Hoffe habs jetzxD
LATB |= 0b00010000 ; // setzen Bit 4 ... LATB &= ~0b00010000 ; // löschen Bit 4
ah ok das bestimmt man also mit den | (Zeichen für oder) und & (Zeichen für und) ? gut zu wissen. Danke für eure Hilfe :)
Dann muss ich doch wenn ich ne Bedingung schreibe und da z.b. den PinB 1 ne Bedingung geben will das so schreiben oder? void main (void); { for (i=0;i<=8;i++) while(); if (i=1) { LATB 0x01=1; } } müsste doch so aussehen ne? Also soll nen Zähler werden und bei einen bestimmten Wert soll jetz erstmal iwas an gehen. In dem Fall soll wenn i=1 ist auf PortB Pin1 ne eins ausgegebn werden.
wenn das auch falsch ist, kann mir einer evtl. mal ein Programmbeispiel zur darstellung und erklärung schreiben? Wo z.B. nen ganz einfaches LED Lauflicht wo man für jeden pin eine LED hat. :)
Eggi schrieb: > h ok das bestimmt man also mit den | (Zeichen für oder) und & (Zeichen > für und) ? gut zu wissen. Und du bist sicher, daß Du nicht doch ein C Buch brauchst?
das das nen UND und ein ODER ist weiß ich aber wusste nicht das man dort löscht mit nem oder
Wäre vielleicht ganz hilfreich für dich: www.sprut.de www.fernando-heitor.de
ja danke. Bin ja shcon dabei mich weiter zu belesen xD gehe gerade semtliche Tuturials durch. Aber ist mein 2tes Prgorammbeispiel schon richtg? Oder könntet ihr mir mal zeigen wie man das richtig schreiben muss? :)
enan schrieb: > TRISA = 0x00; // Alles Ausgänge und deins: Eggi schrieb: > TRISA 0x00=1; und noch einmal Erich schrieb: > LATB |= 0b00010000 ; // setzen Bit 4 Eggi schrieb: > LATB 0x01=1; Fällt dir was auf? Zudem solltest du den Ausgang auch einmal auf 0 setzen, wenn er nur alle 8 Durchläufe height sein soll.
Eggi schrieb: > das das nen UND und ein ODER ist weiß ich aber wusste nicht das man dort > löscht mit nem oder Das ergibt sich aus der Funktion. Das ist so wie wenn du sagst: Ah, eine Multiplikation braucht man also um die Fläche eines Rechtecks zu berechnen. In einem gewissen Sinne stimmt das natürlich. Aber das ist das Pferd von hinten aufgezäumt. Eine Fläche wird durch Multiplikation bestimmt und nicht Multiplikation braucht man um Flächen zu berechnen. Das man UND und ODER zum Setzen/Löschen von Bits benutzen kann, ergibt sich zwangsläufig, wenn man sich mal ansieht, was dabei auf binärer Ebene passiert.
1 | if (i=1) |
und du bist sicher, dass du hier eine Zuweisung haben willst und keinen Vergleich? Deine Aussage, dass du zumindest ein bischen Erfahrung mit C hast, wird immer unglaubwürdiger. Diese Aussage wurd hier Beitrag "Re: Pic mit C programmieren aber wie?" schon das erste mal schwer erschüttert. Denn dieses Codeschnipsel ist alles mögliche, nur kein C. Das ist von C soweit entfernt, wie Chinesisch keine romanische Sprache ist. Tu das nicht. Wenn du C nicht kannst, dann sag das auch und mach dir selbst nichts vor. Dann fallen die Antworten hier nämlich auch so aus, dass sie auch ein Einsteiger verstehen kann. Aber wenn du sagt, du kannst schon C, dann setzen wir hier auch ein wenig Können vorraus. Und wenn sich dann heraus stellt, dass du dieses Können nicht hast, dann ist das ganz schlecht.
@picer: Okey ja das mit dem TRISA habe ich ja schon geändert jetz :) und
ads mit dem LAT da bin ich ja gerade dabei das zu verstehen sy das das
gerade noch nicht klick gemacht hat.
> LATB 0x01=1;
bei dem dachte ich das ich allgemein den PORTB anspreche und dann sage
das "0x01" <--also b'00000001' Pin 1 ne 1 haben soll wenn iwas passiert.
Ich habe gesagt das ich mit den C programmieren auf für PC anwendungen wie man auch anfängt zu lernen klar komme. Aber tut mir leid Um es ma so aus zu drücken ich bin ein Krümel im Kuchen. und mir der if (i=1) wollte ich sagen, das wenn i ne 1 hat soll das und das passieren.
Eggi schrieb: >> LATB 0x01=1; > bei dem dachte ich das ich allgemein den PORTB anspreche und dann sage > das "0x01" <--also b'00000001' Pin 1 ne 1 haben soll wenn iwas passiert. C ist eine genormte Sprache. Du kannst nicht einfach deine eigene Syntax erfinden und dann hoffen, dass der Compiler dich schon versteht. DU musst nach den Regeln der Sprache spielen und nicht umgekehrt. Das was du da hast, ist noch nicht einmal C. Das ist von C meilenweit entfernt.
Eggi schrieb: > Ich habe gesagt das ich mit den C programmieren auf für PC anwendungen > wie man auch anfängt zu lernen klar komme. Aber tut mir leid Um es ma so > aus zu drücken ich bin ein Krümel im Kuchen. > > und mir der if (i=1) wollte ich sagen, das wenn i ne 1 hat soll das und > das passieren. Ich hab schon verstanden, was die Idee dahinter ist. Aber auch hier bezweifle ich wieder diesen Satz in deiner Antwort: > Ich habe gesagt das ich mit den C programmieren auf für PC anwendungen > wie man auch anfängt zu lernen klar komme. Du kommst eben nicht damit klar. Dieser = versus == Fehler ist ein ganz banaler Anfängerfehler, den jeder mal macht. Aber spätestens nach dem 5. oder 6. Programm hat man sich daran gewöhnt, und diese Art von Fehler wird deutlich weniger häufig. 5. oder 6. C-Programm! Denn dieser Fehler ist in keinster Weise PIC spezifisch. Mein Rat lautet: Schreib deine ersten Programme auf dem PC. Du kannst dazu so ziemlich jedes Lehrbuch benutzen, das du findest. Du kannst dazu so ziemlich jedes C-Tutorial benutzen welches du findest. Und dann, wenn du deine ersten Programm auf dem PC geschrieben hast (geschrieben, nicht gelesen. Du musst selber programmieren!), dann kannst du auf den PIC wechseln und wirst deutlich weniger Probleme haben, weil du keinen 2 Frontenkrieg mehr im Gange hast, sondern zumindest soviel von C verstehst um ein Gefühl dafür zu haben, ob eine Schreibweise überhaupt C sein kann oder nicht.
OK, ich programmiere jetzt nich PIC, aber allgemein sollte schon mal klar sein, das mit LATB der gesamte PORRTb gemeint ist. Der hat 1Byte=8Bit welche du nun setzen oder löschen kannst. schreibst du z.B. LATB = 3; so sind die unteren beiden BIT, also PIN B0 und PIN B1 gesetzt. In binäreer Schreibweise wird das klaren: LATB = 0b00000011; // 3 entspricht 0b00000011 Durch diese schreibweise überschreibst du aber auch jedes mal den PORT, deswegen die Anmerkung mit dem ODER; Also, zB: LATB = LATB = 0b00000001; // Port B hart auf 1 schreiben LATB |= 0b00000010; // nimm PORTB und verodere den mit 0b00000010 jetzt steht in LATB ebenso 0b00000010, da 0b00000010 oder 0b00000001 ---------- 0b00000011
Leute vergesst nich den PIC in eine Endlosschleife zu schicken - ansonsten macht der permanent Resets ...
@Karl heinz Buchegger: Ja gut dann werde ich mich wieder mit dem C am Pc auseinander setzen und das festigen was ich schon kann und was ich nicht kann werde ich schleunigst nachholen! @picer: Danke für die Erklärung :) Ich werde mich dann mal ans werk machen. Schönen Tag euch noch
Hallo Eggi! Ich kann Dir auch die Webseite von Mikroelektronika (www.mikroe.com) empfehlen. Hier besonders die Seiten www.mikroe.com/eng/products/view/11/book-pic-microcontrollers/ und das Handbuch vom C-Compiler, zu finden als PDF auf der Seite www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/ Gruß Johannes
Hallo, was ich dir empfehlen kann ist eine Weiterleitung von einem schon vorher gelinkten Buchartikel. Dieses Buch gibt's bei mirkoe legal (!) online: http://www.mikroe.com/eng/chapters/view/1/introduction-world-of-microcontrollers/ Da kannst du anfangen und dich satt lesen ... danach kann man's. Wenn nötig ist das auch auf alle anderen Compiler anzuwenden.
vielen dank die Seiten werde ich mir auch noch zu gemüte führen.
ich spiele auch schon länger mit dem Gedanken wieder in die Programmier Welt einzutauchen. Hatte vor 10 Jahren während meiner Ausbildung mal mit 8051, 8085 mit Assembler angefangen und während dem Gundstudium ein bisschen C. Aber so richitg durch gestiegen bin ich nie, war mir irgendwie zu abstrakt. Mir fehltne als Etechniker immer die Bildchen (ähnlich wie bei einer Schematic), um mir etwas darunter vorzustellen. Habt ihr mir einen Tipp wie ich es vielleicht doch noch schaffe, dass ich ein bisschen programmieren kann. Das wird im Job immer wichtiger, will nicht als reiner Hardware-Mann auf dem Abstellgleis landen.
hallo wayneintersierts, dann Willkommen im Club^^. Wir könnten uns zusammen tun ^^. Wenn du was mit Bilder suchst kenn ich da was ;). Nen Arbeitskolege von mir der programmiert mit LabView. Da setzt man alles wie ein Stromlaufplan zusammen.
Hallo Leute, ich habe folgendes Problem. ich arbeite mit dem mplabx und dem c18 compiler. mit dem pic18lf45k22 sollen am ausgang (RD3, RD2, RD1, RD0, RC4, RC3, RC2, RC1,RE0, RA5, RA4, RA3, RA2, RA1) 12 led´s zum blinken gebracht werden. Hierzu habe ich einen C code geschrieben. Ich lasse das debugger laufen und krige die folgenden 4 error angezeigt! 1.configuration setting 'PWRT' not recognized 2.configuration setting 'BOR' not recognized 3.configuration setting 'WDT' not recognized 4.syntax error -> TRISA = 0b.1100.0001; Wo könnte das Problem liegen? Was ist bei dem Code zur korrigieren?! Ich Programmiere zum ersten mal einen µC. Für eure hilfen bin ich schonmal im voraus sehr dankbar! Hier das C Code; #include <stdio.h> #include <stdlib.h> #include <p18cxxx.h> #include <delays.h> /*Configuration*/ #pragma config FOSC = XT //CPU = 4MHz #pragma config PWRT = ON //Power Up Timer #pragma config BOR = OFF //Brown of Reset Voltage #pragma config WDT = OFF // Watchdog Timer #pragma config LVP = OFF // Low Voltage ICSP /*Decleration*/ #pragma code void main(void) { LATA = 0x00; LATC = 0x00; LATD = 0x00; LATE = 0x00; TRISA = 0b.1100.0001; // EIN und AUSGÄNGE Definiert 0xA1 TRISB = 0b.1111.1110; // EIN und AUSGÄNGE Definiert 0xFE TRISC = 0b.1110.0001; // EIN und AUSGÄNGE Definiert 0xE1 TRISD = 0b.1111.0000; // EIN und AUSGÄNGE Definiert 0xF0 TRISE = 0b.0000.1110; // EIN und AUSGÄNGE Definiert 0x0E while(1) { LATA = 1; LATC = 1; LATD = 1; LATE = 1; Delay10KTCYx(100); // Warteschleife LATA = 0; LATC = 0; LATD = 0; LATE = 0; Delay10KTCYx(100); // Warteschleife } }
Kostet es seit neustem etwas, hier einen neuen Thread aufzumachen? Warum in aller Welt kaperst du einen 2 Jahre alten Thread, anstatt einen neuen für deine Frage aufzumachen? Kopf -> Wand.
Hi, hab mich neu hier im forum angemeldet! Ich dachte mir daher, da es eine ähnlichkeit mit dem thread hat einfach hier die frage zu stellen. Ist das vllcht verkehrt gewesen? Lg
Eggi schrieb >Ich habe gesagt das ich mit den C programmieren auf für PC anwendungen >wie man auch anfängt zu lernen klar komme. Aber tut mir leid Um es ma so >aus zu drücken ich bin ein Krümel im Kuchen. Was rauchst Du eigentlich für Zeug?
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.