- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: Neueinsteiger: Pic16F84a und MPLAB 7.61 (gelöst)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2007
    Beiträge
    5

    Neueinsteiger: Pic16F84a und MPLAB 7.61 (gelöst)

    Anzeige

    E-Bike
    Hallo zusammen.

    Ich hab vor mich im Bereich „PIC“ einzuarbeiten und auch schon fleißig gelesen. Nachdem ich wegen nem 3.3Volt-COM-Port verzweifelt meinen JDM-Brenner wieder zerlötet habe, hab ich nun den Brenner-3 erfolgreich am laufen. Hatte noch nen 7406 in meiner Bastelkiste gefunden gehabt

    Entschieden hab ich mich, um anzufangen, für den „PIC16F84a“. Der ist bei vielen Basteleien weit verbreitet und kann noch nicht so viel, so daß ich hoffe, wenigstens damit klar zu kommen anfangs. Für die Programmiergeschichte hab ich mir das MPLAB-7.61 gezogen und installiert. Auf www.sprut.de sind einige Beispiele mit den ich anfangen wollte. Eine klasse Seite!

    Mein erster Versuch war ne LED blinken zu lassen. Hab mir dazu ein kleines Testboard gelötet auf ner Lochraster wie hier im Forum vorgeschlagen. Ein fertiges „HEX“ zum testen gebrannt und mich über das Funktionieren gefreut.

    Nun gings weiter mit dem Programm an sich. Ich wollte das mal im MPLAB selbst kompilieren. Und da häng ich nun der Verzweiflung nahe und hoffe hier auf jemanden, der mir das ein wenig genauer erklären könnte.

    Ich habe ein Problem mit „ORG 0“ und dem Beispiel aus MPLAB wo das mit „PROG CODE“ und „STARTUP CODE“ in den Dateien „Example & Example2.asm“ drinne steht.

    Erfolgreich konnte ich nur kompilieren, wenn ich anstatt „ORG 0“ „PROG CODE“ geschrieben hatte. Alles andere führte zum Fehler:

    MPLINK 4.12, Linker Copyright (c) 2007 Microchip Technology Inc. Error - section '.org_0' can not fit the absolute section. Section '.org_0' start=0x00000000, length=0x00000034 Errors : 1
    Hab mich schon in der „16F84a.inc“ und der „16F84a.lnk umgesehen. In letzterer sind „Startup und Prog“ erwähnt. Nur ich blick das nicht, wie das nun zusammenhängt. Das mit dem ORG ist ja noch halbwegs nachvollziehbar.

    Wie benutz ich diese Befehle anstatt dem „ORG“, vor allem wenn ich z.B. ne Taste programmieren möchte die einen Interrupt auslöst?

    Hier mein Programm:

    Code:
    list p=16f84a                ;der Prozessortyp wird festgelegt 
    include "p16f84a.inc"        ;die include-Datei mit vielen Festlegungen wird geladen
    
    __config	_XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
    
    
    PROG	CODE 	; damit gehts
    ; ORG	0		; damit nicht
    
    ; Variablennamen vergeben 
    
    loops   Equ     0x22            ; Zähler für Warteschleife  
    loops2  Equ     0x23            ; Zähler für Warteschleife 
    
    ; Initialiesierung
    
            bsf     STATUS, RP0     ; auf Bank 1 umschalten 
            movlw   B'00000000'     ; PortB alle output 
            movwf   TRISB 			; ?
            bcf     STATUS, RP0     ; auf Bank 0 zurückschalten 
            clrf    PORTB           ; alle LEDs ausschalten 
    
    ; LED an RB0 einschalten  
    
            bsf     PORTB,0         ; LED an RB0 einschalten
    
    ; Blinken
    
    Loop 
            call    Wait            ; Wartezeit 
            bcf     PORTB,0			; LED aus
    		call	Wait
    		bsf     PORTB,0         ; LED an
            goto    Loop  
      
    ; Warteschleife 250 ms 
    
    Wait 
            movlw   D'250'          ; 250 ms Pause 
            movwf   loops  
    
    Wai 
            movlw   .110           ; Zeitkonstante für 1ms 
            movwf   loops2 
    Wai2    nop                    ;  
            nop 
            nop 
            nop 
            nop 
            nop 
            decfsz  loops2, F      ; 1 ms vorbei? 
            goto    Wai2           ; nein, noch nicht 
                                   ; 
            decfsz  loops, F       ; 250 ms vorbei? 
            goto    Wai            ; nein, noch nicht 
            retlw   0              ; das Warten hat ein Ende
    
        end
    Ich bin mir auch nicht sicher, ob das auch so richtig ist, wie ich es "zusammenkopiert" hab. Folgend die "Kompiliermeldungen":

    Executing: "C:\Programme\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F84A "Uebung.asm" /l"Uebung.lst" /e"Uebung.err" /o"Uebung.o"
    Warning[205] C:\MPLAB-PROGRAMME\UEBUNG.ASM 1 : Found directive in column 1. (list)
    Warning[205] C:\MPLAB-PROGRAMME\UEBUNG.ASM 2 : Found directive in column 1. (include)
    Warning[205] C:\MPLAB-PROGRAMME\UEBUNG.ASM 4 : Found directive in column 1. (__config)
    Message[302] C:\MPLAB-PROGRAMME\UEBUNG.ASM 18 : Register in operand not in bank 0. Ensure that bank bits are correct.
    Executing: "C:\Programme\Microchip\MPASM Suite\mplink.exe" "C:\Programme\Microchip\MPASM Suite\LKR\16f84a.lkr" "C:\MPLAb-Programme\Uebung.o" /o"Uebung.cof" /M"Uebung.map" /W
    MPLINK 4.12, Linker
    Copyright (c) 2007 Microchip Technology Inc.
    Errors : 0

    MP2HEX 4.12, COFF to HEX File Converter
    Copyright (c) 2007 Microchip Technology Inc.
    Errors : 0

    Loaded C:\MPLAb-Programme\Uebung.cof.
    BUILD SUCCEEDED: Sun Aug 05 19:39:40 2007

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    01.01.2005
    Beiträge
    79
    Versuch doch mal "ORG 0" unmittelbar vor die Initialisierung zu schreiben.
    Nachdem Du die beiden Variablen deklarierst.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    42
    Beiträge
    1.013
    hi die templates sind manchmal nett so ideal von sprut versuch des mal mit folgenden minimal template.

    Als tip ich persönlich finde MPLAB etwas verwirrend voraledem an Anfang nicht so zu Empfehlen, versuche mal piklab das gibt es auch für Windows ist recht umfangreich und einfach zu bedienen.

    Code:
    	list p=16f84a
    	include "p16f84a.inc"
    
    	__config   _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF 
    
    	org    0x00  ; Speicher Anfang die ersten 3 befehle 
    	goto   main ; Erste Routine die aufgerufen wird 
    	org    0x04 ; Erste Speicherzelle von Main
    
    	cblock  0x20 ; Variablen kenzeichnen
            ;....
    	endc 
    
    main
    ;you code here
    goto main
    end
    Legastheniker on Bord !

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2007
    Beiträge
    5
    Zitat Zitat von stowoda
    Versuch doch mal "ORG 0" unmittelbar vor die Initialisierung zu schreiben.
    Nachdem Du die beiden Variablen deklarierst.
    Das funktioniert leider nicht. Habe schon minimalistische Lösungen versucht wie sie hier im Forum zu finden sind.

    Code:
    list p=16f84a                ;der Prozessortyp wird festgelegt 
    include "p16f84a.inc"        ;die include-Datei mit vielen Festlegungen wird geladen
    
    __config	_XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
    
    ORG	0
    PROG	CODE 
    
    ; Variablennamen vergeben 
    
    loops   Equ     0x22            ; Zähler für Warteschleife  
    loops2  Equ     0x23            ; Zähler für Warteschleife 
    
    .....
    So geht das kompilieren.

    Code:
    list p=16f84a                ;der Prozessortyp wird festgelegt 
    include "p16f84a.inc"        ;die include-Datei mit vielen Festlegungen wird geladen
    
    __config	_XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
    
    ORG	0		; damit nicht
    ; PROG	CODE 	; damit gehts
    
    
    ; Variablennamen vergeben 
    
    loops   Equ     0x22            ; Zähler für Warteschleife  
    loops2  Equ     0x23            ; Zähler für Warteschleife 
    
    .......
    So nicht.

    Code:
    list p=16f84a                ;der Prozessortyp wird festgelegt 
    include "p16f84a.inc"        ;die include-Datei mit vielen Festlegungen wird geladen
    
    __config	_XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
    
    ; ORG	0		; damit nicht
    ; PROG	CODE 	; damit gehts
    
    
    ; Variablennamen vergeben 
    
    loops   Equ     0x22            ; Zähler für Warteschleife  
    loops2  Equ     0x23            ; Zähler für Warteschleife 
    
    ......
    So gibts massig Fehlermeldungen [152] und es kompiliert auch nicht.

    Code:
    list p=16f84a                ;der Prozessortyp wird festgelegt 
    include "p16f84a.inc"        ;die include-Datei mit vielen Festlegungen wird geladen
    
    __config	_XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
    
    ; ORG	0		; damit nicht
    PROG	CODE 	; damit gehts
    
    
    ; Variablennamen vergeben 
    
    loops   Equ     0x22            ; Zähler für Warteschleife  
    loops2  Equ     0x23            ; Zähler für Warteschleife 
    
    .........
    So gehts auch.

    Das suggeriert mir, daß der Befehl "ORG" durch "PROG CODE, STARTUP CODE" ersetzt wurde ?! (Steht zumindest in der 16F84a.lnk, aus der ich noch nicht schlau werde)

    Wie oben geschrieben, würd ich mich freuen, wenn mir jemand das etwas näher bringen könnte. Ich hab bisher nur die MPLAB 7.61 verwendet.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2007
    Beiträge
    5
    Zitat Zitat von theborg
    hi die templates sind manchmal nett so ideal von sprut versuch des mal mit folgenden minimal template.

    Als tip ich persönlich finde MPLAB etwas verwirrend voraledem an Anfang nicht so zu Empfehlen, versuche mal piklab das gibt es auch für Windows ist recht umfangreich und einfach zu bedienen.

    Code:
    	list p=16f84a
    	include "p16f84a.inc"
    
    	__config   _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF 
    
    	org    0x00  ; Speicher Anfang die ersten 3 befehle 
    	goto   main ; Erste Routine die aufgerufen wird 
    	org    0x04 ; Erste Speicherzelle von Main
    
    	cblock  0x20 ; Variablen kenzeichnen
            ;....
    	endc 
    
    main
    ;you code here
    goto main
    end
    Dein Beispiel lässt sich ohne Probleme kompilieren.
    Leider hab ich es nicht gebacken bekommen, mein "Blinkprogramm" da reinzubekommen.

    cblock 0x20 ; Variablen kenzeichnen
    ;....
    endc
    Damit kann ich noch nicht um

    Ich werd mir aber das Programm "Piklab" besorgen, wenn es "Einsteigerfreundlicher" ist. Danke für den Tipp

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    42
    Beiträge
    1.013
    hi als beispiel du kanst die variablen zuweisen mit equ oder du machst es mit

    cblock 0x20 ; Variablen kenzeichnen
    bla
    blub
    mip
    endc

    dann hat bla adresse 0x20, blub 0x21 und mip 0x22
    Legastheniker on Bord !

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2007
    Beiträge
    5
    Genial, jetzt hab ich das endlich begriffen. Dank nochmals !

    Nachtrag:

    Das Programm sieht dann nun so aus:
    Code:
    list p=16f84a 
       include "p16f84a.inc" 
    
       __config   _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF 
    
       org    0x00  ; Speicher Anfang die ersten 3 befehle 
       goto   Main ; Erste Routine die aufgerufen wird 
       org    0x04 ; Erste Speicherzelle von Main 
    
    cblock  0x22 ; Variablen kenzeichnen 
    loops  
    loops2 
    endc
    
            bsf     STATUS, RP0     ; auf Bank 1 umschalten 
            movlw   B'00000000'     ; PortB alle output 
            movwf   TRISB 			; ?
            bcf     STATUS, RP0     ; auf Bank 0 zurückschalten 
            clrf    PORTB           ; alle LEDs ausschalten 
    
    ; LED an RB0 einschalten  
    
            bsf     PORTB,0         ; LED an RB0 einschalten
    
    ; Blinken
    
    Main
            call    Wait            ; Wartezeit 
            bcf     PORTB,0			; LED aus
    		call	Wait
    		bsf     PORTB,0         ; LED an
            goto    Main
      
    ; Warteschleife 250 ms 
    
    Wait 
            movlw   D'250'          ; 250 ms Pause 
            movwf   loops  
    
    Wai 
            movlw   .110           ; Zeitkonstante für 1ms 
            movwf   loops2 
    Wai2    nop                    ;  
            nop 
            nop 
            nop 
            nop 
            nop 
            decfsz  loops2, F      ; 1 ms vorbei? 
            goto    Wai2           ; nein, noch nicht 
                                   ; 
            decfsz  loops, F       ; 250 ms vorbei? 
            goto    Wai            ; nein, noch nicht 
            retlw   0              ; das Warten hat ein Ende
    
        end                         ;das Ende des Programms
    Der Kompiler meckert leider wieder über das "ORG" wenn ich es wie angegeben schreibe

    Error - section '.org_1' .......
    "Piklab" lässt sich auch nicht installieren. (Hab die Piglab-Prog-Win32-Version gezogen, benutze WinXP-SP1) Heute ist wohl nicht mein Tag (((

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    30.09.2006
    Ort
    Hamburg
    Alter
    42
    Beiträge
    1.013
    Noch nen kleiner Tipp bei piklab auf Register da sieste die ganzen Zuordnungen weis jetzt nicht ob gpsim unter win läuft aber wenn ja kanste beim simulieren die aktuellen werte auslesen
    Legastheniker on Bord !

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    05.08.2007
    Beiträge
    5
    Das Thema hat sich nun erledigt.

    Mein Englisch ist nicht gerade vorzeigefähig, jedoch war folgendes recht lehrsam und einleuchtend im Bezug auf PIC-16 und MPLAB 7.61:

    PIC16 Application Example - org
    This example shows the usage of the org directive. Code generation begins at an address spcified by org address. The origin of a data table also can be specified by this directive. A data table may be placed either in a program memory region or in an EE data memory region, as in case of a PICmicro device with EE data FLASH.

    #include p16f877a.inc ;Include standard header file for the selected device.
    org 0x0000 ;The following code will be placed in reset address 0.
    goto Main ;Jump to an address whose label is 'Main'.
    org 0x0004 ;The following code will be placed in interrupt address 4.
    goto int_routine ;Jump to an address whose label is 'int_routine'.
    org 0x0010 ;The following code section will placed starting from address 10H.
    ....

    Mein Programmkopf sieht nun so aus und funktioniert nun endlich ohne Murren beim Kompilieren:


    Code:
    list p=16f84a 
       include "p16f84a.inc" 
    
       __config   _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF 
    
    
    	cblock  0x20 ; Variablen kenzeichnen 
       	Test
    	w_temp
    	status_temp
       	endc 
       
    		ORG	0		; Erste Programmadresse
    		call 	init		; Port-Initialisierung aufrufen
    		goto    main          ; Sprung zur Hauptprogrammschleife
    		ORG 4                  ; Interruptadresse
    		goto 	int               ; zur Interruptserviceroutine
    		ORG 10                ; Programm wird ab 10h abgelegt im PIC
    
    main 
    
    ..........
    Wollte das nur erwähnen, für den Nächsten der sich damit rumärgert

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress