Forum: Mikrocontroller und Digitale Elektronik PIC16F688 - Probleme beim BUILD


von Jürgen S. (schmiddii)


Lesenswert?

Hallo Leute bin neu in der "PIC Programmierung" und bin gerade dabei 
mich reinzuarbeiten.

Natürlich bin ich da auf "Sprut" gestoßen , doch einige Fragen bleiben 
offen, bzw. ein Problem bei der Programmierung.
Dafür nehme ich MPLAB mit dem Programmer PICSTART PLUS.

Nun habe ich ein Problem mit dem Programm, ich kann einfach bei dem 
PIC16F688 die Ports nicht umstellen , ich will einfach überall digitale 
Ausgänge haben.Ich habe schon mehrere Dinge probiert, doch MPLAB meckert 
immer und immer wieder beim BUILD.

Hier das Programm :
1
    list p=16f688
2
;***********************************************************************
3
;*      Pinbelegung
4
;*      ---------------------------------- 
5
;*      RA:     0 > LED mit 1 kOhm Vorwiderstand
6
;*              1 -
7
;*              2 -
8
;*              3 -
9
;* 
10
;***********************************************************************
11
;
12
;
13
; Blinklicht
14
;
15
; Prozessor 16F688 
16
;
17
; Prozessor-Takt  4 MHz intern
18
;
19
;
20
;***********************************************************************
21
; Includedatei für den 16F688 einbinden
22
23
        #include <P16F688.inc> 
24
; Configuration festlegen:
25
;       kein codeprotection
26
;       kein WDT-Timer
27
;       kein Reset-Pin 
28
    __Config _CP_OFF & _WDT_OFF & _MCLRE_OFF
29
30
;***********************************************************************
31
; Variablen festlegen ab 10h
32
33
        cblock  0x10
34
        loops
35
        loops2
36
        endc
37
38
        #define LED     PORTA,0
39
 
40
;*******************************************************
41
Init
42
    movlw   7
43
    movwf   19h
44
    clrf    PORTA
45
    movlw   05h
46
    bsf     STATUS,RP0
47
    movlw   B'00000000'
48
    movwf   85h
49
    bcf     STATUS,RP0
50
        clrf    PORTA           ; alle LEDs ausschalten
51
52
;*******************************************************
53
        org     0005h 
54
55
Mainloop
56
        bsf     LED             ; LED an
57
        call    WAIT            ; 250 ms warten
58
        bcf     LED             ; LED aus
59
        call    WAIT            ; 250 ms warten
60
        goto    Mainloop
61
62
;*******************************************************
63
; Warteschleife für 250 ms
64
WAIT
65
        movlw   .250
66
        movwf   loops
67
68
; die top-Schleife verzögert 1 ms = 250 x 4µs
69
top     movlw   .250
70
        movwf   loops2
71
; die top2-Schleife verzögert 4 Takte = 4 µs
72
top2    nop
73
        decfsz  loops2, F 
74
        goto    top2
75
        decfsz  loops, F
76
        goto    top
77
        retlw   .0
78
79
        end
-------------------------

und hier dann die / der Fehler dazu :/
1
----------------------------------------------------------------------
2
Release build of project `C:\Users\AzubiEL\Documents\Blinklicht\blinklicht.mcp' started.
3
Language tool versions: MPASMWIN.exe v5.47, mplink.exe v4.45, mplib.exe v4.45
4
Fri Jan 11 11:56:33 2013
5
----------------------------------------------------------------------
6
Clean: Deleting intermediary and output files.
7
Clean: Done.
8
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F688 "blinklicht_prog.asm" /l"blinklicht_prog.lst" /e"blinklicht_prog.err" /o"blinklicht_prog.o"
9
Error[150]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 41 : Labels must be defined in a code or data section when making an object file
10
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 42 : Executable code and data must be defined in an appropriate section
11
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 43 : Executable code and data must be defined in an appropriate section
12
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 44 : Executable code and data must be defined in an appropriate section
13
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 45 : Executable code and data must be defined in an appropriate section
14
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 46 : Executable code and data must be defined in an appropriate section
15
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 47 : Executable code and data must be defined in an appropriate section
16
Message[302] C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 48 : Register in operand not in bank 0.  Ensure that bank bits are correct.
17
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 48 : Executable code and data must be defined in an appropriate section
18
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 49 : Executable code and data must be defined in an appropriate section
19
Error[152]   C:\USERS\AZUBIEL\DOCUMENTS\BLINKLICHT\BLINKLICHT_PROG.ASM 50 : Executable code and data must be defined in an appropriate section
20
Halting build on first failure as requested.
21
----------------------------------------------------------------------
22
Release build of project `C:\Users\AzubiEL\Documents\Blinklicht\blinklicht.mcp' failed.
23
Language tool versions: MPASMWIN.exe v5.47, mplink.exe v4.45, mplib.exe v4.45
24
Fri Jan 11 11:56:34 2013
25
----------------------------------------------------------------------
26
BUILD FAILED


Wäre nett wenn mir einer helfen könnte.

von Ottmar K. (wil1)


Lesenswert?

Hallo

Hallo

        #define LED     PORTA,0

;NACHSTEHENDES EINFÜGEN!!!!
;*******************************************************
  ORG    0x000      ; processor reset vector
    goto  Init    ; go to beginning of program
;*******************************************************

mit "ORG 0x000" sagtst Du dem PIC ab welcher Adresse er beim Reset 
(Power on Reset) sein Programm findet.

Was willst Du mit " org     0005h " bezwecken? Lass' es einfach weg.

mfG Ottmar

von Jürgen S. (schmiddii)


Lesenswert?

Da bin ich durch das Datenblatt draufgekommen , da steht das 0000 reset 
ist und das Programm ab 0005h steht.

von Ottmar K. (wil1)


Lesenswert?

Hallo Jürgen
solange Du nicht sattelfest bist, gibt es eine einfache Möglichkeit 
gefährliche Klippen zu umschiffen: In MPLAB ist zu jedem PIC ein 
Beispiel.ASM-File vorhanden. Das kannst Du dann nach Deinem Bedarf 
ändern bzw. erweitern. Diese Dateien findest Du in diesem Pfad:
"MPLAB\MPASM Suite\Template\Code\*TEMP.ASM"

Wenn Du MPLAB verwendest kannst Du viele Fehler mittels der dort 
vorhandenen Tools finden bzw. vermeiden. Geh doch einfach mal die 
Untermenüs des Hauptmenue "ViewS" durch"

Wenn Du "sprut" erwähnst, solltest Du einfach mal einige seiner 
Lernbeispiele und die vielen Informationen zu Asssembler, 
PIC-Achictektur, programmstruktur usw durcharbeiten.

mfG Ottmar

von Jürgen S. (schmiddii)


Lesenswert?

Oh danke , dass es da bei jedem PIC etwas von MPLAB gibt wusste ich gar 
nicht :), das werde ich mir auf jeden Fall mal anschauen.

Genau , bei Sprut bin ich ja gerade bei den Lernbeispielen dabei, muss 
ich jetzt halt nur auf mein PIC abändern zusätzlich will ich halt bei 
RA0 / PORTA die ausgabe haben.

& dann hat er mir diese Fehlermeldungen ausgespuckt.
Ich habe daraufhin 3 Tage rumprobiert , mit dem Fehlercode bei Google 
gesucht ,aber nicht die Lösung gefunden.

Ich werde deinen Lösungsansatz nachher gleich mal ausprobieren !

Vielen Dank schonmal Ottmar, ich werde mich wieder melden !

Edit: gleich ausprobiert & ich bin begeistert ! ES FUNKTIONIERT !

von Jürgen S. (schmiddii)


Lesenswert?

Habe leider noch ein Problem,
ich bekomme den Internen Oscillator einfach nicht ans laufen.
Benötige einen 4MHZ Blinklichttakt.

Hier nochmal der akutelle Code :
(So leuchtet das Licht auf der Platine einfach nur)
1
    list p=16f688
2
;***********************************************************************
3
;*      Pinbelegung
4
;*      ---------------------------------- 
5
;*      RA:     0 > LED mit 1 kOhm Vorwiderstand
6
;*              1 -
7
;*              2 -
8
;*              3 -
9
;* 
10
;***********************************************************************
11
;
12
;
13
; Blinklicht
14
;
15
; Prozessor 16F688 
16
;
17
; Prozessor-Takt  4 MHz intern
18
;
19
;
20
;***********************************************************************
21
; Includedatei für den 16F688 einbinden
22
23
        #include <P16F688.inc> 
24
; Configuration festlegen:
25
;       kein codeprotection
26
;       kein WDT-Timer
27
;       kein Reset-Pin 
28
    __Config _CP_OFF & _WDT_OFF & _MCLRE_OFF & _FOSC_INTOSC
29
30
  ORG    0x000         ; processor reset vector
31
  movwf  OSCCON
32
  goto  Init        ; go to beginning of program
33
34
;***********************************************************************
35
; Variablen festlegen ab 10h
36
37
        cblock  0x10
38
        loops
39
        loops2
40
        endc
41
42
        #define LED     PORTA,0
43
 
44
;*******************************************************
45
Init
46
47
   ; Einstellungen für den internen Oszillator vornehmen
48
    bsf   STATUS,5    ; Bank 1 anwählen um in OSCCON zu schreiben
49
    bcf   STATUS,6
50
    bcf   OSCCON,4    ; Damit wurde ein interner Takt von 4 MHZ ausgewähl
51
    bsf   OSCCON,5    ; Ein Takt beträgt somit 1us
52
    bsf   OSCCON,6    ; Nur nötig wenn interner Oszillator genutzt wird
53
    movlw   7
54
    movwf   ADON
55
    clrf    PORTA
56
    movlw   05h
57
    bsf     STATUS,RP0
58
    movlw   B'00000000'
59
    movwf   TRISA
60
    bcf     STATUS,RP0
61
        clrf    PORTA           ; alle LEDs ausschalten
62
63
;*******************************************************
64
65
Mainloop
66
        bsf     LED             ; LED an
67
        call    WAIT            ; 250 ms warten
68
        bcf     LED             ; LED aus
69
        call    WAIT            ; 250 ms warten
70
        goto    Mainloop
71
72
;*******************************************************
73
; Warteschleife für 250 ms
74
WAIT
75
        movlw   .250
76
        movwf   loops
77
78
; die top-Schleife verzögert 1 ms = 250 x 4µs
79
top     movlw   .250
80
        movwf   loops2
81
; die top2-Schleife verzögert 4 Takte = 4 µs
82
top2    nop
83
        decfsz  loops2, F 
84
        goto    top2
85
        decfsz  loops, F
86
        goto    top
87
        retlw   .0
88
89
        end

von Chris B. (dekatz)


Lesenswert?

"cblock 0x10" überschreibt einige SFR, richtig wäre "cblock 0x20".

Was macht das hier????
movlw   7
movwf   ADON
(ADON ist in der .inc für der F688 mit H'0000 definiert, also wird der 
Wert 7 in die SFR-Adresse 0 geschrieben.....sinnlos)

?????????
movlw   05h
bsf     STATUS,RP0
movlw   B'00000000'
movwf   TRISA
?????????
Die Initialierung für PORTA solle man sorgfältig durchführen da nach 
einem RESET der PORTA als Analog-Port (bzw. Teile davon) definiert ist.
Am besten lt. Datenblatt so:
BANKSEL PORTA ;
CLRF PORTA ;Init PORTA
MOVLW 07h ;Set RA<2:0> to
MOVWF CMCON0 ;digital I/O
BANKSEL ANSEL ;
CLRF ANSEL ;digital I/O
BANKSEL TRISA
CLRF TRISA

Und die WAIT-Routine würde ich mit "BANKSEL loops" beginnen - falls mal 
mit einer anderen Bankeinstellung diese aufgerufen wird!

Dann sollte es theoretisch "Blinken".

btw: würde ich mir gelegentlich das Datenblatt zu Gemüte führen und 
nicht nur mit Copy & Paste was zusammenbasteln ;-)

von Jürgen S. (schmiddii)


Lesenswert?

Ich schaue mir das Datenblatt schon als mal an , bin aber noch nicht 
richtig durch das ganze durchgestiegen.

Dieses ADON war eigentlich was für Digitalausgänge , mir kams auch 
komisch vor, deshalb musste ich hier ja mal fragen ,damit ich nicht von 
Grund auf was falsches lerne.

Wie du schon richtig siehst möchte ich natürlich Digitalausgänge 
erhalten.

Wie müsste ich das jetzt beispielsweise anstellen ,wenn ich alle PORTA 
auf Digitale Ausgänge umstellen möchte ?
Das ist etwas , bei dem ich im Datenblatt noch nicht durchsteigen kann 
richtig.

Trotzdem schonmal Vielen Dank für die bisherige Hilfe !

Grüße

von Chris B. (dekatz)


Lesenswert?

Steht schon oben --- das aus dem Datenblatt in Großschrift!

von Jürgen S. (schmiddii)


Lesenswert?

Hab jetzt mittlerweile diesen Code , HEX lässt sich auch erstellen, aber 
jetzt blinkt oder tut gar nichts auf der Platine.
1
    list p=16f688
2
;***********************************************************************
3
;*      Pinbelegung
4
;*      ---------------------------------- 
5
;*      RA:     0 > LED mit 1 kOhm Vorwiderstand
6
;*              1 -
7
;*              2 -
8
;*              3 -
9
;* 
10
;***********************************************************************
11
;
12
;
13
; Blinklicht
14
;
15
; Prozessor 16F688 
16
;
17
; Prozessor-Takt  4 MHz intern
18
;
19
;
20
;***********************************************************************
21
; Includedatei für den 16F688 einbinden
22
23
        #include <P16F688.inc> 
24
; Configuration festlegen:
25
;       kein codeprotection
26
;       kein WDT-Timer
27
;       kein Reset-Pin 
28
    __Config _CP_OFF & _WDT_OFF & _MCLRE_OFF & _FOSC_INTOSCIO
29
30
  ORG    0x000         ; processor reset vector
31
  movwf  OSCCON
32
  goto  Init        ; go to beginning of program
33
34
;***********************************************************************
35
; Variablen festlegen ab 20h
36
37
        cblock 0x20
38
        loops
39
        loops2
40
        endc
41
42
        #define LED     PORTA,0
43
 
44
;*******************************************************
45
Init
46
47
   ; Einstellungen für den internen Oszillator vornehmen
48
    bsf   STATUS,5    ; Bank 1 anwählen um in OSCCON zu schreiben
49
    bcf   STATUS,6
50
    bcf   OSCCON,4    ; Damit wurde ein interner Takt von 4 MHZ ausgewähl
51
    bsf   OSCCON,5    ; Ein Takt beträgt somit 1us
52
    bsf   OSCCON,6    ; Nur nötig wenn interner Oszillator genutzt wird
53
    BANKSEL PORTA ;
54
    CLRF   PORTA     ;Init PORTA
55
    MOVLW   07h     ;Set RA<2:0> to
56
    MOVWF   CMCON0     ;digital I/O
57
    BANKSEL ANSEL     ;
58
    CLRF   ANSEL     ;digital I/O
59
    BANKSEL TRISA
60
    CLRF   TRISA
61
62
63
;*******************************************************
64
65
Mainloop
66
        bsf     LED             ; LED an
67
        call    WAIT            ; 250 ms warten
68
        bcf     LED             ; LED aus
69
        call    WAIT            ; 250 ms warten
70
        goto    Mainloop
71
72
;*******************************************************
73
; Warteschleife für 250 ms
74
WAIT
75
        movlw   .250
76
        BANKSEL   loops
77
78
; die top-Schleife verzögert 1 ms = 250 x 4µs
79
top     movlw   .250
80
        BANKSEL   loops2
81
; die top2-Schleife verzögert 4 Takte = 4 µs
82
top2    nop
83
        decfsz  loops2, F 
84
        goto    top2
85
        decfsz  loops, F
86
        goto    top
87
        retlw   .0
88
89
        end

von Chris B. (dekatz)


Lesenswert?

Auf dem Simulator auch nicht, aber wenn du vor "Mainloop" noch ein 
BANKSEL PORTA einfügst, dann schaltet der Port auch (zumindest auf dem 
Simulator).

Bleibt noch die WAIT Funktion. Die kann auch nicht sinnvoll laufen wenn 
du deine "movlw .250" nicht in den Speicher schreibst!!..also:

WAIT
        BANKSEL   loops
        movlw   .250
        movwf   loops

; die top-Schleife verzögert 1 ms = 250 x 4µs
top     movlw   .250
        movwf   loops2
; die top2-Schleife verzögert 4 Takte = 4 µs
top2    nop
        decfsz  loops2, F
        goto    top2
        decfsz  loops, F
        goto    top
        retlw   .0

von Ottmar K. (wil1)


Lesenswert?

Hallo Jürgen,
mich freut's dass Dein Programmierstiel langsam Form annimmt! Wenn Du 
jetzt noch Flüchtigkeitsfehler (vgl. Anmerkungen von Chris B.) in den 
Griff bekommst, bist Du einen großen Schritt vorwärts gegangen!.

Egänzend zum Bankwechsel:
Beim Banking nicht Durcheinander geraten! Im Datenblatt unter
"Memory-Organisation"
FIGURE 2-2: PIC16F688  SPECIAL FUNCTION REGISTERS
Sind die Bänke mit den darin enthaltenen Registern dargestellt. Dort mal 
nachsehen hilft unnötige Bankwechselbefehle zu vermeiden.
Anstatt kompliziert mit STATUS,RP0:RP1 den Bankwechsel vorzunehmen, 
empfehle ich einfach "banksel [Registername]" zu verwenden, das hat den 
gleichen Effekt.

Mit dem Simualtor, Watch-Fenster, Simulator-Settings usw kennst Du Dich 
aus?

mfG Ottmar

von Jürgen S. (schmiddii)


Lesenswert?

Hallo Ottmar ,

ich versuche stetig mich zu verbessern.
Hab jetzt 6 LED geschalten die zueinander laufen.
Selbes Prinzip, nur Unterschiedlich geschalten.

Nein von einem Simulator hab ich noch nichts gehört / gesehen.
Wäre aber toll, dann kann man das ja alles am PC schonmal anschauen ob 
das geht.Wäre schön, wenn ich dazu mehr von dir erfahren könnte.

Banksel ist echt viel viel besser wie das RP0/RP1 umschalten.

Ein großes Dankeschön natürlich auch an Dich, Chris !

Grüße

von Ottmar K. (wil1)


Lesenswert?

Hallo Jürgen,
hier also die Info zu MPLAB-Sim - Ich verwende MPLAB v. 8.84

Erst ma ein paar Links
1. 
[http://www.fernando-heitor.de/index.php/downloads/Dokumente/MPLAB-Tutorial]
2. [http://dev.emcelettronica.com/how-to-debug-mplab]

Ich gehe davon aus, dass Du ein Projekt in MPLAB anlegen kannst. Wenn 
nicht dann verwende dazu das Menü "Projekt" - Projekt-Wizard, bzw. lese 
das Tutorial 1.

MPLAB starten
Menü "Debugger"
  - Select Tool - MPLAB-Sim aktivieren
  - Settings - Reiter "OSC-TRACE" verwendete fosz eintragen
              -Reiter Animation/Realtime-Updates "
                   [x] enable realtime watch updates" zu aktivieren.
Menü "View" -Watch
Zieh einfach per Drag and Drop die Variable aus dem ASM-File in das 
Watch-Fenster unter "Symbol Name". Sämtliche Bits werden dargestellt. Du 
kannst auch manuell eintragen, z.B. WREG fürs den Akku, das 
Arbeitsregister.

Menü "Projekt" - Make [F10]
falls Fehlermeldungen auftreten, einfach auf die Meldung klicken und der 
Cursor ist in der fehlerhaften Befehlszeile.

Menü "Debugger"
Du probierst einfach die verschiedenen Menüpunkte aus und lernst per 
Versuch und Irrtum
mit [F7] gehst Du per Einzelschritt durch das Programm. Die Änderungen 
der Bits in den Variablen verfolgts Du im Watch-Fenster.

Eingänge kannst Du im "Stimulus" setzen. Wähle dazu
"Debugger" - Stimulus - New Workbook
Dann klickst Du auf das Feld unter "Pin/SFR" und öffnest das Drop 
Down-Menü. Dort wählst Du das Registerbit, z.B. RA0 aus. Nun klickst Du 
unter das Feld "Action" und wählst aus was mit dem Bit geschehen soll 
wenn du später auf "Fire" klickst. Falls Du einen Puls gewählt hast 
kannst Du im Feld daneben wählen wie viele Einheinte der Puls dauern 
soll. Die Maßeinheit wählst Du aus dem Feld rechts daneben (z.B. µs, ms 
u.a.) Bei "Comments" kannst Du einen Hinweis eintragen.
"Save" speichert das stimulus-workbook. "Apply" fügt es dann Deinem 
Projekt zum Gebrauch hinzu (siehe Eintrag im Output-Fenster)

Probiers einfach aus. Es gibt noch viele andere Möglichkeiten die 
Simulation (z.B. den ADC) so zu beeinflussen, als würde diese in der 
realen Welt stattfinden.

Bei microchip ist ein WebSeminar als Video "using stimulus..." 
(englisch) anzusehen:
[http://dev.emcelettronica.com/using-stimulus-algorithm-verification-mplab-ide-simulator-22]

Falls Du noch Fragen hast, ich schau gelegentlich wieder hier vorbei.

mfG Ottmar

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.