www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pic mit C programmieren aber wie?


Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: enan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Port A:
TRISA = 0x00;  // Alles Ausgänge
LATA  = 0x00;  // Ausgänge low

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#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. :(

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: enan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: enan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ah okey also schreibe ich bsp. LATBbits.Lat4 für den Pin4 von PORTB? So 
wie bei dem PIC C-Tuturial? :) Hoffe habs jetzxD

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LATBbits.LATB4*

Autor: Erich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LATB  |=  0b00010000 ; // setzen  Bit 4
...
LATB  &= ~0b00010000 ; // löschen Bit 4

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :)

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. :)

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das das nen UND und ein ODER ist weiß ich aber wusste nicht das man dort 
löscht mit nem oder

Autor: Bierbaron (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre vielleicht ganz hilfreich für dich:
www.sprut.de
www.fernando-heitor.de

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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? :)

Autor: picer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  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.

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: picer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: picer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
picer schrieb:
> LATB = LATB = 0b00000001;

ein LATB zuviel, sch*** copy&paste

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leute vergesst nich den PIC in eine Endlosschleife zu schicken - 
ansonsten macht der permanent Resets ...

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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

Autor: Johannes R. (oa625)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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/introduc...

Da kannst du anfangen und dich satt lesen ... danach kann man's. Wenn 
nötig ist das auch auf alle anderen Compiler anzuwenden.

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank die Seiten werde ich mir auch noch zu gemüte führen.

Autor: wayneintersierts (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Eggi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: el pistolero (elpistolero84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
    }



}

Autor: Cyblord ---- (cyblord)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: el pistolero (elpistolero84)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: spontan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

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.