|
[ danne @ 15.02.2015. 13:20 ] @
| Pozdrav, kupio sam knjigu "PROGRAMIRANJE MIKROKONTROLERA PicBasic-om" autora Voje Milanovica, i resio da napravim iz nje AC korektor, u knjizi je dato izgled plocice, program i sve lepo. E sad ja kupim delove napravim pcb i zaletujem sve to, isprogramiram PIC i kad resih da probam ne radi nista. 2-3 greske na pcb sam pronasao ali ove softwerske mi teze idu. Instalirao sam Proteus 8 i napravio simulaciju u njemu (doduse bez izlaznih releja i trafoa). Evo prilazem u .RAR zapakovan projekat za Proteus 8 i program, semu pa ako neko ima volje da mim pomogne
Hvala
[Ovu poruku je menjao danne dana 15.02.2015. u 17:15 GMT+1] |
[ npejcic @ 15.02.2015. 14:47 ] @
Proveri koje config fuses treba da podesiš. Koliko vidim u HEX fajlu iz tvoje arhive, uključen je WDT, međutim u kodu nema nigde reseta istog pa je mikrokontroler non stop u resetu. Nikada nisam koristio PBP, ali pretpostavljam da on to ne radi automatski.
Znači isključi WDT prilikom programiranja, pa probaj ponovo. Takođe u HEX-u je podešen XT oscilator, to znači da možeš max 4MHz oscliator ili kristal da koristiš. Dešavalo mi se da neće da zaosciluje ako si potavio recimo 10MHz kristal a podesio XT u config fuses.
[ danne @ 15.02.2015. 16:48 ] @
Probao sam i to ali nista, mora da ima gresaka i u kodu, evo i copy paste .bas coda
'Program korektor napona.
'Meri mrezni napon i zavisno od rezultata merenja
'ukljucuje odgovarajuci relej i tako na autotransformatoru
'bira odgovrajuci izvod zavisno od mreznog napona.
Define ADC_BITS 10 ' Broj bita
Define ADC_CLOCK 1 ' Klok (0=Oscilator /8)
AD_Rez var word ' Rezultat AD konverzije
Napon var word ' Promenljiva za dobijanje napona
TRISA = %11111111 ' Port A je ulazni
TRISC = 0 ' Port D je izlazni
ADCON1 = %10000010 ' Port A je u analognom modu, 0 i 5V su
' referentni naponi a rezultat je desno formatiran.
Dummy var byte ' Promenljiva za 32 bitno delenje i mnozenje
symbol DQ = porte.2 ' DQ linija za termometar
symbol Greska = portb.5 'Linija LED diode greske
symbol Rucni = portb.4 'Linija za identifikaciju rucnog rada
symbol Rucni_rad = portb.2 'Linija za identifikaciju rucnog rada
temperatura Var Word ' Izracunata temperatura
temper1 Var Word ' Izracunata temperatura
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Po stepenu C
Pocetak:
'----------------MERI TEMPERATURU--------------------------------------
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature
Sacekaj:
OWIn DQ, 4, [count_remain] ' Provera da li jos traje
IF count_remain = 0 Then Sacekaj
OWOut DQ, 1, [$CC, $BE] ' Procitaj temperaturu
OWIn DQ, 0, [Temperatura.LOWBYTE, Temperatura.HIGHBYTE, Skip 4, count_remain, count_per_c]
Temperatura = (((Temperatura >> 1) * 100) - 25)+ (((count_per_c - count_remain)*100) / count_per_c)
Temper1 = Temperatura / 100
If Temper1 < 70 Then Radi
High Greska
pause 500
Low Greska
pause 500
High Greska
pause 500
Low Greska
pause 500
High Greska
pause 500
Low Greska
pause 500
PortD = $00
Goto Pocetak
'-------------RAD KOREKTORA------------------------------------------
Radi:
' Procitaj 1 kanal na RA2 i prikazi
ADCIN 2, AD_Rez ' Izvrsi konverziju na RA2 i 16 bita i rezultat smesti u AD_Rez.
Dummy = AD_Rez * 5 * 100
Napon = Div32 1023
Pause 5000 ' Pauza 10 sec
' - - - - Napon 180 - 190 - - - - - - - - - - - - - - - - - -
If AD_Rez > 731 Then RE2
PortC = $01
Goto REE
' - - - - Napon 190 - 200 - - - - - - - - - - - - - - - - - -
RE2: If AD_Rez > 775 Then RE3
PortC = $02
Goto REE
' - - - - Napon 200 - 210 - - - - - - - - - - - - - - - - - -
RE3: If AD_Rez > 811 Then RE4
PortC = $04
Goto REE
' - - - - Napon 210 - 220 - - - - - - - - - - - - - - - - - -
RE4: If AD_Rez > 867 Then RE5
PortC = $08
Goto REE
' - - - - Napon iznad 220 - - - - - - - - - - - - - - - - - -
RE5: PortC = $10
Pause 2000 ' Pauza 2 sekunda
REE:
Goto Pocetak ' Kreni ponovo na merenje
'------------RUCNI RAD----------------------------
Iskljucen:
PortC = $10
Rucni = 1
Return
End ' Kraj programa
[ veselinovic @ 15.02.2015. 20:53 ] @
Imas dosta gresaka u tvom programu.
Na semi su tranzistori na portu D, a u programu na portu C.
Drugo, imas logicku gresku kod IF naredbi.
Upalice uvijek portd.0. Neka je napon 205V, to je vece od 731.
Program na prvom IF-u upali portd.0 i ode na ree, odnosno na pocetak.
Na pocetku ti nedostaje include,
AD konvertor je na pinu RA1, tj treba biti ADCIN 1...
[Ovu poruku je menjao veselinovic dana 15.02.2015. u 22:14 GMT+1]
[ danne @ 15.02.2015. 21:37 ] @
Znam da ima puno gresaka, program nije moj vec iz pomenute knjige, nista polako cu da popravljam. AD konvertor je po semi na pinu RA1 ali na pcb je na RA4 tako da to treba da pise ADCIN 4, AD_Rez * 5* 100, to sam ispravio. I ovo Port D umesto port C, i DQ je na Portc.2 a ne na porte.2 tako da program zasad izgleda ovako (naravno ima jos gresaka):
'Program korektor napona.
'Meri mrezni napon i zavisno od rezultata merenja
'ukljucuje odgovarajuci relej i tako na autotransformatoru
'bira odgovrajuci izvod zavisno od mreznog napona.
Define ADC_BITS 10 ' Broj bita
Define ADC_CLOCK 1 ' Klok (0=Oscilator /8)
AD_Rez var word ' Rezultat AD konverzije
Napon var word ' Promenljiva za dobijanje napona
TRISA = %11111111 ' Port A je ulazni
TRISC = 0 ' Port D je izlazni
ADCON1 = %10000010 ' Port A je u analognom modu, 0 i 5V su
' referentni naponi a rezultat je desno formatiran.
Dummy var byte ' Promenljiva za 32 bitno delenje i mnozenje
symbol DQ = portc.2 ' DQ linija za termometar
symbol Greska = portb.5 'LED 7 dioda greske
symbol Rucni = portb.4 'LED 8 dioda rucni rad
symbol Rucni_rad = portb.2 'Linija za identifikaciju rucnog rada PRekidac
temperatura Var Word ' Izracunata temperatura
temper1 Var Word ' Izracunata temperatura
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Po stepenu C
Pocetak:
'----------------MERI TEMPERATURU--------------------------------------
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature
Sacekaj:
OWIn DQ, 4, [count_remain] ' Provera da li jos traje
IF count_remain = 0 Then Sacekaj
OWOut DQ, 1, [$CC, $BE] ' Procitaj temperaturu
OWIn DQ, 0, [Temperatura.LOWBYTE, Temperatura.HIGHBYTE, Skip 4, count_remain, count_per_c]
Temperatura = (((Temperatura >> 1) * 100) - 25)+ (((count_per_c - count_remain)*100) / count_per_c)
Temper1 = Temperatura / 100
If Temper1 < 70 Then Radi
High Greska
pause 500
Low Greska
pause 500
High Greska
pause 500
Low Greska
pause 500
High Greska
pause 500
Low Greska
pause 500
PortD = $00
Goto Pocetak
'-------------RAD KOREKTORA------------------------------------------
Radi:
' Procitaj 1 kanal na RA2 i prikazi
ADCIN 4, AD_Rez ' Izvrsi konverziju na RA4 i 16 bita i rezultat smesti u AD_Rez.
Dummy = AD_Rez * 5 * 100
Napon = Div32 1023
Pause 5000 ' Pauza 10 sec
' - - - - Napon 180 - 190 - - - - - - - - - - - - - - - - - -
If AD_Rez > 731 Then RE2
PortD = $01
Goto REE
' - - - - Napon 190 - 200 - - - - - - - - - - - - - - - - - -
RE2: If AD_Rez > 775 Then RE3
PortD = $02
Goto REE
' - - - - Napon 200 - 210 - - - - - - - - - - - - - - - - - -
RE3: If AD_Rez > 811 Then RE4
PortD = $04
Goto REE
' - - - - Napon 210 - 220 - - - - - - - - - - - - - - - - - -
RE4: If AD_Rez > 867 Then RE5
PortD = $08
Goto REE
' - - - - Napon iznad 220 - - - - - - - - - - - - - - - - - -
RE5: PortD = $10
Pause 2000 ' Pauza 2 sekunda
REE:
Goto Pocetak ' Kreni ponovo na merenje
'------------RUCNI RAD----------------------------
Iskljucen:
PortC = $10
Rucni = 1
Return
End ' Kraj programa
Sad verovatno fali jos da pin 2 portaB bude ulaz a 4 i 5 izlaz i PortC treba da bude ulaz tacnije portc.2. Ovaj deo za temperaturu dali je dobar?
[ danne @ 16.02.2015. 18:57 ] @
u medjuvremenu drugar mi je prepravio program, pa ako vidite da nesto ne valja da i to izmenimo:
'Program korektor napona.
'Meri mrezni napon i zavisno od rezultata merenja
'ukljucuje odgovarajuci relej i tako na autotransformatoru
'bira odgovrajuci izvod zavisno od mreznog napona.
'Max ulazni napon 260V = 1024 na AD konvertoru
'1/1024 na AD konvertoru = 0.254V ulaznog napona
'160V = 630
'170V = 669
'180V = 709
'190V = 748
'200V = 787
'210V = 827
'220V = 866
'260V = 1024
'konvertovana vrednost * 0.254V = ulazni napon
'konvertovana vrednost * 0.00488V = napon na delitelju
Define ADC_BITS 10 ' Broj bita
Define ADC_CLOCK 1 ' Klok (0=Oscilator /8)
AD_Rez var word ' Rezultat AD konverzije
Napon var word ' Promenljiva za dobijanje napona
TRISA = %11111111 ' Port A je ulazni
TRISB = %00000100 ' Port B
TRISC = %11111111 ' Port C je ulazni
TRISD = %00000000 ' Port D je izlazni
ADCON1 = %10000010 ' Port A je u analognom modu, 0 i 5V su
' referentni naponi a rezultat je desno formatiran.
Dummy var byte ' Promenljiva za 32 bitno delenje i mnozenje
symbol DQ = portc.2 ' DQ linija za termometar
symbol Greska = portb.5 'Linija LED diode greske
portb.5 = 1
symbol Rucni = portb.4 'Linija za identifikaciju rucnog rada
portb.4 = 1
symbol Rucni_rad = portb.2 'Linija za identifikaciju rucnog rada
portb.2 = 1
temperatura Var Word ' Izracunata temperatura
temper1 Var Word ' Izracunata temperatura
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Po stepenu C
PortD = $00 ' Postavi port D na 0 (svi releji ugaseni)
Pocetak:
'----------------MERI TEMPERATURU--------------------------------------
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature
Sacekaj:
OWIn DQ, 4, [count_remain] ' Provera da li jos traje
IF count_remain = 0 Then Sacekaj
OWOut DQ, 1, [$CC, $BE] ' Procitaj temperaturu
OWIn DQ, 0, [Temperatura.LOWBYTE, Temperatura.HIGHBYTE, Skip 4, count_remain, count_per_c]
Temperatura = (((Temperatura >> 1) * 100) - 25)+ (((count_per_c - count_remain)*100) / count_per_c)
Temper1 = Temperatura / 100
If Temper1 < 70 Then Radi
High Greska
pause 500
Low Greska
pause 500
High Greska
pause 500
Low Greska
pause 500
High Greska
pause 500
Low Greska
pause 500
PortD = $00
Goto Pocetak
'-------------RAD KOREKTORA------------------------------------------
Radi:
If portb.2 = 0 Then
Goto Iskljucen
else
portb.4 = 1
endif
' Procitaj 1 kanal na RA1 i prikazi
Pause 1000
ADCIN 1, AD_Rez ' Izvrsi konverziju na RA1 i 16 bita i rezultat smesti u AD_Rez.
Pause 1000
'Dummy = AD_Rez * 5 * 100
'Napon = Div32 1023
'Pause 5000 ' Pauza 10 sec
' - - - - Napon 179 i manje - - - - - - - - - - - - - - - - - -
If AD_Rez > 709 Then RE2
PortD = $01
Goto REE
' - - - - Napon 180 - 190 - - - - - - - - - - - - - - - - - -
RE2: If AD_Rez > 748 Then RE3
PortD = $02
Goto REE
' - - - - Napon 190 - 200 - - - - - - - - - - - - - - - - - -
RE3: If AD_Rez > 787 Then RE4
PortD = $04
Goto REE
' - - - - Napon 200 - 210 - - - - - - - - - - - - - - - - - -
RE4: If AD_Rez > 827 Then RE5
PortD = $08
Goto REE
' - - - - Napon 210 - 220 - - - - - - - - - - - - - - - - - -
RE5: If AD_Rez > 866 Then ALLOFF
PortD = $10
Goto REE
' - - - - Napon 221 i vise - - - - - - - - - - - - - - - - - -
ALLOFF: PortD = $00
'PortD = $10
'Pause 2000 ' Pauza 2 sekunda
REE:
Goto Pocetak ' Kreni ponovo na merenje
'------------RUCNI RAD----------------------------
Iskljucen:
PortD = $00
portb.4 = 0
Pause 2000
Goto Pocetak
'Return
End ' Kraj programa
I dalje mi nije jasan ovaj deo za temperaturu, dioda za gresku temperature mi gori i kad treba i kad ne treba, stim da se program izvrsava normalno
[ veselinovic @ 16.02.2015. 19:16 ] @
Prije pocetka programa stavi portb=0
Inace ovaj dio sa temperaturom je felerican, jer temp ispituje samo pri paljenju kontrolera i nikad vise.
treba ubaciti petlju da ponekad ispita i temp u radu.
Ostalo nisam gledao.
[ milan-markovic @ 18.02.2015. 16:29 ] @
Citat: veselinovic: Prije pocetka programa stavi portb=0
Inace ovaj dio sa temperaturom je felerican, jer temp ispituje samo pri paljenju kontrolera i nikad vise.
treba ubaciti petlju da ponekad ispita i temp u radu.
Ostalo nisam gledao.
Sto se tice merenja temperature uvek ce biti merena temperatura kada program skoci na labelu POCETAK.
Pre ce biti problem u odabiru senzora za temperaturu jer na semi stoji DS1820 a u popisu delova DS18b20 e sad za koji je senzor pisan program to stvarno ne znam.
Pozdrav
[ ZAS011 @ 18.02.2015. 17:53 ] @
I DS1820 i DS18S20 imaju 9-bitnu konverziju tako da kod za merenje temperature odgovara i jednom i drugom.
Za DS18B20 se razlikuje.
[ danne @ 18.02.2015. 18:59 ] @
ja sam iz Proelektronika narucio DS18B20 kao sto pise u popisu delova, mada nebi me iznenadilo da je i to greska. Sta treba da se ispravi za pomenuti i da li je ostalo dobro, ako imate neku ideju slobodno pisite
Hvala
[ ZAS011 @ 18.02.2015. 19:40 ] @
[ danne @ 18.02.2015. 22:16 ] @
Ok nije bas neka "tacna" treci link nema kod. drugi za 628 onaj prvi cu da pokusam da iskoristim, a ostali kod jel dobar?
Hvala
[ ZAS011 @ 18.02.2015. 23:16 ] @
Pazi, ako neko još treba i da izanalizira programkoji si prepisao iz neke knjige (ili izkombinovao dva prepisana programa) i da ti kaže da li je OK ili ne, i ti samo na kraju to da izkompajliraš i napržiš u kontroler,ne znam šta da ti dalje napišem...
Da li je deo BASIC programa napisan za 16F628 ili 16F877 ili 18F8722 ??
Objasni mi u čemu bi trebala da bude razlika između BASC programa i BASIC programa.
[ danne @ 19.02.2015. 15:01 ] @
Hvala na pomoci
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.
|