Hallo
Nach langer Suche nach einem guten Democode bin ich auf
http://www.pic18f.com/tutorial/2007/12/06/tutorial-2-hello-world/
ein gutes Tutorial gestossen. Leider sind die von Microchip angebotenen
Codes entweder in C oder für Pic16.
Habe nun den Code angepasst, trotzdem bekomme ich noch Fehler beim
compiling, bei denen ich nicht weiss was ich anpassen sollte.
Assembler-Code:
#include<p18f45k20.inc>
; This header file defines configurations, registers, and other
useful; bits of information for the PIC18F4550 microcontroller. These
names
; are taken to match the data sheets as closely as possible.
CONFIG WDT=OFF; disable watchdog timer
CONFIG MCLRE = ON; MCLEAR Pin on
CONFIG DEBUG = ON; Enable Debug Mode
CONFIG LVP = OFF; Low-Voltage programming disabled (necessary for
debugging)
CONFIG FOSC = INTOSCIO_EC;Internal oscillator, port function on RA6
org 0; start code at 0
Delay1 res 1 ;reserve 1 byte for the variable Delay1
Delay2 res 1 ;reserve 1 byte for the variable Delay2
Start:
CLRF PORTD
CLRF TRISD
CLRF Delay1
CLRF Delay2
MainLoop:
BTG PORTD,RD1 ;Toggle PORT D PIN 1 (20)
Delay:
DECFSZ Delay1,1 ;Decrement Delay1 by 1, skip next instruction if
Delay1 is 0
GOTO Delay DECFSZ Delay2,1
GOTO Delay
GOTO MainLoop
end
Build-Output:
----------------------------------------------------------------------
Debug build of project `C:\Users\patrick\Microcontroller\PIC
Projects\44-Pin Demo Board\Projects\test\test.mcp' started.
Language tool versions: MPASMWIN.exe v5.41, mplink.exe v4.39, mplib.exe
v4.39
Preprocessor symbol `__DEBUG' is defined.
Target debug platform is `__MPLAB_DEBUGGER_PK3=1'.
Debug platform options are: `__ICD2RAM=1'.
Sat Jun 11 13:51:26 2011
----------------------------------------------------------------------
Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Users\patrick\Microcontroller\PIC
Projects\44-Pin Demo Board\Projects\test\test.mcs".
Clean: Done.
Executing: "C:\Program Files (x86)\Microchip\MPASM Suite\MPASMWIN.exe"
/q /p18F45K20 "Untitled.asm" /l"Untitled.lst" /e"Untitled.err"
/o"Untitled.o" /d__DEBUG=1 /d__MPLAB_DEBUGGER_PK3=1
Error[176] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN DEMO
BOARD\PROJECTS\TEST\UNTITLED.ASM 4 : CONFIG Directive Error: (setting
"WDTError[176] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN
DEMO BOARD\PROJECTS\TEST\UNTITLED.ASM 8 : CONFIG Directive Error:
(value "INTOSCIO_ECWarning[231] C:\USERS\PATRICK\MICROCONTROLLER\PIC
PROJECTS\44-PIN DEMO BOARD\PROJECTS\TEST\UNTITLED.ASM 10 : No memory has
been reserved by this instruction
Warning[231] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN DEMO
BOARD\PROJECTS\TEST\UNTITLED.ASM 11 : No memory has been reserved by
this instruction
Error[113] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN DEMO
BOARD\PROJECTS\TEST\UNTITLED.ASM 21 : Symbol not previously defined
(DECFSZ)
Error[112] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN DEMO
BOARD\PROJECTS\TEST\UNTITLED.ASM 21 : Missing operator
Warning[205] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN DEMO
BOARD\PROJECTS\TEST\UNTITLED.ASM 24 : Found directive in column 1. (end)
Halting build on first failure as requested.
----------------------------------------------------------------------
Debug build of project `C:\Users\patrick\Microcontroller\PIC
Projects\44-Pin Demo Board\Projects\test\test.mcp' failed.
Language tool versions: MPASMWIN.exe v5.41, mplink.exe v4.39, mplib.exe
v4.39
Preprocessor symbol `__DEBUG' is defined.
Target debug platform is `__MPLAB_DEBUGGER_PK3=1'.
Debug platform options are: `__ICD2RAM=1'.
Sat Jun 11 13:51:28 2011
----------------------------------------------------------------------
BUILD FAILED
Noch zwei Fragen:
- Wann muss ich den Debugger, wann den Programmer verwenden?
- Wofür ist die Auswahl im Project Manager (Release/Debug?
Vielen Dank für jede Hilfe.
Servus,
in den Conigbits mach mal das Debug aus:
CONFIG DEBUG = OFF;
scripter schrieb:> Leider sind die von Microchip angebotenen> Codes entweder in C oder für Pic16.
www.sprut.de ist der Papst unter den Assemblern.
scripter schrieb:> - Wann muss ich den Debugger, wann den Programmer verwenden?
Debugging ist die Fehlersuche im Programm. Dazu setzt man meist sog.
Breakpoints (Haltepunkte) bei denen der PIC die Programmausführung
einfriert und man ganz in Ruhe alle Register im PIC auslesen kann um
Fehlern auf die Schliche zu kommen. Danach kann man sagen, so jetzt
weiter im Programm, bis zum nächsten Breaktpoint.
scripter schrieb:> - Wofür ist die Auswahl im Project Manager (Release/Debug?
Eben um diesen Modus auch in MPLAB zu aktivieren. Manche PICs laufen im
Debugmodus nicht los, wenn Sie nicht mit dem PicKit verbunden sind.
CONFIG DEBUG = OFF; habe ich gemacht, was aber den Fehler nicht aufhebt.
Woran könnten die Fehler liegen? Ich schhaue mal auf sprut.de,
vielleicht finde ich da ein besserer Code. Merci
Habe nun einen AssemblerCode auf Sprut gefunden, allerdings nicht für
den exakt gleichen Typ. Ich habe #include habe ich angepasst, nun habe
ich nur noch einen Fehler, mit dem ich leider wirklich nichts anfangen
kann. Der Code findet sich hier:
http://www.sprut.de/electronic/pic/8bit/18f/programm/lauflicht8720/lauflicht8720.htm
oder als Anhang, da er recht lange ist.
Error:
Error[176] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN DEMO
BOARD\PROJECTS\TEST\UNTITLED.ASM 29 : CONFIG Directive Error: (setting
"BORError[176] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN
DEMO BOARD\PROJECTS\TEST\UNTITLED.ASM 30 : CONFIG Directive Error:
(setting "WDTHalting build on first failure as requested.
YES, "mein" erster funktionierender Code... Die LED brennt, der Code von
usuru funktioniert. Der Code von sprut funktioniert leider trotz der
Anpassungen nicht (build failed) Error:
Error[176] C:\USERS\PATRICK\MICROCONTROLLER\PIC PROJECTS\44-PIN DEMO
BOARD\PROJECTS\TEST\UNTITLED.ASM 28 : CONFIG Directive Error: (setting
"OSCHalting build on first failure as requested.
Vielen Dank für die Hilfe, nun habe ich eine Basis worauf ich aufbauen
kann.
Der zweite Code compiliert jetzt auch, nur funktioniert läuft er nicht
auf dem Board.
PK3Err0040: The target device is not ready for debugging.
Please check your configuration bit settings and program
the device before proceeding.
Obwohl ich noch
1
CONFIG DEBUG = ON ; Enable Debug Mode
hinzufügte. Vielleicht funktioniert auch er irgendwann mal :-)
Noch was: Ich dachte man kann den Programmspeicher nur eine gewisse
Anzahl beschreiben. Wieviel ist das?
Gruss und Vielen Dank
Patrick
Lehrmann Michael schrieb:> mach mal das Debug aus:> CONFIG DEBUG = OFF;scripter schrieb:> Noch was: Ich dachte man kann den Programmspeicher nur eine gewisse> Anzahl beschreiben. Wieviel ist das?
Laut Datenblatt 10000 mal.
Gruß
John
Da kann ich schon ein paar mal programmieren...
Egal ob mit DEBUG = ON oder Off oder überhaupt nichts, er sagt nur Check
Configuration BITs,
PK3Err0040: The target device is not ready for debugging.
Please check your configuration bit settings and program
the device before proceeding.
Trotzdem Danke.
Das hilft leider auch nichts. Habs auch schon über den Programmer (oder
ist das das gleiche?) probiert, ist mir ein Rätsel, warum das nicht
funktioniert...:-?
wenn debuggen willst, musst du als Debugger deinen entsprechenden
Programmer auswählen, dann einen DEBUG Release compilieren, den dann
manuell auf den PIC brennen, und dann kannste starten zu debuggen.
Hab mal versucht das mim Screenshot zu zeigen. Ein hoch auf
Touchpad+Paint :D
Habe noch eine Frage:
Verstehe trotz Recherche und Ausprobierens den Befehl DECFSZ nicht
vollständig.
DECFSZ Delay1, F ; Decrement Delay in F
was passiert hier mit F ?
Wird hier das Byte für Delay F wieder auf 255 bzw. F gesetzt?
Demnach sollte das Licht ja schneller blinken, wenn ich statt F z.B. D
hinschreibe bei Delay2. Habe nämlich den Code erweitert:
Lies Dir mal das Datenblatt durch, da ist der DECFSZ Befehl (und
natürlich auch die anederen erklärt. DATENBLATT LESEN BILDET !!!
DECFSZ var, [F/W] Decrement var -1, skipt next if zero
Vermindere die Vaiable var um 1 (eins), überspringe den nächsten Befehl,
wenn das Ergebnis null ist.
Wenn nach dem Komma F steht, dann wird der Wert nach dem Decrement
wieder in die Variable geschrieben (F steht für File); wenn da W steht,
dann wird der Wert nach dem Decrement in das W-Register geschrieben und
die Variable bleibt, wie sie vorher war. Anderes als F oder W ist
falsch.
Es ist NICHT so, wie Du oben vemutest, dass die Zahl nach dem Komma der
Wert ist, um den die Variable vermindert wird!
Das Datenblatt habe ich mir natürlich angeschaut
(http://ww1.microchip.com/downloads/en/DeviceDoc/41303G.pdf Seite 335)
es wäre auch nicht so, dass ich das englisch nicht verstehen würde. Was
mir aber in meinem Code nicht klar ist, ist wie der Wert von Delay
wieder runtergezählt werden kann. Es gibt ja im MainLoop oder Loop1
keine Anweisung, die Delay einen Wert zuweisen würde. Wie kommt die
Schleife wieder erneut in Gang? Vom Datenblatt werde ich dazu leider
nicht schlau.
Was mir auch nicht klar ist, ist der Befehl res, also den Speicherden
ich für eine Variable reservieren will. Ist die nachfolgende Anweisung
(Zahl) immer in Byte?
Der Wert von delay ist bei Dir zufällig. Wenn er unter null gerät, geht
es bei 255 (0xff) wieder weiter. Kannst Du mit dem Debugger "MPLAB Sim"
ausprobieren.
Und wie kann ich Delay einen Wert zuweisen? Im Datasheet konnte ich
nichts finden, was ich finden konnte war EQU allerdings bei einem
Beispiel für PIC16.
Vielen Dank für die Hilfe.
scripter schrieb:> Das Datenblatt habe ich mir natürlich angeschaut
Wirklich? MicroChips Datenblätter sind eigentlich vorbildlich. Da steht
auch haarklein beschrieben, was denn ein jeder Maschinenbefehl so macht.
>Verstehe trotz Recherche und Ausprobierens den Befehl DECFSZ nicht>vollständig.> DECFSZ Delay1, F ; Decrement Delay in F>was passiert hier mit F ?
DECFSZ = Decrement File and Skip next instruction if result is Zero,
write result into File
Eigentlich ist die CPU-Architektur der PIC's doch absolut leicht zu
verstehen.
Das andere, was dir Probleme bereitet, sind Direktiven, also Anweisungen
an den Assembler, die per se erstmal nicht zu einem Maschinenbefehl
führen.
Mich störet da auch einiges, weswegen ich mir vor Jahren meinen eigenen
Assembler geschrieben habe. Aber 'RES' wird wohl 'Reserviere' heißen und
das sollte sich auf die Bytes im RAM beziehen. Du weißt sicherlich, daß
beim PIC der Code und die Daten/Register/Ports zwei unterschiedliche
Adreßräume darstellen. Also (mal SYMBOLISCH geschrieben) etwa so:
SEGMENT RAM ; ins Datensegment wechseln
ORG 0 ; Zuweisungszähler auf 0 setzen
STATUS: RES 1 ; 1 Byte auf Adresse 0 im Datensegment deklarieren
...
ORG 20h
MeineErsteVariable: RES 1
MeinZaehler: RES 1
MeinDatenFeld: RES 16
SEGMENT CODE ; ins Codesegment wechseln
; Kaltstart ab 0
ORG 0
GOTO Main
; Interrupt ab 4
ORG 4
...
RETFIE
Main: ; ab hier: na eben dein Programm
MOVF MeineErsteVariable,F
MOVWF MeinZaehler
DECFSZ MeinZaehler,F
GOTO ErIstNichtNull
ErIstNull:
...
ErIstNichtNull:
...
W.S.
END
Wenn kein neuer Wert hineingeladen wurde, wird der alte verwendet.
Nach Abschluss der Warteschleife steht 00 drin, nach dem ersten
Durchlauf FF, was ungleich 00 ist.
Wenn Du die Wartedauer verändern willst, musst Du beim Start der
Warteschleife einmalig in die äußere Variable einen Wert kleiner gleich
FF reinschreiben.
Also etwa so (ungetestet):
Loop2
BTG PORTD, RD4
BTG PORTD, RD5 ; Toggle PORT D PIN 1 (20)
CALL Delay
BTG PORTD, RD6 ; Toggle PORT D PIN 1 (20)
BTG PORTD, RD7
CALL Delay
GOTO LOOP2
Delay
MOVLW 30,W ;Dauer der Warteschleife
MOVWF Delay3
Delay1
DECFSZ Delay1, F ; Decrement Delay in F
GOTO Delay1
DECFSZ Delay2, F ; Decrement Delay in F
GOTO Delay1
DECFSZ Delay3, F
GOTO Delay1
RETLW 0
Die Definition eine Speicherplatzes für Variable geht üblicherweise über
die EQU-Anweisung oder über cblock, wenn man mehrere hintereinader
liegende Speicherstellen reservieren will
Delay EQU 0x070 ; Die RAM-Adresse 0x070 wird für Delay reserviert
oder
cblock 0x070
Delay ; Die RAM-Adresse 0x070 wird für Delay reserviert
wloop1 ; 0x071
wloop2 ; 0x072
wloop3 ; 0x073
endc
> Und wie kann ich Delay einen Wert zuweisen?
MOVLW 0x13 ; Wert 0x13 = Dezimal 19 nach W
MOVWF Delay ; W nach Delay
oder
MOVLW D'19'
MOVWF Delay
Lies Dir erst mal die Seiten bei www. sprut.de durch, dann weisst Du
mehr über PICs
Vielen Dank für die zahlreichen nützlichen Antworten. Ich werde mal
versuchen, ob ich damit was herrichten kann. Ich glaube ich habe das mit
dem W & F Register nicht ganz verstanden. Werde auch mal sprut.de
anschauen, schade dass dort so ziemlich viel mit PIC16 gemacht ist (und
der PIC18F Code bei mir aus unbekannten Gründen nicht funktioniert
(Device is not ready for debugging...).
Gruss
Patrick
Hallo habe jetzt mal so ein Code geschrieben, der die LED hell macht und
dann langsam dunkel. Soweit funktioniert das einigermassen, nur dass die
dunklen kürzer angezeigt werden. Evtl. müsste ich hier ein zusätzlicher
Loop einbauen. Ich frage mich, wie ich nun jedes mal eine andere LED
anzünden kann. Mit rlncf geht ja das nicht, da keine Lampe brennt. Gibt
es eine Möglichkeit ohne extra eine Variable (mit 1Byte, wobei 3 bit
reichen würden) mit einigen if verzweigungen das zu lösen? Gruss
Patrick