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.
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
Da bin ich durch das Datenblatt draufgekommen , da steht das 0000 reset
ist und das Programm ab 0005h steht.
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
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 !
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
|
"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 ;-)
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
Steht schon oben --- das aus dem Datenblatt in Großschrift!
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
|
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
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
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
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.
|