PIC16F676, konfigurace A/D převodníku
Moderátor: Moderátoři
- Přílohy
-
- P_10a_merak pro nabijecku.ASM
- Výpis programu pro měření 2C a 3C baterií LiPol v nabíječce.
- (29.97 KiB) Staženo 148 x
1. na začátku skáčeš do inicializace přes call a nikde se již zpět nevracíš (v zásobníku zůstává jedna návratová adresa) - asi není problém ale nemá to jediné rozumné vysvětlení
2. nemáš definovánu výchozí číselnou soustavu a na jednom řádku máš 200 což mi překladač vyhodil jako chybu. Bylo by vhodné vždy jednoznačně číci, v jaké soustavě dané číslo zapisuješ (0-9 je stejná ale další už ne)
3.v programu čidla ti nesedí časové smyčky, proto ti to asi nefunguje. takže "zkalibruj" smyčky (požadované pauzy x reálné) a pak vyzkoušej.
4. (ne chyba) ale co vyhodnocuješ tím přerušením? Nezkoumal jsem to přesně, myslím, že se může provést právě při komunikaci s čidlem a pokud tam budeš mít nějaký delší kód k přelouskání tak ti to taky může ovlivnit úspěšnost čtení díky "rozhození časování".
Jinak je to dle mého dost nepřehledný.
Kód: Vybrat vše
errorlevel -302
.
.
MOVLW .200Kód: Vybrat vše
MOVLW b'01101011'
MOVWF ANSEL
MOVLW b'11111111'
MOVWF TRISA
MOVLW b'11000000'
CLRF TRISB
MOVLW b'11010000'
MOVWF OPTION_REG
BSF PIE1,ADIE
BSF INTCON,PEIE
MOVLW b'10100000'
MOVWF ADCON1
MOVLW b'01100000'
MOVWF OSCCON
BCF STATUS,RP0
MOVLW b'01000001'
MOVWF ADCON0Kód: Vybrat vše
READ_REG
CALL CEK40
BSF ADCON0,GO ; spuštění A/D převodu
BTFSC ADCON0,GO
GOTO $-1
; ---- oddělení setiny a uloží do ADP_DP ----------------
CLRF ADP_DP ; vynuluje registr ADP_DP
MOVF ADP_DP,0 ; přesune obsah ADP_DP do W
BSF STATUS,RP1
BTFSC ADRESL,0
ADDLW .2 ; když je bit 0=1, přičte dvojku k W
BSF STATUS,RP1
BTFSC ADRESL,1 ; přečte bit 1
ADDLW .5 ; když je bit 1=1, přičte pětku k W
MOVWF ADP_DP ; uloží obsah W do ADP_DP
; ---- oddělení desetiny, jednotky a desítky a uloží do ADP_NM
CLRF ADP_NM ; vynuluje registr ADP_NM
MOVF ADP_NM,0 ; přesune obsah ADP_NM do W
BSF STATUS,RP1
BTFSC ADRESL,2 ; přečte bit 2
ADDLW .1 ; když je bit 2=1, přičte jedničku k W
BTFSC ADRESL,3 ; přečte bit 3
ADDLW .2 ; když je bit 3=1, přičte dvojku k W
BTFSC ADRESL,4 ; přečte bit 4
ADDLW .4 ; když je bit 4=1, přičte čtyřku k W
BTFSC ADRESL,5 ; přečte bit 5
ADDLW .8 ; když je bit 5=1, přičte osmičku k W
BTFSC ADRESL,6 ; přečte bit 6
ADDLW .16 ; když je bit 6=1, přičte šestnáctku k W
BTFSC ADRESL,7 ; přečte bit 7
ADDLW .32 ; když je bit 7=1, přičte třicetdvojku k W
BCF STATUS,RP0
BTFSC ADRESH,0 ; přečte bit 0
ADDLW .64 ; když je bit 0=1, přičte šedesátčtyři k W
BTFSC ADRESH,1 ; přečte bit 1
ADDLW .128 ; když je bit 1=1, přičte stodvacetosm k W
MOVWF ADP_NM ; uloží obsah W do ADP_NM
; ----------
RETURNChcelo by to napísať ideu merania a vyhodnocovania.
Vo väčšine prípadoch sa dá pracovať aj bez iniciovania isr. V niektorých to inak neide. V takom prípade je to o niečo zložitejšie. A dôležité je to pochopiť.
Činnosť-úlohy programu sa rozdelia na dve časti. Jedna pre hlavný program , druhá v isr. Čo bude ktorá riešiť treba uvážiť.
Štruktúra program/podprogram/isr musí byť exaktne presná. Logické chyby veľakrát neobjaví ani MPLAB, inde vyzýva po preklade na skontrolovanie
Ale to sú základy a to si treba niekde naštudovať.
Ten program po 22. kroku v MPLAB SIM "uletí" inde ako by autor chcel a robí všetko iné len nie to čo bolo cieľom.
jo, skus se naucit pouzivat BANKSEL ,
stránka 0 - přerušení, hlavní smyčka programu, funkční podprogramy
stránka 1 - menu
stránka 2 - LCD (init, obslužná rutina a texty)
stránka 3 - komunikace s okolím (čidla apod.), dále zobrazení alarmů
Už to mám tak vžité a vyhovuje mi to.
Mám to nastaveno takto:
LIST p=16F88 ; list directive to define processor
#INCLUDE <P16F88.INC> ; processor specific variable definitions
;------------------------------------------------------------------------------
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
v INI
BSF STATUS,RP0
MOVLW b'00001111'
MOVWF ANSEL
; MOVLW b'11010000'
; MOVWF OPTION_REG
; BSF PIE1,ADIE
; BSF INTCON,PEIE
BSF STATUS,RP0
MOVLW b'11100000'
MOVWF ADCON1
BCF STATUS,RP0
MOVLW b'11000001'
MOVWF ADCON0
v podprogramu:
READ_REG
CALL pause
BSF ADCON0,GO; spuštění A/D převodu
BTFSC ADCON0,GO
GOTO $-1
; ---- oddělení setiny a uloží do ADP_DP ----------------
CLRF ADP_DP ; vynuluje registr ADP_DP
MOVF ADP_DP,0 ; přesune obsah ADP_DP do W
BSF STATUS,RP0
BTFSC ADRESL,6
....
Už nevím co s tím, zkoušel jsem spousta nastavení v ADCON0 s časama a nic a nic, nechce to měřit.