PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einstieg in PICs



NRicola
14.04.2005, 19:43
Hallo,

aaaaaaaaaaalso, ich bin nun mal eben etwas neu hier, wie unschwer zu erkennen ist. Ich will nun in die "höhere" Elektrotechnik einsteigen. Dafür hab ich mir von Conrad das VM111 PIC-Programmer and Experimentation Board (Velleman) zugelgt, wo ein PIC16F627 und ein paar Beispiel-asm's drinnen waren (und die Datenblätter der PICs). Allerdings ist keine ansatzweise Form von Tutorial vorhanden und die Beispiele sind nur äußerst dürftig dokumentiert. Deshalb die Frage: gibt's ein paar vernünftige Tutorials für diese Programmiersprache und/oder im Idealfall eine Art Wörterbuch der Kommandos mit Erklärungen irgendwo im Netz?
Und hier noch ein paar grundlegende Fragen:
Warum hat der PIC16F627 18 Pins? Müsste der nicht 16 haben?
Ist ein PIC auch "nur" ein Prozessor?
Was ist der I2C-Bus?
Kann mir diese Seite hier:http://www.avr-asm-tutorial.net/ helfen?
Vielen Dank für eventuelle( O:) ) Antworten!
MfG

the_Ghost666
14.04.2005, 20:59
das beste was du finden kannst ist www.sprut.de
hier wird hauptsächlich der pic 16f84 benutzt, aber auch einige andere. sehr informativ, umfangreich und ne menge beispiele. das lässt sich alles auch auf den 16f627 umsetzen, die kommandos sind ausführlich erklärt und identisch zu allen 16fs und mit dem datenblatt von deinem controller klappt alles.

the_Ghost666
14.04.2005, 21:13
ups hab im eifer was überlesen

also das mit den 18 pins stimmt schon, unter http://www.sprut.de/electronic/pic/typen.htm#typen findest du ne menge pics, da steht auch deiner drin

ein pic ist "nur" ein prozessor, was willst du mehr. er hat eigentlich alles was man braucht, ram, einen beständigen speicher, er arbeitet mit 8bit, was für die meisten sachen reicht, kann hardwaremäßig leider keine multiplikation und den nachteil, dass er mit einem 12mhz quarz nur 3mhz wirklich raus bekommt, da der takt intern nur ein viertel beträgt. jeder prozessor hat vor und nachteile. vor allem die große community der atmel fans haben mich immer wieder straucheln lassen ob ich beim pic bleiben soll.
und der i2c bus:
also das ist ein serieller bus der zur verbindung von ic untereinander benutzt wird. i2c oder iic steht für inter ic c... verdammt, das letzte ist mit entfallen. naja, auf jedenfall kommt er mit einer takt und einer datenleitung aus. du kannst ne menge ics anschließen, dein controller ist der master und kann jedes ic ansprechen und von ihm lesen oder schreiben. i2c ics haben eine standartadresse, mit jumpern kann man die leicht ändern und so bis zu 6 ics der selben sorte betreiben. ist ein sehr hilfreiches ding der i2c bus. was willst du denn mit dem pic machen?

NRicola
14.04.2005, 21:44
Jo, (um mal den Gruß der 30er Jahre zu verwenden)

vielen Dank für die raschen Antworten. Sprut hat schonmal nen guten Eindruck vermittelt.
@the_Ghost666
ok, dier Schwerpunkt lag auf "Gehört er auch zur Kategorie der Prozessoren". Sicher brauch ich für den Anfang erstmal nicht wirklich viel (bzgl. Hardware). Also Ziel ist es erstmal die Programmiersprache kennenzulernen, und da geht's irgendwie schon gut los: irgendwie kommt es mir vor, als würden die Programmcodeauszüge, die ich auf diversen Seiten finde einer anderen Sprache angehören, als jene, die ich verwenden soll(te). Es wurde vereinzelt auch von nem Compiler geredet, den ich (logischerweise) nicht kenne. Da steht nun die Frage: Gibt's da Compiler, bei denen man quasi im C- oder BASIC-Style programmieren kann und der Kompiler dann den Rest macht? (habe aber kein Interesse mich durch ein solches zu fuchteln) Sprich bei mir sieht's so in etwa aus:
...
OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
...
;INPUTS
SW1 EQU H'00'
SW2 EQU H'01'
...
MENU CLRF PORTB
;
BTFSC PORTA,SW1
GOTO EFFECT_1
...
Programmcode also in NotePad o.ä. +Kompiler = Maschinensprache blablabla
Multiplikationen also nicht!? Divisionen logisch dann auch nicht...
mmh
wie sieht's mit Addition/Subtraktion aus (wie sieht beispielhaft eine Rechenoperation aus)?
Gehen if-tests?
Ist festgelegt, welche Pins als Eingang und welche als Ausgang fungieren, oder kann man das ändern? (Wie?)
Mein Vorhaben: ich habe jetzt erstmal auf der Experimentierplatine 6 LEDs und 4 Tastschalter drauf sitzen, mit denen ich etwas rumspielen kann. Ich denke mein nächstes Ziel ist das Rumspielen mit logischen Operationen (AND, OR, NOR, NAND) und ggf. mit den if-Fragen, später dann auch den Rechenoperationen. Gibt's da ein paar (erklärende) Beispiele irgendwo, oder hätte jemand von Euch Bock mir was (grundlegendes) beizubringen? (wenn nicht, dann freu ich mich trotzdem über jede geschenkte Webseite mit gleichwertigen Inhalten! O:) )
Vielen Dank nochmal.

the_Ghost666
15.04.2005, 12:52
erstmal , wie weit bist du denn mit deinen elektronikkenntnissen, ich bin nämlich selbst nicht besonders weit und hab mir alles selbst beigebracht.
Für PICs gibt es eine Reihe von Compilern, erstmal einen der deinen Assemblertext in ein benutzbares hex-file compiliert, das ist dein beispiel da oben, der microship assembler. unter 40 befehle und eigentlich ganz einfach aufgebaut. sprut hat da ne menge beispiele. den compiler und eine entwicklungsumgebung gibts bei microchip gratis und heißt mlab. sehr gutes prog. auch laut der zeitschrift elektor.
für C brauchst du andere compiler, unter cc5x findest du einen privat kostenlosen compiler, einfach googlen. ebenso einer ist der ccs compiler. er ist kostenpflichtig, aber es gibt ne eingeschränkte demo. ebenso einfach googeln. was basic angeht hab ich keinen schimmer, aber es gibt sicher einen compiler dafür. ich kenn ihn nur leider nicht.

moment, gleich gets weiter mit dem rest der fragen

NRicola
15.04.2005, 14:12
Also sagen wir mal so: Elektrotechnik ist kein Problem, Elektronik...da steh ich noch quasi am Anfang. Wie gesagt, einen anderen Compiler will ich nicht benutzen, ich will stattdessen gleich in die unverblümte und konkrete obige Sprache einsteigen. Da hat ja Sprut auch mein ersehntes Wörterbuch der Programmierbefehle.
Aber noch eine Frage: Wie sieht's mit der Verwaltung mit Variablen aus? Kann ich mehrere gleichzeitig verwalten? Wie definiere ich Vars?
Gruß

15.04.2005, 16:21
das was du da oben hast ist wie ich es sehe der normale Microchip assembler.
er benutzt die befehle die im datenblatt oder bei sprut stehen.
ifs kann er naja nicht so einfach wie in c.

erstmal die variablen, du sprichst damit direkt speicherzellen an. mit dem befehl
x equ 0x07 weißt du der speicherzelle 07h den namen x zu.

leider ist es nicht so einfach damit zu arbeiten, der pic hat ein arbeitsregister, W. du kannst nicht direkt 2 speicherstellen verknüpfen sondern immer nur eine mit W oder aber W mit einer constante.

als beispiel
var1 equ 0x30
var2 equ 0x31

movfw var1
addwf var2,f

damit nimmst du den wert von var1, schiebst in in w, addierst w mit var2 und speicherst das ergebnis in deiner speicherzelle (f) var2.

the_Ghost666
15.04.2005, 16:32
was bei c das x++ ist, ist hier das incf x. das geht schneller als +1 mit dem obrigen beispiel.

für ifs benutzt du den btfss oder btfcs befehl. das steht für bit test, if set (clear) skip. wenn die bedingung erfüllt ist oder nicht, überspringt er den nächsten befehl, das wäre dann ein goto, das zur verzweigung führt.

btfss RB0
goto led_an
goto led_aus

so, wenn an port rb0 nun eine led ist, und sie 1, also an ist. dann überspringt er led_an und geht zu led_aus.

zu den ports, dein controller hat nur i/o pins. die kannst du frei als eingang oder ausgang definieren. andere pics haben noch analog oder comparator module oder serielle interfaces. da kann man sich dann entscheiden ob es ein normaler io port ist, oder ob es ein analogeingang ist, ein comparatoreingang oder eben ein teil des interfaces

NRicola
15.04.2005, 18:42
Hallo,

vielen Dank für die Beschreibungen. So habe ich damit jetzt erfolgreich das hier umgesetzt:
Taster1 lässt LEDs der reihe nach aufleuchten, wenn alle an sind der Reihe nach wieder aus (Befehlsabfolge)
Taster2 zählt vom aktuellen Stand (etwa von Wert des T1-Leuchtens) binär genau 8 Schritte runter (per Laufvariable).
Taster 3 und 4 erhöhen bzw verringern den Wert jeweils um eins.
Nun ist aber folgendes Problem: nicht selten zählt er bei betätigen von T3 oder T4 nicht nur ein, sondern zwei oder drei Mal nach oben oder unten. (Geht sehr schnell, sodass die 2^0-LED manchmal nichtmal blitzt) Kann man dagegen was machen?
Und so hätte ich jetzt schon die nächste Frage:
Wie funktionieren die ANDWF, ANDLW, IORLW, usw.? Die Erklärungen auf Sprut leuchten mir nicht so wirklich ein. Was kann ich damit verknüpfen und wie und inwiefern bringt mir das was?
Vielen Dank nochmal für Eure Bemühungen!
MfG

stegr
16.04.2005, 17:47
1.) die Mehrmalsbetätigung des Tasters nennt sich "prellen". Am einfachsten vermeidest du das, indem du noch abfragst, ob der Taster wieder losgelassen wurde und dazwischen ne pause machst...
Das sieht dann ungefähr so aus:
Prüfe Taster T1, wenn gedrückt, dann Routine für T1.
-> Routine T1 -> deine normale Routine, wie bisher...
-> Marke T1wait: Warteschleife (10-50ms, je nachdem wie stark dein Taster prellt)
-> prüfe ob Taster losgelassen, wenn ja, dann Ende Schleife, wenn nein, dann gehe zu T1wait.
Damit erzwingst du, dass die Taste losgelassen wird, bis die nächste Bearbeitung erfolgen kann.
Und mit der Warteschleife erzwingst du, dass das eigentliche Hardware-Prellen des Tasters (bedingt durch das leichte Zittern des Fingers und ähnliche Effekte) sich nicht auswirken.

2.) ANDWF (die anderen sind ähnlich)
Was ist das überhaupt?
AND W F bedeutet ganz einfach: Nimm das, was in F steht, verknüpfe es logisch UND mit dem, was in W steht und speicher das ganze dann in W ab.
Logisch UND verknüpfen ist eigentlich ganz einfach:
- Du hast in W 00011001 stehen.
- Und in F steht 00001111.
UND bedeutet dann, dass du die Schnittmenge bildest, d.h. alles wo beides auf 1 ist, ergibt auch 1.
Ergebnis:
0&0=0 W=00011001, F=00001111
0&0=0 W=00011001, F=00001111
0&0=0 W=00011001, F=00001111
1&0=0 W=00011001, F=00001111
1&1=1 W=00011001, F=00001111
0&1=0 W=00011001, F=00001111
0&1=0 W=00011001, F=00001111
1&1=1 W=00011001, F=00001111
Das Ergebnis wieder in W, damit steht dann in W: 00001001

Das ganze geht über Wahrheitstabellen:
A AND B = X: (und)

A
B x|0|1
0|0|0
1|0|1
A OR B = X: (oder, auch als Inklusiv-oder bekannt, daher IOR)

A
B x|0|1
0|0|1
1|1|1
A XOR B = X: (entweder - oder, auch als Exklusiv-oder bekannt)

A
B x|0|1
0|0|1
1|1|0

A NAND B = X: (nicht und)

A
B x|0|1
1|0|0
1|0|0
A NOR B = X: (nicht oder)

A
B x|0|1
0|1|1
1|1|0
A NXOR B = X: (nicht entweder-oder, sehr selten)

A
B x|0|1
0|1|0
1|0|1

Du hattest dann neben ANDWF noch ANDLW, das bedeutet nichts anderes als:
W AND L -> W, dabei ist L ein sog. Literal, d.h. ein fester Wert, den du schon bei der Programmierung fest einträgst.
Damit man das später noch schön lesen kann und du später nicht an tausenden Stellen im Programm nach dem Wert suchen musst, macht man das häufig über "Define"-Statements. Das sind Präprozessor-Anweisungen, die (automatisch) abgearbeitet werden, bevor dein Assembler drüber geht. Das include ganz am Anfang ist z.B. auch so eine Präprozessor-Anweisung (oder auch P.-Direktive genannt).
Bsp:
#define WARTEZYKLEN 27 ;Anzahl der Totzyklen für Warteschleife
Der Wert ist, sofern du nichts anderes angibst, dezimal.

Btw. schau dir mal dein Include-File an, dort drinnen findest du jede Menge defines (eigentlich fast ausschließlich). Das komtm daher, dass da drinnen nichts mysteriöses steht, sondern nur in welchem Register sich was befindet - und das dann in Namen verpackt, so dass man nicht für jeden anderen Typ alles umschreiben muss (sondern nur noch kleinere Teile).

Daher bietet es sich eigentlich fast immer an, mit Hilfe von equ und define "variablen" zu "definieren".

MfG
Stefan

Mobius
16.04.2005, 23:57
Der Wert ist, sofern du nichts anderes angibst, dezimal

Vorsicht, muss nicht direkt sein!!! Bei meinem MPLAB war beim COmpiler als Standard HEX angegeben, als ist es immer besser, die Art der eingegebenen Zahl anzugeben. Im Obrigen Beispiel wäre es dann

D'27' <-- D für Decimal (H oder 0x steht für Hexadecimal, B für Binär und O für Octal, wobei ich nur einige Unix-Freaks kenne, die diesen benutzten).

Und dadurch entstehten auch keine Probleme, wenn du dein Code weitergibst und jemand hat nicht Decimal als "nehme, wenn nichts angegeben ist" eingestellt.

Meine nur, weil es bei mir zu nervenden und vor allem unerklärlichen Fehlern bei dem Test meines Codes gekommen war und seit dem habe ich es mir angewöhnt.
MfG
Mobius

NRicola
17.04.2005, 15:09
Vielen Dank Ihrs!

Ihr habt meine Beispieldateien gut nackig gemacht! Hat mir sehr weitergeholfen. Ich denke, ich werde jetzt erstmal alles einwirken lassen, rumexperimentieren und anstreben, von den 6LEDs und 4 Tastern des Experimentierboards wegzukommen und mir was eigenes zu bauen.
Achja, könnt ihr mir vieleicht noch ein oder zwei Firmen nennen, die neben Conrad noch Elektronikteile (idealerweise online) vertreiben. Hab irgendwo gelesen, dass Conrad relativ hohe Preise hat.
Achso, da sind doch noch zwei Fragen:
kann ich mehrere Pausen über den gleichen Timer definieren? Also ich hab da jetzt ein
PAUSEgroß MOVLW D'150'
MOVWF TIMER2
kann ich da jetzt trotzdem einfach noch eine PAUSEklein ranhängen:
PAUSEklein MOVLW D'030'
MOVWF TIMER2
? Oder muss ich den größten gemeinsamen Teiler nehmen und die kleine Pause mehrmals CALLen?
Und was ist das hier für ein Befehl:
GOTO $-1
?
Sodenn. MfG

NRicola

17.04.2005, 16:24
also:
1.) anderer Anbieter: Reichelt (www.reichelt.de), sehr viel günstiger als Conrad
2.) Warteschleifen werden häufig nicht über Timer gemacht, sondern mittels verschachtelten Zählschleifen, die dann den Befehl NOP (No Operation) häufig hintereinander ausführen (siehe www.sprut.de). Was besser ist hängt meist davon ab, ob du noch genug Timer hast und wie deine persönlichen Vorlieben sind... Aktive Warteschleifen sind meist einfacher zu implementieren als timergesteuerte.
3.) GOTO $-1 ist ne Endlosschleife... Warum?
Ganz einfach: $ ist der aktuelle PC (Program Counter), also die Stelle im Programm, an der du grade bist. Bevor ein befehl ausgeführt wird, wird er um eins inkrementiert (PC+1 -> PC). Wenn du dann zu der Stelle PC-1 springst, kommst du wieder vor dem Goto raus, und arbeitest den Befehl nochmal ab... und das halt immer wieder...
Das ist eine übliche Methode bei rein interruptgesteuerten Programmen.

MfG
Stefan

Mobius
17.04.2005, 16:28
GOTO $-1

Befiehlt dem PIC zum nächst folgendem Befehl zu springen. Ist eigentlich nichts anderes als ein NOP, nur, dass der PIC zwei Zyklen braucht um den GOTO befehl auszuführen (und somit doppelt so lange wartet, wie ein NOP). Dadurch kann man "längere" Pausen, die normalerweise durch eine Anhäufung von NOPs gelöst werden können (was aber speicher wegfrisst) mit der hälfte der Befehle erledigen.

Also gilt, ein GOTO $-1 entspricht zwei NOPs hintereinander.
Sorry, habs falsch gesagt, siehe Post von Gast...


@Timer: Ja, kannst du machen, so lange du dir sicher bist, dass du nicht plötzlich, während der eine lange Pause ausgeführt wird, eine kurze Pause startest. Was aber eigentlich nur bei interrupts auftreten kann. Und dann auch nur, wenn man unsauber arbeitet...

@Anbieter: Alos, bei Reichelt (www.reichelt.de) kriegt man die Chips auch (und um einiges billiger als bei Conrad) und da du ja in Deutschland wohnst (du glücklicher ;) ), schicken die es dir schon ab einem Bestellwert von 10€...

MfG
Mobius

Edit: Also, ich muss mich entschuldigen, hab echt falsch gelegen ](*,) Aus einem mir unerklärlichen Grund habe ich es mit GOTO $+1 verwechselt #-o

NRicola
18.04.2005, 18:09
Okay, vielen Dank nochmal für die Tips und Erklärungen. Wie gesagt, ich lass jetzt erst mal alles einziehen. Die nächsten Fragen kommen gewiss! :)
MfG
NRicola

NRicola
21.04.2005, 17:50
Hi,

es hat sich wieder eine neue Frage aufgetan:
muss ich am PIC einen externen Oszillator dranklemmen, oder funzt der auch ohne?
Welcher der drei Timer (0,1,2) ist der externe?
MfG

NRicola

Mobius
21.04.2005, 21:00
Ob er auch ohne extrenen Oszillator funzt, hängt vom CHip-Typ ab. z.B.: der 16F84A kann es nicht, aber der 16F636 kann es (schau einfach im Datenblatt unter "Oscillator configuration" nach, dort sind auch alle anderen wichtigen Sachen aufgelistet, meist heist es INTOSCXX).

Wie meinst du extern? Extern angetrieben oder herausgeführt (sodass du die Highs und Lows auf einem Osci angucken kannst)? Am einfachsten alles bei den Timern im Datenblatt durchschmökern, da stehts immer drin.
Bei den Timern ist es aber meist so, dass Timer 0 einen externen Source-trigger hat, also kannst ihn fast unabhängig von dem Oszillator laufen lassen.
Bei Timer 2 (oder war es 3?) kannst den Clock mit einem Postscale auf einen Pin legen, d.h. der schaltet dann bei jedem clock-Impuls um.

MfG
Mobius