Kod till PIC16F877A-- Edit: 887

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Kod till PIC16F877A-- Edit: 887

Inlägg 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
Senast redigerad av squiz3r 10 juni 2007, 12:51:03, redigerad totalt 1 gång.
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

:pray: Tack!! Det är ovärderligt! :happy:

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

//Daniel A
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg 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... :-)
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, de finns i resten av databladet... :-)
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Men.. :S Finns inte MCLRE (intern/extern) med i __config snutten :?::?:

//Daniel A
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Varför ska den göra det ?
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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)...
Skriv svar