LED som Touch Sensor
Detta har igentligen inget med själva applikationen att göra, men
jag tänkte bara flika in ett par kod-tips som gör koden lite lättare
att läsa (inte för att den är *svår* att läsa nu, men i alla fall...
)
Om du i början av koden lägger till :så kan du senare i koden skriva:o.s.v.
Det gör nästan kommentarerna på dessa rader överflödiga, men viktigast
är att det blir skitenkelt att flytta de två LED'arna till andra pinnar, bara
ett ställe i "headern" på koden att ändra...
Sedan, ett problem med att göra bcf/bsf själv direkt på STATUS, RPx bitarna
är just att du *själv* måste kolla vilken bank det aktuella registret ligger i.
Det vet ju redan MPASM, så låt MPASM fixa det åt dig med BANKSEL.
jag tänkte bara flika in ett par kod-tips som gör koden lite lättare
att läsa (inte för att den är *svår* att läsa nu, men i alla fall...

)
Om du i början av koden lägger till :
Kod: Markera allt
#define LED_Ind porta,1
#define LED_Sens portb,5
#define LED_Sens_t trisb,5
Kod: Markera allt
bcf LED_Sens_t
...
...
bsf LED_Ind
btfss LED_Sens
Det gör nästan kommentarerna på dessa rader överflödiga, men viktigast
är att det blir skitenkelt att flytta de två LED'arna till andra pinnar, bara
ett ställe i "headern" på koden att ändra...
Sedan, ett problem med att göra bcf/bsf själv direkt på STATUS, RPx bitarna
är just att du *själv* måste kolla vilken bank det aktuella registret ligger i.
Det vet ju redan MPASM, så låt MPASM fixa det åt dig med BANKSEL.
sodjan >> Sedan, ett problem med att göra bcf/bsf själv direkt på STATUS, RPx bitarna
är just att du *själv* måste kolla vilken bank det aktuella registret ligger i.
Det vet ju redan MPASM, så låt MPASM fixa det åt dig med BANKSEL.
Hur fungerar BANKSEL?
Jag hittade detta på microchip.com
Innebär det att jag skulle kunna skriva enligt följande?
Sen hoppar programmet tillbaka och körs som vanligt?
Det är alltid bra med lite tips och trix i programmerings djungelen!
är just att du *själv* måste kolla vilken bank det aktuella registret ligger i.
Det vet ju redan MPASM, så låt MPASM fixa det åt dig med BANKSEL.
Hur fungerar BANKSEL?
Jag hittade detta på microchip.com
Kod: Markera allt
movlw b00101000 ; setup value into W register
banksel SSPCON1 ; select SFR bank
movwf SSPCON1 ; configure for Master I2C
Kod: Markera allt
banksel TRISA ; select TRISA bank
bsf TRISA,5 ; Make RA5 to a input
Det är alltid bra med lite tips och trix i programmerings djungelen!
Efter bakläxa från Sodjan
så har jag läst på och kommit fram till följande!
Om man vill byta till en BANK där en funktion finns så skriver man helt enkelt bara "BANKSEL funktionnamn" och då kommer det att genereras kod som byter till just den BANKen där den funtionen finns. Sen får man inte glömma att byta tillbaka igen om det nu är så att man t.ex. bara skulle ändra i TRISA och sedan skall köra vidare i sitt program.
Code exempel är ifrån User guide ASM...
Enligt detta så måste man ändå ha ganska bra koll på vilken funktion som finns i vilken bank...

Om man vill byta till en BANK där en funktion finns så skriver man helt enkelt bara "BANKSEL funktionnamn" och då kommer det att genereras kod som byter till just den BANKen där den funtionen finns. Sen får man inte glömma att byta tillbaka igen om det nu är så att man t.ex. bara skulle ändra i TRISA och sedan skall köra vidare i sitt program.
Code exempel är ifrån User guide ASM...
Kod: Markera allt
#include p16f877a.inc ;Include standard header file
;for the selected device.
banksel TRISB ;Since this register is in bank 1,
;not default bank 0, banksel is
;used to ensure bank bits are correct.
clrf TRISB ;Clear TRISB. Sets PORTB to outputs.
banksel PORTB ;banksel used to return to bank 0,
;where PORTB is located.
movlw 0x55 ;Set PORTB value.
movwf PORTB
goto $
end ;All programs must have an end.
> Om man vill byta till en BANK där en funktion finns...
> ...
> Enligt detta så måste man ändå ha ganska bra koll på vilken
> funktion som finns i vilken bank...
(*Register*, inte "funktion"...)
Banker har inget att göra med var programkoden finns.
Med BANKSEL behöver man *inte* veta i vilken bank register ligger.
Jag ser inte av exemplet från manualen varför du tycker det ?
Det använder BANKSEL före både TRISB och PORTB och man behöver inte
veta i vilken bank som någon av dessa ligger. De skulle kunna ligga i vilken
som helst av processorns 4 banker, och koden fungerar ändå.
Dock, det finns naturligtsvis även en nackdel med BANKSEL, den håller
inte reda på i vilken bank Man befinner sig, så den kommer ofta att generera
"onödig" kod. Om detta är ett problem, så måste man fortfarande gå in
som programmerare och "trimma" koden.
Men vid tester (som t.ex din kod) så kan BANKSEL undvika de mest
enkla buggarna.
Sen finns det utvecklingsmiljöer för PIC assembler som innehåller
funktioner för bank-hantering som även håller reda på vilken bank
som är vald, och som enbart sätter in BCF/BSF instruktioner när det
är nödvändigt, men det är en annan historia...
> ...
> Enligt detta så måste man ändå ha ganska bra koll på vilken
> funktion som finns i vilken bank...
(*Register*, inte "funktion"...)
Banker har inget att göra med var programkoden finns.
Med BANKSEL behöver man *inte* veta i vilken bank register ligger.
Jag ser inte av exemplet från manualen varför du tycker det ?
Det använder BANKSEL före både TRISB och PORTB och man behöver inte
veta i vilken bank som någon av dessa ligger. De skulle kunna ligga i vilken
som helst av processorns 4 banker, och koden fungerar ändå.
Dock, det finns naturligtsvis även en nackdel med BANKSEL, den håller
inte reda på i vilken bank Man befinner sig, så den kommer ofta att generera
"onödig" kod. Om detta är ett problem, så måste man fortfarande gå in
som programmerare och "trimma" koden.
Men vid tester (som t.ex din kod) så kan BANKSEL undvika de mest
enkla buggarna.
Sen finns det utvecklingsmiljöer för PIC assembler som innehåller
funktioner för bank-hantering som även håller reda på vilken bank
som är vald, och som enbart sätter in BCF/BSF instruktioner när det
är nödvändigt, men det är en annan historia...
