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
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.
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?
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 4Eggi 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.
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
@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.
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?