PIC 16f690 trivialiteter
PIC 16f690 trivialiteter
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?
utgångar med bsf men detta gör en nollning av alla andra utgångar på porten, varför?
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: PIC 16f690 trivialiteter
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
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
Re: PIC 16f690 trivialiteter
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
Re: PIC 16f690 trivialiteter
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.
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.
Re: PIC 16f690 trivialiteter
Typexempel på RMW, dvs Read Modify Write.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?
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.
Re: PIC 16f690 trivialiteter
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?
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?
Re: PIC 16f690 trivialiteter
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.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: PIC 16f690 trivialiteter
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:
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".
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'
EDTI: Denna template är alltså till för om man kör i "relocatable mode".