Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC...... und viele Fragen.
Guten Tag zusammen,
Ich hab da in Bezug auf PIC und Software ein paar kleine Fragen, die ihr mir sicher recht schnell beantworten könnt, und dann kann dieser Thread auch sicher schnell "nach unten durchgeschoben" werden....
Also, ich hab den Picstart-Plus damals in so ner "ich will Prozessor programmieren"-Phase gekauft.... lange her.
Inzwischen ist mir die Schachtel mit dem Programmiergerät wieder in die Hände gefallen und nach etwas Suchen, bin ich auch auf dieses Forum gestossen.
Wenn ich mir Assembler so ansehe, bekomme ich Bauchweh und würde das Programmiergerät am liebsten wieder weglegen. Genau das soll aber nicht passieren *GGGG*
Basic ? C ? C++?
Mit welcher Programmiersoftware programmiert ihr so rum ?
Ist C oder C++ schwer zu lernen ?
Könnt ihr mir verständliche Bücher empfehlen, die den "Einstieg" einigermassen erträglich machen ?
Falls weitere Fragen auftauchen, werd ich die bei Gelegenheit noch beifügen.
Gruß
Alex
Also ich persönlich benutze ASM infos dazu findest du auf sprut.de
Andere alternativen wehren für C: css, hitec-c, cxx5 und noch einige andere.
Grafisch gibt es: ktechlab(flowchat), Parsic
und dann hatte ich irgentwo noch basic und pascal gesehen.
Ich finde, dass Du asm lernen solltest bevor Du anfängst einen PIC in einer Hochsprache zu programmieren.
Natürlich musst Du kein Profi werden in Assembler, um jedoch den Microcontroller zu verstehen wäre es von Vorteil einige Programme in asm zu schreiben.
Danach fällt es Dir leichter zum Beispiel in C zu programmieren.
Enige Routinen müssen sogar in asm geschrieben werden, vor allem bei zeitkritischen Vorgängen.
Eine Hochsprache erzeugt einen Code der oft viel zu lahm ist für eine gegebene Anwendung.
Also heisst es, Assembler (ASM ?) lernen ??
MP-LAB ist ja schliesslich dabei gewesen...
Naja, dann muss ich da wohl durch.
Gibts es denn da ein paar Tips für leicht verständliche Bücher oder so ?
Hab da eben auf der Sprut-Seite noch was gesehen.......
interner Oszillator (z.B. 16F62x 16F62xA 12F6xx und andere) (INTRC bzw. INTOSC)
Im INTRC-Mode wird ein interner 4-MHz-Oszillator verwendet, der leider nicht sehr stabil ist (3,65 ... 4,28 MHz). Dafür benötigt er keinerlei externe Bauelemente, und die OSC-Pins können als I/O-Pins verwendet werden.
Da ich grad nächste Woche ein paar 16F628A bekomme.... heisst das, daß ich im Grunde gar keinen externen Oszillator anschliessen muss und das Ding läuft trotzdem ??
Wär ja cool.
Ich sag ja, bin kleiner Anfänger, aber mit Eurer Hilfe werd ich das noch ändern.
www.sprut.de
Ist besset als alle mir bekannten Bücher in deutscher Sprache.
Tipp:
Fang am besten an Dich mit der Konfiguration (Anfangseinstellung) des PIC anzufreunden.
Da wären: PWRTE, WDT, OSC, CODEPROTECT
Dann solltest Du versuchen eine LED einzuschalten, blinken zu lassen, ein Lauflicht programmieren.
Unter Lernbeispiele bei sprut findest Du einen leichten einstieg.
Natürlich wäre ein Klick auf Grundlagen ebenso ratsam.
kalledom
04.08.2007, 23:44
Hallo,
vielleicht hilft Dir auch dieser (http://www.domnick-elektronik.de/picasm.htm) oder dieser (http://www.domnick-elektronik.de/picpwm.htm) Link.
Jetzt seh ich mir einen Programmcode nach dem anderen an und bin immer noch kein Stück weiter.....
Entweder denke ich zu "logisch" oder ich bin einfach nur zu blöd dazu.
Ich habe beruflich SPS programmiert, hab schon ein bisschen was mit C-Control gemacht und versuche in den Programmen immer noch sowas wie logik zu sehen...
Load I 0.1 (Lade Eingang 0.1)
If....then
goto
xor.....
Alles Dinge, die ich "übersetzen" kann und darin Sinn sehe...
Bei Assembler find ich nicht mal ansatzweise sowas...
Ich sehe bei Sprut zum Beispiel gar nix von Include...
irgendwo hab ich dann noch "include irgendwas.H" gesehen, woanders sehe ich "include irgendwas.INC"
Ich blicks nicht mehr...
Und ich hab immer noch nix gefunden, wie ich beim 16F628A den internen Oszillator aktiviere, bzw nutze...
Muss ich dann da schreiben
list P=16f628a, E=1, R=DEC ; Prozessortyp, Errorlevel und Zahlenformat
include "P16F628A.INC" ; Registerdefinitionen einbinden
errorlevel 1 ; Meldungen ignorieren
__CONFIG INTRC_OSC
???
Moin moin.
Hier mal ein Beispiel für deinen PIC:
__config b'10000100011000'
So müsste er den Internen Oszillator benutzen.
(bit 0 ist das erste von rechts)
bit 13 bit 0
bit 13: CP: Flash Program Memory Code Protection bit(2)
(PIC16F648A)
1 = Code protection off
0 = 0000h to 0FFFh code-protected
(PIC16F628A)
1 = Code protection off
0 = 0000h to 07FFh code-protected
(PIC16F627A)
1 = Code protection off
0 = 0000h to 03FFh code-protected
bit 12-9: Unimplemented: Read as ‘0’
bit 8: CPD: Data Code Protection bit(3)
1 = Data memory code protection off
0 = Data memory code-protected
bit 7: LVP: Low-Voltage Programming Enable bit
1 = RB4/PGM pin has PGM function, low-voltage programming enabled
0 = RB4/PGM is digital I/O, HV on MCLR must be used for programming
bit 6: BOREN: Brown-out Reset Enable bit (1)
1 = BOR Reset enabled
0 = BOR Reset disabled
bit 5: MCLRE: RA5/MCLR/VPP Pin Function Select bit
1 = RA5/MCLR/VPP pin function is MCLR
0 = RA5/MCLR/VPP pin function is digital Input, MCLR internally tied to VDD
bit 3: PWRTE: Power-up Timer Enable bit (1)
1 = PWRT disabled
0 = PWRT enabled
bit 2: WDTE: Watchdog Timer Enable bit
1 = WDT enabled
0 = WDT disabled
bit 4, 1-0: FOSC<2:0>: Oscillator Selection bits(4)
111 = RC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, Resistor and Capacitor on RA7/OSC1/CLKIN
110 = RC oscillator: I/O function on RA6/OSC2/CLKOUT pin, Resistor and Capacitor on RA7/OSC1/CLKIN
101 = INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
100 = INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
011 = EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
010 = HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
001 = XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
000 = LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
In diesem Register kannst Du zwischen zwei Frequenzen des internen Oszillators wählen.
PCON – POWER CONTROL REGISTER (ADDRESS: 8Eh)
bit 3 OSCF: INTOSC Oscillator Frequency bit
1 = 4 MHz typical
0 = 48 kHz typical
Sooo....
Hab eben mal mit CH-Basic etwas rumgespielt...
Ich hoffe, falls fehler auftauchen, werden mir die ASM-Spezies die Richtung weisen, und insgesamt wirds den ASM-Neulingen etwas helfen das alles zu verstehen.
CH-Basic-Code:
PIC 16F628
StartAddress 0x5
BYTE vartest1
WORD
SBYTE
SWORD
PortRd A , VARTEST1
SetPort B , VARTEST1
Zu Deutsch:
Lade den kompletten Port A in die Variable VARTEST1
Schiebe die komplette Variable VARTEST1 in Port B
Also alles was an Port A reinkommt, gebe ich 1 zu 1 an Port B weiter....
Als ASM-Code macht mir das Prog das hier:
LIST P= 16F628
INCLUDE "P16F628.INC"
RADIX DEC
ORG 0X5
AUX1_L EQU 0X20
AUX1_H EQU 0X21
AUX2_L EQU 0X22
AUX2_H EQU 0X23
AUX EQU 0X24
S0 EQU 0X25
VARTEST1 EQU 0X26
MOVF PORTA, W
MOVWF VARTEST1
MOVF VARTEST1, W
MOVWF TRISB
END
Ich versuche jetzt mal geschriebenerweise, mir das ganze irgendwie zu "übersetzen"...
LIST P= 16F628
INCLUDE "P16F628.INC
Hier sag ich dem Programm, welchen Controller ich überhaupt verwende....
MOVF PORTA, W
Packe (mov = move ?) den Port A in den Arbeitsspeicher (W ?)
MOVWF VARTEST1
Packe den Arbeitsspeicher W in die Variable VARTEST1
MOVF VARTEST1, W
Packe die Variable VARTEST1 in den Arbeitsspeicher W
MOVWF TRISB
Packe den Arbeitsspeicher W in den Port B
---------
Warum das aber erst PORTA und hinterher TRISB heisst, bin ich überfragt....
r.moshage
07.08.2007, 18:17
W steht für working Register, also Arbeitsregister. Bei den PIC's laufen alle
Aktionen über dieses Register, ist manchmal etwas lästig aber man gewöhnt sich daran. Also dein punkt 1 stimmt so. Bei 2 heist dann bewege den Inhalt von PORT A in das W-Register.
3. Move W-Register in die Variable VARTEST (F steht für File-Register)
4. Das Ganze wieder zurück
5. Schreibe den inhalt von W in das Datenrichtungsregister TRIS B
Damit wird dein Programm schonmal nicht das machen was du woltest sondern PORT A einlesen und je nach eingelesenen Wert Teile von PORT B als Ausgang konfigurieren. Ich vermute mal das du nicht SetPort B sondern Port Write nehmen mußt (ich kenne den syntax deines Basics nicht)
Schau dir doch mal die seite von Sprut http://www.sprut.de/ an da kann man viele Grundlagen zum PIC nachlesen und wenn du die Beispiele dort Verstanden hat hast du ein gutes Grundgerüst zum Programieren mit den PIC's
.
MFG
ralf
und wenn du die Beispiele dort Verstanden hat
Und genau DA hängts....
Ich seh keinen Ansatz und durch "Programm ansehen" kapier ich da leider nicht das geringste...
da wird irgendwas konfiguriert, und dann so erklärt, wie ein Fachmann es einem Fachmann erklärt... der Laie steht da und versteht nix.
Sooo.... ich stell einfach mal immer weiter Fragen die mir einfallen, mit Eurer Hilfe werden wir das schon packen *GGG*
Ich beiss mich jetzt mal auf "meinem" demnächst (hoffentlich morgen) kommenden 16F628A fest....
Bezug: http://www.sprut.de/electronic/pic/config/config_emb.htm#wort
Also... wenn ich folgendes schreibe
; Configuration festlegen
__CONFIG B'11110100011100 '
Müsste ich der Sprut-Seite nach:
- Programmspeicher ungeschützt
- EEprom ungeschützt
- RB4 ist I/O
- Vdd<4V bewirkt kein Reset
- Pin4 ist RA5 = I/O
- direkt Programm starten
- Watchdog AN
- benutzt den internen Oszillator
Oder hab ich nen denkfehler ?
Damit wird dein Programm schonmal nicht das machen was du woltest sondern PORT A einlesen und je nach eingelesenen Wert Teile von PORT B als Ausgang konfigurieren. Ich vermute mal das du nicht SetPort B sondern Port Write nehmen musst (ich kenne den syntax deines Basics nicht)
CH-Basic:
PIC 16F628
StartAddress 0x5
BYTE vartest1
WORD
SBYTE
SWORD
PortRd A , VARTEST1
PortOut B , VARTEST1
ASM:
LIST P= 16F628
INCLUDE "P16F628.INC"
RADIX DEC
ORG 0X5
AUX1_L EQU 0X20
AUX1_H EQU 0X21
AUX2_L EQU 0X22
AUX2_H EQU 0X23
AUX EQU 0X24
S0 EQU 0X25
VARTEST1 EQU 0X26
MOVF PORTA, W
MOVWF VARTEST1
MOVF VARTEST1, W
MOVWF PORTB
END
So besser ??
Jetzt sieht das auch mit dem "PortB" am Ende etwas "logischer" aus...
Jetzt stellt sich mir allerdings die Frage, warum ich nicht die Variable umgehen kann mit:
MOVF PORTA, W
MOVWF PORTB
??
Schau mal bitte auf Seite 98.
http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf
Du solltest ab und zu mal ins Datenblatt schauen, es steht dort sehr viel Nützliches.
Klar kannst Du die Variable umgehen, sie ist nichts anderes als ein Register und W ist auch ein "imaginäres" Register.
Also PortA nach W und W nach PortB. Nur zu.
Seite 98 der PDF-Datei oder Seite 98 des Datenblatts ??
Seite 98 der PDF (Seite 96) ist die Config-Geschichte... gut zu wissen. Danke !
So ich bins mal wieder....
Also ich hab mir nach Vorlage von Sprut auf ner Steckplatine Port A als Eingang (mit 100k Pull-Up an +5V) und Port B als Ausgang (LED und dahinter 1k an Masse) zusammengesteckt.
Die Konfig kann man bei MP-Lab ja schön zusammen-"klicken"...
Konfiguration und Programm sieht man HIER (http://driona.gmxhome.de/roboternetz/mplab-0001.jpg)
Trotzdem macht der PIC nix....
Hülfe !!!
r.moshage
11.08.2007, 23:31
Der PIC kann so auch nichts machen weil du erst festlegen mußt ob ein Port als Ein- oder Ausgang funktionieren soll. Dazu mußt du das entsprechende TRIS-Register setzen wobei 1=Input und 0=Output bedeutet. Also um PORT A auf input zu setzen
MOVLW 0xff
MOVWF TRISA
du kannst auch nur einige Bits auf Output stellen dann sieht der erste befehl so aus:
MOVLW '01011001'
für das setzen aller bits auf Input reicht:
CLRF TRISB
da die PORT und TRIS Register sich in verschiedenen Speicherbänken befinden muß vor jedem ansprechen dieser Register mit BANKSEL auf die entsprechende Bank umgeschaltet werden. Also vor dem einstellen der Datenrichtungsregister einmal BANKSEL TRISA und vor dem ansprechen der Portregister einmal BANKSEL PORTA.
MFG
Ralf
Kann man das bitte auch mal so schreiben, daß ein Volldepp wie ich das auch kapiert ???
So komm ich mir nämlich grad vor....
Ich frag mich dann
A) warum ein Programm wie CH-Basic, das ja soooo einfach sein soll, das nicht "automatisch" mit einbindet...
und
B) warum ich (wie auch die Config-Geschichte) das nicht irgendwo in MP-Lab zum "anklicken" hab....
Also dann so, oder was ??
LIST P= 16F628A
INCLUDE "P16F628A.INC"
RADIX DEC
ORG 0X5
AUX1_L EQU 0X20
AUX1_H EQU 0X21
AUX2_L EQU 0X22
AUX2_H EQU 0X23
AUX EQU 0X24
S0 EQU 0X25
VAR01 EQU 0X26
Init MOVLW 0xff ; Port A auf Input
MOVWF TRISA
clrf TRISB ; Port B OutputOutput
MOVF PORTA, W
MOVWF VAR01
MOVF VAR01, W
MOVWF PORTB
END
Eben ausprobiert..... NEE, das tuts auch nicht
Hab eben bei Sprut was rumgesucht....
Jetzt siehts so aus:
Init bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'11111111' ; PortA Input
movwf TRISA
movlw B'00000000' ; PortB Output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
Jetzt sind RB0 - RB5 aus (bleiben auch aus, RB6 und RB7 sind an..... und wenn ich RA6 betätige, gehen RB6 und RB7 aus.... wenn ich RA6 betätige geht RB6 aus.... wenn ich RB7 betätige, geht RB7 aus...
Jetzt hab ichs so:
Init bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB Output
movwf TRISB
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
clrf PORTB
aber dann sind RB0, RB6 und RB7 an, der Rest nicht....
Erklärts doch mal bitte für nen Doofen....
Möchtest Du mit manuell vorgegebenen Pegeln an PORTA die LED´s an PORTB schalten?
ich möchte ganz einfach das was an Port A reinkommt... hinten an Port B rausschmeissen....
Also quasi, alle Pins an Port B aus... und wenn an z.B. RA0 was kommt, soll RB0 auch kommen... RA5 - RB5 eben das selbe....
eigentlich was ganz einfaches !
Übrigens..
Die "Config Geschichte" gibts sehr wohl "zum Anklicken in MPLAB"..
Ich benutze die Version 7.6
Dort gehst Du im geöffneten Projekt auf Configure (Oben in der Leiste) und dann auf Configuration Bits.
Nun machst Du das Häckchen weg bei: Configuration Bits set in code.
Achso.. Nochwas:
Es ist sehr hilfreich eine LED zum debuggen zu benutzen.
Das bedeutet, dass man eine LED an irgendein freien I/O hängt und diese an bestimmten Stellen im Programm blinken lässt.
So kannst Du Dich davon überzeugen wie weit das Programm abgearbeitet worden ist oder wo es hängt.
In C kann man zum Beispiel eine Funktion definieren debug_led(); , die man je nach Anforderung irgendwo im Code plaziert.
Zu Deinem Hauptproblem:
Kannst Du bitte einen Schaltplan posten wie Du was an den PIC gehängt hast?
So kann man sich besser drüber unterhalten und es schleichen sich keine Missverständnisse rein.
Maxigraf
12.08.2007, 11:30
Die "Config Geschichte" gibts sehr wohl "zum Anklicken in MPLAB"..
Das hat er ja gesagt.
Ihm gings darum, die IO-Port-Geschichte irgendwo zum anklicken zu haben ;)
Im übrigen würd ich sagen, sollte er ne Endlosschleife machen und einfach immer PortA auf PortB schreiben, so z.b.
LOOP MOVFW PORTA
MOVWF PORTB
GOTO LOOP
Wie hast du eigentlich PortA beschaltet? Wenn du nämlich die Pins per Button auf Low ziehst, musst du PortB nachher invertieren, würd ich sagen ;)
Achja, die Config zusammenklick geschichte hat bei mir noch nie wirklich funktioniert...
Bzw. wenn ich die CONFIG im code setze, dann hab ich sie danach im hex file, wenn ich sie mit diesem zusammenklickassistenten benutz, dann nicht ;)
Da verlangt er ein wenig zu viel ;)
Ich wette, er schaltet jetzt die Komparatoren an PORTA ab und beseitigt das Problem mit dem MCLR Pin und siehe da, es geht ein Licht auf. ;)
Also hier grad der "Schaltplan", sofern man dieses einfache Gedöns so nennen kann...
http://driona.gmxhome.de/roboternetz/16f628a-0001.jpg
Und dank Stowoda´s Hilfe das Listing, das fast komplett läuft:
; Auswahl PIC-Typ
LIST P= 16F628A
INCLUDE "P16F628A.INC"
RADIX DEC
ORG 0X5
; Variablen
AUX1_L EQU 0X20
AUX1_H EQU 0X21
AUX2_L EQU 0X22
AUX2_H EQU 0X23
AUX EQU 0X24
S0 EQU 0X25
VAR01 EQU 0X26
; Init-Einstellungen
Init clrf PORTA ;Initialize PORTA by setting output data latches
movlw 0x07 ;Turn comparators off and
movwf CMCON ;enable pins for I/O functions
bsf STATUS, RP0 ;In Block 1 springen
movlw B'00000000' ;PortB alle Output
movwf TRISB
bcf STATUS, RP0 ;In Block 0 zurückspringen
; Hauptprogramm
MOVF PORTA, W
MOVWF VAR01
MOVF VAR01, W
MOVWF PORTB
END
Nur RB4 will noch nicht.... RB0 bis RB3 und RB5 bis RB7 machen jetzt, was sie sollen !
Hallo!
Ich hoffe, dass der Artikel im Wiki nicht schaden kann:
https://www.roboternetz.de/wissen/index.php/PIC_Assembler
MfG
Robbersoft
13.08.2007, 01:08
Hallo Driona,
leider kann ich mich dir nur anschließen, daß ASM etwas kompliziert ist die einzelnen Schritte zu verstehen. Es werden immer wieder Einzelschritte mit den selben bzw. ähnliche Befehlen ausgeführt und dabei kann man schnell die Kontrolle verlieren.
Nach langem hin und her habe ich mich für PIC Basic entschieden und bin sehr zufrieden damit. Für mich ist Basic einfach verständlicher und übersichtlicher. Ich benutze das MicroCodeStudio und bin seit etwa 2 Monaten dabei und schon ein paar Projekte entworfen.
z.B.
Anstatt
AUX1_L EQU 0X20
AUX1_H EQU 0X21
AUX2_L EQU 0X22
AUX2_H EQU 0X23
AUX EQU 0X24
S0 EQU 0X25
VAR01 EQU 0X26
Init MOVLW 0xff ; Port A auf Input
MOVWF TRISA
clrf TRISB ; Port B OutputOutput
MOVF PORTA, W
MOVWF VAR01
MOVF VAR01, W
MOVWF PORTB
END
gibst du unter PICBASIC nur
TRISA = %00111000 ' Kommentar : RA0-2 OUTPUT, RA3-5 INPUT, RA6+7 OUTPUT
TRISB = %11000000 ' Kommentar : RB0-5 OUTPUT, RB 6+7 INPUT
ein. Die 1er stehen für Inputs und die 0en für Outputs. Demnach ist von rechts nach links die PinPORT Nr am PIC.
Schau mal im Netz ob du irgendwelche Handbücher über MicroCodeStudio findest. Ist echt total easy und fast alles realisierbar, und Einbußen hast du fast keine, da die Files sowieso in Hex umgewandelt werden.
Für dein obiges Beispiel würde das dann so aussehen:
DEFINE OSC 4 ' 4MHz
CMCON = %111 ' oder einfach 7 ; Komparatoren und A/D abschalten wenn vorhanden
TRISA = %11111111 ' oder einfach 255
TRISB = %00000000 ' oder einfach 0
main:
PORTB = PORTA
GOTO main
Anstatt 100k würde ich 10k nehmen oder die Eingänge mit Schaltern versehen mit Pullup oder Pulldown Widerständen.
kalledom
13.08.2007, 23:33
Hallo Driona, hallo Robbersoft,
Assembler ist nach der Maschinensprache (das sind diese 0x3F, 0xC9, 0x45, 0x.....) eine sehr maschinen-nahe Programmiersprache, mit der jedes einzelne Bit in jedem Register in der Maschine, in diesem Fall der PIC, angesprochen werden kann.
Die Frage für euch beide, was möchtet ihr ?
Eine Programmiersprache erlernen, um Anwendungen zu programmieren,
oder wissen, was der PIC macht bzw. reagiert.
Letzteres ist das Schwierigste, weil es voraussetzt, daß einem Struktur und Funktionen des PIC, bekannt sind.
Dann muß das 'Innenleben' des PIC in Verbindung mit Assembler (und nur damit geht es) erforscht und erlernt werden.
Wer nur programmieren möchte, der muß die Funktionen des PIC nicht wissen, sondern die Befehle kennen, mit denen ein Taster abgefragt und eine LED ein- / ausgeschaltet wird. Den Rest übernimmt der Compiler.
Driona hat ja schon ganz gut angefangen, aber vermutlich nicht die nötige Ruhe.
Du solltest etwas im Datenblatt (PDF-Datei) blättern und die interne Struktur des PIC mal überschlägig anschauen. Die Blockbilder helfen da am besten weiter. Nicht alles auswendig lernen, aber vieleicht ein wenig merken, wo in dem Datenblatt was beschrieben ist.
Dann zur Abwechslung mal am Ende des Datenblattes die Assembler-Befehle anschauen, wie die heißen und was die machen. Nicht auswendig lernen, nur wissen, wo was steht. Nachschauen wirst Du nämlich noch häufiger müssen. Auch bei mir liegt heute noch das PIC-Buch beim Programmieren neben mir.
Vergiß nicht, daß die I/Os sehr flexibel sind; sie können Eingang sein (Reset-Zustand), Ausgang oder als Sonderfunktion initialisiert werden (serieller Pin, Zähler-Eingang, PWM-Ausgang, ....).
Dann mußt Du nur noch die Stolperfallen kennen, daß nämlich die Funktions-Register (F) auf bis zu 4 Register-Bänken untergebracht sind und auf diese Bänke auch umgeschaltet werden muß; und wieder zurück auf Bank 0, weil da die gebräuchlisten Register sind. Einige Register sind auf allen 4 Bänken erreichbar. Das findest Du alles im Datenblatt auf den ersten Seiten.
Damit es mit Deinem Programm erst einmal weiter geht, da gibt es nämlich noch eine Stolperfalle: Analogeingänge bzw. bei einigen PICs Komperator-Eingänge. Die sind ausgerechnet am Port A. Diese Analog-Funktion muß erst einmal auf Digital-I/O umgeschaltet werden, dann noch auf Eingang (ist nach Reset so) und dann sind es auch Eingänge.
Dann sollte das auch funktionieren.
Schau Dir mal im Datenblatt das Blockbild für I/Os vom Port A an, da wird das beschrieben sein.
Viel Spaß .... bis zur nächsten Stolperfalle :-)
Ich bin ja mal angetan über diesen Beitrag..... so langsam bewegen wir uns in die richtige Richtung.
Ich setze einfach mal den Text voran und reagiere einfach darauf *GGGG*
..... in jedem Register in der Maschine, in diesem Fall der PIC, angesprochen werden kann.
Die Frage für euch beide, was möchtet ihr ?
Nun, ich dachte eigentlich, daß ich das oben ganz zu Anfang schon erwähnt hatte. Ich kenne das von der C-Control (bitte nicht auslachen) und von Industrie-SPS her... Lade Eingang X... rechne irgendwas... mache am Ausgang Y dies und das...
Und dazu ist es eigentlich total egal, wie die Bits von einem Register ins andere geschoben werden... Hauptsache an den Ports passiert das, was ich haben will.
Eine Programmiersprache erlernen, um Anwendungen zu programmieren,
oder wissen, was der PIC macht bzw. reagiert.
Also für mich: Das erste davon !!! Keine Ahnung, ob Robbersoft das anders sieht.
Wer nur programmieren möchte, der muß die Funktionen des PIC nicht wissen, sondern die Befehle kennen, mit denen ein Taster abgefragt und eine LED ein- / ausgeschaltet wird. Den Rest übernimmt der Compiler.
Genau darum gehts, mehr wollte ich eigentlich gar nicht...
Driona hat ja schon ganz gut angefangen, aber vermutlich nicht die nötige Ruhe. Du solltest etwas im Datenblatt (PDF-Datei) blättern und die interne Struktur des PIC mal überschlägig anschauen. Die Blockbilder helfen da am besten weiter. Nicht alles auswendig lernen, aber vieleicht ein wenig merken, wo in dem Datenblatt was beschrieben ist.
Das Datenblatt hat (in ausgedruckter Form) 178 Seiten.... und wenn man gar nicht weis, WAS darin "wichtig" ist und was nicht, ist das doch ganz schön happig...
Vergiß nicht, daß die I/Os sehr flexibel sind; sie können Eingang sein (Reset-Zustand), Ausgang oder als Sonderfunktion initialisiert werden (serieller Pin, Zähler-Eingang, PWM-Ausgang, ....).
Kann das die (oben als Beispiel genommene) C-Control nicht teilweise auch ?
Damit es mit Deinem Programm erst einmal weiter geht, da gibt es nämlich noch eine Stolperfalle: Analogeingänge bzw. bei einigen PICs Komperator-Eingänge. Die sind ausgerechnet am Port A. Diese Analog-Funktion muß erst einmal auf Digital-I/O umgeschaltet werden, dann noch auf Eingang (ist nach Reset so) und dann sind es auch Eingänge.
Dann sollte das auch funktionieren.
Schau Dir mal im Datenblatt das Blockbild für I/Os vom Port A an, da wird das beschrieben sein.
Viel Spaß .... bis zur nächsten Stolperfalle
Hmm, so langsam hab ich das Gefühl, ich hätte mir damals besser ne EasyStep von Frenzel&Berg (Software ähnlich der Step5 SPS) , ne neuere C-Control oder nen anderen Prozessor geholt....
Wie gesagt, ich wollte nur einen Baustein, dem ich z.B. sage "Wenn an Pin A und Pin B (z.B. CNY70 Reflexkoppler zur Linienerkennung) kein Signal kommt, Pin C und D eingeschaltet (rechter und linker Motor).... wenn A kommt, fahr nen rechtsbogen.... wenn B kommt, nen Linksbogen....
fertig aus...
Gut, das ganze halt etwas schöner geschrieben, aber ich finde dazu muss und will ich überhaupt nicht wissen, in welchen Bänken was wo warum steht....
Robbersoft
14.08.2007, 02:43
@Kalledom
genau so sieht es aus. Man sollte zunächst wissen, was man wissen möchte =D>
Entweder wie ein PIC funktioniert oder wie ich ihn programmiere. Das wird wahrscheinlich das größte Problem bei Neueinsteigern sein, die eigentlich nicht wissen, was sie wollen. Für mich persönlich ist nur das Ergebnis wichtig. Klar ist man im Vorteil, wenn man beides weiß. Aber auch ich habe komplexe Aufgaben wenn vielleicht über "Umwege" das erreicht, was ich mir vorgestellt habe. Ich bin momentan darauf fixiert, meine Codes noch zu optimieren. Denn ich habe festgestellt, daß jedes BIT zählt.
Das sehe ich an meinem aktuellen Projekt in dem ich Lenkradinterfaces scanne und die Remotesignale emuliere. Ganz schön heftig, was man da an wertvollen Bits sparen kann, wenn man wiederholte Sequenzen als Sprungroutinen nutzt.
Gruß RobberS
Nun..
Ich bin da ganz anderer Meinung und denke nicht, dass man den PIC nicht kennen muss um ihn in einer Hochsprache zu programmieren.
Schließlich ist ein Kompiler kein Gedankenleser und muss gesagt bekommen was er realisieren soll.
Wenn ich nun nichteinmal weiss wieviele Ports mein PIC hat oder welche funktionen damit realisiert werden können so fehlt mir ernormes Grundwissen.
Das wäre ja vergleichbar mit einem Auto bei dem ich nicht sicher bin wo Gas und Bremse sind.
Ein paar Projekte in Assembler sind Grundvoraussetzung, wie ich denke, um den PIC näher kennen zu lernen.
Ihr solltet nicht so ungeduldig sein, Rom wurde schlielich auch nicht an einem Tag erbaut ;)
Obwohl der Vergleich hinkt, denn mit www.sprut.de , diesem Forum und einem Datenblatt ist es fast ein Kinderspiel im Gegensatz zu "Rom" ;)
Noch eines: Wer ein paar leichte Sachen in ASM programmiert der hat auch das Zeug den PIC später zB.: mit C zu steuern.
Für diejenigen die diese kleine Hürde nicht nehmen können, wird eine Hochsprache auch schwierig werden.
In dem Sinne..
Gruß
stowoda
Wer ein paar leichte Sachen in ASM programmiert ...
Eigentlich hatte ich ja angenommen, daß eine Vorne-rein-hinten-raus-Anwendung was recht einfaches ist.... bei dem was ich dann jetzt erlebt habe, ist es aber genau das wohl nicht.....
Ich hatte (wohl fälschlicherweise) angenommen, ein Prozessor wäre mit einer SPS oder C-Control vergleichbar....
Hier werden so tolle Tips gegeben wie "ja dann musst Du vorher noch dies und das Configurieren, oder so... aber keiner gibt ein wirkliches Beispiel, wie das dann genau auszusehen hat...
Und teilweise werden Fragen nur teilweise oder gar nicht beachtet....
Schade eigentlich.....
kalledom
14.08.2007, 10:50
Ich hatte (wohl fälschlicherweise) angenommen, ein Prozessor wäre mit einer SPS oder C-Control vergleichbar.... Das war sicherlich Dein erster großer (Denk-)Fehler. Da hättest Du Dich etwas besser informieren sollen. Wieviel Software steckt in einer SPS oder in der C-Control schon drin, damit eine Bedienung möglich ist ? Wieviel Software ist im PIC drin ? Damit hätte der Unterschied schon mal klar sein müssen.
Hier werden so tolle Tips gegeben wie "ja dann musst Du vorher noch dies und das Configurieren, oder so... aber keiner gibt ein wirkliches Beispiel, wie das dann genau auszusehen hat... Von mir hast Du 2 Links mit vielen Beispielen bekommen, andere haben dich auf Sprut hingewiesen, wieder andere auf das Datenblatt.
Und teilweise werden Fragen nur teilweise oder gar nicht beachtet....
Schade eigentlich.....Ein wenig mußt Du schon selbst dran arbeiten. Das Forum ist keine Hochschule, wo Du alles beigebracht bekommst. Grundkenntnisse mußt Du Dir selber aneignen. Die Initialisierung eines µC gehört mit zu den Grundkenntnissen, zumindest aber zu wissen, wo es im Datenblatt beschrieben ist.
Was das Datenblatt mit 178 Seiten betrifft, mußt Du es weder ausdrucken, noch auswendig lernen. Anfangs habe ich auch nur die Blockbilder betrachtet und bei den Texten nur so viel gelesen, wie keine Details beschrieben wurden. Es geht doch erst mal nur darum, sich einen Überblick zu verschaffen. Es sind viele Fragen abgehakt, wenn man weiß, wo was beschrieben wurde. Dann kann / muß man auch schon mal Details lesen.
stowoda stimme ich soweit zu, als daß auch in Hochsprachen assembler-ähnliche Befehle erforderlich sind, bei denen man die Struktur des Controllers kennen muß.
Also, so einen Mikro-Controller zieht man sich nicht mal so eben an einem gemütlichen Abend bei 1...3 Flaschen Bier rein, da studieren andere mehrere Semester für.
Wenn Du aber nur vorne was rein und hinten was raus haben möchtest, bist Du mit einem µC auf dem vollkommen falschen Weg.
Robbersoft
14.08.2007, 11:38
@Driona
was das wichtigste ist für dich, was für einen PIC du überhaupt brauchst. Das fängt schon damit an, was du realisieren möchtest, wieviele PortPins du brauchst, ob mit A/D Funktion oder nicht, ob Komparatoreingänge oder nicht, serielle RS232 Schnittstelle oder nicht, ICSP, Bluetooth usw.
Viele PIC´s haben sog. Multifunktionspins, d.h. ein PIN kann mehrere Funktionen haben. Deshalb müssen diese PIN´s vorher schon definiert werden, ob diese als A/D Wandler dienen sollen oder als normale I/O Pin´s. Du solltest dir schön schlüssig sein, welche Parameter dein PIC für deine Anwendung benötigt. Dieses Grundwissen ist eigentlich schon Pflicht.
Du wirst in "jedem" Forum über PIC´s immer wieder auf die gleichen Anfängerprobleme stoßen, weil sich viele gar nicht die Mühe machen, die Grundkenntnisse kurz mal einzuarbeiten. Immer wieder das selbe "PORTA funktioniert nicht richtig". Klar wenn dieser PORT als digitaleingang genutzt wird und die Flags analog gesetzt sind. Bei fast allen PIC´s ist der PORTA bei einem Reset oder Inbetriebnahme erstmal auf analog gesetzt.
Dazu brauchst du aber keine 178 Seiten lernen, sondern nur die Anschlußbelegung im Datenblatt überfliegen, wo welche Ports sind und wie ich diese Funktion an oder abschalte.
Zudem spielt der Preis auch eine große Rolle. Ich stoße immer wieder auf exotische PIC´s die wesentlich mehr leisten, trotzdem aber viel billiger sind. Dazu schmöker ich schonmal bei Farnell oder Reichelt und laß mir alle PIC´s anzeigen und deren Beschreibung.
Meine Favoriten sind zur Zeit der 16F690, 16F737 und 16F913.
Erst wenn du weißt, was du brauchst um dein Ding zu realisieren, dann kann es mit der Programmierung weitergehen.
Ich hoffe dir etwas behilflich gewesen zu sein.
Bis denne
RobberS
Wenn Du aber nur vorne was rein und hinten was raus haben möchtest, bist Du mit einem µC auf dem vollkommen falschen Weg.
Erst wenn du weißt, was du brauchst um dein Ding zu realisieren, dann kann es mit der Programmierung weitergehen.
Tja.... damit ist eigentlich das gesagt, was Knackpunkt der ganzen Geschichte ist.....
Ich meine aus all dem zu verstehen, daß ich beim PIC mir eine Schaltung zurecht plane, die Peripherie zusammensetze, und dann erst schaue, welchen PIC ich dafür überhaupt brauche....
Ich finde, das ist für einen Hobbyelektroniker, der heute was für seine Modell-Yacht programmiert, morgen einen kleinen fahrbaren Robbi, übermorgen ne kleine Zeitschaltung..... nicht so wirklich sinnvoll. Ist nur meine Meinung.
Wieviel Software steckt in einer SPS oder in der C-Control schon drin, damit eine Bedienung möglich ist ?
Daß ein Programm, daß direkt in Assembler programmiert wurde, wesentlich "sparsamer" und klarer ist, ist selbstverständlich.
Ich vergleiche das mal mit HTML im Editor programmiert und Frontpage.
Die Homepage mag optisch gleich aussehen, aber der Quelltext.... naja.
In meinem Anfangsbeitrag dachte ich bei der Erwähnung von Basic aber genau an eine Software, die ein paar einfache Befehle von mir, entsprechend zusammenbauen, daß es der PIC versteht. Wie eben Frontpage für Homepages.
Inzwischen ist klar, daß es sowas wohl nicht gibt.
Hat jemand Interesse an einem
PicStart Plus mit dem neuen Flash-Baustein
2 mal PIC18F252
5 mal PIC16F628A
3 mal PIC16F84A
1 mal PIC12F629
1 mal PIC12F675 ???
Lass Dich doch nicht so schnell entmutigen.
Darf ich fragen seit wann Du mit PIC µC zu tun hast?
Wenn ich mich an meine Anfänge erinnere habe ich es nicht leichter gehabt, doch ich bin froh die hürde genommen zu haben, denn im nachhinein ist der Einstieg in das Thema PIC ein Witz.
Ich will Dich natürlich nicht zwingen aber ein wenig Motivation brauchst, denk ich, jeder. Und erwarte nicht zuviel am Anfang dann wirst Du auch nicht so schnell enttäuscht.
kann stowoda nur zustimmen.
"Wenn Sie weiterhin das tun, was Sie bisher getan haben, werden Sie weiterhin das bekommen, was Sie bisher bekommen." haben.
G. Kayen
Quelle (http://www.nlp-spectrum.de/a-Zitate.html)
Ohne etwas Motivation tut sich da gar nichts. Aller Anfang ist bekanntlich schwer und mal ehrlich: wenn man einen Fehler eingebaut hat und diesen dann letztendlich selber findet, freut man sich doch mehr als ohne den Fehler gemacht zu haben.
Man soll ja aus seinen Fehlern lernen und genau das tut man bei der Assembler-Programmierung. Überall lauert schon die nächste Stolperfalle. Aber genau das bringt einen vorwärts, denn dann weis man in Zukunft, wo die Tücken sind und kann damit besser umgehen.
Man bekommt ja nicht alles auf dem Silbertablett präsentiert, sondern muss sich manche Dinge echt hart erarbeiten.
Nach einiger Zeit hat man sich damit einen großen Erfahrungs-Schatz gesammelt!
Jeder muss diese Erfahrungen machen, obwohl man sich manchmal wünscht, nicht unbedingt jeden Fehler nochmals zu machen, da sich schon viele andere daran die Zähne ausgebissen haben!
ohne Einsatz kein Gewinn
Auch ich hab mir das erarbeiten müssen, man bekommt nichts geschenkt ^^ Arbeite seit ca 15 Monaten mit den PICs und programmiere jetzt schon den 3. Compiler! (Absatz soll nicht selbstverherrlichend wirken)
Mit freundlichen Grüßen
BMS (16)
kalledom
14.08.2007, 22:47
Alle möglichen Fehler wurden schon mindestens ein mal gemacht,
nur noch nicht von Jedem :-)
Robbersoft
14.08.2007, 22:59
@Driona
wenn du nur Digitaltechnik machen möchtest mit dem PIC, gibt es auch eine programmierfreie Oberfläche. Darin kannst du aber auch ASM Strukturen einsetzen. Schau mal im Netz nach dem Programm PARSIC.
Du setzt dir quasi deine UND, ODER, EXOR, MUX, TEILER, TABELLEN Timer etc als grafische Bausteine im PIC zusammen. Ist evtl. als Einstieg auch mal erwähnenswert.
Komplexe interne Strukturen zu realisieren ist aber etwas schwieriger oder zum Teil nicht realisierbar. Zudem hast du auch einen SIMULATOR integriert und kannst sehen was abgeht.
Für Newbies allemal in Ordnung. Hab auch mal experimentiert... Leider nach einem harten Tag an die grenze gestossen *gggg*
Robbersoft
14.08.2007, 23:08
Nochmal @Driona
Es ist auch so wie du das schon erwähnt hast. Worauf du nur achten mußt, wie die Flagbits zu setzen sind. Danach kannst du mit IF xx then YY ELSE ZZ programmieren.
In den Flags setzt du lediglich ob IN, OUT oder A/D, Kopierschutz, Oszillator int. oder ext.
Das sind 3 oder 4 Zeilen und dann kannste auch schon loslegen. Das ist nicht so schwer. Ich hatte mir auch die Hände überm Kopf gehalten als ich genau wie du mit den ersten Problemen auseinandersetzte.
Die Flags sind zum größten Teil bei vielen PIC´s immer gleich !
Also nicht gleich die Flinte mit Korn abfüllen ...
Experimentier ein paar mal und falls du nicht weiterkommst gibts ja das FORUM.
Hier werden Sie geholfen.
Also ran an den Speck *schmatz mjam*
Hier noch ein Link http://www.the-starbearer.de/Praxis/Microkontrollerpraxis/PIC/PIC%20%DCbersicht/16F628.htm
JottSchi
15.08.2007, 21:49
Hoi,
ich habe mir eben die Beiträge durchgelesen. Bin selbst Anfänger in PIC-Programmierung. Ich denke stowoda hat Recht, wenn er dir am 7.08. rät, mal öfter in das Datenblatt zu schauen. Meiner kurzen Erfahrung nach kann es auch bei Assembler gar nicht anders gehen. Die Sprache ist so dicht an der Hardware, dass du ohne die Informationen aus dem Datenblatt gar nicht klar kommen kannst. Dumm ist nur, dass es die nur in Englisch gibt. Aber ohne das geht es in der modernen Elektronik kaum noch. Zusätzlich habe ich mich bei dem schon erwähnten Sprut schlau gemacht. Das erhellt dann einige Sachen, die im Datenblatt noch unklar blieben.
Interessant ist auch diese Seite http://www.winpicprog.co.uk/pic_tutorial.htm
weil es dort eine ganze Reihe erläuterter Beispiele gibt. So kann man sich gut klar machen, was die im Datenblatt erwähnten Befehle und Register für eine Funktion haben.
Aber nur aus fertigen Programmen Assembler für ein eigenes Programm zu stricken, wird wohl nicht so gut gehen, wobei nichts dagegen zu sagen ist, wenn man sich fertige Routinen zu Nutze macht. Man muss das Rad nicht immer wieder neu erfinden. Aber auch das geht nur, wenn man weiß, was man da tut.
Gruß Jörg!
kalledom
16.08.2007, 10:58
Ich habe da noch eine Fehler-Checkliste für PICs: http://www.domnick-elektronik.de/piccheck.htm
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.