PIC 16f690 trivialiteter

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

PIC 16f690 trivialiteter

Inlägg av GoAmiga »

Jag försöker sätta PORTC som utgång och sedan styra separata
utgångar med bsf men detta gör en nollning av alla andra utgångar på porten, varför?
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: PIC 16f690 trivialiteter

Inlägg av PopUnoNkoK »

Ett tips är att posta koden som du jobbar med. Annars kommer det att vara väldigt svårt för någon att svara på varför det går som det går.
Om du av någon anledning inte vill posta koden så måste du förklara mer hur du gjort för att någon ska ha en chans att svara på din fråga.

Ett tips i all välmening för att du snabbare/lättare ska få svar på din fråga.

MVH Peter
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Re: PIC 16f690 trivialiteter

Inlägg av GoAmiga »

bra ide. =)

Kod: Markera allt

#include <p16F690.inc>
    __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

    cblock 0x20
Delay1                   ; Define two file registers for the
Delay2                   ; delay loop
SEND
CTRL
Temp
W_T1
W_T2
     endc
      
     org 0
Start:

    bsf STATUS,RP0          ; select Register Page 1
	bcf	STATUS,RP1
	movlw 00h
    movwf TRISC             ; make c and a output
	movwf TRISB
	clrf ANSEL
	movlw 31h
	movwf OSCCON
    bcf STATUS,RP0          ; back to Register Page 0
	bcf	STATUS,RP1
loop:

bsf	PORTC,0
bsf	PORTC,1
call	WAIT15	
bsf PORTC,1
call	WAIT15

	goto loop
ToPNoTCH
Inlägg: 5098
Blev medlem: 21 december 2009, 17:59:48

Re: PIC 16f690 trivialiteter

Inlägg av ToPNoTCH »

Du fixar ju med ANSEL men 690'an har fler AD'n och därav ANSELH som även den bör hanteras.

Nu är nog inte det problemet, för jag vill minnas att dom fyra A/D omvandlarna ligger i mitten på PORTB och höga PORTC.

Men du borde kanske prova med lite BANKSEL i koden känner jag spontant.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46827
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC 16f690 trivialiteter

Inlägg av TomasL »

GoAmiga skrev:Jag försöker sätta PORTC som utgång och sedan styra separata
utgångar med bsf men detta gör en nollning av alla andra utgångar på porten, varför?
Typexempel på RMW, dvs Read Modify Write.

När du skriver direkt till en port, framförallt till en specifik pinne, så sker det lite lustigheter.
Porten läses först, dvs Portens faktiska tillstånd läses in till cpu'n, där ändringen utföres, varvid allt skrivs tillbaka till porten.
I vissa lägen kan det då av misstag skrivas en nolla (Eller en etta) på övriga portpinnar.

Om du googlar på RMW så hittar du mängder med information om just detta problem.

Det finns ett antal varianter för att komma runt detta problem.
För till exempel PIC18 så finns det en extra registeruppsättning som kallas LATx som man skriver till istället för till porten.
Användarvisningsbild
Variosboy
Inlägg: 834
Blev medlem: 5 september 2005, 17:10:03
Ort: kristinehamn

Re: PIC 16f690 trivialiteter

Inlägg av Variosboy »

Vad händer i wait15?
Tänker främst på att du kör bsf på portc,1 och sen anropar du wait15 och sen kör du bsf på samma pinne en gång till?
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Re: PIC 16f690 trivialiteter

Inlägg av GoAmiga »

Ok, tack för svaren. Ska göra lite googling och datablads research. En annan sak, att ha en sådan configfil som jag har i början av programmet, är det standard nu mera? Jag har saxat ur ett exempelprogram och där var det med. Men när det begav sig för min del (typ 05) så minns ja inget om att man överhuvudtaget kunde "configa" en PIC på det viset.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46827
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC 16f690 trivialiteter

Inlägg av TomasL »

Jodå. i MPLAB har man alltid gjort på det sättet.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: PIC 16f690 trivialiteter

Inlägg av PopUnoNkoK »

Jag brukar alltid utgå från Microchips egna Templatefiler. Vet inte om det finns andra som tycker att det är mindre bra men för mig funkar det kanon.

Till 16f690 ser den filen ut så här:

Kod: Markera allt

;**********************************************************************
;   This file is a basic code template for object module code         *
;   generation on the PIC16F690. This file contains the               *
;   basic code building blocks to build upon.                         *
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler and linker (Document DS33014).          *
;                                                                     *
;   Refer to the respective PIC data sheet for additional             *
;   information on the instruction set.                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:      xxx.asm                                           *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files required: P16F690.INC                                      *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;                                                                     *
;                                                                     *
;                                                                     *
;**********************************************************************

    list      p=16F690           ; list directive to define processor
    #include <p16F690.inc>        ; processor specific variable definitions

    errorlevel  -302              ; suppress message 302 from list file

    __CONFIG   _CP_OFF & _CPD_OFF & _BOR_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _FCMEN_OFF & _IESO_OFF 

; '__CONFIG' directive is used to embed configuration word within .asm file.
; The lables following the directive are located in the respective .inc file.
; See data sheet for additional information on configuration word settings.

;***** VARIABLE DEFINITIONS (examples)

; example of using Shared Uninitialized Data Section
INT_VAR     UDATA_SHR     
w_temp      RES     1       ; variable used for context saving 
status_temp RES     1       ; variable used for context saving
pclath_temp RES     1       ; variable used for context saving

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

INT_VECTOR      CODE    0x0004       ; interrupt vector location

INTERRUPT

        movwf   w_temp            ; save off current W register contents
        movf    STATUS,w          ; move status register into W register
        movwf   status_temp       ; save off contents of STATUS register
        movf    PCLATH,w          ; move pclath register into W register
        movwf   pclath_temp       ; save off contents of PCLATH register



; isr code can go here or be located as a call subroutine elsewhere


        movf    pclath_temp,w     ; retrieve copy of PCLATH register
        movwf   PCLATH            ; restore pre-isr PCLATH register contents
        movf    status_temp,w     ; retrieve copy of STATUS register
        movwf   STATUS            ; restore pre-isr STATUS register contents
        swapf   w_temp,f
        swapf   w_temp,w          ; restore pre-isr W register contents
        retfie                    ; return from interrupt

MAIN_PROG       CODE

start

; remaining code goes here

        goto    start             ; loop forever

; initialize eeprom locations

EE      CODE    0x2100
        DE  0x00, 0x01, 0x02, 0x03

        END                       ; directive 'end of program'
Iblad har det tjorvat lite för mig när jag använt en ny processor då templaten inte ser riktigt likadana ut. Men till 16f690 tror jag inte att det varit nåt problem.


EDTI: Denna template är alltså till för om man kör i "relocatable mode".
Skriv svar