> Resultatet blir att enbart LED nr 2 lyser och inte båda.
Självklart. det är exakt så som databladet beskriver det !
Prova detta :
Kod: Markera allt
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
org 0
Start:
banksel ANSEL
clrf ANSEL
banksel TRISC
bcf TRISC,0 ; make IO Pin RC0 an output
bcf TRISC,1 ; make IO Pin RC1 an output
banksel PORTC
bsf PORTC,0 ; turn on LED C0 (DS1)
bsf PORTC,1 ; turn on LED C1 (DS2 ?)
goto $ ; wait here
end
Notera användningen av banksel !
Detta :
> bsf STATUS,RP0 ; select Register Page 1
stämmer igentligen inte. Kommandot väljer bank 1 *eller* bank 3,
det beror på hur den andra bank-biten (RP1) är ställd. Så
använd alltid banksel, den gör alltid rätt.
Notera också att hanterigen av ANSEL är tydligt beskriven på
sidan om PORTC i databladet. Det finns även med i det kodexempel
som finns på samma sida.
Det som händer med din kod är att LED1 först tänds, sedan släcks
den när LED2 tänds. Varför ? Jo, en I/O pinne som är konfigurerade
som en analog pinne, läses alltid som "0". BSF/BCF instruktionerna
läser alltid först hela registret (t.ex PORTC), ändrar sedan den
aktuella *biten* och skriver sedan tillbaka hela registret.
Så summan är att det är viktigt att läsa sidan om PORTx i databladet.
Det är ofta en del saker som kanske inte är självklara men viktiga.