PIC16F676, konfigurace A/D převodníku
Moderátor: Moderátoři
Posílám tedy výpis programu. V programování jsem začátečník. Použil jsem nějaké procedury z inetu a konstrukcí s výpisem v asm. Zařízení má měřit napětí článků baterie LiPOL v nabíječce. Vstupní hodnoty jsou napětí článku 1 = U1, napětí článků 1+2 = U12, napětí článku 1+2+3 = U13 (to z důvodu, aby byl jediný potenciál a vyhnul jsem se složitého zapojení či nějakého přepínání či použití odděleného zdroje napájení pro měřák). Napětí článku 2 vypočítávám U12-U1, napětí článku 3 vypočítávám U13-U12(když je záporné zobrazí se nula), napětí baterie vypočítávám: U12-U13, když je výsledek kladný, zobrazí se U12 (U13=0), když je výsledek záporný, zobrazí se U13. Přenos dat z čidla DS18B20 s 16F88 nechodí, s 16F676 a 16F628 to šlo. Pokud budete mít někdo čas na to kouknout, děkuji předem za rady a opravy. Omlouvám se i za strukturu programu, mám to okoukané z jiných projektů, snad se v tom vyznáte.
- 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 80 x
Zdravím a přeji veselé Velikonoce.
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ý.
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ý.
Žádnej učenej z nebe nespadl ...
chybu mas v nastaveni bank ! v MPLABu dole na liste ti to ukazuje v ktery bance si ...., tak si ji nastav spravne, udelej si hlavni program ze kteryho budes volat ostatni podprogramy pres CALL a na konci bude RETURN spatky do hlavniho, bude to prehlednejsi, jestly pouzivas preruseni a ctes z cidla tak ho zakaz, bude to delat problemy ...., + to co tu bylo uz receno
Kód: Vybrat vše
errorlevel -302
.
.
MOVLW .200
ma staci se podivat
Kó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 ADCON0
OK Maš pravdu to som si nevšimol. Ale to prepínanie banky platí.
Kó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
; ----------
RETURN
Nepochopil som funkciu prerušovacieho systému, kvôli čomu je potrebný, a potom načo je dobrý it-od AD.
Chcelo 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.
Chcelo 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.
Děkuji za připomínky a diskuzi, podívám na to. Abych pravdu řekl, jak procházím jednotlivé procedury abych pochopil jak pracují, tak mi z toho jde hlava kolem a zamotám se v tom, několikrát to opakovaně projíždím. Nakonec si to rozepisuji na papír či do tabulky a ověřuji např. výpočet hodnoty z 8bitového slova. Docela tak potom pochopím pravidla a postup a lépe se orientuji v programu. Je pravda že se to učím a někdy opravdu hledám rady kde se dá. Např. podle serialu v Praktické elektronice či ten kurz myslím z Pandatronu. Kdyby jste ještě něco objevili, prosím o info. Díky moc. Neboli, jak říkala naše matematikářka: Až spočítáte tisíc příkladů, tak vám to pak půjde samo. Takže, hurá do toho.
pokud si ten program trochu zprehlednis tak se v tom pak uz nestratis, nejlepsi je zacit od zacatku, nastavit si pojistky rozsvitit ledku, vis ze procesor bezi.., pak pridas zobrazeni na LCD jenom text "ahoj" treba, LCD bezi ..., pak zobrazeni promene kterou treba po 500ms menis, tim si overis ze prevod HEX na ASCII funguje + ta promena, a nakonec tam muzes pridat ten A/D, timhle zpusobes se taky muzes samozrejme zaseknout ale tim ze to delas postupne vis kde pak hledat problem..... nez kdyz poskladas kompletni kod a nejde
jo, skus se naucit pouzivat BANKSEL ,
jo, skus se naucit pouzivat BANKSEL ,
Máte, prosím, nějaký popis, či odkaz na rady pro začátečníky, jak správně psát program? Jak řadit chronologicky části programu, tj. inicializace, difinice vstupů a výstupů, proměnné, hlavní smyčka, podprogramy, definice znaků, řazení znaků pro zobrazovače LCD řádek po řádku, časové články a pod? Jistě jsem nevyčerpal všechny možnosti. Díky za info.
Takový první návrh: papír, tužka a nakresli si blokové schéma programu. Dle toho pak začni dělat bloky vlastního programu, které spojíš programem nadřazeným. Já osobně to dělám tak (netvrdím, že zcela správně), že mám hlavní smyčku programu a z ní skáču do podprogramů. Dále mám u více stránkových PICů zažité:
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.
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.
Žádnej učenej z nebe nespadl ...
Tak jsem předělal program, opravil chybičky. Nejdříve mám proměnné, pak definice, pak postupně za sebou všechny inicializace, pak úvodní hlášení na displeji zobrazující se po zapnutí a pak je smyčka, v jakém pořadí podprogramy volám, v takovém pořadí jsou za sebou, pokud má podprogram svuj další podprogram, je pod ním, úplně na konci mám časové články, zpoždění, pauzy a pod. Už to vše funguje, měří i teplota. Ani to nedalo moc práce. Díky všem za podporu.
Ahoj všichhni, nemáte, prosím, zkušenost s tím, když máte jako zdroj hodinového signálu externí krystal, jak na stavit parametry pro AD převodník? S interním oscilátorem to měří, s externím krystalem ne.
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.
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.