Sida 1 av 4

Kod till PIC16F877A-- Edit: 887

Postat: 15 maj 2007, 16:57:34
av squiz3r
Hej, Jag försöker programera min första 877A i ASM, och har nu lyckats få tag på en kod där config bitar m.m. finns med. Men jag förstår inte riktigt den... Vad är allt detta ovanför __Config?? Är det saker som man behöver eller är det bara till andra saker som de gör i programet sen??

Räcker denna kodbiten eller behöver ni mer? Hela koden finns på http://www.dunmire.org/projects/MEEPS/s ... loader.asm

Kod: Markera allt

;*************************************************************************
;               Suppress warning errors from MPASM

                errorlevel -306
                errorlevel -302

;*************************************************************************
;               Configuration settings

ON              EQU     1       ;TRUE
OFF             EQU     0       ;FALSE

FULLMEM         SET     ON      ;full, 8K parts, 16F877/16F876
;FULLMEM         SET     OFF     ;half, 4K parts, 16F874/16F873

;PASSPROT        SET     ON      ;password protection is on
PASSPROT        SET     OFF     ;password protection is off

;Oscillator frequency, typically 3.6864, 4, 10, 16, or 20MHz
FOSC    equ     D'20000000'

;Communications speed - note that not all baud rates are possible
;                       Do not change this value without reviewing
;                       section 10.1 of the PIC16F87x data sheet.
BAUD    equ     D'19200'

;CTS bit selection
; E2 for MEEPS
; B6 for generic picloader replacement
CTSPORT equ     PORTE
CTS_D     equ     2h              ;CTS input from host
                                  ;(The _D designation signifies that
                                  ;this is a data signal rather than
                                  ;the RS-232 signal.)

;*************************************************************************
;               CPU Configuration Fuses
;
; Note that the watchdog timer is enabled and will be serviced while
; QwikLoader (this program) is running. The user program must service
; the watchdog to avoid the watchdog reset.

 __CONFIG  _BODEN_ON&_CP_OFF&_WRT_ENABLE_ON&_PWRTE_ON&_WDT_ON&_HS_OSC&_DEBUG_OFF&_CPD_OFF&_LVP_OFF

;*************************************************************************
;		Variable Declarations
//Daniel A

Postat: 15 maj 2007, 18:36:50
av bos
Om du läser den andra kommentaren så bör du få hjälp på traven vad det är för något.

Det handlar om konstanter och övriga inställningar som programmet använder sig av. En bekvämlighetssak helt enkelt. Du kan gott radera dem alla och skriva "1", "0" osv på de ställen där de används.

Postat: 15 maj 2007, 19:05:09
av squiz3r
>Du kan gott radera dem alla och skriva "1", "0" osv på de ställen där de används.

Jag förstår inte riktigt vad de gör för något :?: Och då är det lite svårt att ersätta dem med en 1'a eller 0'a :oops:

Det är ingen som har ett blink-a-LED program eller något annat enkelt till en 877?

För att undvika missförstånd: Jag ska inte använda denna koden, utan jag ska bara ta den som en mall så jag får config bitar m.m. till ett blink-a-LED program :)

Tack för svaret!
//Daniel A

Postat: 15 maj 2007, 19:06:49
av sodjan
Här har du en annan liten snutt till en 877A.
Det går att ta första delen som "mall" men jag tog med hela
för att få "hela bilden" så att säga...
Koden är alltså helt komplett och fungerar som den är rakt av.

Kod: Markera allt

;**********************************************************************
;   Enkelt blink-a-led, 16F877A.                                       *
;                                                                     *
;**********************************************************************
;    Files required:  P16F877A.INC                                     *
;                     16F877A.LNK                                      *
;                                                                     *
;**********************************************************************


	list      p=16f877A
	#include <p16f877A.inc>
	
	__CONFIG   _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

RESET_VECTOR    CODE    0x000     ; processor reset vector
	    goto    start             ; go to beginning of program


INT_VECTOR      CODE    0x004     ; interrupt vector location
        goto    isr_routine       ; goto main interrupt service routine.
        

MAIN    CODE

start

        banksel adcon1
        movlw   h'06'
        movwf   adcon1            ; Stäng av ADC.

        banksel trisa
        clrf    trisa
        clrf    trisb
        clrf    trisc
        clrf    trisd
        clrf    trise             ; Alla pinnar = utgångar.

        banksel t1con
        movlw   b'00110001'
        movwf   t1con             ; Se datablad...
        
        banksel pie1
        movlw   b'00000001'
        movwf   pie1              ; Enable avbrott från TMR1.

        banksel intcon	
        bsf     intcon, peie
        bsf     intcon, gie       ; Enable avbrott...

loop
        goto loop                 ; Vänta på avbrott...
 


ISR_ROUTINE  CODE

isr_routine

        banksel portb
        comf    porta            ; Blinka !!

        banksel pir1
        bcf     pir1, tmr1if     ; clear avbrotts flagga.

        retfie



		END

Postat: 15 maj 2007, 19:08:54
av squiz3r
:pray: Tack!! Det är ovärderligt! :happy:

Då får jag börja labba med den efter semestern :)

//Daniel A

Postat: 15 maj 2007, 19:16:40
av sodjan
squiz3r 19:05> Det är ingen som har ett blink-a-LED program eller något annat enkelt till en 877?

Och 19:06 hade du det. Inte så himla illa, eller hur ? :-) :-)

> Då får jag börja labba med den efter semestern

*efter* ?? :-)

Notera också att denna (och all min kod) är skriven som
"relocatable code". D.v.s använder CODE, UDATA och andra
direktiv som används just då. Min *personliga* rekomendation
är att börja skriva "relocatable" direkt. Det blir bättre och snyggare
kod i längden när den börja växa i storlek...

Se även : http://www.jescab.se/Rellocmode.html

Postat: 15 maj 2007, 19:16:54
av bos
squiz3r skrev:Då får jag börja labba med den efter semestern :)//Daniel A
Efter? Det är ju under semestern man ska labba... :-)

Postat: 15 maj 2007, 19:56:43
av squiz3r
Att labba med det på semestern är inte så lätt i detta fallet :( Jag ska till england med min klass och åka kanalbåt... Skulle nog inte bli så uppskattat om jag plockade fram dator och hela mitt labb i ett hörn på båten och började labba med det hela dagarna :wink:

Edit: Sodjan: Det kunde varit snabbare... Men eftersom det är en gratistjänst så får det väll duga :D
//Daniel

Postat: 15 maj 2007, 22:49:10
av sodjan
Kanalbåt, låter himma skönt !

En annan sak...

> och har nu lyckats få tag på en kod där config bitar m.m. finns med.....

Notera att alla tänkbara symboler för __CONFIG för en viss processor modell
finns sist i den speciella INC filen för processorn. T.ex för 877A så
ligger de i P16F877A.INC och ser ut så här:

Kod: Markera allt

;==========================================================================
;
;       Configuration Bits
;
;==========================================================================

_CP_ALL                      EQU     H'1FFF'
_CP_OFF                      EQU     H'3FFF'
_DEBUG_OFF                   EQU     H'3FFF'
_DEBUG_ON                    EQU     H'37FF'
_WRT_OFF                     EQU     H'3FFF'    ; No prog memmory write protection
_WRT_256                     EQU     H'3DFF'    ; First 256 prog memmory write protected
_WRT_1FOURTH                 EQU     H'3BFF'    ; First quarter prog memmory write protected
_WRT_HALF                    EQU     H'39FF'    ; First half memmory write protected
_CPD_OFF                     EQU     H'3FFF'
_CPD_ON                      EQU     H'3EFF'
_LVP_ON                      EQU     H'3FFF'
_LVP_OFF                     EQU     H'3F7F'
_BODEN_ON                    EQU     H'3FFF'
_BODEN_OFF                   EQU     H'3FBF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_RC_OSC                      EQU     H'3FFF'
_HS_OSC                      EQU     H'3FFE'
_XT_OSC                      EQU     H'3FFD'
_LP_OSC                      EQU     H'3FFC'
Detta tillsammans med beskrivningen av CONFIG registret i databladet
ska vara nog för att sätta det som man vill ha det...
Sedan kan man ta en ASM fil för vilken processor som helst och
ganska enkelt skriva om __CONFIG så att det passar den nya modellen.

Postat: 17 maj 2007, 12:18:28
av squiz3r
Ja, config bitarna skulle jag kunna fixa (tror jag) Men sen är det alla specialfunktioner m.m. I detta fall verkar det inte vara så mycket, men tex. ADC m.m. m.m.

Återigen Tack!
//Daniel A

Postat: 17 maj 2007, 17:53:32
av sodjan
OK, de finns i resten av databladet... :-)

Postat: 17 maj 2007, 17:58:16
av squiz3r
Men.. :S Finns inte MCLRE (intern/extern) med i __config snutten :?::?:

//Daniel A

Postat: 17 maj 2007, 17:59:19
av sodjan
Varför ska den göra det ?

Postat: 17 maj 2007, 18:01:32
av squiz3r
Får väll ta en ny titt i databladet. Det gör den ju i andra PIC'ar och jag uppfattade datablade som att den gjorde det här med :S

//Daniel A

Postat: 17 maj 2007, 18:12:45
av sodjan
877A (och andra äldre PIC'ar av samma generation) saknar stöd för "internal-MCLR".
Vill man ha en modernare variant så rekomenderas 16F887 (och de andra
i samma familj), de har alla moderna funktioner som de flesta senare PIC's.

Notera att 887 är betydligt billigare än 877A, med samma minnesstorlek
m.m plus en del nya finesser (nanowatt-prylarna)...