Forum: Mikrocontroller und Digitale Elektronik PICKIT 3 Demo Board (PIC18F45K20) - Build failed


von scripter (Gast)


Lesenswert?

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.

von Lehrmann M. (ubimbo)


Lesenswert?

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.

von scripter (Gast)


Lesenswert?

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

von scripter (Gast)


Angehängte Dateien:

Lesenswert?

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.

von scripter (Gast)


Lesenswert?

Weiss das niemand?

von usuru (Gast)


Lesenswert?

folgender Code compiliert bei mir fehlerfrei
1
#include<p18f45k20.inc>
2
3
  CONFIG WDTEN = OFF    ; disable watchdog timer
4
  CONFIG MCLRE = ON     ; MCLEAR Pin on
5
  CONFIG DEBUG = OFF    ; Enable Debug Mode
6
  CONFIG LVP = OFF      ; Low-Voltage programming disabled
7
  CONFIG FOSC = INTIO67 ; Internal oscillator, port function on RA6 and RA7
8
9
Delay1 res 1            ; reserve 1 byte for the variable Delay1
10
Delay2 res 1            ; reserve 1 byte for the variable Delay2
11
12
  org 0                 ; start code at 0
13
  
14
Start
15
  CLRF PORTD
16
  CLRF TRISD
17
  CLRF Delay1
18
  CLRF Delay2
19
MainLoop
20
  BTG PORTD, RD1         ; Toggle PORT D PIN 1 (20)
21
Delay
22
  DECFSZ Delay1, F       ; Decrement Delay in F
23
  GOTO Delay
24
  GOTO MainLoop
25
  end

von John (Gast)


Lesenswert?

Hallo Patrick,
ich glaube die Zeile
1
    CONFIG      BOR = OFF            ; brown out detect off
muss so sein:
1
    CONFIG      BOREN = OFF            ; brown out detect off

Gruß
John

von John (Gast)


Lesenswert?

und Watchdog ist
1
    CONFIG      WDTEN = OFF            ; watchdog off

von John (Gast)


Lesenswert?

Ich hab noch zwei Punkte gefunden:
Im angehängten Listing ist noch der falsche Prozessor definiert.
Richtig ist:
1
       LIST P=PIC18F45K20             ;der Typ des Prozessors

und der Oszillator wird so definiert:
1
       CONFIG      FOSC = HS          ; HS 20 MHz

Ich hoffe das war alles.

Gruß
John

von scripter (Gast)


Lesenswert?

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.

von scripter (Gast)


Lesenswert?

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

von John (Gast)


Lesenswert?

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

von scripter (Gast)


Lesenswert?

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.

von Lehrmann M. (ubimbo)


Lesenswert?

Nimm mal den Debugmodus in MPLAB raus.

von Lehrmann M. (ubimbo)


Lesenswert?

also Release!

von scripter (Gast)


Lesenswert?

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...:-?

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

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

von scripter (Gast)


Lesenswert?

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:
1
Loop2
2
  BTG PORTD, RD4
3
  BTG PORTD, RD5         ; Toggle PORT D PIN 1 (20)
4
  GOTO Delay
5
Loop3
6
  BTG PORTD, RD6         ; Toggle PORT D PIN 1 (20)
7
  BTG PORTD, RD7
8
Delay
9
  DECFSZ Delay1, F       ; Decrement Delay in F
10
  GOTO Delay
11
  DECFSZ Delay2, A       ; Decrement Delay in F
12
  GOTO MainLoop
13
  DECFSZ Delay3, A
14
  GOTO Loop2
15
  GOTO Loop3
16
  end

von ... (Gast)


Lesenswert?

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!

von scripter (Gast)


Lesenswert?

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.

von scripter (Gast)


Lesenswert?

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?

von usuru (Gast)


Lesenswert?

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.

von scripter (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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

von eProfi (Gast)


Lesenswert?

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

von usuru (Gast)


Lesenswert?

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

von scripter (Gast)


Lesenswert?

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

von scripter (Gast)


Angehängte Dateien:

Lesenswert?

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

von scripter (Gast)


Lesenswert?

Das Thema ist immer noch aktuell! Weiss das niemand?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.