PIC16F676, konfigurace A/D převodníku

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#16 Příspěvek od fikes »

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

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#17 Příspěvek od procesor »

inicializácia a samotné isr je zmätočné

Uživatelský avatar
Chenzee
Příspěvky: 464
Registrován: 26 čer 2007, 02:00
Bydliště: Vysočina

#18 Příspěvek od Chenzee »

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ý.
Žádnej učenej z nebe nespadl ...

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#19 Příspěvek od MiloPS3 »

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

Uživatelský avatar
strg
Příspěvky: 26
Registrován: 14 říj 2004, 02:00

#20 Příspěvek od strg »

PIC16F88 má okrem ADCON0 aj ADCON1 ktorý tam nemáš nakonfigurovaný. V podprograme READ_REG zle prepínaš banku. Pred čítaním registru ADRESL prepínaš RP1 namiesto RP0. Program sa potom sekne pri čakaní na vynulovanie bitu GO.

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#21 Příspěvek od MiloPS3 »

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

Uživatelský avatar
strg
Příspěvky: 26
Registrován: 14 říj 2004, 02:00

#22 Příspěvek od strg »

OK Maš pravdu to som si nevšimol. Ale to prepínanie banky platí.
:oops:

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

Uživatelský avatar
procesor
Příspěvky: 5284
Registrován: 02 říj 2009, 02:00
Bydliště: PO

#23 Příspěvek od procesor »

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.

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#24 Příspěvek od fikes »

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.

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#25 Příspěvek od MiloPS3 »

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 , :wink:

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#26 Příspěvek od fikes »

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.

Uživatelský avatar
Chenzee
Příspěvky: 464
Registrován: 26 čer 2007, 02:00
Bydliště: Vysočina

#27 Příspěvek od Chenzee »

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. :wink:
Žádnej učenej z nebe nespadl ...

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#28 Příspěvek od fikes »

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.

Uživatelský avatar
MiloPS3
Příspěvky: 259
Registrován: 07 srp 2010, 02:00

#29 Příspěvek od MiloPS3 »

vydis jak je to snadny :wink:

Uživatelský avatar
fikes
Příspěvky: 70
Registrován: 15 lis 2005, 01:00
Bydliště: Trutnov

#30 Příspěvek od fikes »

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.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“