[ Darko_zed @ 28.10.2009. 18:06 ] @
Pozdrav drugari evo ja sam poceo sa pitanjima kako sam vec i najavio .Krenuo sam da ucim i vezbam sa nekim prostim primerima pa sam vec uocio neke meni nejasne stvari a nigde ne mogu da pronadjem objasnjenja ni postupke kako bi ih resio ,pa da se obratim vama jer kazem ne bih vas menjao za hiljadu knjiga.Evo za pocetak jedno pitanjce od njih hiljadu koliko mislim da postavim :) deo koji me muci za sada je:
TRISA= %11110000 ' RA0..3=Outputs RA4=Input
TRISB= %00000111 ' RB0..RB2=Inputs, RB3..RB7=Outputs
e sada on je ovim definisao ulazne i izlazne portove ali kako bih ja dosao do objasnjenja da ga on nije napisao koji su ulazni a koji izlazni portovi i kako bih ja mogao da na ovaj nacin definisem ulaz izlaz portova od do odredjenog broja ,kako ide postupak na ovaj nacin?poz

[ bogdan.kecman @ 28.10.2009. 18:16 ] @
TRISA registar cuva u svojih 8 bitova (mozes da pises samo po onima kojima ti procesor dozvoljava, ostale ce da ignorise) vrednost da li je RA0 - RA7 ulaz ili izlaz

dakle skroz desni bit je RA0, skroz levi bit je RA7, broj koji pocinje sa % je binarni broj sto znaci da 11110000 znaci da je RA0-RA3 izlaz, posto vrednost 0 znaci izlaz, a RA4-RA7 su ulaz posto 1 znaci ulaz. E sada posto taj uC verovatno ima samo do RA4 on je u komentaru stavio da je RA4 input a ostali 5-7 se ignorisu. Da postoje bili bi ulaz

isto tako za TRISB, on isto tako cuva za RB0 do RB7, kao sto vidis trei bita sa desne strane su 1 znaci RB0-RB2 je ulaz (posto 1 znaci ulaz) a ostali su izlaz (posto su ostali 0 a 0 znaci izlaz) kao sto je i napisao u komentaru

[ Darko_zed @ 28.10.2009. 18:57 ] @
bogdane hvala puno sada mi je jasno .Jos jedno pitanje koje me muci ove veceri ,primer:



If TEMP < 390 Then :Napon punjenja manji od 14.4 Volta

If temp < 477 then ' ako je napon manji od 12.3 idi na pocetak

pa recimo primer termostata:


If TargetTemp < 17500 then ' Not higher than 75 C. (10000+MaxTemp * 100)
If TargetTemp > 7500 then ' Not lower than -25 C. (10000-MinTemp * 100)

ovde mi nije jasno kako su dobili kojim postupkom recimo 14.4 V je broj 390 ,a 12.3 V je 477 i recimo kod programa za termostat 17500 je 75C ,a -25C je 7500 i tako od primera do primera uvek drugacije nikako da skapiram postupak .Ima jos par nekih vrednosti koje se stalno vrte u programima ali to cemo u drugom pitanju kasnije.Hvala puno na odgovoru
[ Stojan Trifunovic @ 28.10.2009. 22:04 ] @
Jednostavno, izmerili su.

Za prvi slucaj verovatno je koriscen (eksterni ili interni) A/D
konvertor. On napon na ulazu pretvara u digitalno stanje od
b'00000000' do b'11111111' (za 8 bita). U primerima koje ste naveli,
ocigledno je upotrebljen A/D konvertor sa vise bitova, jer su i
vrednosti vece od maksimalnog broja koji se moze prikazati sa 8 bita
(255).

Ukoliko je napon akumulatora npr. 12,3V (akumulator je prazan), izlaz
iz A/D konvertora bice .477. Ukoliko je napon = 14,4V (akumulator je
pun) izlaz iz A/D konvertora je 390.

12,3V 477
14,4V 390

Ovde je ocigledno da se sa porastom napona vrednost iz A/D konvertora
smanjuje, pa pretpostavljam da je ulazni signal invertovan (negativna
logika). Ukoliko propustite ove dve vrednosti kroz merni interpolator
(imate na mom sajtu) mozete dobiti i ostale vrednosti. Mrzi me da to
sada uradim, ali verovatno cete dobiti nesto slicno ovome:

10V 500
12,3V 477
14,4V 390
15V 330
18V 100


U drugom primeru imate 75C i vrednost 17500, i -25C i 7500.

-25C 7500
75C 17500

Ovde je za razliku od prethodnog slucaja primenjena "normalna" logika,
pa je vrednost iz A/D konvertora proporcionalna temperaturi. Opet
mozete za dobijanje ostalih vrednosti koristiti merni interpolator, i
dobicete nesto slicno ovome:

-25C 7500
0C 8000
20C 9000
40C 10000
...
75C 17500


Pravila kako se dobijaju ove vrednosti nema. Tacne vrednosti uveliko
zavise od senzora i A/D konvertora. Najgori je slucaj kada su senzori
nelinearni, jer se onda tacne vrednosti najteze racunaju (interpolator
i tu pomaze).

Postupak dobijanja ovih vrednosti se naziva kalibracija, i svodi se na
merenje velicina (napona, temperature...) instrumentom dovoljne
preciznosti, i ocitavanje stanja iz A/D konvertora pri istom
intenzitetu fizicke velicine (naponu, temperaturi..).

Ukoliko ste na primer unimerom izmerili napon akumulatora od 14,4V i
istovremeno iz A/D konvertora dobili vrednost 390, onda vrednost 390
ocigledno odgovara naponu od 14,4V. Izmerite vrednosti za jos par
karakteristicnih tacaka, propustite ih kroz interpolator, i dobijate
sve ostale vrednosti.
[ Darko_zed @ 28.10.2009. 22:53 ] @
kako da izmerim iz A/D konvertora vrednost ,pomocu cega i kako na kom pinu ,kada ,prilikom rada celog sklopa ili?U prvom primeru koriscen je 16F675 ,a u drugom koriscen je 16F628 e sada ako se ne varam da 16F628 nema AD ulaz i kako su to onda uradili , jer u programu nema naredbi za AD konverzaciju.Evo pocetka programa:

Universal thermostat -25/+75 C. *


TRISA= %11110000 ' RA0..3=Outputs RA4=Input
TRISB= %00000111 ' RB0..RB2=Inputs, RB3..RB7=Outputs
CMCON=7 ' Disable comparators

DEFINE LCD_DREG PORTB ' LCD on port B
DEFINE LCD_DBIT 4 ' Data bits B4..B7
DEFINE LCD_RSREG PORTA ' RS on PORTA
DEFINE LCD_RSBIT 1 ' RS on A1
DEFINE LCD_EREG PORTA ' E on PORTA
DEFINE LCD_EBIT 0 ' E on A0
DEFINE LCD_BITS 4 ' LCD 4 bit mode
DEFINE LCD_LINES 2 ' 2 line LCD display

Temperature Var Word ' Temperature storage
TargetTemp Var Word ' Desired Temperature
Hyst Var Word ' Hystereris
V Var Word ' Var. for display
B1 Var Byte ' Byte for TargetTemp calculation
B2 Var Byte ' Byte for TargetTemp calculation
Count_Remain Var Byte ' Count remaining
Count_Per_C Var Byte ' Count per degree C
Sign Var Byte ' +/- sign
Mode Var Byte ' 0=Temp. display, 1=Set Temp, 2=Set Hysteresis
DQ Var PORTA.4 ' One-wire data pin

DATA 46, 224, 20 ' Temp MSB, TEMP LSB, Hysteresis DIV 10

PORTA.2=0 ' Warm Output Low
PORTA.3=0 ' Cold Output Low
Mode=0 ' Temperature display mode

LCDOUT $FE, 1, $FE, $0C ' Clear display, cursor off

Read 0, B1 ' Read TargetTemp MSB
Read 1, B2 ' Read TargetTemp LSB
TargetTemp=B1*256+B2 ' Calculate TargetTemp value (Default=20.0 C.)
Read 2, B1 ' Read Hysteresis
Hyst=10*B1 ' Calculate Hysteresis value (Default= 2.0 C.)


Hvala puno na odgovoru i pomoci
[ rsinisa @ 29.10.2009. 05:24 ] @
Nisi dao šemu, ali se iz programa jasno vidi da se koristi neki "Dallas"-ov jednožični temperaturni davač, recimo DS18S20.
Ja ljudima predložim da prvo pročitaju dokumentaciju komponenti sa kojima rade, da probaju sami, pa tek onda da se obrate za pomoć ako negde zapne jer se tako najpre pročita ono što je potrebno plus se usput pročita i dosta toga što će zatrebati kad-tad. Tako bih i tebi preporučio da pročitaš dokumentaciju za kontroler sa kojim radiš kao i za DS1820 i biće ti sve mnogo jasnije.

Pozdrav.
Sinisha
[ Darko_zed @ 29.10.2009. 18:29 ] @
Da u pitanju je DS 1820 1-WIRE kolo koje u ovom slucaju radi u parazitnom modu jer napajnje dolazi sa DQ data linije,citam ja detaljno i dosta o tome ali pitanje je bilo "kako da izmerim iz A/D konvertora vrednost ,pomocu cega i kako na kom pinu ,kada ,prilikom rada celog sklopa ili?" jer sam upredhodnom pitanju dobio odgovor" Ukoliko je napon akumulatora npr. 12,3V (akumulator je prazan), izlaz
iz A/D konvertora bice .477. Ukoliko je napon = 14,4V (akumulator je
pun) izlaz iz A/D konvertora je 390."
Znaci mene interesuje kako da ocitam stanje iz A/D konvertora da bih to mogao da uporedim sa fizickom velicinom naponom ili temperaturom i izvrsio kalibraciju u programu?


[Ovu poruku je menjao Darko_zed dana 29.10.2009. u 22:00 GMT+1]
[ bogdan.kecman @ 29.10.2009. 23:56 ] @
vrednost AD konvertora citas mikrokontrolerom. Ako je interni AD onda mozes na seriskom portu da imas debug info i da tu saljes vrednosti, mozes da imas lcd na koji to ispises, mozes da imas 1wire comm preko kog ces to da ispises, mozes da preko i2c to posaljes ... dakle, taj info imas na uC-u i treba da ga uC-om prosledis dalje. Mozes na primer da imas dugme, i kad stisnes to dugme uC upise u flash vrednost (ako uC ima svoj slobodni flas na primer)
[ rsinisa @ 31.10.2009. 06:41 ] @
Citat:
Darko_zed:Znaci mene interesuje kako da ocitam stanje iz A/D konvertora da bih to mogao da uporedim sa fizickom velicinom naponom ili temperaturom i izvrsio kalibraciju u programu?

Dao si primer u kome se radi sa DS1820 pa sam stekao utisak da misliš kako se u PIC-u obavlja A/D konverzija. Moja greška, pogrešno protumačeno pitanje.

Pozdrav.
Sinisha
[ Darko_zed @ 31.10.2009. 11:40 ] @
da li bi ovo moglo da mi pomogne da ocitam A/D vrednost i uporedim sa naponom ili temperaturom http://www.rentron.com/PICX2.htm
Hvala Bogdane na odgovoru ali ja jos nisam na tom stepenu znanja da bih mogao ono sto si mi odgovorio da pretvorim u delo ,evo ucim, citam ,trazim, mozgam i kapiram polako.Najlakse bih ukapirao kada bih video neki primer sa semom programom itako sl.Hvala i puno pozdrava
[ Stojan Trifunovic @ 31.10.2009. 12:39 ] @
Evo ovako. Postoje PIC16 mikrokontroleri koji nemaju integrisani A/D
konvertor. Na primer PIC16F84, 16F627, 16F628 i mnogi drugi (naveo sam
samo najpoznatije). Njima je ipak moguce izmeriti analognu vrednost
napona, ali koristeci eksterne A/D konvertore (posebna integrisana
kola) ili par hardversko/softverskih trikova. Program koji bi ovo
radio je tezi, i kao pocetniku ne bih Vam preporucio da pocnete sa
necim takvim.

Postoje opet PIC16 mikrokontroleri koji imaju integrisane A/D
konvertore. Na primer PIC16F88, PIC16F870, PIC16F877...
U PIC16 seriji postoji par tipova ovih A/D konvertora.
8-bitni A/Dkonvertor
10-bitni A/D konvertor
12-bitni A/D konvertor.

Glavna razlika izmedju ovih A/D konvertora je rezolucija merenja.
Ukoliko se meri napon izmedju 0 i +5V osmobitnim A/D konvertorom koji
daje b'00000000' za 0V i b'11111111' za 5V, rezolucija je
5V/256stanja=0.0195V.

Znaci
b'00000000' = 0V
b'00000001' = 0.195V
b'00000010' = 0.390V
b'00000011' = 0.234V
...
b'11111101' = 4.610V
b'11111110' = 4.805V
b'11111111' = 5V

Ukoliko imate 10-btini A/D konvertor, rezolucija je
5V/1024stanja=0.00488V odnosno sledeca:

b'00 00000000' = 0V
b'00 00000001' = 0.00488V
b'00 00000010' = 0.00976V
...
b'11 11111101' = 4.99024
b'11 11111110' = 4.99512
b'11 11111111' = 5V

Isto vazi i za 12-bitni A/D konvertor.

Kod nekih mikrokontrolera sa A/D konvertorima moguce je podesiti da se
umesto maksimalnog napona od +5V (uobicajenog) odabere neki drugi
(nizi). Ovo je pozeljno uraditi ukoliko mikrokontrolerom na primer
merite napon baterije od 1,5V. Nema svrhe uzeti kao maksimalni napon
5V, jer se on nikada nece moci dostici. Logicnije bi bilo odabrati
manji maksimalan napon (ovaj napon naziva se referentni), jer se
ukoliko je maksimalni napon npr. 2V dobilo sledece:

b'00000000' = 0V
...
b'11111111' = 2V

Referentni napon koji mozete ovako izabrati, nazalost ne sme biti veci
od napona napajanja mikrokontrolera, koji je uobicajeno 5V.

Da bi se mogli meriti veci naponi mora se koristiti naponski delitelj
(dva otpornika), kojim bi se ovaj napon "spustio" na dozvoljenih +5V.
Najverovatnije je takav princip primenjen prilikom merenja napona
akumulatora.

Naponski delitelj se mora dimenzionisati tako da "pokriva" i
maksimalni moguci mereni napon. Za akumulator u automobilu morao bi
bez problema meriti i do 18V, jer je moguce dobiti i toliki napon
prilikom veceg broja obrtaja morota.

Znaci:
b'00000000' = 0V
...
b'11111111' = 18V.

Pin koji se koristi za A/D konverziju mozete za Vas primerak
mikrokontrolera naci u datasheetu tog mikrokontrolera bez koga ne
mozete ni zamisliti ikakav rad. Datasheetove mozete naci na
www.microchip.com . Na primer ukucajte u polje za pretragu '16F877
datasheet'.

Vecina mikrokontrolera ima vise ulaza za A/D konverziju. Ovo ne znaci
da ima vise nezavisnih A/D konvertora, vec samo jedan, ali njega u
samom mikrokontroleru prebacuje sa jednog na drugi pin, u zavisnosti
od programa, po potrebi. Kao da ste na jedan jedini pin povezali 8
releja, tako da spolja ukljucenjem samo jednog releja birate koji ce
se napon meriti (kroz koji relej).

Na linku koji ste mi poslali privatnom porukom
http://www.rentron.com/PICX2.htm primenjen je upravo takav princip.
Iskoriscena su 3 A/D konvertora koji se fizicki nalaze na pinovima
porta A (RA0, RA1 i RA3). Meri se napon od minimalnog (0V - oznacenog
sa GND) do maksimalnog (+5V oznaceno sa VCC). Izmerene vrednosti sa
sva 3 A/D konvertora se prikazuju na inteligentnom (ko li mu dade
takvo ime) LCD displeju.
[ Darko_zed @ 01.11.2009. 09:36 ] @
Evo recimo primera programa regulacije punjenja akumulatora to jest njegovog pocetka gde se sve definise pa ako nije problem da mi se neke stvari malo objasne:

"Program za kontrolu punjenja akumulatora" u pitanju je PIC 16F675

temp VAR WORD
ANSEL = 0
GPIO = 0
TRISIO = 0 ' Svi gpio su izlazni
TRISIO.0 = 1 ' Gpio.0 je ulazni

ANSEL = %00110001 ' Postavi ADC takt na Frc i GP0 u analog mod

ADCON0 = %10000001 ' Konfigurisi A/D Modul:
' Desno poravnanje, koristi Vref pin, na kanalu 0

Pocetak:

Petlja:
ADCON0.1 = 1 'Start konverzije
notdone:
IF ADCON0.1 = 1 Then
GOTO notdone 'Ceka low na 1-bitu na ADCON0
Endif

Temp.highbyte = ADRESH ' premsta HIGH byte rezultata u temp
temp.lowbyte = ADRESL ' premesta LOW byte rezultata u temp

if temp > 558 then
goto pun
Endif

Znaci ovde mi nije jasno komanda ANSEL(analog selekt registar)
ANSEL=%00110001 da su prva cetri bita 0001 i da je prvi kanal A/D konverzacije postavljen za ulaz ,dok sledeca tri bita imaju vrednost 011 i da se za A/D konverzaciju koristi takt FRC iz internog oscilatora reda 500hz.Kako mogu iz ovoga ANSEL=%00110001 dobiti podatak o A/D ulazu sto mislim da znam jer da je ANSEL=%00110010 onda bi drug kanal bio ulaz jer se sa desno definisu zar ne?E tu mi je jos i nejasno , sledeca tri bita imaju vrednost 011 da se za A/D konverzaciju koristi takt FRC iz internog oscilatora, kako se dolazi do ovog saznanja jer nema nigde objasnjenja?

Sledece mi je nejasno ADCON0=%10000001 ,najveci bit ima vrednost 1 pa je rezultat desno poravnat dok je bit najmanje tezine takodje postavljen na 1 kako bi A/D modul bio omogucen e sada mi nije jasno zasto bas mora najmanji bit da bude na 1 da bi bio omogucen i kako se uopste podesava sve to.Ovde je u igri koliko vidim samo 8 bita a A/D konvertor je 10 bita jer se to vidi sa ocitavanja jer ima preko 255 stanja (if temp > 558 then).Postoji komanda ADCON0 i ADCON1 u cemu je razlika.Molio bih objasnjenje i za ovo jer mi nije jasna komanda.
Izvinite ako malo davim sa ovakvim pitanjima koja su mozda neka osnova koja treba da se zna imam literaturu ali nije bas detaljno objasnjeno i koce me ovakve stvari a hocu da bas saznam zasto je to tako i objasnjenja o tome kako bih lakse presao na druge stvari.Hvala puno i pozdrav
[ rsinisa @ 01.11.2009. 10:16 ] @
Zanimljivo da na MICROCHIP sajtu ne postoji kontroler 16F675. Da nije 676? U svakom slučaju, imaš sve objašnjeno u PDF-u samo treba pažljivo čitati.
Registar ANSEL odredjuje da li je odgovarajući pin digitalni I/O ili analogni ulaz.
Registar ADCON0 si ispravno protumačio i to tako mora. Znači, konstruktor mikrokontrolera je rekao "kada se setuje bit 0 registra ADCON0, tada će A/D konvertor biti uključen". Kao što je proizvodjač TV-a rekao "kada se pritisne crveno dugme OI na daljincu, tada će TV da se isključi". Znači, ADCON0, ADCON1, kao i još mnogi drugi, su registri (ne komande, komanda je postavljanje sadržaja registra) koji kontrolišu rad kontrolera, i to je jednostavno tako. Zato treba dobro proučiti dokumentaciju i sve će "leći" samo od sebe.
A rezultat konverzije se čita iz druga 2 registra.

Pozdrav.
Sinisha
[ Darko_zed @ 01.11.2009. 10:48 ] @
Greska izvinite ne 16F675 nego 12F675
[ rsinisa @ 01.11.2009. 11:24 ] @
Citat:
Darko_zed:ANSEL=%00110001 da su prva cetri bita 0001 i da je prvi kanal A/D konverzacije postavljen za ulaz ,dok sledeca tri bita imaju vrednost 011 i da se za A/D konverzaciju koristi takt FRC iz internog oscilatora reda 500hz.Kako mogu iz ovoga ANSEL=%00110001 dobiti podatak o A/D ulazu sto mislim da znam jer da je ANSEL=%00110010 onda bi drug kanal bio ulaz jer se sa desno definisu zar ne?E tu mi je jos i nejasno , sledeca tri bita imaju vrednost 011 da se za A/D konverzaciju koristi takt FRC iz internog oscilatora, kako se dolazi do ovog saznanja jer nema nigde objasnjenja?

Moram da priznam da meni nije baš jasno šta tebi nije jasno. Lepo si to analizirao, donja 4 bita odredjuju koji će pin biti analogni, a koji digitalni. U konretnom slučaju bit 0 je postavljen kao analogni, a takodje je preko TRISIO registra taj bit postavljen kao ulazni (tako mora). A podešavanje oscilatora za konverziju je objašnjeno malo niže, a i piše da ima još informacija u dokumentu DS33023.

Citat:
Darko_zed:Sledece mi je nejasno ADCON0=%10000001 ,najveci bit ima vrednost 1 pa je rezultat desno poravnat dok je bit najmanje tezine takodje postavljen na 1 kako bi A/D modul bio omogucen e sada mi nije jasno zasto bas mora najmanji bit da bude na 1 da bi bio omogucen i kako se uopste podesava sve to.Ovde je u igri koliko vidim samo 8 bita a A/D konvertor je 10 bita jer se to vidi sa ocitavanja jer ima preko 255 stanja (if temp > 558 then).Postoji komanda ADCON0 i ADCON1 u cemu je razlika.Molio bih objasnjenje i za ovo jer mi nije jasna komanda.

Ovo sam ti objasnio u prethodnoj poruci. Ako ti i dalje nije jasno, probaj malo detaljnije da opišeš šta te tačno buni.

Pozdrav.
Sinisha
[ Darko_zed @ 01.11.2009. 13:11 ] @
Hvala Sinisa puno, sada su mi neke stvari jos jasnije ,poslusao sam tvoj savet procitao o kontroleru podatke i resio dilemu i razjasnio ANSEL i ADCON0 to jest ukapirao sam da imaju definisana fabricka podesavanja po bitovima kao sto kazes .
Interesuje me sledece iz primera:

ADCON0 = %10000001 ' Konfigurisi A/D Modul:
' Desno poravnanje, koristi Vref pin, na kanalu 0


ovako moje vidjenje stvari , 1 na 7bitu kao sto se vidi iz tabele je komanda za desno poravnanje "Desno poravnanje-iz primera" , e onda iz primera "koristi Vref pin", kako kada je za to zaduzen 6bit a on je na 0 a 0=Vdd a 1=Vref pin?????? i predpostavljam "na kanalu 0" jer je za to zaduzen bit3-2 a on je 00 sto je 00=chanel 00(AN0) a definisano je i TRISIO.0 sto znaci da je Gpio.0 ulazni ako se ne varam(molim ispravku ako gresim).
Ansel registar mi je sada u potpunosti jasan jer se sve vidi iz tabele samo mi nije jasno zasto je u pocetku programa stojalo
ANSEL = 0 sta ovo znaci i nasta utice u programu?
[ rsinisa @ 01.11.2009. 14:51 ] @
Da, dobro si ovo primetio za bit 6 registra ADCON0, po meni je greška u komentaru. Znači, registar je u tom primeru podešen tako da mu je Vref u stvari jednak Vdd. Takodje si u pravu i za bitove 3 i 2, tj. da je odabran kanal 0. A to što je na početku ANSEL postavljen prvo na 0, a malo niže mu je promenjena vrednost, može da bude nekoliko razloga: ili je programer iskoristio početak nekog programa i zaboravio da izbriše, ili programer misli da tako treba, ili jednostavno ne zna da tako ne treba ;). U svakom slučaju je ta prva naredba koja postavlja ANSEL na 0 potpuno nepotrebna.

Pozdrav.
Sinisha

[ rsinisa @ 02.11.2009. 09:22 ] @
Da dodam još jednu stvar koja bi mogla da te buni u tom primeru:

TRISIO = 0 ' Svi gpio su izlazni
TRISIO.0 = 1 ' Gpio.0 je ulazni

Ovo je takodje nepotrebno, dovoljna je jedna naredba:

TRISIO=1 ili binarno TRISIO=%00000001

Pozdrav.
Sinisha
[ Darko_zed @ 02.11.2009. 11:26 ] @
Da Sinisa shvatio sam ,hvala na objasnjenju i pomoci budi pozdravljen.
[ Darko_zed @ 14.12.2009. 15:26 ] @
Pozdrav drugari evo mene opet ,imam mali problem koji ja nisam uspeo da resim .Problem je u sledecem evo programa :


TRISB = %00001000
Pocetak:
PORTB.2 = 1
PORTB.1 = 0
Pause 10
PORTB.2 = 0
PORTB.1 = 1
pause 10
Goto Pocetak

kao sto vidite pin RB3 je ulazni dok su ostali izlazni i sada je stvar u tome kada mi pin RB3 bude "low" ili "high" nebitno ,to ja definisem, ciklus koji se odvija na portu RB1 i RB2 se ne prekida ali da traje jos samo tri sekunde i prekida ciklus do sledece promene stanja na RB3.Sta fali jos i kako u stvari da ostvarim ovo na ovom primeru sto sam dao?Pozdrav i hvala
[ rsinisa @ 14.12.2009. 18:26 ] @
Jedan od načina bi bio uvodjenje interapta na prekoračenje TMR0 ako ti treba vremenska baza još negde. Drugo rešenje, koje mislim da je primerenije tvom nivou poznavanja mikrokontrolera, a i sasvim lepo može da reši ovaj problem, je uvodjenje brojača koji bi se uvećao pri svakom prolasku kroz petlju. Npr ovako:


brojac var byte

TRISB = %00001000
brojac=0

Pocetak:
if portb3.0=0 then ; ili =1, ili ovde ispitaš ono što tebi treba
brojac=1
endif

PORTB.2 = 1
PORTB.1 = 0
Pause 10
PORTB.2 = 0
PORTB.1 = 1
pause 10

if brojac > 0 then
brojac=brojac+1
if brojac=150 then ; 150 * 20 ms pauze je 3 sekunde
brojac=0
; uradi šta hoćeš jer je upravo ispunjen tvoj uslov od 3 sekunde
endif
endif

Goto Pocetak


To je suština, sad ti prilagodi svojim potrebama.

Pozdrav.
Sinisha
[ Darko_zed @ 05.01.2010. 12:21 ] @
Pozdrav i srecna nova godina ,evo dosla i sa novim problemima.Problem mi je u tome sto sam radio nesto sa PIC16F628 i dosao sam do nekih nejasnoca evo ovako:

TRISA= %11110000 ' RA0..3=izlaz RA4=ulaz
TRISB= %00000111 ' RB0..RB2=izlaz, RB3..RB7=ulaz
CMCON=7 ' onemoguci komparator

stvar je u tome sto sam trazio u datasheet-u za kontroler i nisam nasao ovu komandu CMCON=7 da onemogucuje komparator a bez njega mi RA portovi nisu u funkciji izlaza.Ako mi neko moze detaljnije objasniti komande i sta mu znaci =7 sto onemugucuje comparator jer u CMCON REGISTER toga nema.

sledeci problem je :
TRISA= %00000000
TRISB= %00000000
CMCON=7

proba:
porta.1 = 1
pause 500
porta.2 = 1
pause 500
porta.1 = 0
pause 500
porta.2 = 0
pause 500
goto proba2
proba2:
if brojac = 150 then brojac = 0
portb.0 = 1
portb.1 = 0
pause 50
portb.0 = 0
portb.1 = 1
pause 50
if portb.7 = 0 then brojac = brojac + 1
if brojac = 150 then PORTb.0 = 1 : PORTB.1 = 1
IF BROJAC = 150 THEN GOTO proba
goto proba2

problem mi je u tome sto mi portb.0 na izlazu daje 0 i nece da blinka kao portb.1 ,znaci tu su vezane led diodice i jedna treperi ,a druga je ugasena non stop to jest portb.0=0.Na simulaciji radi ,a prakticno nece iako sam menjao dva mikrokontrolera isto jer sam mislio da je on u pitanju.Znaci sve radi super i prolazak kroz petlju sa brojacem ali nece da treperi portb.0 negde gresim ,a ne vidim gde,a neka posebna podesavanja portab nisam nasao .poz
[ *mile* @ 05.01.2010. 16:03 ] @
Pozrdrav,

Kada uneses CMCON = 7, to je isto kao da si uneo CMCON = %00000111, sto znaci da bitove 0, 1 i 2 postavljas na ogicku jedinicu a
ostale 3, 4, 5, 6, 7 na logicku nulu.

Pogledaj malo bolje datasheet.

Srecna vam svima nova godina!!!

[ Darko_zed @ 05.01.2010. 16:44 ] @
hvala druze ukapirao sam a sta je sa drugim problemom mozes li tu pomoci-pocetnik sam.hvala
[ rsinisa @ 06.01.2010. 01:35 ] @
Daj prvo da vidimo ovo sa isptivanjem stanja brojača; ne razumem zašto 3 puta ispituješ da li je brojač došao do 150. Sve to može u jednom IF-u što je logičnije, preglednije i troši manje prog. memorije:

Code:

if brojac=150 then
  brojac=0
  portb.0=1
  portb.1=1
  goto proba
endif


Što se tiče uključenja LED, maltene bih mogao da se opkladim da kada bi zamenio mesta pinovima u programu, da bi dobio obrnutu situaciju, da ti RB0 blinka, a RB1 ostaje isključen, tj. kada bi napisao ovako:

Code:

portb.1 = 1
portb.0 = 0
pause 50
portb.1 = 0
portb.0 = 1
pause 50


Ali nema potrebe da eksperimentišeš sa time, a da ne bih ponovo sve objašnjavao pročitaj ovaj post, velike su šanse da je to problem mada LED ne opterećuje izlazni stepen toliko (valjda si stavio otpornik na svaki LED?):
http://www.elitesecurity.org/p2307376

Pozdrav.
Sinisha
[ Darko_zed @ 06.01.2010. 11:17 ] @
U pravu si cim zamenim mesta u programu dodje do obrnutog stanja ,a sto se tice pinova(portova) oni preko otpornika idu na tranzistore pa tek posle pale led diode .Resio sam problem tako sto sam uzeo slobodni pin sa RA porta i radi super ,mada mi odgovara da bude po starom a probao sam sa "@ nop" komandom i nije se nista promenilo:

portb.1 = 1
@ nop
portb.0 = 0
pause 50
portb.1 = 0
@ nop
portb.0 = 1
pause 50

ovako je izgledalo i nista se ne menja,postoji li nacin da se ovo resi .Pic je 16F628
Poz. Sinisa i srecna nova godina i predstojeci praznici
[ rsinisa @ 06.01.2010. 15:25 ] @
Možda si rešio problem, ali ne i misteriju ;). Šalim se, nema ovde misterije - ovo ponašanje sa zamenom mesta i to da radi sa A portom ukazuje da je problem ono što tvrdim. Imaš tu 2 rešenja:
1. da povećaš pauzu, tj. da staviš više NOP-ova (probaj pa javi), ili
2. da koristiš neku promenljivu umesto direktnog pristupa portu pa da prebaciš njeno stanje na B port. Znači, definišeš promenljivu pod nazivom npr. "bport" i sada setuješ i resetuješ njene bitove (bport.0=1 i bport.1=0) i na kraju uradiš "let portb=bport".

Pozdrav, i tebi takodje (kao i svim prisutnim) Srećna Nova Godina i Božićni praznici.
Sinisha
[ rsinisa @ 06.01.2010. 17:38 ] @
Setih se, ima i treće rešenje, a to je da odjednom postaviš oba bita: portb=%00000010 ili kako već hoćeš samo moraš da vodiš računa i o ostalim bitovima
B porta koji su ti važni.

Pozdrav.
Sinisha
[ Darko_zed @ 06.01.2010. 18:44 ] @
Sinisa probao sam sa ova prva dva resenja i nikako da proradi ,probacu sada sa trecim resenjem pa javljam,a ako bih povecavao pauzu to mi ne bi odgovaralo ,a i sta bi se desilo kada bih koristio recimo RB0 i RB2 da preskocim RB1 bih li tako resio ovaj problem .poz
[ rsinisa @ 06.01.2010. 19:30 ] @
Drugo rešenje bi moralo da radi jer ne dolazi do problema zbog direktnog menjanja B porta. Moram da priznam da mi nije jasno ... Povećanje NOP-ova ne uzima mnogo vremena jer svaki NOP na 4 MHz traje samo 1 µs. Daj šemu da vidimo kako si ti to sve povezao. A to RB1, 2 ili 3 nema nikakve veze.

Pozdrav.
Sinisha
[ Darko_zed @ 06.01.2010. 20:55 ] @
U sustini sam pravio ovo ,potpuno ista sema samo su fetovi drugi slabiji i po jedan je ,a ovde su tri i sluze mi za osvetljenje neke eksperimente izvodim.Gde pise faza+ i faza- tu sam doveo signale sa RB porta direktno,i uvek mi jedna led svetli a druga treperi
kao sto smo i pricali mada ih ja prikljucim i na bazu faza(+) ili (-) bc 337 t20 i t30 ista prica i na gejtovima feta i izlazu i sve isto ,ali kada jedan prebacim na RA port onda radi ok.komandu nop sam pisao ovako @ nop jeli je to ispravno.
portb.1 = 1
@ nop
portb.0 = 0
pause 50
portb.1 = 0
@ nop
portb.0 = 1
pause 50
[ Darko_zed @ 06.01.2010. 21:03 ] @
Gledajuci sada ovu semu mislim da sam z..ebo stvar zato sto sam preopteretio portove tako sto sam baze vezao direktno na njih pa tako prvi port koji se aktivira blokira drugi kao sto si objasnio ,siguran sam u to prepravljam semu(ubacujem otpornik) pa javljam .Kakav propust covece kada zuris, a tek sada sam ga uocio.poz
[ rsinisa @ 06.01.2010. 22:24 ] @
Zato sam ti i tražio šemu KAKO SI POVEZAO, a ne PO KOJOJ SI GLEDAO. Ako nemaš bazne otpornike, to je ozbiljan propust jer tako na pinu nikad nemaš napon veći od 0,7V i opteretiš ga maximalno.
[ Darko_zed @ 16.01.2010. 19:22 ] @
Stavio sam bazne otpornike i sada radi perfektno .Moja greska nisam stavio otpornike i opteretio portb max.
Imam jos jedno pitanje da mi se malo bolje razjasni mada shvatam sustinu ali opet mi nije bas sve bistro ,primer:

u pitanju je PIC 12f675
rezultat VAR WORD
TRISIO = 0 ' Svi gpio su izlazni
TRISIO.0 = 1 ' Gpio.0 je ulazni

ANSEL = %00110001 ' Postavi ADC takt na Frc i GP0 u analog mod -ovo mi je u potpunosti jasno iz datasheeta i vec mi je objasnjeno

ADCON0 = %10000001 ' Konfigurisi A/D Modul:' Desno poravnanje, koristi Vref pin, na kanalu 0 i ovo razumem takodje iz datasheet-a


Pocetak:

Petlja:
ADCON0.1 = 1 ;'Start konverzije -ovo mi nije najjasnije zasto ADCON0.1 sta mu to odredjuje zasto nije samo ADCON0=1 nego i .1 koliko sam ja shvatio to je prvi bit i ima znacenje iz tabele datasheet-a ADCON0
"1 = A/D conversion cycle in progress. Setting this bit starts an A/D conversion cycle."
This bit is automatically cleared by hardware when the A/D conversion has completed

notdone:
IF ADCON0.1 = 1 Then
GOTO notdone 'Ceka low na 1-bitu na ADCON0 -i ovo mi nije jasno kako ceka low prvom bit sta mu to znaci ,trebao bih malo objasnjenje za to recimo sta je low a sta high bit recimo koliko shvatam na ulaznom portu GPPIO.0, kada na njega dolazi napon sa razdelnika
Endif

rezultat.highbyte = ADRESH ' premsta HIGH byte rezultata u temp ;
rezultat.lowbyte = ADRESL ' premesta LOW byte rezultata u temp; i ovo mi nije jasno odakle su ti dobijeni rezultati jer ako su rezultati znaci mere se od negde -kako i gde kada


if temp > 500 then ; definisem sta hocu
Znaci nemogu ukapirati ciklus koji se ovde odvija za ovo sto sam napisao pa bih molio objasnjenje da bih lakse naucio ,ukapirao

[ rsinisa @ 16.01.2010. 20:08 ] @
Jednostavno su konstruktori tako napravili da se AD konverzija "uključi" (aktivira, startuje) tako što setuješ taj bit; on je setovan sve dok traje konverzija, a kada se završi sam PIC ga resetuje i zato se nakon setovanja nadzire taj bit i čeka da se vrati na 0 što je znak da je AD konverzija gotova i da je rezultat smešten u ADRESH i ADRESL (to ADRES nije od adrese već od "A/D RESult", a H i L su viši i niži bajt rezultata, "High" i "Low"). A rezultat sam PIC smešta u te registre, ti nemaš ništa sa tim sem da ih pročitaš kada je konverzija završena.

Pozdrav.
Sinisha
[ Darko_zed @ 16.01.2010. 21:01 ] @
'Ceka low na 1-bitu na ADCON0 evo ovo interesuje ,kada se javlja taj low bit i kako ,a kada je high bit.Ovo me ineresuje konkretno iz seme ako mi mozes objasniti .poz
[ rsinisa @ 16.01.2010. 22:27 ] @
Ne znam šta ti nije jasno, sve sam ti napisao, pročitaj još jednom pažljivo, a pogledaj i original dokumentaciju. Zaista ne razumem kako drugačije da ti objasnim i šta ti tačno nije razumljivo. Nema nikakve veze sa shemom, koju god da upotrebiš AD konvertor radi uvek na istom principu.

Pozdrav.
Sinisha

[ Darko_zed @ 17.01.2010. 11:23 ] @
Znaci to je bukvalno ovo sto pise u datasheet-u

bit 1 GO/DONE: A/D Conversion Status bit:
1 = A/D conversion cycle in progress. Setting this bit starts an A/D conversion cycle.
This bit is automatically cleared by hardware when the A/D conversion has completed.
0 = A/D conversion completed/not in progres


jer je tako setovano u programu ADCON0.1 = 1 znaci high bit '1' je sve dok sam PIC ne odradi proces u sebi to jest ocitavanje i ne setuje sam low '0' i tek tada smesta rezultate u adres i krece program sa izvrsavanjem dalje i tako u krug.Ovako sam ja shvatio.Poz Sinisa i hvala sto se trudis da mi objasnis
[ rsinisa @ 17.01.2010. 15:39 ] @
Da, tako je, samo što program može da ide dalje ako ima potrebe, nije obavezno da čeka u petlji da ADCON0.1 dodje na nulu. U tom slučaju program ode uradi nešto što treba i povremeno proveri da li je konverzija gotova, tj. da li se ADCON0.1 vratio na nulu. Medjutim, sama konverzija traje relativno kratko pa može i da sačeka malo. A rezultat konverzije se prvo smešta u ADRESH i ADRESL pa se tek onda resetuje ADCON0.1.

Pozdrav.
Sinisha
[ Darko_zed @ 17.01.2010. 20:05 ] @
A mozes li mi objasniti zasto postoje ADRESH i ADRESL ,sta se kad meri i upisuje u ove ADRES.Recimo kada je LOW to je '0' sta on tu meri ili isto HIGH .Cemu sluze i mogu li se ti rezultati meriti i upisivati u razlicite promenjive koje se definisu .
Recimo 12f675 je 10bit a/d i ima rezoluciju 1024 stanja za recimo napon koji merim, e sada od tog napona kada je bit
BIT HIGH on meri trenutno stanje i ispisuje u ADRESH ali kada je BIT LOW sta tu ima da se meri to je '0' i zasto uopste postoji ADRESL .poz

[Ovu poruku je menjao Darko_zed dana 17.01.2010. u 21:16 GMT+1]
[ rsinisa @ 17.01.2010. 22:24 ] @
Uh, Darko, Darko ... Mislio sam da si savladao neke osnovne stvari (bez uvrede)... Ajde da probam ukratko neke osnovne stvari. PIC (kao i svi drugi kontroleri) pored programske memorije ima i memorijski prostor za posebne namene u kome se nalaze mapirani (adresirani) registri za kontrolu rada i neke rezultate rada samog PIC-a. Čak su i pinovi mapirani i oni su za PIC ništa drugo do memorijske lokacije u tom SFR segmentu (SFR-Special function registers = registri posebne namene) samo su konstruktori njihove bitove povezali sa spoljnim svetom.
AD konvertor radi tako što za početak mora da ima referentni napon i onda on neki ulazni napon odredjenim metodama (potraži to sam po netu, da ne pišem ovde sada sve) uporedjuje sa tim maximalnim naponom i pretvara ga u binarnu kombinaciju. U konkretnom slučaju imamo 10-bitni AD što znači da je rezultat AD konverzije 10-bitni broj, a pošto su SFR registri u PIC-u 8-bitni, logično je da tih 10 bitova ne može da se smesti u jedan registar pa su zato konstruktori napravili 2 i nazvali ih ADRESH i ADRESL. I sad, ako ti npr. dovedeš na ulazni pin AD konvertora napon jednak Vref, taj binarni broj će biti 1111111111, ako dovedeš masu, biće 0000000000, a napon izmedju će, naravno, imati neku medjuvrednost. Iz rezolucije AD konvertora i Vref-a možeš da izračunaš kolika je minimalna razlika u naponu koju AD konvertor može da izmeri, a u ovom primeru je to 5V/1024 (jer je AD 10-bitni).
AD konvertor u PIC-u nije stalno aktivan, tj. ne meri stalno već čeka komandu za to (mada mora prvo da se uključi i tada on stoji u režimu čekanja), a tu komandu mu daje korisnik tako što setuje bit 1 registra koji se zove ADCON0 i nalazi se na adresi 1Fh (GPIO se npr nalazi na adresi 05h, a TRISIO na 85h). Kada PIC završi AD konverziju rezultat smešta u registre ADRESH i ADRESL i resetuje bit koji je korisnik setovao, tj. bit 1 ADCON0 registra. To ti je npr. kao na onim starim kasetofonima dugme za puštanje muzike, tj. za start kasete - korisnik pritisne to dugme što je znak kasetofonu da treba da krene sa reprodukcijom, a kada se završi on to dugme isključi što je znak da je on tu operaciju odradio.
Rezultat merenja koji se nalazi u ADRESH i ADRESL pokupiš u neke druge promenljive koje sam definišeš i onda radiš sa njima matematiku ili već šta ti treba.
Nadam se da je sada jasnije, a još jednom preporučujem detaljno čitanje originalne dokumentacije za svaki PIC sa kojim radiš.

Pozdrav.
Sinisha
[ Darko_zed @ 17.01.2010. 23:15 ] @
Shvatam ja sve ovo sto si mi objasnio ,kako se vrsi A/D konverzacija i sve to unutar PIC-a ali me je bunilo ovo sa ADRESH i ADRESL ja sam mislio da su to bukvalno dva odvojena rezultata koja se dobijaju iz A/D merenja .E sada to sto su PIC-u 8 bitni registri onda treba mesta za smestiti 10bitne rezultate i tako onda koriste dva registra ADRESH i ADRESL tako sto su oni isto 8 bitni svaki ,i pozajmljuje od ovog drugog 2 bita za smestaj rezultata od 10 bita ,odnosno kako je definisem u ADCON da li ce uzeti od jednog 8 a od drugog 2 bit ili obrnuto ,to je ono
ADFM: A/D Result Formed Select bit
1 = Right justified
0 = Left justified

i vidi se iz seme registra
procitao sam detaljno sve o njemu i nadam se da sam shvatio i ovo sto sam napisao da je to to?
Sinisa hvala ti opet na svemu jer stvarno nemam odakle da detaljnije procitam ovo sto mi ti objasnjavas odnosno usmeravas ka odgovoru na moja pitanja.Imam literaturu ali opet tu nije objasnjeno ovako kako ti objasnjavas nije tako shvatljivo pa te zato malo davim nekim glupim pitanjima, ali sta da radim bolje da pitam nego da se vrtim u krug dal jeste ili nije.Pozdrav i ispravi me ako gresim ,pa se cujemo do sledeceg pitanja ma kakvo bilo:):)




[Ovu poruku je menjao Darko_zed dana 18.01.2010. u 00:27 GMT+1]

[Ovu poruku je menjao Darko_zed dana 18.01.2010. u 00:29 GMT+1]

[Ovu poruku je menjao Darko_zed dana 18.01.2010. u 00:38 GMT+1]
[ rsinisa @ 18.01.2010. 10:31 ] @
Slobodno ti pitaj, zato smo tu, ali su mi tvoja pitanja u jednom momentu bila malo čudna pa sam stekao utisak da si pomešao pojmove i zato sam bio opširniji. A što se tiče poravnjanja, prirodno je da postoji desno poravnjanje, medjutim konstruktori PIC-a su uveli i levo što je jako korisno ako ti je dovoljna 8-bitna rezolucija (u tom slučaju uzmeš stanje iz ADRESH) jer skraćuje uzimanje rezultata; jeste da je tada rezolucija manja, ali za Vref od 5V i dalje je solidna (0,019 V) što je za mnoge primene sasvim dovoljno. Ako ti treba svih 10 bitova onda definišeš promenljivu tipa "word" i pokupiš rezultat ovako:

Code:

rezultat var word

...
...
rezultat.lowbyte=adresl
rezultat.highbyte=adresh
...


Pozdrav.
Sinisha
[ Darko_zed @ 18.01.2010. 17:15 ] @
Da i sa tom rezolucijom 8 bita 255 stanja se sasvim zadovoljavaju potrebe kod mnogih stvari ,hvala opet na objasnjenju i nisam znao da se moze iskoristiti samo 8 bita na ovaj nacin ,veoma korisno ubrzas proces ako nemas potrebe za tolikom preciznoscu jer je i 0,019 v po stanju itekako precizno makar za moje potrebe.poz
[ Darko_zed @ 20.01.2010. 22:39 ] @
Pozdrav evo mene opet ,imam jedno pitanjce vise onako iz radoznalosti jer mi je palo na pamet da li je to moguce mada o tome nisam nista mogao da procitam niti saznam iz ove literature koju posedujem ,a cak se i ne spominje.
Znaci interesuje me da li je moguce da pic izvrsava naredbe u isto vreme iz dva razlicita labela ,znaci paralelno izvrsavanje i citanje naredbi ,evo jednog primera onako bez veze samo radi boljeg objasnjenja :

TRISA = $FF
TRISB = $00

label1:

If porta.0 = 1 Then goto label2

portb.0 = 1
pause 1000
portb.0 = 0
pause 1000
Goto label1

label2:

portb.1 = 0
pause 1000
portb.1 = 1
pause 1000
if porta.1 = 1 then goto label1
Goto label2

E sada mene tu interesuje recimo dok se izvrsava naredba LABEL1 onda se izvrsava samo ona ,a kada se ispuni uslov
If porta.0 = 1 Then goto label2 da predje na LABEL2 da se u isto vreme izvrsava i naredba labela 2 i Labela 1 bez prekida labela 1,pa posle kada se ispuni uslov za povratak na label1 if portb.2 = 1 then goto label1 da se prekine sa izvrsenjem labela 2 a nastavi sa labelom 1 i to bukvalno bez ijedne mili sekunde prekida izvrsenja labela1 za svo vreme ciklusa.Mozda je ovo malo nelogicno i nepotrebno za nekoga ali evo bas me interesuje da li je moguce i koja bi to naredba trebala da se doda u ovaj primer za tako nesto ,ako je moguce.poz
[ rsinisa @ 21.01.2010. 04:59 ] @
Ne, u jednom trenutku može da izvršava samo jednu naredbu, tako je konstruisan.

Pozdrav.
Sinisha
[ Odin D. @ 21.01.2010. 11:25 ] @
Citat:
Darko_zed: Znaci interesuje me da li je moguce da pic izvrsava naredbe u isto vreme iz dva razlicita labela

Treba ti "PIC Duo-Core".
[ Darko_zed @ 22.01.2010. 20:20 ] @
Hvala na odgovorima za labele za paralelan rad.Gledao sam predhodne postove to jest pitanja koja sam postavljao pa sam naisao na jos nesto sto mi nije jasno a procitao sam datasheet za obe komponente za Pic16F628 i DS1820 i nisam razjasnio neke stvari,evo primera :
Universal thermostat -25/+75 C. *


TRISA= %11110000 ' RA0..3=Outputs RA4=Input
TRISB= %00000111 ' RB0..RB2=Inputs, RB3..RB7=Outputs
CMCON=7 ' Disable comparators

DEFINE LCD_DREG PORTB ' LCD on port B
DEFINE LCD_DBIT 4 ' Data bits B4..B7
DEFINE LCD_RSREG PORTA ' RS on PORTA
DEFINE LCD_RSBIT 1 ' RS on A1
DEFINE LCD_EREG PORTA ' E on PORTA
DEFINE LCD_EBIT 0 ' E on A0
DEFINE LCD_BITS 4 ' LCD 4 bit mode
DEFINE LCD_LINES 2 ' 2 line LCD display

Temperature Var Word ' Temperature storage
TargetTemp Var Word ' Desired Temperature
Hyst Var Word ' Hystereris
V Var Word ' Var. for display
B1 Var Byte ' Byte for TargetTemp calculation
B2 Var Byte ' Byte for TargetTemp calculation
Count_Remain Var Byte ' Count remaining
Count_Per_C Var Byte ' Count per degree C
Sign Var Byte ' +/- sign
Mode Var Byte ' 0=Temp. display, 1=Set Temp, 2=Set Hysteresis
DQ Var PORTA.4 ' One-wire data pin

DATA 46, 224, 20 ' Temp MSB, TEMP LSB, Hysteresis DIV 10

PORTA.2=0 ' Warm Output Low
PORTA.3=0 ' Cold Output Low
Mode=0 ' Temperature display mode

LCDOUT $FE, 1, $FE, $0C ' Clear display, cursor off

Read 0, B1 ' Read TargetTemp MSB
Read 1, B2 ' Read TargetTemp LSB
TargetTemp=B1*256+B2 ' Calculate TargetTemp value (Default=20.0 C.)
Read 2, B1 ' Read Hysteresis
Hyst=10*B1 ' Calculate Hysteresis value (Default= 2.0 C.)

Sada u ovome mi nije jasno bas ovo DATA 46, 224, 20 koji su to podaci i cemu sluze u programu jer znam da su MSB i LSB dva registra gde se smestaju podaci o temperaturi u DS-u i sad kako da povezem ovo sa DATA 46, 224, 20 ' Temp MSB, TEMP LSB, Hysteresis DIV 10 ,ovo Hysteresis DIV 10 znaci da se rezultat Hysteresis deli sa deset da bi mogao da se smesti u jednom bitu.Nasao sam ovaj primer sa DS1820 senzorom pa bih zeleo kompletno da ga analiziram deo po deo ,jer su mi mnoge stvari sada jasne u programu za razliku od prvog puta kada sam postavio ovo pitanje pa ga sada zelim do kraja isterati .poz
[ Sepa011 @ 22.01.2010. 21:51 ] @
Ako malo bolje analiziras ceo program
Code:
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* Universal thermostat -25/+75 C.  by R.T.G. van Steenis                  *
'* Compiler : PicBasic Pro 2.45                                            *
'* B0 = Mode switch in (In)            A0 = LCD Enable    (Out)            *
'* B1 = + switch in    (In)            A1 = LCD RS        (Out)            *
'* B2 = - switch in    (In)            A2 = "Warm" Output (Out)            *
'* B3 = Not connected  (Out)           A3 = "Cold" Output (Out)            *
'* B4 = LCD Bit 4      (Out)           A4 = DQ DS1820     (In)             *
'* B5 = LCD Bit 5      (Out)                                               *
'* B6 = LCD Bit 6      (Out)                                               *
'* B7 = LCD Bit 7      (Out            PIC16F628 Code size = 1124 Words    *
'*                                                                         * 
'* Oscillator XP (4 MHz.) - Power up timer enabled - MCR enable            *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

TRISA= %11110000                        ' RA0..3=Outputs RA4=Input
TRISB= %00000111             ' RB0..RB2=Inputs, RB3..RB7=Outputs
CMCON=7                                 ' Disable comparators

DEFINE LCD_DREG PORTB                   ' LCD on port B
DEFINE LCD_DBIT 4                       ' Data bits B4..B7
DEFINE LCD_RSREG PORTA                  ' RS on PORTA
DEFINE LCD_RSBIT 1                      ' RS on A1 
DEFINE LCD_EREG PORTA                   ' E on PORTA
DEFINE LCD_EBIT 0                       ' E on A0
DEFINE LCD_BITS 4                       ' LCD 4 bit mode
DEFINE LCD_LINES 2                      ' 2 line LCD display

Temperature     Var    Word        ' Temperature storage
TargetTemp    Var    Word        ' Desired Temperature
Hyst        Var    Word        ' Hystereris
V        Var    Word        ' Var. for display
B1              Var     Byte            ' Byte for TargetTemp calculation 
B2              Var     Byte            ' Byte for TargetTemp calculation
Count_Remain     Var     Byte        ' Count remaining
Count_Per_C     Var    Byte        ' Count per degree C
Sign        Var    Byte        ' +/- sign
Mode         Var    Byte        ' 0=Temp. display, 1=Set Temp, 2=Set Hysteresis
DQ        Var    PORTA.4        ' One-wire data pin

DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10

PORTA.2=0                               ' Warm Output Low
PORTA.3=0                               ' Cold Output Low
Mode=0                                  ' Temperature display mode  

LCDOUT $FE, 1, $FE, $0C                 ' Clear display, cursor off

Read 0, B1                              ' Read TargetTemp MSB
Read 1, B2                              ' Read TargetTemp LSB
TargetTemp=B1*256+B2                    ' Calculate TargetTemp value (Default=20.0 C.)
Read 2, B1                              ' Read Hysteresis 
Hyst=10*B1                              ' Calculate Hysteresis value (Default= 2.0 C.)  

MainLoop: 
 If PORTB.0=0 then                      ' Mode switch pressed
  Pause 50                              ' Debounce 
  LcdOut $FE, $8F, "*"                  ' Show that command is accepted 
  If PORTB.0=0 then MainLoop            ' Wait until button is released  
  Mode=Mode+1                           ' Increment mode
  If Mode=2 then                        ' Save Target Temperature (Mode1 -> Mode2)
   Write 0, TargetTemp / 256        ' TargetTemp MSB
   Write 1, TargetTemp MOD 256          ' TargetTemp LSB
  EndIf
  If Mode > 2 Then                      ' Save Hysteresis (Mode 2 -> Mode 0) 
   Mode=0                       ' Only 0, 1, 2 are valid
   Write 2, Hyst / 10                   ' Divide Hyst value to fit in Byte
  EndIf
 EndIf

 If Mode =1 then                        ' Set Target Temperature
  LcdOut $FE, $80, "SET TEMPERATURE "   ' Show function
  V=TargetTemp                          ' TargetTemp in V  
  Gosub SelectSign                      ' Select +/blank/- 
  Gosub DisplayTemp                     ' Display Target Temperature
  If (PORTB.1=0) Or (PORTB.2=0) then    ' Up or Down button pushed
   If PORTB.2=0 then                    ' Down button 
    If TargetTemp > 7500 then           ' Not lower than -25 C. (10000-MinTemp * 100)
     TargetTemp=TargetTemp-25           ' Decrease temperuture with 0.25 C.
    EndIf
   EndIf
   If PORTB.1=0 then                    ' Up button
    If TargetTemp < 17500 then          ' Not higher than 75 C. (10000+MaxTemp * 100)
     TargetTemp=TargetTemp+25           ' Increase temperature with 0.25 C.
    EndIf
   EndIf
   GoSub SetTargetTemp                  ' Display TargetTemp and delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode=2 then                         ' Set Hysteresis    
  LcdOut $FE, $80, "HYSTERESIS      "   ' Show function
  Sign=" "                              ' No sign  
  V= 10000+Hyst                         ' Set value for V  
  Gosub DisplayTemp                     ' Display Hysteresis
  If (PORTB.1=0) Or (PORTB.2=0) then    ' Up or down button pushed  
   Sign=" "                             ' No sign for Hysteresis
   If PORTB.2=0 then                    ' Down button
    If Hyst > 10 then Hyst=Hyst-10      ' Not less than 0.1 C.
   EndIf
   If PORTB.1=0 then                    ' Up button
    If Hyst < 1000 then Hyst=Hyst+10    ' Not more than 10.0 C.
   EndIf 
   V= 10000+Hyst                        ' Set value for V
   Gosub DisplayTemp                    ' Display Hysteresis 
   Pause 250                            ' Delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode > 0 then Mainloop              ' Setting TargetTemperature or Hysteresis

 LcdOut $FE, $80, "TEMPERATURE     "    ' Show function

 Output DQ                         ' Make Pin Output
 DQ=0                    ' OneWire line Low
 PauseUs 480                            ' Keep down for 480 µS  
 Input DQ                               ' Make Pin Input
 PauseUs 70                             ' Wait 70 µS
 If DQ=1 then                           ' No presence pulse from DS1820   
  LcdOut $FE, $1, "** No sensor! **"    ' Show message
  Pause 500                             ' Wait 0.5 Sec. 
  Goto MainLoop                         ' Check again
 EndIf

 OWOut DQ, 1, [$CC, $44]               ' Start temperature conversion
WaitLoop: OWIn DQ, 4, [Count_Remain]    ' Check for still busy converting
 If Count_Remain = 0 Then WaitLoop      ' Busy 
 OWOut DQ, 1, [$CC, $BE]        ' Read the temperature
 OWIn DQ, 0, [Temperature.LowByte, Temperature.HighByte, Skip 4, Count_Remain, Count_Per_C]
 Temperature = (((Temperature >> 1) * 100) - 25) + (((Count_Per_C - Count_Remain) * 100) / Count_Per_C)
 if Temperature > 32767 then
  Temperature= ~Temperature
  V= 10000 - Temperature                ' 25 C=12500  0 C=10000  -10 C=9000 
 else
  V= 10000 + Temperature
 EndIf

 If V < TargetTemp - Hyst then          ' Below Target temperature - Hysteresis
  PORTA.2=1                             ' Activate   Warm Output
  PORTA.3=0                             ' Deactivate Cold Output
 EndIf

 If V > TargetTemp + Hyst then          ' Above Target temperature + Hysteresis
  PORTA.2=0                             ' Deactivate Warm output
  PORTA.3=1                             ' Activate   Cold Output
 EndIf

 GoSub SelectSign                       ' +/blank/- Sign 
 GoSub DisplayTemp                      ' Temperature to LCD

Goto MainLoop                ' Do it forever

' SUBROUTINES:
'----------------------------------------
SelectSign:
 If v = 10000 then                      ' Temperature = 0 C.
  Sign=" "                 ' No sign
 Else 
  If v < 10000 then                  ' <> 0
   Sign="-"                ' Temperature below 0 C.     
  Else
   Sign="+"                ' Temperature above 0 C.
  EndIf
 EndIf
Return

'----------------------------------------
DisplayTemp:
 If V >= 10000 then                     ' Above 0 C.      
  Temperature=V-10000                   
 Else                                   
  Temperature=10000-V                   ' Below 0 C. 
 EndIf
 LcdOut $FE, $C0, Sign, DEC (Temperature / 100), ".", DEC2 Temperature, " ",223,"C "
Return

'-----------------------------------------
SetTargetTemp:
 V=TargetTemp
 Gosub SelectSign
 Gosub DisplayTemp 
 Pause 250
Return

'-----------------------------------------

videces da autor pribegava jednom malom triku koji se zove matematika celih brojeva. Ako bi se baktao decimalnim brojevima imao bi jako veliku gresku u racunanju (provereno sa kojekakvim preracunavanjima rezultata A/D konverzije). Em je brze, em je krace (kraci kod).
[ Darko_zed @ 22.01.2010. 22:15 ] @
Mozes li mi malo opsirnije pojasniti, ipak nisam na tom nivou znanja da bih to sam uvideo.Sta konkretno znaci ono ,da bih mogao da sagledam ostatak.poz
[ Sepa011 @ 22.01.2010. 22:32 ] @
Code:
DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10


46*256+224=12000

Ovde autor programa namerno dodaje 10000 vrednost iscitanu sa DS senzora da bi mu citava matematika bila sa celim i pozitivnim brojevima.

sto se vidi iz podprograma
Code:
SelectSign:
 If v = 10000 then                      ' Temperature = 0 C.
  Sign=" "                 ' No sign
 Else 
  If v < 10000 then                  ' <> 0
   Sign="-"                ' Temperature below 0 C.     
  Else
   Sign="+"                ' Temperature above 0 C.
  EndIf
 EndIf
Return


10000 = 0 stepeni.

Lukavo, nema sta.

A "ono" sto si pitao (DATA 46, 224, 20), svaka READ naredba cita podatak, koji je prilikom kompajliranja programa smesten u programski deo memorije i stoga nepromenljiv (da ne zalazim u kontrolere koji mogu da zvrljaju po svom FLASH-u), prema parametru koji joj je prosledjen tako da

posle
Code:
Read 0, B1                              ' Read TargetTemp MSB

B1 ima vrednost 46,... (0 -> prvi element u DATA listi)
posle
Code:
Read 1, B2                              ' Read TargetTemp LSB

B2 ima vrednost 224,...(1 -> drugi element u DATA listi)
i tako redom.
[ Darko_zed @ 22.01.2010. 23:33 ] @
Hoces reci da "B1 ima vrednost 46" i "B2 ima vrednost 224" zato sto je to tako autor definisao ,a nisu neka ocitavanja ili vrednosti iz neke tabele kako sam ja mislio ,jer po onome 46*256+224=12000 ili ti TargetTemp=B1*256+B2 se vidi da su to vrednosti definisane od strane autora .
A sto se tice "DATA 46, 224, 20 ' Temp MSB, TEMP LSB, Hysteresis DIV 10" to znam cija je cija vrednost jer kao sto kazes komandom READ odmah cita iz linije DATA po redosledu Read 0 ,Read 1 , Read 2 jer su tri vrednosti upisane.Pozdrav i ispravi me ako gresim .Hvala
[ rsinisa @ 23.01.2010. 00:06 ] @
Ovo je program koji radi kao termostat, a termostat mora da uporedi trenutnu veličinu sa nekom zadatom da bi znao šta da radi i zato je autor rekao da je početna zadata temperatura 20 stepeni.

Pozdrav.
Sinisha

P.S. Jeste da nije bitno, ali sve mi se čini da bi ovaj program mogao da se prepakuje da stane u 16F627. Nebitno, ali eto kako radi moj mozak - uvek gleda gde može da se odradi neka optimizacija.
[ Sepa011 @ 23.01.2010. 01:00 ] @
Xe xe, naravno da može i to da čita 2 komata DS18B20 (diplomirasmo Teslu po drugi put sa 5)
[ Darko_zed @ 23.01.2010. 22:21 ] @
Citat:
Ovde autor programa namerno dodaje 10000 vrednost iscitanu sa DS senzora da bi mu citava matematika bila sa celim i pozitivnim brojevima.

Ovo ne razumem kako dodaje 10000 na ocitanu vrednost ,koja bi vrednost bila da ne dodaje ,znaci za 0 stepeni?Ispada vrednost bi bila '0',i cemu sluzi ona tabela u datasheet-u za DS senzor digital output za odredjenu temperaturu.Jer kada pretvorim binarni u decimalni zapis izlazi mi sve oko 65000 za temperaturu ispod nule.
Razumeo sam da za svakih 100 je u stvari jedan stepen ali kako smo dosli do toga i sto rece Sinisa da je pocetna zadata temperatura 20 stepeni to je u stvari odavde iz ovoga 46*256+224=12000 ali kako to uskladiti sa ocitanim vrednostima sa senzora , to jos ne mogu bas shvatiti ,nisu mi sve ovce na broju
[ Darko_zed @ 23.01.2010. 22:26 ] @
Izvinite mozda cu vas malo daviti sa pitanjima oko ovoga ali resio sam da ukapiram program sta i kako, jer ce mi mnogo pomoci za dalji rad ,pogotovo je sa senzorima.Citam sve detaljno ali ipak mi je potreban neko drugacije da mi to objasni na nasem jeziku sto bi se reklo ,ajde kad sve naucim pomoci cu i ja vama kada negde zapne
[ Sepa011 @ 23.01.2010. 22:45 ] @
Code:
WaitLoop: 
 OWIn DQ, 4, [Count_Remain]    ' Check for still busy converting
 If Count_Remain = 0 Then WaitLoop      ' Busy 
 OWOut DQ, 1, [$CC, $BE]        ' Read the temperature
 OWIn DQ, 0, [Temperature.LowByte, Temperature.HighByte, Skip 4, Count_Remain, Count_Per_C]
 Temperature = (((Temperature >> 1) * 100) - 25) + (((Count_Per_C - Count_Remain) * 100) / Count_Per_C)
 if Temperature > 32767 then
  Temperature= ~Temperature
  V= 10000 - Temperature                ' 25 C=12500  0 C=10000  -10 C=9000 
 else
  V= 10000 + Temperature
 EndIf


Iz ovoga gore se vidi da autor odmah posle iscitavanja DS senzora prevrce sve u celobrojnu matematiku (mnozi sa 100 -> tu se vec pojavljuje tih 10000 koji te bune).
DS senzor temperature koje su manje od 0 stepeni prikazuje kao 2's komplement (bemliga kako se kaze na nasem jeziku), ali to ti je 'vako: za temperature ispod nule invertujes sve bitove u tvom rezultatu 0=>1 i 1=>0 i opet dobijes ispravnu vrednost (moras samo da zapamtis da je temperatura ISPOD 0), inverziju bitova vrsi operator '~'
[ rsinisa @ 23.01.2010. 23:03 ] @
Citat:
Sepa011:DS senzor temperature koje su manje od 0 stepeni prikazuje kao 2's komplement (bemliga kako se kaze na nasem jeziku)

Kaže se "drugi komplement".

Pozdrav.
Sinisha
[ Sepa011 @ 23.01.2010. 23:31 ] @
Fala mladiću Setio se čika, al' kasno
[ Darko_zed @ 24.01.2010. 00:18 ] @
Znaci zbog toga sto je rezolucija veca od 9 bita moze se izracunati pomocu ova dava registra COUNT REMAIN i
COUNT PER °C gde se smestaju ocitavanja u scratchpad-u(svastari na nasem) ,tako pise.I racuna se po formuli
TEMPERATURE =TEMP READ-25+COUNT_PER_C - COUNT REMAIN/COUNT_PER_C
Interesuju me ova dva registra COUNT REMAIN i COUNT_PER_C kako se i sta upisuje u njih pa je zato po njima napravljena ova formula i zasto je i sta znaci u njoj -25vrednost.Znam da je vrednost rezolucije 16 bita pa se zato upisuje u dva registra ali mi je potrebno malo pojasnjenje o njima posto nista konkretno ne pise.
Jos jedno pitanje posle citanja scratchpad-a the TEMP_READ value is obtained by truncating the 0.5°C bit (bit 0) from the temperature data (see Figure 2). iz tablice je bit o 2 na -1 sto je 0,5C ,pa bit1 2 na 0 je 1C ,pa bit2 2 na 1 je 2C(stepeni) pa tako redom ,e sada me interesuje kako se ovo primenjuje to jest ocitava iz tabele i primenjuje u programu.poz





[ Sepa011 @ 24.01.2010. 11:46 ] @
Code:
Temperature = (((Temperature >> 1) * 100) - 25) + (((Count_Per_C - Count_Remain) * 100) / Count_Per_C)


Temperature >> 1

Ovime se vrsi pomeranje (siftovanje) promenljive Temperature u desno za jedno binarno mesto tako da 21 postaje 20 .. i tako redom. Time je dobijena celobrojna vrednost temperature.

Count_Per_C - Count_Remain

sluzi da se dobije decimalni deo temperature sa vecom rezolucijom od same rezolucije DS1820 senzora (ja vise volim DS18B20 posto ima vecu rezoluciju - programabilno 9, 10, 11 ili 12 bita)

Evo ti i jedan slican/malo drugaciji program sa 2 komada DS18B20

Code:
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* Universal thermostat -25/+75 C.  by R.T.G. van Steenis                  *
'* Digital thermostat (080090-11) from Elektor july_august 2008            *
'* Compiler : PicBasic Pro 2.44                                            *
'* B0 = Mode switch in (In)            A0 = LCD Enable    (Out)            *
'* B1 = + switch in    (In)            A1 = LCD RS        (Out)            *
'* B2 = - switch in    (In)            A2 = "Warm" Output (Out)            *
'* B3 = Not connected  (Out)           A3 = "Cold" Output (Out)            *
'* B4 = LCD Bit 4      (Out)           A4 = DQ DS1820     (In)             *
'* B5 = LCD Bit 5      (Out)                                               *
'* B6 = LCD Bit 6      (Out)                                               *
'* B7 = LCD Bit 7      (Out                                                *
'*                                                                         *
'*                 modify by Niculescu Dan                                 * 
'*                                                                         *
'*         DUAL THERMO 2xDS18B20 ; PIC 16F628A  ; LCD 2x16                 *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

TRISA= %11011111                        ' RA5=Outputs Rest=Input
TRISB= %00000000                         ' RB0..RB7=Outputs
CMCON=7                                 ' Disable comparators

DEFINE LCD_DREG PORTB                   ' LCD on port B
DEFINE LCD_DBIT 4                       ' Data bits B4..B7
DEFINE LCD_RSREG PORTB                  ' RS on PORTB
DEFINE LCD_RSBIT 3                      ' RS on B3 
DEFINE LCD_EREG PORTB                   ' E on PORTB
DEFINE LCD_EBIT 1                       ' E on B1
DEFINE LCD_BITS 4                       ' LCD 4 bit mode
DEFINE LCD_LINES 2                      ' 2 line LCD display

Temperature1     Var    Word        ' Temperature storage Sensor1
Temperature2     Var    Word        ' Temperature storage Sensor2
TempC            Var    Word
Float            Var    Word
TargetTemp         Var    Word        ' Desired Temperature
Hyst             Var    Word        ' Hystereris
V                 Var    Word        ' Var. for display
V2                 Var    Word        ' Var. for display
B1               Var    Byte        ' Byte for TargetTemp calculation 
B2               Var    Byte        ' Byte for TargetTemp calculation
Sign             Var    Byte        ' +/- sign
Mode              Var    Byte        ' 0=Temp. display, 1=Set Temp, 2=Set Hysteresis
DQ                 Var    PORTA.2        ' One-wire data pin
Twist            Var    Bit
Twist2           Var    Bit
Dummy            Var    Byte

DS18B20_9bit     CON %00011111 ; 93.75ms, 0.5°C
DS18B20_10bit     CON %00111111 ; 187.5ms, 0.25°C 
DS18B20_11bit     CON %01011111 ; 375ms,   0.125°C
DS18B20_12bit     CON %01111111 ; 750ms,   0.0625°C  (default)
DS18B20_1_12bit CON %01111111 ; 750ms,   0.0625°C  
DS18B20_2_12bit CON %01111111 ; 750ms,   0.0625°C  

DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10

PORTA.5 = 0                               ' Warm Output Low
PORTA.0 = 0                               ' Cold Output Low
Mode = 0                                  ' Temperature display mode  
Twist = 0
Twist2 = 0

Pause 500
low portb.2
LCDOUT $FE, 1, $FE, $0C                 ' Clear display, cursor off
Pause 250

Read 0, B1                              ' Read TargetTemp MSB
Read 1, B2                              ' Read TargetTemp LSB
TargetTemp = B1 * 256 + B2                    ' Calculate TargetTemp value (Default=20.0 C.)
Read 2, B1                              ' Read Hysteresis 
Hyst= 10 * B1                              ' Calculate Hysteresis value (Default= 2.0 C.)  

 OWOut DQ, 1, [$55, $28,  $4F, $DF, $A0, $01, $00, $00, $7C, $4E, $FF, $FF, DS18B20_12bit] ' Init Sensor 1
 OWOut DQ, 1, [$55, $28,  $4F, $DF, $A0, $01, $00, $00, $7C, $48] 
 OWOut DQ, 1, [$55, $28,  $4F, $DF, $A0, $01, $00, $00, $7C, $B8] 
 OWOut DQ, 1, [$55, $28,  $4F, $DF, $A0, $01, $00, $00, $7C, $BE] 
Pause 1000
 OWIn DQ, 0, [Temperature1.Byte0, Temperature2.Byte1]
LcdOut $FE, $80,  "Senzor1 INIT OK" 
Pause 500


 OWOut DQ, 1, [$55, $28,  $80, $5E, $BF, $01, $00, $00, $63, $4E, $FF, $FF, DS18B20_12bit] ' Init Sensor 2
 OWOut DQ, 1, [$55, $28,  $80, $5E, $BF, $01, $00, $00, $63, $48] 
 OWOut DQ, 1, [$55, $28,  $80, $5E, $BF, $01, $00, $00, $63, $B8] 
 OWOut DQ, 1, [$55, $28,  $80, $5E, $BF, $01, $00, $00, $63, $BE] 
Pause 1000
 OWIn DQ, 0, [Temperature2.Byte0, Temperature2.Byte1] 
LcdOut $FE, $C0,  "Senzor2 INIT OK" 
Pause 1000


MainLoop: 
 If PORTA.6 = 0 then                      ' Mode switch pressed
  Pause 50                              ' Debounce 
LcdOut $FE, 1
 LcdOut $FE, $8F, "*"                   ' Show that command is accepted 
  If PORTA.6 = 0 then MainLoop            ' Wait until button is released  
  Mode = Mode + 1                           ' Increment mode
  If Mode = 2 then                        ' Save Target Temperature (Mode1 -> Mode2)
   Write 0, TargetTemp / 256            ' TargetTemp MSB
   Write 1, TargetTemp MOD 256          ' TargetTemp LSB
  EndIf
  If Mode > 2 Then                      ' Save Hysteresis (Mode 2 -> Mode 0) 
   Mode=0                           ' Only 0, 1, 2 are valid
   Write 2, Hyst / 10                   ' Divide Hyst value to fit in Byte
  EndIf
 EndIf

 If Mode = 1 then
  LcdOut $FE, $80, "SET TEMPERATURE "   ' Show function
  V = TargetTemp                          ' TargetTemp in V  
  Gosub SelectSign                      ' Select +/blank/- 
  Gosub DTemp                           ' Display Target Temperature
  If (PORTA.7 = 0) Or (PORTA.3 = 0) then    ' Up or Down button pushed
   If PORTA.7 = 0 then                    ' Down button 
    If TargetTemp > 7500 then           ' Not lower than -25 C. (10000-MinTemp * 100)
     TargetTemp = TargetTemp - 25           ' Decrease temperuture with 0.25 C.
    EndIf
   EndIf
   If PORTA.3 = 0 then                    ' Up button
    If TargetTemp < 17500 then          ' Not higher than 75 C. (10000+MaxTemp * 100)
     TargetTemp = TargetTemp + 25           ' Increase temperature with 0.25 C.
    EndIf
   EndIf
   GoSub SetTargetTemp                  ' Display TargetTemp and delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode = 2 then                         ' Set Hysteresis  
  LcdOut $FE, $80, "SET HYSTERESIS "    ' Show function
  Sign = " "                              ' No sign  
  V = 10000 + Hyst                         ' Set value for V  
  Gosub DTemp                           ' Display Hysteresis
  If (PORTA.7 = 0) Or (PORTA.3 = 0) then    ' Up or down button pushed  
   Sign = " "                             ' No sign for Hysteresis
   If PORTA.7 = 0 then                    ' Down button
    If Hyst > 10 then Hyst = Hyst - 10      ' Not less than 0.1 C.
   EndIf
   If PORTA.3 = 0 then                    ' Up button
    If Hyst < 1000 then Hyst = Hyst + 10    ' Not more than 10.0 C.
   EndIf 
   V = 10000 + Hyst                        ' Set value for V
   Gosub DTemp                          ' Display Hysteresis 
   Pause 250                            ' Delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode > 0 then Mainloop              ' Setting TargetTemperature or Hysteresis


Output DQ                             ' Make Pin Output
 DQ = 0                              ' OneWire line Low
 PauseUs 480                            ' Keep down for 480 µS  
 Input DQ                               ' Make Pin Input
 PauseUs 70                             ' Wait 70 µS
 If DQ = 1 then                           ' No presence pulse from DS1820   
  LcdOut $FE, $1, "** No sensor! **"    ' Show message
  Pause 500                             ' Wait 0.5 Sec. 
  Goto MainLoop                         ' Check again
 EndIf

'===================================================================================================

Main :
Part1:    
 OWOut DQ, 1, [$55, $28,  $4F, $DF, $A0, $01, $00, $00, $7C, $44] ' Start temp. conversion Sensor1

WaitLoop: 
While not DQ
Wend

OWOut DQ, 1,  [$55, $28,  $4F, $DF, $A0, $01, $00, $00, $7C, $BE]
Pause 500
OWIn DQ, 0, [Temperature1.Byte0, Temperature1.Byte1]
If Temperature1.15 then       
  Temperature1 = ~Temperature1 +1
  Twist = 1
Endif
 
Dummy = 625 * Temperature1
TempC = DIV32 10 
TempC = (Temperature1 & $7FF) >> 4
Float = ((Temperature1.Lowbyte & $0F ) * 25 )>> 2
Temperature1 = TempC * 100 + Float
If Twist then
  V = 10000 - Temperature1               ' 25 C=12500  0 C=10000  -10 C=9000 
  Twist = 0
 else
  V = 10000 + Temperature1
 EndIf
 If V >= 10000 then                     ' Above 0 C.      
  Temperature1 = V - 10000                   
 Else                                   
  Temperature1 = 10000 - V                  ' Below 0 C. 
 EndIf
 GoSub SelectSign                       ' +/blank/- Sign 
 GoSub DisplayTemp                      ' Temperature to LCD

'===================================================================================================
Part2 :    
 OWOut DQ, 1, [$55, $28,  $80, $5E, $BF, $01, $00, $00, $63, $44]  ' Start temp. conversion Sensor2

WaitLoop2: 
While not DQ
Wend

OWOut DQ, 1,  [$55, $28,  $80, $5E, $BF, $01, $00, $00, $63, $BE]
Pause 500
OWIn DQ, 0, [Temperature2.Byte0, Temperature2.Byte1]
If Temperature2.15 then       
  Temperature2 = ~Temperature2 + 1
  Twist2 = 1
Endif
 
Dummy = 625 * Temperature2
TempC = DIV32 10 
TempC = (Temperature2 & $7FF) >> 4
Float = ((Temperature2.Lowbyte & $0F ) * 25 )>> 2
Temperature2 = TempC * 100 + Float
If Twist2 then
  V2 = 10000 - Temperature2              ' 25 C=12500  0 C=10000  -10 C=9000 
  Twist2 = 0
 else
  V2 = 10000 + Temperature2
 EndIf
 If V2 >= 10000 then                    ' Above 0 C.      
  Temperature2 = V2 - 10000                   
 Else                                   
  Temperature2 = 10000 - V2                 ' Below 0 C. 
 EndIf

 GoSub SelectSign                       ' +/blank/- Sign 
 GoSub DisplayTemp                      ' Temperature to LCD


Goto MainLoop                    ' Do it forever

' SUBROUTINES:
'===================================================================================================
SelectSign:
 If v = 10000 then                      ' Temperature = 0 C.
  Sign = " "                           ' No sign
 Else 
  If v < 10000 then                      ' <> 0
   Sign = "-"                          ' Temperature below 0 C.     
  Else
   Sign = "+"                          ' Temperature above 0 C.
  EndIf
 EndIf

 If v2 = 10000 then                     ' Temperature = 0 C.
  Sign = " "                           ' No sign
 Else 
  If v2 < 10000 then                      ' <> 0
   Sign = "-"                          ' Temperature below 0 C.     
  Else
   Sign = "+"                          ' Temperature above 0 C.
  EndIf
 EndIf

Return


'===================================================================================================
DisplayTemp:
 If V >= 10000 then                     ' Above 0 C.      
  Temperature1 = V - 10000                   
 Else                                   
  Temperature1 = 10000 - V                  ' Below 0 C. 
 EndIf


 If V2 >= 10000 then                    ' Above 0 C.      
  Temperature2 = V2 - 10000                   
 Else                                   
  Temperature2 = 10000 - V2                 ' Below 0 C. 
 EndIf


LcdOut $FE, $80,  "INT : ", Sign," ", DEC (Temperature1 / 100), ".", DEC2 Temperature1, " ",223,"C " 
LcdOut $FE, $C0,  "EXT : ", Sign," ", DEC (Temperature2 / 100), ".", DEC2 Temperature2, " ",223,"C " 
Return

'===================================================================================================
SetTargetTemp:
 V = TargetTemp
 Gosub SelectSign
 Gosub DTemp 
 Pause 250
Return
'===================================================================================================
DTemp :
 If V >= 10000 then                     ' Above 0 C.      
  Temperature1 = V - 10000                   
 Else                                   
  Temperature1 = 10000 - V                  ' Below 0 C. 
 EndIf
LcdOut $FE, $C0, Sign," ", DEC (Temperature1 / 100), ".", DEC2 Temperature1, " ",223,"C " 
Return

'============================================= END OF PROGRAM ======================================

[ Darko_zed @ 24.01.2010. 13:27 ] @
hvala na odgovoru i znam da se siftuje za jedno mesto u desno ali mi nije sve bas najjasnije zasto se bas 2na1 (ne znam kako se pise ono malo jedan gore) pomera za jedno mesto ,zasto bas od drugog bita krece .Nije mi bas najjasniji ovaj ceo proces ,ne mogu nikako da stvorim sliku u glavi.Znam da se u dva registra po 8 bita, LS byte i MS byte upisuju podaci ocitavanja.

Imam jos jedno pitanje isto u vezi tvog odgovora
Citat:
Count_Per_C - Count_Remain
sluzi da se dobije decimalni deo temperature sa vecom rezolucijom od same rezolucije DS1820 senzora

treba mi malo bolje objasnjenje i za ova dva registra sta se u kome smesta i kako se dobija decimalni deo i povecanje rezolucije samog senzora.
[ Sepa011 @ 24.01.2010. 14:53 ] @
Citat:
Darko_zed: hvala na odgovoru i znam da se siftuje za jedno mesto u desno ali mi nije sve bas najjasnije zasto se bas 2na1 (ne znam kako se pise ono malo jedan gore) pomera za jedno mesto ,zasto bas od drugog bita krece .Nije mi bas najjasniji ovaj ceo proces ,ne mogu nikako da stvorim sliku u glavi.Znam da se u dva registra po 8 bita, LS byte i MS byte upisuju podaci ocitavanja.

Imam jos jedno pitanje isto u vezi tvog odgovora

treba mi malo bolje objasnjenje i za ova dva registra sta se u kome smesta i kako se dobija decimalni deo i povecanje rezolucije samog senzora.


Siftuje se jedno mesto u desno posto bit na poziciji 20 nosi informaciju o 1/2 stepena 28, 27, 26, 25, 24, 23, 22 i 21 sadrze informaciju o celobrojnim stepenima, odn. 1, 2, ... Ako ne odsiftujes ovih 8 bitova udesno (ne oslobodis se decimalnog dela), onda bi morao stalno da 'gledas' (LOOKUP) u neke tablice da bi imao podatak o temperaturi. Ovako 00000001 = 1, 00000010 = 2, binarna reprezentacija celih brojeva .



Posto je datasheet za DS1820 malko nakaradno napisan, u njemu nije bas najbolje opisano sta su Count_Remain i Count_Per_C, ali to su ti 2 memorijske lokacije u Scratch Pad-u koje se iscitavaju iz senzora (jedan od razloga zasto ne koristim 1820 vec 18B20 je veca rezolucija senzora)


[Ovu poruku je menjao Sepa011 dana 24.01.2010. u 23:09 GMT+1]
[ Darko_zed @ 24.01.2010. 15:24 ] @
Shvatio sam zasto se siftuje zato sto u registru su zapisi o celobrojnim stepenima 1,2,4,8,16,32,64,128 i 256 ,e sada kako se gledaju ovi zapisi recimo zapis 256 stepeni kada senzor meri do +125 , i kako mislis "bit na poziciji 20"?
[ Darko_zed @ 24.01.2010. 22:11 ] @
Mislim da bit 2na -1 nosi 0,5 stepeni ako se ne varam.
[ Sepa011 @ 24.01.2010. 22:15 ] @
axm, nije vise 20 nego 20. preskocilo se u formatiranju

a i ne moze 2546 stepeni. Imas i temperature ispod nule, a tada se temperatura prikazuje kao 'drugi komplement', kad pogledas u tablicu u datasheet videces da je MSBajt 11111111 a i u LSBajtu preovladjuju jedinice.

kod nekih kompajlera, bez obzira na mikrokontroler, postoje promenljive tipa INT (Integer) koje mogu da imaju vrednost izmedju -127 i +128 (xa, MSB = 1, ostatak predstavljen kao 'drugi komplement').
[ Darko_zed @ 24.01.2010. 23:00 ] @
Ma ovo nikako da shvatim
Temperature = (((Temperature >> 1) * 100) - 25) + (((Count_Per_C - Count_Remain) * 100) / Count_Per_C)
to bi bilo ovo samo sto ti kazes mnozi se sa 100 da bi za nula stepeni dobio 10000 i radio sa celim brojevima ,a ovo je iz datasheeta
TEMPERATURE =TEMP READ-25+COUNT_PER_C - COUNT REMAIN/COUNT_PER_C znaci ista formula samo se ne mnozi i siftuje ali kazi mi evo na prost nacin kako da dodjem do 10000 kada bih sam ovako na papiru hteo da resim formulu ,koje su mi vrednosti COUNT_PER_C,COUNT REMAIN, ali da gledamo formulu iz naseg primera sa mnozenjem sa 100.Znaci kada bi bilo 10000 to je nula ,kako doci do te vrednosti pesice na papiru?poz
[ Sepa011 @ 25.01.2010. 08:15 ] @
Ajmo da probam da raspetljam, mozda sam negde bio nejasan. Uzecemo za primer temperaturu od +25.5

+25.2 = 00000000 00110011 (prestacu u nastavku da prikazujem visi bajt posto je 0)

ako ovo 00110011 direktno pretvoris u decimalni prikaz dobije se 51 sto, slozices se, nema nikakve veze sa +25.5 stepeni.

00110011 >> 1 = 00011001 siftovanje u desno za jedno mesto (u prevodu binarno deljenje sa 2)

pretvoreno u decimalni prikaz dobija se 25

Ovo ti je, nadam se, pojasnjenje za prvi deo tvog pitanja. Posto nisam nikada koristio DS1820, nisam ni imao potrebe da preterano setaljno citam njegov datasheet da bih dokucio sta su Count_Per_C i Count_remain, mada mislim da su to vrednosti registara senzora koje je proizvodjac ostavio dostupnima korisniku da moze da preciznije izracunava temperaturu (kada mu je potrebna rezolucija bolja od 0.5 stepeni).

Nadam se da si u par mojih odgovora primetio da sam pominjao da, kada mi je potrebno, koristim DS18B20 senzor.
[ Darko_zed @ 26.01.2010. 22:30 ] @
Ok shvatam sustinu samo mi pojasni jos sledece uzeo si npr. +25.5C to je 00110011 binarno odnosno 51 ,i da bi dobio ceo broj siftujes u desno to razumem kako i zasto ali sta se desava sa onih 0.5C sto gubimo siftovanjem (deljenjem) da li dobijamo gresku ili smanjujemo preciznost posto si siftovanjem dobio ceo broj 25C a u stvari je 25.5C.Hvala na pomoci i pozdrav.
[ Sepa011 @ 27.01.2010. 08:57 ] @
Paz' 'vako:

pošto ti operišeš sa promenljivima koje si iščitao iz senzora (i koje se, dok ih ne izmeniš na bilo koji način, nalaze u RAM-u) raznoraznom matematikom, na tebi je da smisliš kako ćeš doći do željenog rezultata.

Šiftovanjem u desno, za jedan bit, dobijaš CELOBROJNI deo temperature (u našem, već pominjanom primeru, 25 stepeni). Pomoću Count_Per_C i Count_Remain se iyračunava DECIMALNI deo temperature.

Dallas-Maxim je u kasnijim verzijama senzora to odradio interno (DS18S20 i DS18B20)

Na slici 4 u prikačenom datasheet-u imaš objašnjeno kako DS1820 interno radi. 2 oscilatora sa različitim temperaturnim koeficijentima, 2 brojača, ....
[ Darko_zed @ 27.01.2010. 21:50 ] @
aha znaci tako to ide al ga komplikuju .Imam jos jedno pitanje za onih -25 sto si mi poslao isecak iz datasheet-a ,onaj binarni
deo daje decimalni broj 206 sto je u stvari -25 (zato sto je visi bajt MSB na 1 koja odredjuje (-)),a 0 C je bin. 11111111 ili dec 255 da ne pokazujemo visi bajt (ostalih osam jedinica jer je razlika u decimalnom zapisu ista) e tu me buni sledece ako je
255=0C a 206=-25C razlika u decimalnom broju je 49 ili bin. 110001 a to ispada -24.5 stepeni a ako se siftuje onda je -24C .
Ovo me buni kako je dobio -25C ,izvini ako davim ali idem dok ne isteram do kraja jos ovo me buni ,a kao sto kazes zamenicu i ja senzor stavicu noviji jer ko da se je.e sa ovim starim slozenim.hvala i pozdrav
[ Darko_zed @ 28.01.2010. 20:36 ] @
Jos samo ovo i necu vise
[ Stojan Trifunovic @ 01.02.2010. 22:47 ] @
Dallas-ov datasheet uopste nije dovoljno precizan u opisu COUNT_REMAIN
i COUNT_PER_C registara.

Darko, pogledaj tehniku za povecanje rezolucje senzora sa mog sajta.
[ Sepa011 @ 02.02.2010. 14:38 ] @
Stojane, ako Darko stigne da procita to sto je na tvom sajtu. Inace, u programcetu u kome ima njemu nejasnih delova je bas ta metoda (ili veeeeoooooma slicna) upotrebljena. U stvari, iscitavaju se registri brojaca sa velikim temperaturnim koeficijentom i brojaca sa jako malim temperaturnim koeficijentom i onda se te dve vrednosti uvode u 'matematiku', sto je kod 18B20 i 18S20 vec odradjeno u samom senzoru.

Ne 'postizavam' jos i da raspetljam taj deo 'cvora' za Darka, sustigle obaveze
[ Stojan Trifunovic @ 02.02.2010. 15:31 ] @
Ne znam dovoljno dobro basic komande za PIC, pa stoga ni ne mogu
vise pomoci. Na mom sajtu nema programa. Data je samo teorija.
Pretpostavljao sam da se koristi slican postupak, i zato sam smatrao
da bi mogla biti od pomoci.
[ Sepa011 @ 02.02.2010. 20:31 ] @
Stojane, uopste nemoj da se uzbudjujes po ovom pitanju, stoji u datasheet-u od DS1820, al' mlogo zakukuljeno, t.j. lose objasnjeno.
[ Darko_zed @ 05.02.2010. 21:56 ] @
Ljudi hvala puno na objasnjenju sada mi je jos jasnije procitao sam sa sajta sadrzaj i pojasnile su mi se neke stvari mada me jos malo po nesto zbunjuje oko COUNT_REMAIN i COUNT_PER_C ,ali cu definitivno da proucim ove novije DS senzore kao sto Zoran preporucuje jer je definitivno u pravu.Ako mozete samo da mi objasnite zadnje moje pitanje oko onog -25C .Pozdrav
[ Sepa011 @ 13.02.2010. 21:12 ] @
@Darko_Zed
Nadam se da si malko sam dokucio sta se desava sa -25?

@rsinisa
el ovo jedna od tvoji' slicki
[ rsinisa @ 13.02.2010. 21:48 ] @
Moja slicka? Ne, ali je simpaticna.

[ Darko_zed @ 13.02.2010. 22:11 ] @
Zorane iskreno nisam ni imao vremena ,a ni volje bas da saznam zasto je -25C jer si bio u pravu da bih trebao koristiti noviju seriju DS senzora sa vecom rezolucijom i manje je komplikovanije od ove pa tako da sam bas i izgubio volju mada mi je jos ostalo nerazjasnjeno kako je -25.Pozdrav
[ Darko_zed @ 18.02.2010. 14:36 ] @
Ha, evo mene opet ,dobio sam malo vremena pa da nastavim sa ucenjem ovih picova ne citati "pikova" vec kao sto je Vuk rekao citaj kako je napisanoSada imam sledece pitanje na koje sam dobio neke odgovore u ranijim postovima ali me sada konkretno zanima PIC12F675 odnosno kako da procitam iz njega trenutnu vrednost A/D konvertora i kako da ga prikazem na LCD displeju ili PC ili vec kako?Citao i citao i nikako da to naucim .Poz
[ rsinisa @ 18.02.2010. 15:03 ] @
Darko, pa to gradivo, čitanje A/D konvertora, smo već prešli. Na LCD displeju ne možeš da ga prikažeš jer nemaš dovoljno pinova, a za slanje ka PC-u upotrebiš npr. serijsku komunikaciju.

Pozdrav.
Sinisha

P.S. Čitati, čitati i samo čitati :)
[ Darko_zed @ 18.02.2010. 15:41 ] @
Znam Sinisa da ne mogu procitati na LCD samo pomocu ovog pica ali sam mislio da mozda ima nekih pomocnih kola koja mogu to ocitati iz njega i to prikazati na displeju ali nikako to nisam mogao da nadjem a da to sredim pomocu serijske komunikacije sa PC nisam bas siguran da to mogu sam uraditi jer nemam ama bas nikakve osnove ni literature da procitam.Za USB je lakse ali ovaj pic nema podrsku za ovaj vid komunikacije preko USB-a.Ako imas koju literaturu ili me makar uputi gde da nadjem malo gradivo ili neki primer ili kako sve to funkcionise pa da to skapiram jer me pre svega interesuje ovaj pic sa 8 pina,a za ostale nije problem to sam vec ukapirao.Postoji li neki program za PC koji to ocitava ili kako vec to ide?"poz i hvala
[ rsinisa @ 18.02.2010. 16:14 ] @
Imaš varijantu za serijsku kontrolu LCD-a, npr. ovo:
http://jap.hu/electronic/lcdif.html
Što se tiče PC-a, ako hoćeš samo da vidiš da li komunikacija radi, tj. samo da pošalješ podatke ka PC-ju, možeš da upotrebiš windows-ov hyperterminal, a ako hoćeš nešto korisno da radiš sa podatkom na PC-ju onda moraš da napišeš program, a to je već sasvim druga stvar i nova komplikacija u tvom životu ...

Pozdrav.
Sinisha
[ Darko_zed @ 18.02.2010. 18:02 ] @
Hvala Sinisa za ovo ,e na to sam mislio 3-wire serial LCD interface for the PIC ovo vec sigurno mogu da iskoristim za 12F675 iscitavanje vrednosti A/D konvertora.Za sada bih samo hteo da posaljem podatke PC-u i vidim vrednosti i ne bih da komplikujem zivot za sada vise, dosta je i ovo za pocetak jos se nisam raspetljao sa ovim sto sam zapoceo.Mislio si na hyperterminal ovaj sto se moze koristiti telefon preko njega u Accessories-communications-Hyper terminal i kako to da izvedem i ocitam podatke u njemu?
[ rsinisa @ 18.02.2010. 18:24 ] @
He, pa kao i svaki serijski terminal, podesiš mu parametre konekcije i iste takve i za PIC.

Pozdrav.
Sinisha
[ k_spale @ 18.02.2010. 18:42 ] @
pozdrav,
nov sam na forumu,nisam detaljno procitao temu i mozda ce se pitanje ponoviti.
Zanima me moze li mi ko reci mozeli se u pic basic-u napisati koristenje tmr1
kao brojac impulsa u odredjenom vremenskom periodu i da mi tu vrednost upise u promenjivu bilo kog tipa.
Hvala u napred
[ Darko_zed @ 18.02.2010. 18:46 ] @
A kako bi glasio programcic u picbasic-u za slanje AD_REZ na seriski port PC ako koristimo interni oscilator PIC-a ,ako nije problem,a u podesavanju hyper terminala treba odprilike podesiti prijemni port koliko sam ukapirao
[ k_spale @ 18.02.2010. 18:49 ] @
pozdrav.
Nov sam na ovom forumu i zamolio bih sve za pomoc.
Mozeli se u pic basic-u napisati da tmr1 broji impulse ili meri vreme od impulsa do impulsa,i sve to da upise u promenjivu bilo kog tipa.
Hvala u napred
[ rsinisa @ 18.02.2010. 18:58 ] @
Citat:
k_spale: pozdrav.
Nov sam na ovom forumu i zamolio bih sve za pomoc.
Mozeli se u pic basic-u napisati da tmr1 broji impulse ili meri vreme od impulsa do impulsa,i sve to da upise u promenjivu bilo kog tipa.

Može

Pozdrav.
Sinisha
[ Darko_zed @ 18.02.2010. 19:00 ] @
k_spale druze bolje postavi temu zasebno ,jer isuvise pitanja u jednoj temi koju sam pre svega ja zapoceo napravice konfuziju i nece se znati ko kome odgovara ,a naravno da moze to sto ti hoces samo polako dobices odgovor .
[ rsinisa @ 18.02.2010. 19:04 ] @
Citat:
Darko_zed: A kako bi glasio programcic u picbasic-u za slanje AD_REZ na seriski port PC ako koristimo interni oscilator PIC-a ,ako nije problem,a u podesavanju hyper terminala treba odprilike podesiti prijemni port koliko sam ukapirao

Pogledaj naredbu DEBUG.

Pozdrav.
Sinisha
[ k_spale @ 18.02.2010. 19:52 ] @
ok.postavicu novu temu.hvala
[ Darko_zed @ 18.02.2010. 20:26 ] @
k_spale nema na cemu ,nego tako je lakse za sve nas da pratimo i odgovaramo.pozdrav
[ Darko_zed @ 20.02.2010. 00:01 ] @
Hvala Sinisa shvatio sam ,e samo sada ostaje veza sa serijskim portom a kasnije cu softwerom da se igram pa me zanima mogu li iskoristiti ovu semu za vezu sa serijskim portom za PIC 12F675 konkretno ,i to iskoristiti za slanje podataka u hyperterminal .poz
[ rsinisa @ 20.02.2010. 09:03 ] @
Da, možeš da povežeš prema toj šemi i tako je sigurnije jer će da radi na svim kompjuterima ili uredjajima sa RS232 portom. Možeš da probaš i bez MAX232 tj. direktno preko otpornika, ali moraš da paziš na mod; kod nekih računara direktna veza ne može da radi jer zahteva poštovanje RS232 nivoa, ali na većini PC-jeva može da prodje. Detaljnije informacije pogledaj u PBP uputstvu uz naredbe SERIN i SEROUT.

Pozdrav.
Sinisha
[ Sepa011 @ 20.02.2010. 14:53 ] @
@Darko
C7 mozes isto kao i C10 da vezes na masu (GND), kolce isto radi. Takodje ako je MAX232CPE kondenzatori mogu da budu i blokovi od 100n. Samo kod 'sirovog' MAX232 idu 1uF kondenzatori. Jos kad imas potrebe za konverzijom nivoa (PC: +/- 12V, PIC: TTL 5V, Telit GE862 GSM/GPS modul: CMOS 2.7V), ondak 'vako:
[ Darko_zed @ 20.02.2010. 16:56 ] @
hvala drugari puno ,javljam sta sam uradio i kad krenem da pisem programcic za slanje vrednosti preko DEBUG naredbe ,samo sam u startu video da cu imati malo problema jer ja koristim interni oscilator PIC-a 12F675 pa cu to morati da prilagodim ,ali to sam video na brzaka, ne znam detalje , trenutno sam zauzet drugim poslom,a i nemam kolo max232cpe treba da skoknem po njega.Hvala i pozdrav
[ Sepa011 @ 20.02.2010. 19:25 ] @
Ma ne mora CPE, moze i obican, onda idu elkosi. Sto se tvog softverceta tice, nemoj mnogo da se sekiras, bice ovde pomoci.

Na slici koja je na ovoj stranici, u gornjem desnom uglu se vide elektroliti (upotrebnljen MAX232N - Texas Instruments, ili ICL232)
[ Darko_zed @ 22.02.2010. 11:24 ] @
Jos jedno pitanje u vezi ove komunikacije Pic-a sa hyperterminalom jer jos nemam predstavu kako to izgleda, a to je da li mogu da na ovaj nacin pratim odvijanje procesa odnosno rad programa u Pic-u i tacno pratim izvrsenja naredbi i sve to.poz
[ rsinisa @ 22.02.2010. 12:40 ] @
Ne, to možeš sa ICD-om. Ali zato možeš na neka mesta u programu da postaviš slanje nekih tebi interesantnih promenljivih na serijski port, ili na bilo koji drugi način.

Pozdrav.
Sinisha
[ Darko_zed @ 22.02.2010. 13:06 ] @
znaci ne mogu pratiti ceo proces nego recimo neku vrednost A/D konvertora ili skok sa labela na label ,ili da pratim neki uslov koji zadan odnosno u mom slucaju kada je neki pin HIGH or LOW i u tom smislu nesto sto bi mi u svakom slucaju zavrsavalo itekako posao za pocetak mog ucenja i experimentisanja.Hvala i pozdrav
[ Brelak @ 06.03.2010. 23:01 ] @
Gospodo, imam jedan problemcic. Vrsim komunikaciju PC- uC, sa PC-a saljem podatke i uC odlicno ocitava, medjutim problem je u tome sto uC ocitava samo PRVI koji posaljem a ostale kao da ne vidi. Taj podatak citam iz SBUF registra. Program za slanje podataka je odradjen u C#. Evo koda:

#include <regx52.h>
#include<stdio.h>


void main ()
{
P2 = 0x00;
TMOD = 0x20;
TH1 = 0xfd;
PCON &= 0x7f;
SCON = 0x50;
TCON =0x40;

while (1)
{
P2 = SBUF;
}
}
[ bogdan.kecman @ 07.03.2010. 02:20 ] @
za seriski port ... zgodno je imati jednu plocku sa max-m .. nesto poput http://www.mikroe.com/sr/tools/max232conn/ ...

no .. ako imas pickit2 mozes direkt da ga zabodes na ttl seriski port i da kroz njegov terminal pricas preko istog
[ rsinisa @ 07.03.2010. 09:15 ] @
Citat:
Brelak: Program za slanje podataka je odradjen u C#. Evo koda:

#include <regx52.h>
#include<stdio.h>


void main ()
}


Ne bih da ispadne da zvocam, ali ovaj post ne odgovara temi.

Pozdrav.
Sinisha
[ Brelak @ 07.03.2010. 20:38 ] @
a jbg, nisam provalio uopste, registrovao sam samo ono "za sve sto mi nije jasno" :D Nista onda, izvin'te momci.

@bogdan.kecman: napravio sam plocicu sam max232.
[ Darko_zed @ 23.10.2010. 09:40 ] @
Pozdrav drugari ,evo mene posle duze pauze .
Sledeci problem mi je u tome sto ja mislim da je PIC neispravan, a nisam jos kupio drugi da to utvrdim nego ajde rekoh da pitam vas mozda sam i zeznuo stvar negde mada ........
Semu sam odradio po sledecem to jest uzeo vec gotovu za kontrolu punjenja akumulatora samo sto sam promenio razdelnik napona na A/D ulazu zbog druge vrednosti koje merim .Desava mi se to da recimo kada dostigne gornju granicu napon po programu on iskljuci relej i prebaci na label ''cekanje'' gde ceka taj pad napona ispod donje vrednosti koju sam definisao i ponovo ukljuci i ponovi proces ,ali desi se da dostigne gornju granicu i iskljuci sve pa prebaci na ''cekanje'' ali taj luft od par volti izmedju donje i gornje granice ne ispostuje u cekanju vec odmah vrati na pocetak cim padne recimo par milivolti od gornje granice recimo 300-400 mV ,a uslov je 2-3 V pada napona.
Program je sledeci:

Code:
temp VAR WORD
 ANSEL = 0
 GPIO = 0
 TRISIO = 0         
 TRISIO.0 = 1        ' Gpio.0 je ulazni

ANSEL = %00110001     

ADCON0 = %10000001    
                    

Pocetak:                    
                
Petlja:
        ADCON0.1 = 1    
notdone:
        IF ADCON0.1 = 1 Then 
        GOTO notdone    
        Endif
        
        Temp.highbyte = ADRESH    
        temp.lowbyte = ADRESL    
 
        if temp > 620  then
        goto iskljuci
        Endif



        GPIO.5 = 1  ' ukljuci led  -  zelena
        GPIO.4 = 0  ' iskljuci led -  crvena
        GPIO.2 = 1  ' ukljuci relej
        goto Pocetak

' - - dostignut zeljeni napon  - - - - - - - -

iskljuci:
        GPIO.5 = 0   ' iskljuci led  - zelenu
        GPIO.4 = 1   ' iskljuci crvenu led
        GPIO.2 = 0   ' iskljuci relej
cekanje:
        ADCON0.1 = 1    
notdone1:
        IF ADCON0.1 = 1 Then 
        goto notdone1    
        EndIf
        
        Temp.highbyte = ADRESH    
        temp.lowbyte = ADRESL    

        If temp < 460 then   
        goto Pocetak
        EndIF

        GPIO.5 = 1
        PAUSE 300          ' blinka zelena 
        GPIO.5 = 0
        PAUSE 300
    
        Goto cekanje
        end

Evo i seme:
[ Sepa011 @ 23.10.2010. 11:36 ] @
Evo tebi nesto da naprzis u PIC-onju (pisano u Proton+ PicBasic-u)

Code:
Device 12F675
Xtal 4

Declare Adin_Res 10
Declare Adin_Tad 32_FOSC
Declare Adin_Stime 50

ANSEL = %00110001

Input GPIO.0
Output GPIO.2
Output GPIO.4
Output GPIO.5

Symbol Rele GPIO.2
Symbol Crvena GPIO.4
Symbol Zelena GPIO.5

Dim Temp As Word

Clear

Pocetak:
' Izmeri napon akumulatora
Temp = ADIn 0

If Temp > 620 Then
    GoTo Iskljuci
EndIf

High Zelena        ' Upali Zelenu LED
Low Crvena        ' Ugasi Crvenu LED
High Rele        ' Ukljuci Rele
GoTo Pocetak

Iskljuci:
Low Zelena        ' Ugasi Zelenu LED
High Crvena        ' Upali Crvenu LED
Low Rele        ' Iskljuci Rele

Petlja1:
' Izmeri napon akumulatora
Temp = ADIn 0

If Temp < 460 Then
    GoTo Pocetak
EndIf

' Blinka zelena
High Zelena
DelayMS 300
Low Zelena
DelayMS 300
GoTo Petlja1


End


i HEX u prilogu
[ Darko_zed @ 23.10.2010. 11:49 ] @
Hvala Sepa na ovome ,vidim da je program skoro u potpunosti slican mome samo sto je pisano u Protonu koji se malo razlikuje od PBC-a.Probacu naravno da ubacim ovo i da vidim sta se desava ,a i imam proton pa cu se malo i sa njim pozabavitim, nego reci mi vidis li zbog cega mi se eventualno desavalo ono sto sam pitao bas me interesuje gde ja gresim ili nije uopste do mene.Hvala ti u svakom slucaju
[ Sepa011 @ 23.10.2010. 14:26 ] @
Pazi ovako, u Proton-u ne moram da vodim racuna o GO/DONE bit-u da bih video da li je A/D konverzija zavrsena.

BTW, u hex-u koji sam prikacio nisu setovani konfiguracioni bit-ovi kako bi trebalo

treba Interni oscilator, WDT iskljucen, MCLR ukljucen (da bi ti se 'gadjalo sa semom), mada mozes i da ga iskljucis i izbacis otpornik koji ide na MCLR pin (jedna komponenta manje )

Mora da pogledam da li negde imam neki 675 pa da ga turim u razvojni sistem da proverim da li ovo funkcionise.

EDIT:
boktemazo, ovaj EasyPic6 nema izvedene pinove sa 8-mo pinca na eksterne konektore
Probaj simulaciju u Proteus-u

[Ovu poruku je menjao Sepa011 dana 23.10.2010. u 17:15 GMT+1]

Evo ti hex (i sors) koji mozes da uprzis u piconju pa javi kako se ponasa

[Ovu poruku je menjao Sepa011 dana 23.10.2010. u 17:19 GMT+1]
[ Darko_zed @ 06.11.2010. 09:55 ] @
Sepa 011 hvala na ovome ,probacu pa javljam.
Mislis da je problem u mom slucaju to sto mi se AD konverzacija ne zavrsi znaci da odbacim soluciju da mi je PIC u kvaru
[ Darko_zed @ 06.11.2010. 10:00 ] @
Mada evo gledam ceo programcic i veruj mi da su u pitanju gremlini ili sam ja corav u pm. a ono nece pa nece kao sto sam opisao jbg . Verujem da sa tvojim hex ce raditi ali me veruj mi sada ovo zainteresovalo samo tako, da vidim gde je problem
[ veselinovic @ 06.11.2010. 12:30 ] @
Darko,
cini mi se da je greska hardverske prirode.
Prvo bih na mclr stavio neki kond, a i napajanje bih malko ocistio od pikova.
Drugo, ako je akku los ili malog kapaciteta, ili je punjac sa maloim unutrasnjim otporom ( mnogo jak ) C2 pomaze da mjeris vrsni napon ispravljaca, pa ako aku ne pojede te spicove sinusoide eto problema.
Probaj sa manjom vrijednosti c2, ili cak bez njega ( radi se o jednosmjernom naponu akku-a) .
Pomoci ce i neki otpornik ( male vrijednosti, ali velike snage) u seriju sa punjacem.
Dakle prvo mjeri napone na c2 da vidis jel do toga.
Poz.
[ Darko_zed @ 06.11.2010. 12:49 ] @
Ma merio sam naravno i ovo sam prikljucivao na stabilisani ispravljac radi stelovanja gde nema varijacije ni milivolt,a i ovaj sklop mi nece sluziti kao punjac akumulatora. Objasnio sam vec sta mi se desava kada odradi iskljucenje na gornjoj granici voltaze treba znaci sacekati donju granicu koja je navedena u programu i da ponovo ukljuci relej ,a to se ne desava zbog toga sto vec na 2-3 volta ispod gornje granice ponovo ukljuci relej i ne saceka donju koja je recimo jedno 5 V manja od gornje granice .Merio sam napon i na razdelniku napona na AD ulazu i napon je perfektan bez varijacija.Radi jedino tacno i super kada brzo oborim napon na donju granicu u roku od recimo par sekundi ,a kada bih postepeno to radio pocinje da zeza ,odnosno cim padne napon ispod gornje navedene granice pa makar to bilo i 0.5V, sada sam se setio.
Pozdrav
[ Sepa011 @ 06.11.2010. 16:23 ] @
Darko, ima mala ispravka u programu, i mene je zezalo (morao dam drugaru da skarabudzim neki punjac), za koji minut cu da okacim softverce koje radi.

A za to sto tebi ukljucuje ranije, iscitavaj AD konvertor u petlji dok cekas da se dostigne donja granica
A i quick'n'dirty sema je tu

[Ovu poruku je menjao Sepa011 dana 06.11.2010. u 17:57 GMT+1]
[ Darko_zed @ 07.11.2010. 11:37 ] @
Kako mislis da iscitam u petlji ?
[ Sepa011 @ 08.11.2010. 09:18 ] @
Darko, izvini ako sam te zbunio sa izrazom petlja, meni je svaki repetitivni proces petlja.

Inace, kada prikljucis taj tvoj sklop na 'laboratorijski ispravljac', meri napon na tvom razdelniku koji ti je na A/D pinu kontrolera pa sracunaj vrednosti za gornju i donju granicu na kojoj sklop treba da reaguje.

U prilogu source koji ne trepce nikakvim ledarama, samo odradjuje ono sto je tebi interesantno. Da bi tebi radilo kako treba, samo izmeni konstante:
Code:

Dim DonjaGranica As 780
Dim GornjaGranica As 855

U prilogu: izmenjeni source i .hex
[ Darko_zed @ 09.11.2010. 01:45 ] @
Ma naravno Zorane na A/D ulazu sam i merio napon koji je bez varijacija i tako sam i odredio pragove ukljucenja to jest iskljucenja .Onaj programcic sto sam nalepio ovde sam pustio kroz simulator i radi perfektno ,menjao stanje A/D ulaza i lepo radi kada iskljuci na gornjoj ceka tacno donju granicu da bi ponovo ukljucio i nema brljanja da ukljuci na pola vrednosti izmedju donje i gornje .E sada kada to pustim u realnosti problem koji sam opisao se javlja ,mada probacu da izmenim konstante pa da vidim i javljam ali me cudi ovo sto se u programu za simulaciju ponasa normalno ,a ovako nece .Pozdrav
[ Sepa011 @ 09.11.2010. 08:38 ] @
Konstante izracunas veoma prosto. Posto ti je Vdd referentni napon:

Faktor = 5/1024

Gornjagranica = (Izmereni napon za gornju granicu)/Faktor
Donjagranica = (Izmereni napon za donju granicu(/Faktor

Tako da su u programu koji sam okacio to konstante za punjac 12V akumulatora Gornja = 14V, Donja = 12V)

I citava skalamerija se napaja sa akumulatora, a sam ispravljac cine trafo i grec, elektrolita ni na vidiku

Radi k'o iz 3.14cke
[ Darko_zed @ 09.11.2010. 10:52 ] @
Tacno tako ,to je prvo sto sam uradio ali to me ne muci.
[ Sepa011 @ 09.11.2010. 11:12 ] @
Koliki su ti otpornici u razdelniku?
[ Darko_zed @ 28.01.2011. 16:23 ] @
Pozdrav, evo mene opet zapelo mi kod 7-segment led displeja.Do sada nisam nikada radio sa njima ,kada mi je nesto trebalo koristio sam LCD displeje pa sam resio da malo probam sa 7-segmentnim led displejima i nekim za pocetak prostim stvarima .Uz ovo cu priloziti semu po kojoj sam nesto radio i naisao na sledece kako da kazem nejasne stvari ,a to su da zelim da na svakom u ovom slucaju dvocifrenom displeju prikazem drugaciji broj recimo od 11 do 19 .Potrebno mi je objasnjenje rada zato sto su segmenti cifre oba broja vezana na iste vodove iz PIC-a ali su im napajanja po cifri na zasebnim vodovima i sada me interesuje kako pokazuje razlicite cifre i ako su segmenti vezani na istim vodovima sto bi bilo logicno da prikazuje istu cifru sem ako prikazivanje svakog broja je odredjeno vremenski dok je drugi iskljucen i obrnuto pa tako je moguce prikaz razlicitih cifara ako se razume sta sam hteo reci jer sam tako shvatio .Potreban mi je prost primer za prikaz razlicitih cifara u ovom dvocifrenom displeju u Picbasicu kao i objasnjenje rada.Pozdrav
[ m51 @ 29.01.2011. 09:08 ] @
Citat:
Darko_zed:  sem ako prikazivanje svakog broja je odredjeno vremenski dok je drugi iskljucen i obrnuto pa tako je moguce prikaz razlicitih cifara ako se razume sta sam hteo reci jer sam tako shvatio .


Darko, u pravu si. Radi se o tzv. vremenskom multipleksu-načinu koji koristi tromost ljudskog oka. Ukratko-upisivanje svih cifara-na svim displejima se organizuje tako da traje npr. 1/100 sekundi ili 1/50 sekundi. Znači sve cifre se paljenjem onih tranzistora čiji je kolektor na anodi izredaju za pomenuti vremenski interval i tako u krug. Koliko puta je displej kraće uključen u odnosu na 100% uključenost toliko puta treba da smanjiš vrednost otpornika koji ograničavaju struju segmenata.
Ovo je najkraće- ako imaš problema, pošto me znaš, a i ja tebe javi se na pp. pa navrati da to pogledamo.
[ rsinisa @ 30.01.2011. 17:27 ] @
Evo, ovde sam se malo osvrnuo na te displeje i na multipleks, nije mnogo, ali pročitaj, možda pomogne. Za ostalo pitaj šta ti nije jasno.

Pozdrav.
Sinisha
[ Darko_zed @ 31.01.2011. 12:46 ] @
Veliki pozdrav za tebe Sinisa ,
nije problem procitacu samo mislim da si zaboravio link da ostavis .Ukapirao sam neke stvari saznao ,citao o ovome ali nije lose imati vas ovde jer ste mi dosta pomogli i dalje pomazete oko ove oblasti ,hvala na tome!!!
[ Sepa011 @ 31.01.2011. 13:44 ] @
Sinisa, negde ti se "pogubio" link :)

Sto se mene tice, iz nekih svojih razloga, ne volim multipleks. Vise sam pristalica staticnih stvari (cak i kad 'mrdaju') a razlozi:
* Manje zauzetih pinova mikrokontrolera
* Nema treperenja
* ...
[ rsinisa @ 31.01.2011. 21:20 ] @
Gle stvarno, nema ga :). Evo ga sada
http://www.elitesecurity.org/p2148911

Naravno, sve je stvar ukusa, o njima ne vredi raspravljati; ja volim multipleks, veoma je zgodan za par LED cifara, a ja sam to relativno često koristio.
Darko, jel još uvek treba primer za onu gornju shemu ili si shvatio princip? Imaš i na mom sajtu dat primer za PIC panel za 4 cifre, jedino što je multipleks odradjen u INT rutini u ASM-u. Doduše, taj deo je univerzalan, lako se implementira za skoro svaki PIC.

Pozdrav.
Sinisha
[ markoni38 @ 05.02.2011. 08:28 ] @
Pozdrav, video sam komentare o multipleksu.
Ima situacija kad nije stvar ukusa. Ako treba da drajvujete 1000 led segmenata istovremeno tad vam van multipleksa treba napajanje od bar 5-6A.
Ako to isto drajvujete u multipleksu sa uvek oko 60 aktivnih led segmenata tada svodite napajanje na ispoad 1A.
Za velike panoe je obavezan multipleks zbog energetske ustede.
Pozdrav Aca
[ Darko_zed @ 05.02.2011. 09:40 ] @
Pozdrav Aco ,u pravu si naravno jer koliko je displej puta manje ukljucen od 100% ukljucenosti toliko puta vuce manje struje prosto receno i naravno napajanje tih velikih panoa se smanjuje.
Napravio sam brojac sa 4 led segmenta koji ima mogucnost programiranja da stane na zadati broj ,a ujedno i opciju da broji unazad ukoliko je to potrebno .Zadavanje broja se vrsi u stotkama ,desetkama i jedinicama sa posebnim tasterima za to ,a brojanje je u jedinicama.Konkretno odradjeno je za motalicu da automatski stane na zadati broj .Semu i program cu postaviti cim odradim plocicu i isprobam u realnosti jer u simulatoru radi super.Pozdrav
[ rsinisa @ 05.02.2011. 10:02 ] @
Markoni i Darko, niste u pravu. LED se u multipleksu pobudjuje strujom onoliko puta većom koliki je faktor multipleksa, što znači da je ukupna potrošnja ista. Multipleks se najpre koristi da bi se smanjili troškovi izrade, tj. broj komponenti, a i štampa je znatno jednostavnija. Zamisli koliko bi trebalo komponenti za ne-multipleksni LED displej od npr 640 X 480 piksela. Matematika za potreban broj izlaza je jednostavna: ne-multipleks = 640 * 480; multipleks = 640 + 480.

Pozdrav.
Sinisha
[ Darko_zed @ 05.02.2011. 10:33 ] @
Pozdrav Sinisa ,
sto se tice izrade sto si spomenuo i samog rada razumem da se stvar uprostila X puta od ne-multipleksa ,ali ne razumem da ako treba deset displeja da rade u sekundi u multipleksu da tako samo jedan svetli dok su ostali pogaseni i da rade svih deset konstantno bez gasenja i struja za napajanje bude ista u oba slucaja .
Imao sam prilike da radim veliki aparata za punktovanje sa 10 elektroda ,potpuno automatizovan sam redja zice i pravi dimenzije kocki za punktovanje jer se punktuju mreze za betoniranje i snaga je bila oko 100KW.U njemu je deset trafoa za svaku elektrodu po 10KW one sve u istom momentu pritisnu materijal za punktovanje ali se ukljucuje punktovanje jedan po jedan i tako da kad ovaj prvi zavrsi ,trajenje oko 1 sek. ukljucuje drugi i tako redom do kraja i to tako bas zbog toga da bi se izbeglo u momentu 100Kw opterecenja svih deset ukljucenih .Ovo je princip multipleksa kao kod displeja i zato mislim da je struja manja nego u nemultipleksu ali je zato potrosnja ista jer trajanje rada ajde da kazemo kod aparata traji deset sekundi sa po 10Kw po sekundi i jedan sekund sa 100Kw dodje na isto ali je struja manja u multipleksu jer je u pitanju samo 10KW.Pozdrav
[ Sepa011 @ 05.02.2011. 11:54 ] @
Pre izvesnog vremena, gledajuci karakteristike nekih modulcica (16 x 32 RGB), nadjoh da im le potrosnja reda velicine 19W. Za displej osnovne VGA rezolucije 640 x 480 je potrebno 600 takvih "modulcica", sto u najgoroj varijanti potrosnje - beli raster, sve boje ukljucene - dodje oko 12kW. kada se izracuna struja potrebna za pogonjenje 921,600 LEDara dobije se 18,432A, sto bi sa 'prosecnim' radnim naponom LEDare od 3V dalo da je potrebna snaga za takav displej 55.296kW.

Ovde na scenu stupa multipleks, posto je ljudsko oko dovoljno tromo da moze da "usrednji" osvetljaj koji vidi, a ti veliki displeji funkcionicu veoma slicno monitoru, najverovatnije da se pobudjuju linijski (za neke kombinacije modula/softvera/elektronike koja to pogoni) sa osvezavanjem (vertikalna frekvencija) od 6kHz.
[ rsinisa @ 05.02.2011. 17:37 ] @
Vidi Darko, to sa aparatima nije isto što i multiplekes, jer se tamo kroz elektrodu propušta ista struja bez obzira da li se sve eletkrode uključe istovremeno ili radi svaka za sebe. A ti uporno u oba posta ne primećuješ jednu činjenicu; zato ću da ti iskopiram iz oba posta po jednu rečenicu koja je ključna za multipleks da bi intenzitet ostao isti kao i kada nije multipleks:
1) Konkretno, za 4 cifre u multipleksu struja kroz svaki segment treba da bude 4 puta veća od one koja je potrebna za kontinualni režim.
2) LED se u multipleksu pobudjuje strujom onoliko puta većom koliki je faktor multipleksa

Evo, da stanem tu za sada, a ti se javi ako i dalje ima nekih nejasnoća, razjasnićemo taj multipleks ponovo. Ako treba, razjasnićemo celu priču do tančina, možemo da odradimo i neki primer.

Pozdrav.
Sinisha
[ Darko_zed @ 05.02.2011. 18:23 ] @
Ok ,mislio sam da je drugacije .
Mozes li mi objasniti zasto je to tako
Citat:
1)Konkretno, za 4 cifre u multipleksu struja kroz svaki segment treba da bude 4 puta veća od one koja je potrebna za kontinualni režim.
2) LED se u multipleksu pobudjuje strujom onoliko puta većom koliki je faktor multipleksa


Evo par slicica multiplexa i nije mi jasno zasto struja da bude 4 puta veca ,na primer led dioda vuce nekih 20mA ,a u multiplexu sa cetiri diode bi trebala vuci 80mA po komada ,tako sam te ja shvatio.
Pozdrav Sinisa i hvala na objasnjenjima.

[ rsinisa @ 05.02.2011. 18:53 ] @
He, ti uporno mešaš babe i žabe. Jedno je multipleks u komunikaciji, drugo u optici. Probaćemo ovako:
Da bi video svetlost LED-a odredjenog intenziteta potrebno je da ona isija odredjenu količinu energije. Kada je ta količina energije manja, i intenzitet svetla koji vidimo je manji, a važi i obrnuto. Ako LED radi u kontinualnom režimu, i energija koju isijava je kontinualna. Ako npr. radi u multipleksu sa faktorom 4 (znači, radi sa 25% ispune, ili 1/4 vremena), da bi ta energija ostala ista, ona mora da emituje 4 puta veću količinu enerije dok radi. Zbog svoje nesavršenosti, oko će to da vidi kao da se konstantno emituje ista količina svetlosti, a LED mogu bez problema da izdrže taj režim rada - faktor multipleksa može da ide čak do 1000, ali naravno uz odredjene uslove.

Nadam se da je sada malo jasnije, a možemo da proširimo priču i dalje ako treba, mada bi to ipak bilo bolje odraditi u zasebnoj temi.

Pozdrav.
Sinisha

P.S. u stvari, kad sad malo razmislim, kako ti znaš da u primeru komunikacije na slici energija jednog impulsa nije 5 puta veća? Mada, tu oblast ne poznajem i ne mogu da pričam o tome.
[ veselinovic @ 06.02.2011. 13:50 ] @
Darko,
posmatraj energiju umjesto snage.
Energija je P*t, dakle snaga puta vrijeme.
Predpostavimo da je napon konstantan tokom procesa.
Energija je proporcionalna integralu Idt
ili kad se sredi I*t/T, gdje je t period kad je upaljena dioda a T period osvjezavanja displeja.
Ako se radi o nemultipleksu, tj konstantna struja t=T, pa je I=I
Ako je t=T/4 ( za 4 cifre multipleks) onda da bi bila ista energija mora struja biti 4 puta veca.

Pazi sad, tvoji punkt aparati rade isto.
Vari 1 sec sa 1 kA i ima ih recimo 24 komada.
Elem tebi treba 24kAs e sad hoces li to razvuci na pet minuta ili u 1 sekundi svakako ti treba 24kAs.

Valjda se nisam previse zapetljao.

Poz.
[ Darko_zed @ 06.02.2011. 15:58 ] @
Citat:
Vari 1 sec sa 1 kA i ima ih recimo 24 komada.
Elem tebi treba 24kAs e sad hoces li to razvuci na pet minuta ili u 1 sekundi svakako ti treba 24kAs.


to je isto sto sam i ja rekao :

Citat:
U njemu je deset trafoa za svaku elektrodu po 10KW one sve u istom momentu pritisnu materijal za punktovanje ali se ukljucuje punktovanje jedan po jedan i tako da kad ovaj prvi zavrsi ,trajenje oko 1 sek. ukljucuje drugi i tako redom do kraja i to tako bas zbog toga da bi se izbeglo u momentu 100Kw opterecenja svih deset ukljucenih .Ovo je princip multipleksa kao kod displeja i zato mislim da je struja manja nego u nemultipleksu ali je zato potrosnja ista jer trajanje rada ajde da kazemo kod aparata traji deset sekundi sa po 10Kw po sekundi i jedan sekund sa 100Kw dodje na isto ali je struja manja u multipleksu jer je u pitanju samo 10KW.Pozdrav


ali nije to to ,jer u multipleksu bi se racunao faktor multipleksa pa bi bilo 1kAs x24 pa bi na svakoj elektrodi trebalo biti 24kAs 1s i tako dok sve ne odrade posao jedna po jedna.
Jer gledaj ovako kod aparata konkretno ako je potrebno da se neki materijal spoji za
24 sekunde za 1KA po elektrodi ,a ima 24 elektroda onda bi on u multipleksu radio sa 24kA po elektrodi
u sekundi da bi zavrsio posao kao za 24s sa 1KA i tako redom .Samo sto se ovo ne bi nikada primenjivalo u ovom slucaju dok kod led displeja je to obavezno ako zelis imati vise od jednog broja ,a i to je osnova za led panele.
Citat:
1) Konkretno, za 4 cifre u multipleksu struja kroz svaki segment treba da bude 4 puta veća od one koja je potrebna za kontinualni režim.
2) LED se u multipleksu pobudjuje strujom onoliko puta većom koliki je faktor multipleksa


[Ovu poruku je menjao Darko_zed dana 06.02.2011. u 17:08 GMT+1]

[Ovu poruku je menjao Darko_zed dana 06.02.2011. u 17:09 GMT+1]
[ Stojan Trifunovic @ 06.02.2011. 19:06 ] @
Imate četiri displeja. Ukoliko uključite samo jedan (bez multipleksa) tako da on svetli neprekidno, on će svetleti nekim intenzitetom svetla. Obeležimo ga oznakom S. Pri tome će trošiti neku struju I.

Ukoliko imate četiri displeja, i povežete ih u multipleksu tako da svetle prvi, pa drugi, pa treći pa četvrti kao i aparati za punktno zavarivanje, oni će (ukupno) svetleti istim intenzitetom svetla S, trošeći istu količinu struje I.

Međutim!!!

Ukoliko pogledate količinu svetla prvog displeja u prvom slučaju (bez multipleksa) moći ćete primetiti da u drugom slučaju (sa multipleksom) on svetli četiri puta slabije. Razlika je još očiglednija ukoliko ste za displeje koristili podnožja, pa možete iščupati drugi, treći i četvrti displej. Prvi ostaje, ali budući da on sada svetli samo 1/4 vremena, svetleće količinom svetla S/4 i trošiti I/4 struje, odnosno neće svetleti toliko jako koliko bi mogao bez multipleksa.

Ukoliko Vam to ne predstavlja problem, slobodno ga tako koristite. Međutim, ima slučajeva kada se MORA obezbediti ista vidljivost. Na primer ukoliko displeji trebaju biti vidljivi i pri direktnom Suncu. Tada se NAMERNO propušta četiri puta veća struja (ukoliko imate četiri displeja). Količina svetlosti samo jednog displeja sada će biti S, a struja I. Dodate li i ostale displeje (vratite u podnožje), količina svetla svih displeja biće 4S, a struja 4I.

To je sve.
[ electron2008 @ 18.02.2011. 08:00 ] @
Kako isti kod :Universal thermostat -25/+75 C. by R.T.G. van Steenis, naterati da na LCD display ispisuje samo na 1 decimalu ili bez decimala, kako zadatu temp sa hysterezom tako i merenu temperaturu?
[ electron2008 @ 18.02.2011. 12:22 ] @
I jos jedno pitanje u vezi timera 59:59 sa LCD i PIC evo primera:
Code:
Define  LCD_DREG        PORTD      ' I/O port na kome se nalazi LCD
  Define  LCD_DBIT        4          ' Data bits D4..D7
  Define  LCD_RSREG       PORTD      ' RS on PORTD
  Define  LCD_RSBIT       2          ' Register select pin
  Define  LCD_EREG        PORTD      ' E on PORTD
  Define  LCD_EBIT        3          ' Enable pin
  DEFINE  LCD_BITS        4          ' 4-bitni data bus 
  DEFINE  LCD_LINES       2          ' LCD ima dva reda karaktera
  define  OSC 4
  DEFINE BUTTON_PAUSE 100
  symbol set=porta.0              ' Taster setje na PORTA.0
  symbol start=porta.1            ' Taster start se nalazi se na PORTA.1
  symbol led=portb.0
               
'*******************************************************************************
'                           Inicijalizacija
'*******************************************************************************
                            
   trisb=%00000000             ' RB.0...RB.7  output  
   ADCON1=$7                   ' Disable comparators
   

   
   
'*******************************************************************************
'                                Promenljive
'*******************************************************************************
  sec   var word   'gore
  minu  var word   'gore
  sec1  var word   'dole
  minu1 var word   'dole
  
  sec=0
  minu=0
  sec1=0
  minu1=0
  
  
  
  pause 200
 '******************************************************************************
 '                         Podesavanje zadatog vremena
 '****************************************************************************** 

  pocetak:
  
  portb=0
  if set=0 then sec=sec+1
  if sec>=60  then sec=0:minu=minu+1
  if minu>=60 then minu=0
  if start=0 then   odbrojavanje
  
  pause 20

  
  
  lcdout $fe,1, "SET:     ",Dec2 minu,":", Dec2 sec
  
  pause 100
  
  goto pocetak
  


'*******************************************************************************
'                  Odbrojavanje sa prikazom na LCD
'*******************************************************************************
  Odbrojavanje:
  portb=0
  high led
  
  for minu1=0 to minu
  for sec1=0 to sec
  If sec1=60 Then sec1=0:minu1=minu1+1
  If minu1>=60 Then minu1=0 
  
  
  if sec1=sec then  sec=0 
  if minu1=minu then minu=0
  lcdout $fe,$c0, "START:   ",DEC2 minu1,":", DEC2 sec1
  pause 1000
  next sec1
  next minu1
  
  
 low led
 goto Pocetak
  

  end



Gde gresim?
[ Darko_zed @ 18.02.2011. 19:06 ] @
Koji PIC koristis(predpostavljam pic16F628 ) ? Koliko sam video na brzaka je da nisi definisao PORTA, PORTD(ukoliko si koristio 16F628 moras predefinisati jer on nema D portove) i to pises prvo na pocetku programa pre DEFINE direktiva.Kako si uopste zamisli da ti radi tajmer jer ovakva definicija programa totalno je zbunjujuca za mene ,reci kako bi ti hteo da radi . Sta ti je set ,start to nisi definisao, kao i LCD out ti nije u redu koliko sam video .Ajde kasnije cemo to pokusati da resimo ,a i kako mislis za prvi primer bez decimala da ispises rezultate temperature.Pozdrav i pokusavaj da ne ides copy paste jer su mi to savetovale starije kolege i bile su apsolutno u pravu jer onako ga moras sam pisati i to mnogo znaci u daljem ucenju.Pozdrav do kasnije





[Ovu poruku je menjao Darko_zed dana 18.02.2011. u 20:26 GMT+1]
[ electron2008 @ 18.02.2011. 21:54 ] @
Najobicniji tajmer do sat vremena 59:59; "navijem" tasterom SET odredjeno vreme, pritisnem START upali LED, odbroji i stane ugasi LED to je to? A sto se tice regulacije temperature bez decimalnog prikaza da prikazuje ne NPR. 43,25 C nego 43,2 ili samo 43?
[ Darko_zed @ 25.02.2011. 16:51 ] @
Da li bih uspeo da komandom POT sa PIC-om koji nema A/D ulaz to zamenim recimo kod 16F84 ili 16F628.Znam da je na taj nacin mogu ocitati ulaz sa 255 stanja (8 bita) ali me konkretno interesuje da li mogu ovako preko razdelnika napona da ocitavam vrednosti recimo akumulatora .Razdelnik bi postavio na ulaznom pinu ispred kondenzatora.Ako postoji jos neki nacin ocitavanje vrednosti sa PIC-om koji nema A/D ulaz voleo bih da cujem.Pozdrav
[ Darko_zed @ 25.02.2011. 17:12 ] @
Evo primera kako sam mislio da vezem i kako je inace pravilno vezano.Zener diodu sam stavio kako zastitu da ne predje 5V ,a razdelnik se izracuna prema max voltazi da bude 5V ,a napon ce linearno padati do nule na ulazu kako se smanjuje sto bih ja to hteo da ocitam PIC-om .Sada me interesujei to sto na ovaj nacin ovom komandom POT iz prilozene pravilne seme veze PIC ocitava brzinu punjenja i praznjenja kondenzatora koja se menja kako se menja otpor potenciometra i uz to sto je napon konstantan 5V bez promene ,pa razmisljam da li bi radilo kako sam ja zamislio .Mozda je neko to vec probao ili na neki drugi nacin da ocita vrednost kao sto sam vec pitao .Pozdrav
[ Sepa011 @ 25.02.2011. 21:20 ] @
Nece da moze. Uzmi lepo 12F675, taj ti ima ADC.
[ Darko_zed @ 26.02.2011. 08:28 ] @
Ma znam 12F675 da ima A/D in pricali smo o njemu vec ali na njemu recimo ne mozes prikljuciti ni jedan displej da prikaze merenu vrednost .Nije mi bilo u cilju da merim akumulator vec da na neki nacin sa PIC-ovima koji nemaju A/D ulaz to uradim sa recimo 16F628 izmerim neku vrednost bilo cega ,a dosta je jeftiniji od 16F877 .
[ Darko_zed @ 26.02.2011. 08:34 ] @
Mogao bih sa 16F676 to isto da uradim ima A/D(jeftiniji od 16F877) ali me interesuje moze li se nekako to uraditi i sa ovim PIConjama koji nemaju???
[ Sepa011 @ 26.02.2011. 08:41 ] @
Moze i 12F675 da ganja lcd :). Teoretski ti treba samo jos jedan HC595 a izbacis ledare sa moje seme.
[ elektrostudio @ 26.02.2011. 13:20 ] @
Citat:
Darko_zed: Evo primera kako sam mislio da vezem i kako je inace pravilno vezano.Zener diodu sam stavio kako zastitu da ne predje 5V ,a razdelnik se izracuna prema max voltazi da bude 5V ,a napon ce linearno padati do nule na ulazu kako se smanjuje sto bih ja to hteo da ocitam PIC-om .Sada me interesujei to sto na ovaj nacin ovom komandom POT iz prilozene pravilne seme veze PIC ocitava brzinu punjenja i praznjenja kondenzatora koja se menja kako se menja otpor potenciometra i uz to sto je napon konstantan 5V bez promene ,pa razmisljam da li bi radilo kako sam ja zamislio .Mozda je neko to vec probao ili na neki drugi nacin da ocita vrednost kao sto sam vec pitao .Pozdrav


Moze da radi, ali ovako: onaj r sto ide na masu vezi na red sa pin-om PIC-a (da smanjis struju praznjenja elko-a cca 100ohm) a upotrebi open collector pin sa schmit ulazom, potom kod merenja prvo das da pin bude output i dovedes na 0, potom konfigurises pin da bude input i meris vreme za koje input pin prebaci sa 0 na 1. Napravis malu tabelicu kalibracionu - napon->vreme i eto jednostavnog resenja. Nije nesto precizno mnogo ali moze da obavi posao
[ Darko_zed @ 26.02.2011. 13:28 ] @
Koliko je precizno odnosno neprecizno ?? Moze li imati preciznost odnosno da reaguje na promenu 100mV ili eventualno 200mV .Mislio si da tako na pinu pomocu reverse komande odradim posao koja menja pin u ulaz/izlaz ??
[ Sepa011 @ 26.02.2011. 13:48 ] @
Nisam siguran kako je kob PBP (odavno sam prestao da ga koristim), ali u Proton+ postoji RCIn fumkcija, opis u prilogu.
[ Darko_zed @ 26.02.2011. 21:22 ] @
Zorane nema ta funkcija u PBP koliko znam, mada mogu iskoristiti kao sto sam rekao komandu reverse na datom pinu pa onda tajmer da merim vreme prelazenja iz 0 u 1 i tako izvrsim kalkulacije za odredjenu vrednost napona ,a ujedno cu videti kolika je preciznost i stabilnost rada na ovaj nacin i vredi li se sa tim igrati.Pozdrav
[ Darko_zed @ 26.02.2011. 21:24 ] @
Citat:
open collector pin sa schmit ulazom

koji je ovo pin kod 16F628 ili 16F84
[ elektrostudio @ 27.02.2011. 14:59 ] @
Citat:
Darko_zed: koji je ovo pin kod 16F628 ili 16F84

pin RA4 kod 16f84 ili iskljuciti pull-up otpore kod RB3:RB0 kod istog PIC-a jer su i oni sa schmit ulazima
Jos jedno - posto je u pitanju vreme dobices vecu preciznost sto je duze vreme punjenja kondenzatora (izbor RC elemenata) i preciznost zavisi od temperature MCU-a (prag okidanja ulaza) ali i nije toliko velika
Inace to sam radio u asm-u tako da ne mogu pomoci oko basic-a
[ electron2008 @ 15.05.2011. 18:15 ] @
Imam jedno pitanje u vezi ovog hardvera vezanog na adc 16f877A termostat (termometar) sa PT100:



Naime, nikako nemogu da podesim, da ide od nule izlazni napon, kod menne ide od nekih 0.65V pa do 5,01?
Kalibrisanje, odnosno max izlazni napon je OK ubaci se, koliko sam razumeo otpor umesto pt 100 odredjene vrednosti iz tabele za pt100 sto je ovde slucaj za 250 (255) stepeni i podesim sa trimerom 5v, medjutim napon mi ne pada ispod 0.65V? Umesto Pt100 sam stavio trimer zbog probe?
Da li je neko radio neki slican uredjaj?
[ rsinisa @ 16.05.2011. 11:13 ] @
Jeste da ovo nema veze sa PBP-om, ali ajde.
Ako ja tebe dobro razumem, ti na sobnoj temperaturi (a ne na 0 stepeni celzijusa) imaš napon veći od nule. To je sasvim u redu jer 0V treba da bude na 0 stepeni celzijusa; ako baš hoćeš da ga anuliraš na sobnoj, treba da ubaciš trimer otpornik u most.
Ako ni tako ne uspeš, u pitanju je tzv. ofset napon iz operacionih pojačavača - u tom slučaju moraš da ga kompenzuješ.

Pozdrav.
Sinisha
[ electron2008 @ 16.05.2011. 13:24 ] @
Znam da tema nije vezana bas za Picbasic, neka administratori premeste postove...da u pitanju je ofset iz op, treba da kompenzujem, neka sema?
[ electron2008 @ 19.09.2011. 17:20 ] @
Ako recimo zelim da merim napon na analognom ulazu RA0 na Picu 16F877A, te program pisem PicBasicom i nekoristim referentni napon OK, ali ako isto to zelim da uradim, a da na RA2 i RA3 dovedem 5V kao Vref tj referentni napon kako to da ukljucim u programu? Ako ste me razumeli?
[ elektrostudio @ 19.09.2011. 19:41 ] @
Aktiviraj tu opciju u ADCON1 registru - pogledaj uputstvo za uC

ADCON1 REGISTER (ADDRESS 9Fh)

upisi na tu adresu 0x08h
[ Darko Zivkovic @ 19.09.2011. 21:17 ] @
Kao sto kaze Sinisa citati citati i samo citati , samo po nekad pitati ahahahah , covek apsolutno ima pravo i poslusaj njegov savet ,a kad bas zapne tu je on da resi problem naravno .Pozdrav
[ Darko_zed @ 28.01.2012. 15:52 ] @
Da malo osvezimo temu , naime naisao sam na potrebu da na piconji 16f628 napravim PWM na tri pina , manje vise potreba koliko je u edukativne svrhe . Posto ovaj pic ima samo na jednom pinu izlaz za pwm resio sa da pesaka rucno napravim PWM pa me zanima za pocetak kako upisati vremena manja od 1ms za PWM preko 1khz ??Zelim njime dimovati vise dioda od jednom ali da svaka bude na posebnom pinu i mogu regulisati svaku pojedinacno. Pozdrav
[ ZAS011 @ 28.01.2012. 16:13 ] @
Evo ti da se ucis, u pitanju je 16F688 koji nema HPWM a vozi 3 kanala i jos osluskije DMX koji ide brzinok od 250 kbps.
[ Darko_zed @ 28.01.2012. 16:39 ] @
suvise komplikovano da izvucem neko znanje iz ovoga , na zalost sam ogranicen na pic basic . Kako da upisem u ''pause'' vreme manje od 1ms , recimo 0.1ms ???
[ ZAS011 @ 28.01.2012. 16:43 ] @
Predji na Proton+ on ima PauseUs, inace minimalna pauza je ogranicena radnom frekvencijom.
[ Darko_zed @ 28.01.2012. 17:37 ] @
radna ferg 4mhz , kako da napisem najmanju mogucu pauzu
[ Darko_zed @ 28.01.2012. 17:43 ] @
Pazi napisem je i radi kao recimo ''pause 1/10'' , sve je to ok ali kad je hocu uvecavati recimo za svakih 1/10 kada prodje kroz petlju to nece
[ foxhunter1 @ 28.01.2012. 18:10 ] @
I u PBP imas pauseus (pauza u uS). Minimalna pauza zavisi od takta, za 4 MHz je 22 uS - ako me pamcenje sluzi. Otvori uputstvo pa pogledaj tacnu vrednost.
[ Darko_zed @ 28.01.2012. 18:30 ] @
tacno tako ''pauseus'' mada sam ja hteo neku drugu matematiku ali nema veze , bice i ovo ok dobro je ,a i manje komplikovano .Pozdrav i hvala puno
[ goran_68 @ 29.01.2012. 07:58 ] @
Ako je već u svrhu učenja bolje uradi koristeći prekid nekog od tajmera pri čemu periodu prekida odrediš kao n-ti deo od periode PWM. n je broj nivoa kojima dimuješ LED. Ne koristim PBP pa tu ne mogu da pomognem ali imam negde c kod pa ako ti bude trebalo javi.
[ Darko_zed @ 29.01.2012. 09:32 ] @
jasno mi je to Gorane ali sam sa dvema pauzama i malo matematike hteo da napravim signal 1khz gde cu moci menjati sirinsku modulaciju kao na pravom PWM .
[ rsinisa @ 29.01.2012. 11:05 ] @
Teško ćeš to da uradiš bez interapta, a da sve radi kako si zamislio na 3 pina. Goran ti je dao odličan savet, drugačije nećeš moći i ne vidim razlog za izbegavanje interapta koji je pravi izbor za to što tebi treba. Ko je pratio moja pisanja zna da ja interapt smatram moćnim oružjem i ne koristim kad za njim nema realne potrebe, ali ovde jednostavno moraš tako i to se sa njim jako elegantno rešava.
Podesiš lepo interapt na TMR0 da se dešava svake milisekunde, i odlučiš koliko ms hoćeš da ti traje jedan PWM ciklus. Napraviš 3 brojača za svaki pin i kad udješ u interapt uporediš brojač interapta sa zadatim brojem za svaki PWM pin i onda uključiš ili isključiš pin. Vrlo jednostavno i elegantno rešenje.
Ako ti je osc. 4 MHz, to znači da izmedju 2 interapta imaš izvršenje oko 1000 asm instrukcija (pričam o ekivalentu jer se za PBP to ne može izračunati) minus trajanje interapta što je više nego dovoljno da se odradi mnogo toga izmedju 2 int-a.

Pozdrav.
Sinisha

P.S. A najmanju moguću pauzu napišeš tako što staviš ASM naredbu nop:

neka PBP naredba
@ nop
opet neka PBP naredba
[ goran_68 @ 29.01.2012. 11:37 ] @
Za dimovanje LED ti ne treba puno nivoa jer se razlika između dva susedna neće ni primećivati. Ja sam jednim PIC18F2220 dimovao 16 LED u 10 nivoa a preko USART-a kontrolisao 16 takvih slave jedinica.
[ Darko_zed @ 29.01.2012. 11:58 ] @
Hvala na savetima , poslusacu vas i ako stignem danas da se malo pozabavim ovim sto ste napisali , da probam .Ako negde zapne znam gde da se obratim .Pozdrav i hvala
[ ZAS011 @ 29.01.2012. 13:15 ] @
255 nivoa, DMX kontrola (250 kbps): http://zastos.com/Video/DMXIFCE.html

BTW Da se o'ma ogradim, 'Talenat - "Luster"' nizu moji kontroleri, u sledecoj sezoni, ako je bude, bice moji.

Dodatak:
RTS, veceras u 21.00


[Ovu poruku je menjao ZAS011 dana 29.01.2012. u 15:52 GMT+1]
[ Darko_zed @ 29.01.2012. 15:28 ] @
video sam ovo jos onda kada si mi poslao , extra izgleda .
[ yt1nvs @ 29.01.2012. 20:14 ] @
ovde ima dobar primer za soft PWM koji radi ok kontrolise 3 kanala i pisan u PBP

http://320volt.com/picbasic-pro-ile-pwm-ve-ornek-uygulamalar/
[ Darko_zed @ 29.01.2012. 21:52 ] @
Hvala druze , evo konkretnog primera ,a ujedno su to i spominjali Goran i Sinisa .Malo sam preradio program da dimovanje ne zavisi od tastera vec automatski ide od minimuma do maksimuma i obrnuto i tako sve u krug . Neke mi stvari nisu bas najjasnije , nagadjam ali ako ne uspem da procitam , razjasnim ,i naucim pitacu .Jedno veliko hvala i pozdrav
[ EvilMax @ 05.02.2012. 20:08 ] @
Izvinite ljudi na smetnji, samo me interesuje da li ste resili problem punjaca sa 6 strane...?Ne mogu da skapiram koji deo koda je zaduzen za tu gresku koja se ispoljava tako sto punjac kada napuni do odredjenog predefinisanog napona, gasi se relej i crvena blinkne 3 puta i opet ukljuci punjenje i tako bez prestanka, umesto da saceka da napon padne na naznacenu vrednost iz programa......
Prilazem i 'kod'...

Code:
' Program za kontrolu punjenja akumulatora

 temp VAR WORD
 ANSEL = 0
 GPIO = 0
 TRISIO = 0         ' Svi gpio su izlazni
 TRISIO.0 = 1        ' Gpio.0 je ulazni

ANSEL = %00110001     ' Postavi ADC takt na Frc i GP0 u analog mod

ADCON0 = %10000001    ' Konfigurisi A/D Modul:
                    ' Desno poravnanje, koristi Vref pin, na kanalu 0

Pocetak:                    
                
Petlja:
        ADCON0.1 = 1    'Start konverzije
notdone:
        IF ADCON0.1 = 1 Then 
        GOTO notdone    'Ceka low na  1-bitu na ADCON0
        Endif
        
        Temp.highbyte = ADRESH    ' premsta HIGH byte rezultata u temp
        temp.lowbyte = ADRESL    ' premesta LOW byte rezultata u temp
 
        if temp > 558  then
        goto pun
        Endif

'' - - Napon punjenja manji od 14.4 Volta - - - - - - - -

        GPIO.5 = 1  ' ukljuci led punjenja - svetli zelena
        GPIO.4 = 0  ' iskljuci led praznjenja
        GPIO.1 = 1  ' ukljuci relej
 puni4:
        If TEMP < 390 Then
        GPIO.5 = 0
        GPIO.4 = 0  ' cetvorostruki blink crvene kad je napon manji od 10 volti
        Pause 300
        GPIO.4 = 1  
        Pause 300
        GPIO.4 = 0  
        Pause 300
        GPIO.4 = 1  
        Pause 300
        GPIO.4 = 0  
        Pause 300
        GPIO.4 = 1  
        Pause 300
        Endif
      
        goto Pocetak

' - - dostignut napon 14.4 Volta - - - - - - - -

pun:
        GPIO.5 = 0   ' iskljuci led punjenja - zelenu
        GPIO.4 = 0   ' iskljuci crvenu led
        GPIO.1 = 0   ' iskljuci relej
puni:
        ADCON0.1 = 1    ' start konverzije
notdone1:
        IF ADCON0.1 = 1 Then 
        goto notdone1    'ceka low na 1-bitu od ADCON0
        EndIf
        
        Temp.highbyte = ADRESH    'premesta HIGH byte rezultata u temp
        temp.lowbyte = ADRESL    'premesta LOW byte rezultata u temp

        If temp < 477 then   ' ako je manji od 12.3 idi na pocetak
        goto Pocetak
        EndIF

        GPIO.5 = 1
        PAUSE 300          ' blinka zelena kada je pun
        GPIO.5 = 0
        PAUSE 300
    
        Goto punI
        end
[ Darko_zed @ 06.02.2012. 15:00 ] @
Sada stoji ovako

Code:
Temp.highbyte = ADRESH    ' premsta HIGH byte rezultata u temp
      temp.lowbyte = ADRESL    ' premesta LOW byte rezultata u temp


sledece probaj ovako

Code:
 temp.lowbyte = ADRESL    ' premesta LOW byte rezultata u temp       
    Temp.highbyte = ADRESH    ' premsta HIGH byte rezultata u temp


po kojoj semi si ga radio ??
[ EvilMax @ 06.02.2012. 15:44 ] @
Pazario sam knjigu za picbasic od Voje Milanovica i pride sam dobio i seme i programe za njegove uredjaje koji se i inace obradjuju u knjizi...Medjutim, pocetniku ne vredi ta knjiga jer izgleda da moras imati i predznanje po kojoj bi obradjivao tu knjigu i programe u njoj....Tako da ne ogu da skapiram kako to funkcionise, a glavu iz knjige ne vadim......
Inace ta velika slova ladno nisam primetio, a vec sanjam taj kod nocima.... Al rekao sam sebi da necu da odustanem dok ne shvatim taj maleni bedni programcic, i naravno dok mi uredjaj ne proradi kako treba.....
Hvala ti prijatelju za pomoc.....

Probao sam i ovu izmenu, ali i dalje kad napuni do naznacenog napona (u ovom slucaju sam izmerio 13.36V) on iskluci zelenu led i rele i crvena blinkne tri puta i opet ukljuci punjenje, ali posto je napon jos uvek na nivou napunjenosti, zelena i rele se samo na tren ukljuce i iskljuce i crvena opet blinkne tri puta i tako u nedogled....

[Ovu poruku je menjao EvilMax dana 06.02.2012. u 17:17 GMT+1]
[ Darko_zed @ 06.02.2012. 16:23 ] @
ajde okaci semu i plocicu sto si uradio .
Sta ti konkretno nije jasno u ovom programcicu ??
kako stelujes pragove ukljucenja , iskljucenja , koristis li neki lab ispravljac ili kako vec ??
[ EvilMax @ 06.02.2012. 16:25 ] @
Me again...Zaboravih da napomenem da se na simulaciji sve ponasa savrseno kao sto bi i trebalo, al u stvarnosti ne ferma....I ne ide mi u glavu zasto se pali crvena tri puta kad napuni akumulator, kad je u programu lepo stavljeno da se pali samo kada je prazan akku...?!

Sema je identicna tvojoj sa stranice broj 6 ove teme,a sto se izgleda plocice tice, ostao sam bez toga i svega ostalog pre par meseci nakon umiranja hard-a, inace je prosta i ne verujem da je do nje.....Napone sam proveravao na stabilisanom regulatoru promenljivog napona a i direktno na akumulatoru i identicno se ponasa...Mozda bih i pomislio da je do mene, ali komponente opet nemaju veze sa ukljucenjem crvene led diode koja bi trebala da se ukljuci tek na manje od 10 volti a ona se ukljucuje i blinkne tri puta odmah nakon punjenja i gasenja releja iako pada napona nema i odmah nakon blinkanja opet ukljucuje punjenje i to samo na tren dok ne skapira da je napon na maksimalnom nivou i opet blinkne crvena tri puta i tako u krug, stalno samo klikce rele, a crvena se pali i blinkne tri puta i kada ukljucim uredjaj....Pragove sam skapirao kako da stelujem, ali ni to necu da radim sve dok ne proradi uredjaj po default-u kako treba...
U razdelniku napona sam stavljao metaloslojne otpornike kao sto i pise.....
Jel si ti imao neke probleme sa uredjajem i kakve.....Prva greska koju sam uvideo je bila na semi da je izlaz za rele stavljen na GP2 a u programu je na GP1, ali to sam brzo skapirao, ali ovo mi ne ide jer ne razumem jos uvek A/D konverziju.....Pratio sam tvoj problem sa ovim uredjajem i taman kad si trebao da odgovoris sta ti je bio problem, presli ste na multiplexiranje sa led displejima....

[Ovu poruku je menjao EvilMax dana 06.02.2012. u 17:54 GMT+1]
[ Darko_zed @ 06.02.2012. 16:31 ] @
da nisi nesto pogresio u realizaciji plocice i same seme ?? zato ti kazem slikaj i postavi ovde
[ EvilMax @ 06.02.2012. 16:58 ] @
Reci mi samo kako se kod tebe ponasao program i uredjaj, da znam da li da trazim problem na plocici ili u programu.....
[ ZAS011 @ 06.02.2012. 18:10 ] @
Da li imas diodu paralelno sa spulnom relea? Eventualno i snubber preko kontakata relea.

U Darkovom programu nigde nisam video da crvena LED treba da trepce.
[ Darko_zed @ 06.02.2012. 20:33 ] @
kod mene ne trepce crvena vec zelena kada je aku. pun ,a gledajuci tvoj program crvena je indikator da je napon akumulatora ispod 10V i stvarno ne znam zasto ona trepce ako je napon akumulatora iznad 10V ,a jos pogotovo oko 12,5-13V kada je pun .Proveri plocicu i sve ostalo inace program radi super ali onaj sa 6 strane ,a ne vidim razloga da i ovaj ne radi jer je u sustini sve isto sem par dodataka .pozdrav
[ EvilMax @ 12.02.2012. 17:22 ] @
Pozdrav prijatelji...! Imao sam na trenutak resenje, ali je nazalost bilo samo prividno...Mislio sam da je kondenzator od 1uF bio u pitanju, ali nije...A nije ni program....Do tog zakljucka sam dosao tako sto sam nakon menjanja kondenzatora izasao u radionicu da testiram na ispravljacu, ali kad sam izlazio otkacio sam rele, jer je bio zalemljen za trafo i stavio sam led diodu umesto njega i radilo je savrseno...Tada sam ja pomislio da je ok, medjutim udjem ja i prikacim ga na rele, kad ono isti djavo, blinka crvena ko mutava...! Malopre ti ja izadjem da se smrznem i saznam jos nesto, kad ima sta da vidim...Prikacim uredjaj i rele i zelena se normalno upale, medjutim uredaj nakon dostizanja potrebnog napona iskljuci rele i u tom trenutku krene sa delom programa za blinkanje crvene led koji traje 6 ciklusa po 300 milisekundi, a za to vreme napon ako opadne samo par milivolti, uredjaj nakon blinkanja crvene led diode ponovo iscitava napon i kapira da nema dovoljan napon i ponovo ukljucuje rele....Cim otkacim rele, led diode signaliziraju savrseno kao u simulatoru i to tacno u milivolt, a cim vratim rele (prazni kontakti, nista prikaceno) izbaguje mi ceo uredjaj...Probao sam i drugi tip releja, sve isto...Jedini logican odgovor mi je da mu rele pobrlja napon iscitavanja u trenu iskljucenja releja, ali kako...? Rele jeste nakon naponskog regulatora, ali iscitavanje mu je pre toga, tu rele ne moze uticati na taj neki pad napona...Ima li neko logicniji odgovor.....?
[ Darko_zed @ 12.02.2012. 18:10 ] @
postavi semu po kojoj si radio
[ EvilMax @ 12.02.2012. 19:47 ] @

Razlika je ta sto je izlaz na nozici 6 a ne 5....Jel tebi pada na pamet kako bi rele mogao uticati na rad mikrokontrolera...?!
[ Darko_zed @ 12.02.2012. 19:55 ] @
Nemam pojma , ciji si program koristio ???
[ Darko_zed @ 12.02.2012. 19:56 ] @
Kod mene je GP2 izlaz ,a ne GP1 to jest pin 5
[ goran_68 @ 12.02.2012. 20:51 ] @
Da li imas kondenzator izmedju 5V i mase? Ako nemas, stavi.
[ EvilMax @ 12.02.2012. 23:28 ] @
Citat:
Koristio sam originalan program od autora ovog uredjaja, a proucavao sam i tvoj program, razlika je samo ta sto si obrisao iz programa deo koji je zaduzen za treptanje crvene led diode, prepravio izlaz sa GP1 na GP2 i promenjeni su pragovi reagovanja releja.... Krenuo sam ja da menjam program da bi proradilo, ali sam odustao nakon par pokusaja jer znam da uredjaj savrseno radi cim otkacim rele....Da, imam i kondenzatore i pre i posle regulatora....


E sad vala necu da brisem gornji post, ovo bi bio cetvrti put da napisem i obrisem, jer shvatim problem dok napisem sve ovo.... NE, NEMAM kondenzator nakon regulatora i necu vise da se pravim tvrdoglav, obecavam....! Ja se jos pitam "sta mi trazi semu k'o da sam glup i ne znam da sastavim 10 komponenata".... E sada sam se i uverio da treba u SVE da sumnjam, a narocito u to sto sam hiljadu posto siguran....Aj odradicu i to sutra pa javljam rezultate, a koliko vidim, trebao bih i turu piva da platim da bih se iskupio za svoje nebuloze...
[ Darko_zed @ 12.02.2012. 23:39 ] @
radi po ovoj semi.
Obrati paznju samo jer je Sepa drugacije konfigurisao pinove , hocu reci odradi sve isto po semi samo na pinovima kako su ti konfigurisani u programu ako me razumes .Pozdrav

[Ovu poruku je menjao Darko_zed dana 13.02.2012. u 15:50 GMT+1]
[ EvilMax @ 13.02.2012. 16:02 ] @
Hvala brate, sad i meni radi, samo cim stavim elektrolit nakon regulatora kao sto rece goran_68 i kao sto je kod Sepe.....Sramota s'moje strane,ali takav je proces ucenja kroz zivot i dela, uz podrsku prijatelja i dobrih ljudi...Od sada bez razmisljanja stavljam kondenzatore i pre i posle regulatora, kao sto je i na sepinoj semi, a i on je covek lepo stavio rele od 12v i pre regulatora ga nakacio, tako da napon od 5 volti koriste samo ledovi i MCU, pametno.....Hvala vam prijatelji.....Nego, nisam video da si negde napisao Darko kako si resio onaj problem sa 6 strane sa onim odstupanjem napona....? Bas me zanima sta je bio problem....
[ Darko_zed @ 13.02.2012. 18:03 ] @


Code:
Temp.highbyte = ADRESH    ' premsta HIGH byte rezultata u temp
      temp.lowbyte = ADRESL    ' premesta LOW byte rezultata u temp





Code:
temp.lowbyte = ADRESL    ' premesta LOW byte rezultata u temp       
    Temp.highbyte = ADRESH    ' premsta HIGH byte rezultata u temp

Ovo mi je resilo problem samo to sam zamenio u programu ako na to mislis
[ MILANAN @ 14.02.2012. 07:56 ] @
Kako mogu da napisem u Basicu za 16f628A i 16f84A da kad pritisnem taster na rb0 da se na rb7 na pr ukljuci dioda i kad ponovo pritisnem isti taster da se dioda ugasi ? Bitno mi je to za taster a program umesto diode mislim da mogu sam da napisem. ( pretpostavljam da nije tesko,pocetnik sam a nikako da nadjem bilo kakvu literaturu za tako nesto ) Hvala unapred.
[ ZAS011 @ 14.02.2012. 08:40 ] @
Jako retko koristim PBP, ali zato u Proton+ to izgleda ovako:
Code:
'****************************************************************
'*  Name    : Pocetnik.BAS                                      *
'*  Author  : Zoran A. Scepanovic                               *
'*  Notice  : Copyright (c) 2012 Zoran A. Scepanovic            *
'*          : All Rights Reserved                               *
'*  Date    : 14-Feb-12                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 16F628A
Xtal 4
All_Digital True
PortB_Pullups False

Reminders False
Config BODEN_OFF, BOREN_OFF, CP_OFF, DATA_CP_OFF, PWRTE_ON,_
       WDT_OFF, LVP_OFF, MCLRE_OFF, INTOSC_OSC_NOCLKOUT
Reminders true
       
Symbol Taster PORTB.0
Symbol LED PORTB.7

Input Taster
Output LED

' Poicetno stanje: LED ugasena
LED = 0

' Beskonacna petlja posto je 1 uvek jednako 1
While 1 = 1
    ' Ceka se pritisak na taster
    While Taster = 1
        DelayMS 50
    Wend
    
    ' Taster pritisnut menja se stanje LED
    Toggle LED
    
    ' Ceka se otpustanje tastera
    While Taster = 0
        DelayMS 50
    Wend
Wend

End
[ MILANAN @ 14.02.2012. 09:15 ] @
Ja se izvinjavam,pisem sposla pa sam u brzini lose napisao poruku.Mislio sam kad pritisnem i pustim taster dioda se upali i radi beskonacno a kad ponovo pritisnem i pustim isti taster dioda se ugasi.Molio bih vas da mi kazete kako to da napisem i jos jednom izvinite na gresci
[ ZAS011 @ 14.02.2012. 09:25 ] @
Upravo to ti radi ovo sto sam napisao.

Klasicna Flip-Flop funkcija. Ako bolje pogledas i pocnes da citas sa barem malko razumevanja, videces da se posle otpustanja tastera nista ne desava sa LED. Znaci:

1. Inicijalno je LED ugasena
2. Ceka se na pritisak tastera
3. Kada se detektuje pritisnut taster promeni se stanje LED (upaljena)
4. Ceka se da se taster otpusti
5. Natrag na 2.

Nadam se da ti je sada malo jasnije (a ima i ponesto komentara u programu )
[ MILANAN @ 14.02.2012. 09:44 ] @
Hvala vam,ja sam tezak pocetnik pa nisam mogao da odmah vidim da ste mi poslali to sto mi je treba a pokusavam da sve sto naucim bude sa razumevanjem jer tako je mnogo lakse za ucenje nadalje.
[ Darko_zed @ 14.02.2012. 11:08 ] @
Code:
'*********************************
'*  Name    : za pocetnika                                      *
'*  Author  : Valjda ja :D                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 14.02.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'***********************************
TRISB = $00 ;svi portovi b su izlazni
trisb.0 = 1  ; ulazni za taster
CMCON = 7

upali:
if portb.0 = 1 then portb.7 = 1 ;  kada pritisnes taster upali se led dioda
pause 50
if portb.7 = 1 and portb.0 = 0 then goto ugasi  ;uslov ako je led upaljena i taster pusten prelazis na label ugasi
goto upali                                                  
end
ugasi:
if portb.0 = 1 then portb.7 = 0 ; led dioda ugasena ponovnim pritiskom na taster
pause 50
if portb.7 = 0 and portb.0 = 0 then goto upali  ;uslov ako je ugasena led i taster pusten prelazis na label upali 
goto ugasi 
end                                          


Evo ti u Basic-u najprostije da bi shvatio mada se tu moze jos mnogo sta modifikovati .Ako te nesto muci pitaj , odgovaram koliko znam
[ Darko_zed @ 14.02.2012. 11:23 ] @
Ti ako nisi js savladao osnove pic basica onda stvarne ne znam kako kapiras proton , u sustini je slican ali opet pocetniku je veoma zaeban
[ MILANAN @ 14.02.2012. 12:26 ] @
Sad samo kapiram kako da kazem pocetak basica tj na pr to sa pinovima koji ce kad da radi ali sam cvrsto resio da idem dalje pa dokle stignem.
[ Darko_zed @ 14.02.2012. 12:46 ] @
Citat:
MILANAN: Sad samo kapiram kako da kazem pocetak basica tj na pr to sa pinovima koji ce kad da radi ali sam cvrsto resio da idem dalje pa dokle stignem.

Za pohvalu , dao sam ti primer najprostije da ukapiras , ako nesto nije jasno pitaj slobodno pa makar to bilo i najosnovnije .Pozdrav
[ MILANAN @ 14.02.2012. 15:25 ] @
Ubacio sam ovaj kod u pic i cim dovedem napajanje dioda se odmah upali pa se tasterom gasi itd..Sta mogu da ubacim u ovaj kod da kad dovedem napajanje na pic dioda bude ugasena pa tek onda kad stisnem i pustim taster da se upali i gasi tek kad ponovo stisnem i pustim taster

TRISB = $00 ;svi portovi b su izlazni
trisb.0 = 1 ; ulazni za taster
CMCON = 7

upali:
if portb.0 = 1 then portb.7 = 1 ; kada pritisnes taster upali se led dioda
pause 50
if portb.7 = 1 and portb.0 = 0 then goto ugasi ;uslov ako je led upaljena i taster pusten prelazis na label ugasi
goto upali
end
ugasi:
if portb.0 = 1 then portb.7 = 0 ; led dioda ugasena ponovnim pritiskom na taster
pause 50
if portb.7 = 0 and portb.0 = 0 then goto upali ;uslov ako je ugasena led i taster pusten prelazis na label upali
goto ugasi
end

Probao sam:
upali:
if portb.0 = 0 . . . i jos neke kombinacije

ali neide mi
[ ZAS011 @ 14.02.2012. 15:38 ] @
Evo u PBP:
Code:
trisb = %00000001
cmcon = 7
' Poicetno stanje: LED ugasena
portb.7 = 0

' Beskonacna petlja posto je 1 uvek jednako 1
While 1 = 1
    ' Ceka se pritisak na taster
    While portb.0 = 1
        pause 50
    Wend
    
    ' Taster pritisnut menja se stanje LED
    Toggle portb.7
    
    ' Ceka se otpustanje tastera
    While portb.0 = 0
        pause 50
    Wend
Wend

End


Aj' sad da vas vidim
[ Darko_zed @ 14.02.2012. 15:39 ] @
jesi li stavio otpornik ka masi na ulaznom pinu portb.0 od 10K ???
[ ZAS011 @ 14.02.2012. 15:41 ] @
U napisanome ide otpornik ka V+ (Pull Up), taster spaja na masu, podto pull up drzi ulazni pin na 1, i to se testira

@MILANAN: 'end' ti je potrebno na samo JEDNOM mestu, a to je na samom kraju programa.

Code:
TRISB = $00 ;svi portovi b su izlazni
trisb.0 = 1 ; ulazni za taster
CMCON = 7

upali:
if portb.0 = 1 then portb.7 = 1 ; kada pritisnes taster upali se led dioda
pause 50
if portb.7 = 1 and portb.0 = 0 then goto ugasi ;uslov ako je led upaljena i taster pusten prelazis na label ugasi
goto upali
end    <--- VISAK
ugasi:
if portb.0 = 1 then portb.7 = 0 ; led dioda ugasena ponovnim pritiskom na taster
pause 50
if portb.7 = 0 and portb.0 = 0 then goto upali ;uslov ako je ugasena led i taster pusten prelazis na label upali
goto ugasi
end 


Mada bi to trebalo da se malko drugacije napise ako hoces sa If/EndIf pa GoTo
[ Darko_zed @ 14.02.2012. 15:50 ] @
Zorane nije cilj u ovome sto si postavio na ovaj nacin WHILE...WEND sa uslovnim ciklusima , on ne zna osnovne funkcije Basica , treba mu klasicna upotreba pinova sto jasniji program da bi mogao ukapirati , a ne da pokazujemo koliko smo sposobni mi sami , da to odradio sto krace i efikasnije jer veruj mi njemu to nije od pomoci sto sam imao prilike da se licno uverim kada sam poceo i ja da radim sa nekim sitnim i osnovnim stvarima.
Ovo sto si postavio je za njega spansko selo , covek uci kako da konfigurise pinove i kako da ih koristi ,a ti mu takav primer nisi dao on ne zna sta znaci u programu beskonacna petlja i sta se tu desava , koliko sam ga shvatio zeli da ima sto jasniji program da moze ukapirati sta ,zasto i kako se desavaju te promene na izlaznim pinovima itd itd . Pozdrav

P.S Milane ako nemas brosuru sa osnovnim instrukcijama u basic-u javi



[Ovu poruku je menjao Darko_zed dana 14.02.2012. u 17:37 GMT+1]
[ Darko_zed @ 14.02.2012. 15:55 ] @
Citat:
Mada bi to trebalo da se malko drugacije napise ako hoces sa If/EndIf pa GoTo

to me je uvek zanimalo , u cemu je razlika u ovome ako ovako stavim ili ostavim kao sto sam naopisao jer sam ko zna sta sve vec napravio i uvek sam pisao kao sto sam i ovde navika valjda , a razlike nisam video , radilo je u oba slucaja isto i bez greske.
Inace iz knjiga i literatutra iz kojih sam ucio su davali dva nacina upravo ova koja spominjemo da ne moram zavrsavati uslov ako je sve u nizu .
[ MILANAN @ 14.02.2012. 15:58 ] @
RBO preko r10k na 5v i RB0 taster masa - kad se pritisne taster RB0 ide na masu.To sam pronasao sa nekim uputstvima na internetu i za sada sto odatle napisem radi ali nema mnogo primera kao na pr ovo sto sam trazio
[ Darko_zed @ 14.02.2012. 15:59 ] @
Inace u simulaciji je dioda prvo ugasena pa kad pritisnes taster onda se upali jer dovedem 1(+) na ulaz.
[ Darko_zed @ 14.02.2012. 16:04 ] @
Citat:
MILANAN: RBO preko r10k na 5v i RB0 taster masa - kad se pritisne taster RB0 ide na masu.To sam pronasao sa nekim uputstvima na internetu i za sada sto odatle napisem radi ali nema mnogo primera kao na pr ovo sto sam trazio

Okreni sve kontra i radice
[ Darko_zed @ 14.02.2012. 16:22 ] @
Citat:
Mada bi to trebalo da se malko drugacije napise ako hoces sa If/EndIf pa GoTo

Moje pojasnjenje pre svega Milanu a to je da ja kada koristim IF... THEN bez zavrsetka uslova sa ENDIF je u slucajevima kada skacem direktno na LABEL , a kada imam neku instrukciju unutar uslova onda zavrsavam sa ENDIF ako me razumes .Prepravicu program da ti bude jasnije sa end IF.
Evo te prepravke gde inace koristim ovaj nacin uvek kada nesto radim sto se tice IF THEN ... ENDIF i GOTO zavisno od instrukcija u programu i mislim da je to ok.

Code:
 '*********************************
'*  Name    : za pocetnika                                      *
'*  Author  : Valjda ja :D                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 14.02.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'***********************************
TRISB = $00 ;svi portovi b su izlazni
trisb.0 = 1  ; ulazni za taster
CMCON = 7

upali:
if portb.0 = 1 then
 portb.7 = 1 ; 
 endif             kada pritisnes taster upali se led dioda
pause 50
if portb.7 = 1 and portb.0 = 0 then ugasi  ;uslov ako je led upaljena i taster pusten prelazis na label ugasi
goto upali                                                  
end
ugasi:
if portb.0 = 1 then
 portb.7 = 0
 endif                              ; led dioda ugasena ponovnim pritiskom na taster
pause 50
if portb.7 = 0 and portb.0 = 0 then  upali  ;uslov ako je ugasena led i taster pusten prelazis na label upali 
goto ugasi 
end                                          
[ MILANAN @ 14.02.2012. 16:35 ] @
Proradelo je i kad okrenem sve naopko ali mnogo vam hvala i za ovaj drugi kod sa endif meni mnogo znaci da vidim i tu varijantu
[ ZAS011 @ 14.02.2012. 16:41 ] @
@Darko_zed: I dalje imas jedan end viska
[ Darko_zed @ 14.02.2012. 16:46 ] @
Citat:
ZAS011: @Darko_zed: I dalje imas jedan end viska


Moja velika greska je na koju si mi mislim bas ti uvek skretao paznju je sto radim copy/paste uvek i onda pravim svakakve gluposti (sto se i da videti iz prilozenog) jer ja bukvalno sklapam program ovako ako mi verujes , mrzi me da kucam .Al dobro ispravim na kraju kad moram il kad hocu da sve bude po PS-u

Ipak ako Milan zeli moze mu se sve objasniti jer sam ipak za tvoju verziju ovog programa i tako bih ja odradio , pa ako mu nije visak i da ga nece potpuno zbuniti moze mu se program objasniti sa ovim instrukcijama



[Ovu poruku je menjao Darko_zed dana 14.02.2012. u 17:59 GMT+1]
[ Darko_zed @ 14.02.2012. 17:04 ] @
Zorane jedno pitanje za tebe ako mozes da mi pojasnis ,a to je bas sa ovim IF THEN

primer:
Citat:
if portb.0 = 1 then portb.7 = 1

sta se moze desiti u programu ako ostane ovako za raliku od ovog primera
Citat:
if portb.0 = 1 then
portb.7 = 1
endif


kada zavrsim uslov sa ENDIF . KOje su razlike i sta moze krenuti po zlu ako ostavim ili napravim gresku u mom ''sklapanju'' programa sa copy/paste . Veliko hvala i pozdrav

P.S ipak cu morati da krenem da trosim tastaturu da je ne stedim al jbg svidja mi se pa mi je zao da je arcim
[ MILANAN @ 14.02.2012. 17:06 ] @
Sta ustvari radi ENDIF ? Primetio sam da se ne koristi kad su komande u istom redu a kad su komande jedna ispod druge tad se stavlja
.
.
.
ENDIF
END
[ Darko_zed @ 14.02.2012. 17:17 ] @
Citat:
MILANAN: Sta ustvari radi ENDIF ? Primetio sam da se ne koristi kad su komande u istom redu a kad su komande jedna ispod druge tad se stavlja
.
.
.
ENDIF
END

ENDIF zavrsava uslov koji si zadao sa IF THEN i tu prestaje njegovo izvrsenje .
Koristi se u dva slucaja i to u prvom sa IF THAN bez ENDIF ako skaces recimo direktno na drugi label
na primer

Code:
 IF portb.0 = 1 THAN label ; (skace na label bilo koji u programu koji definises ovde ) 

i ovde ti nije potreban ENDIF

primer dva :


Code:
  IF portb.0 = 1 THAN 
            portb.7 = 1            
            ENDIF
            END


Ovde je bitno da uradis to ovako zato sto u primeru imas instrukciju neku unutar uslova i bitno je zavrsiti uslov .
jer ako ne zavrsis i stavis sve u redu uslov ce i dalje trajati ali ni ja ne znam kako to moze uticati na program zato sam pitao Zorana u predhodnom postu sta se moze desiti jer ima slucajeva gde nisam zavrsio uslov i radilo je dobro , mada radim ovako kako sam napisao u primeru dva . Pozdrav
[ ZAS011 @ 14.02.2012. 17:45 ] @
u viticastim zagradama cu ti pisati znacenja

IF {ako} uslov koji se testira THEN {onda}
operacije koje se obavljaju ako je uslov zadovoljen
.
.
.
ELSE {u suprotnom}
operacije koje se obavljaju ako uslov nije zadovoljen
.
.
.
ENDIF {kraj ispitivanja uslova} mora da postoji da bi kompajler {prevodilac} znao sta ce dalje



WHILE {dok je uslov zadovoljen}
operacije koje se obavljaju dok je uslov zadovoljen
.
.
.
WEND {kraj bloka operacija koje se obavljaju dok je uslov zadovoljen}
[ MILANAN @ 14.02.2012. 17:47 ] @
Samo jos nasto i da vas vise na zamaram a i meni je sve ovo dovoljno za danas pa da sad malo vezbam

U ovom kodu:

TRISB = $00 ;svi portovi b su izlazni
trisb.0 = 1 ; ulazni za taster
CMCON = 7

upali:
if portb.0 = 1 then portb.7 = 1 ; kada pritisnes taster upali se led dioda
pause 50
if portb.7 = 1 and portb.0 = 0 then goto ugasi ;uslov ako je led upaljena i taster pusten prelazis na label ugasi
goto upali
end <--- VISAK
ugasi:
if portb.0 = 1 then portb.7 = 0 ; led dioda ugasena ponovnim pritiskom na taster
pause 50
if portb.7 = 0 and portb.0 = 0 then goto upali ;uslov ako je ugasena led i taster pusten prelazis na label upali
goto ugasi
end

Gde sad tj u kom redu da ubacim neki prog. da na pr umesto sto dioda samo svetli da na pr dve diode blinkaju ?

(ovaj kod radi i sa ovim END viska i kad je kontra 0 na 1 i 1 na 0 dioda je prvo ugasena pa se posle pali na taster)
[ ZAS011 @ 14.02.2012. 17:49 ] @
@Darko_zed:

Ako je samo jedna instrukcija koja se obavlja ako je uslov zadovoljen, moze se ista staviti iza THEN, nema potrebe za EndIf, mada ja preferiram pisanje programa sa If/EndIf i uz to i nazubljeno, preglednije je:
Code:
IF portb.0 = 1 THEN 
    portb.7 = 1            
ENDIF
END
[ ZAS011 @ 14.02.2012. 17:58 ] @
Milane, ima li neki programski jezik da znas, posto si vec OPERATER RACUNARA, pa da nastavimo sa tim jezikom?

Pored PBP i Proton+ PicBasic-a pricam i C, a po potrebi i Pascal
[ MILANAN @ 14.02.2012. 18:28 ] @
Neznam.Poceo dam od skoro sa ovim,znam ponesto da napisem da neki pin ili pinovi budu izlazni ili ulazni da dlinkaju diode jedna ili vise sa ili bez tastera i otprilike toliko,mozda dvadesetak komandi.Nemam ili ne znam gde da nadjem neku pocetnicku litetaturu pa se nekako snalazim.To operater racunara je bio samo kurs inace radim elektroniku Radio TV Bezicne tel auto instalacije dekodiranje ark ali sa programiranjem sam nula
[ ZAS011 @ 14.02.2012. 18:32 ] @
Pazi, za PBP, posto vidim da njega koristis, imas jako dobar HELP, u njemu su ti objasnjene sve komande. Moras da citas, citas, citas, ...
[ Darko_zed @ 14.02.2012. 18:37 ] @
Evo ti za pocetak
http://vojo.milanovic.org/mikkon/picbas-01.htm
http://vojo.milanovic.org/mikkon/picbas-03.htm
http://vojo.milanovic.org/mikkon/picbas-04.htm
procitaj imas i primere ujedno sa instrukcijom i vezbaj , gde zapne pitaj .Pozdrav
[ MILANAN @ 14.02.2012. 18:45 ] @
OK.Hvala vam na savetima i strpljenju stvarno ste mi puno pomogli,veliki pozdrav.
[ MILANAN @ 15.02.2012. 07:24 ] @
TRISB = $00 ;svi portovi b su izlazni
trisb.0 = 1 ; ulazni za taster
CMCON = 7

upali:
if portb.0 = 1 then
portb.7 = 1 ;
endif kada pritisnes taster upali se led dioda
pause 50
if portb.7 = 1 and portb.0 = 0 then ugasi ;uslov ako je led upaljena i taster pusten prelazis na label ugasi
goto upali
end
ugasi:
if portb.0 = 1 then
portb.7 = 0
endif ; led dioda ugasena ponovnim pritiskom na taster
pause 50
if portb.7 = 0 and portb.0 = 0 then upali ;uslov ako je ugasena led i taster pusten prelazis na label upali
goto ugasi
end

Izvinjavam se unapred ako sam dosadan,i posle skoro cele noci nikako da uspem da napisem da kad stisnem i pustim taster da se na pr dve diode naizmenicno pale i gase i sledecim pritiskom i pustanjem tastera da se ugase.Pokusavao sam u ovom kodu jer ovaj nacin pisanja razumem.Ako moze pomagajte samo jos sad.Mislim da cu da budem prvi koji je unistio pic zbog veliki broj programiranja.
[ Darko_zed @ 15.02.2012. 08:06 ] @
Code:
 '*********************************
'*  Name    : za pocetnika                                      *
'*  Author  : Valjda ja :D                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 14.02.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'***********************************
TRISB = $00 ;svi portovi b su izlazni
trisb.0 = 1  ; ulazni za taster
CMCON = 7

upali:
if portb.0 = 1 then
 portb.7 = 1
 portb.6 = 0 ; 
 endif             kada pritisnes taster upali se led dioda
pause 50
if portb.7 = 1 and portb.0 = 0 then ugasi  ;uslov ako je led upaljena i taster pusten prelazis na label ugasi
goto upali                                                  
end
ugasi:
if portb.0 = 1 then
 portb.7 = 0
 portb.6 =1
 endif                              ; led dioda ugasena ponovnim pritiskom na taster
pause 50
if portb.7 = 0 and portb.0 = 0 then  upali  ;uslov ako je ugasena led i taster pusten prelazis na label upali 
goto ugasi 
end                                          


Evo , a daj neki primer sta si ti pokusavao da vidimo gde gresis u samom startu izvodjenja onoga sto zamislis
[ MILANAN @ 15.02.2012. 08:28 ] @
Stavicu primer popodne sad sam na poso pa nemem nista kod mene sto sam pisao.Kad ostanem sam iskoristim priliku da posaljem poneku poruku ali nemogu uvek,zavisi od situacije.
[ MILANAN @ 15.02.2012. 08:39 ] @
if portb.7 = 1 and portb.0 = 0 then ugasi
goto upali

Sad ovako nabrzinu,nisam ukapirao sta u programu uradi label-ugasi pa ispod -goto upali.
To me zeza ugasi upali pa sam sa tim pokusavo i sa ubacivanjem pause kako bi posle pritisa i pustanja tastera blinkale naizmenicno
a posle sledeceg pritiska i pustanja tastera da se obe ugase
[ Darko_zed @ 15.02.2012. 09:56 ] @
Citat:
if portb.7 = 1 and portb.0 = 0 then ugasi

ako su portb.7 = 1 i portb.0 = 0 onda predji na label ugasi

Citat:
goto upali

idi na upali to jest vrati se na pocetak labela ako uslovi za skok na label ugasi nisu ispunjeni ( ovi pod uslovom IF u predhodnom pasusu)

[ MILANAN @ 15.02.2012. 11:40 ] @
Da sad kapiram znacenje.Sad vezba cim dodjem kuci pa ili stizem do kakvog takvog programera ili do razvoda posto sam sve kuci zapostavio.Pozdrav i veliko hvala
[ ZAS011 @ 15.02.2012. 12:44 ] @
Neces, valjda, zbog PIC-onje da popijes razvod? Ako tako mislis, bolje batali mikrokontrolere i prihvati ... (nesmem da nastavim, Joca ce da potebne gumicu)
[ MILANAN @ 15.02.2012. 20:43 ] @
Valjda necu,borim se za sad.
Napravio sam ovako da kad pritisnem i pustim taster upali ove dve diode,jednu pa drugu i ostaju upaljene a kad ponovo pritisnem i pustim taster obe da se ugase.
Medjutim dogadja se nesto bar meni cudno pisem redom:
dovedem napajanje diode ugasena,stisnem i pustim taster upale se redom i ostaju upaljene e sad kad gasim nece odmah da se ugase,nekad treba da zadrzim taster duze.ponekad ali retko se ugase kad kratko stisnem i pustim drugim recim glupira se i kad se ugase a neprekidam napajanje za sledece paljenje isto trazi da zadrzim t duze pa tek onda da pustim.

UPALI:
IF PORTB.0 = 1 THEN
PORTB.6 = 0
PORTB.5 = 0
PORTB.4 = 0
ENDIF
PAUSE 50
IF PORTB.0 = 0 THEN UGASI
GOTO UPALI
END
UGASI:
IF PORTB.0 = 1 THEN
PORTB.6 = 1
PAUSE 1000
PORTB.5 = 1
PAUSE 1000
PORTB.4 = 1
ENDIF
PAUSE 50
IF PORTB.0 = 0 THEN UPALI
GOTO UGASI
END


[Ovu poruku je menjao MILANAN dana 15.02.2012. u 21:54 GMT+1]
[ Darko_zed @ 15.02.2012. 21:33 ] @
koje dve kad imas tri i kad pritisnes taster dovodis na pin sta + ili - ?
u programu imas uslove tako da on stalno skace sa labela na label i sad je pitanje gde se nalazi sam program kada ti pritisnes taster i zato ti se to desava .
[ MILANAN @ 15.02.2012. 21:47 ] @
Ima 3 diode pogresio sam u kucanju poruke.Kad je t pritisnut vodi pin na nulu kad nije dolazi mu 5V preko 10K
[ Darko_zed @ 15.02.2012. 22:01 ] @
onda u tom slucaju ti je ulazni pin uvek na HIGH to jest uvek je 1 pa ti stalno kada ih upali iscitava i prolazi kroz uslov IF u labelu ugasi,a to traje nekih 2 sekundi zbog pauza od po sekund pa zavisi kad ga nabodes .Malo cudno je definisan program ali boze moj radice , a jos ti se led diode pale u labelu ugasi
[ MILANAN @ 15.02.2012. 22:13 ] @
Da netreba mozda da ispod UPALI: stavim da se pale a dole ispod UGASI: da se gase.Sta bi tad bilo? Tacno je toliko potrebno da se drzi t da se ugase koliko im treba da sve 3 upale.Zato sam stavio trecu da vidim tu razliku u vremenu
[ Darko_zed @ 15.02.2012. 22:37 ] @
ja sam zbunjen sada
[ MILANAN @ 16.02.2012. 06:54 ] @
Ovako radi ali sa zakasnjenjem se gasi,nisu upisane nikave pauze oko toga pa sad nevidim zasto treba da se duze drzi t da se ugasi ali nema veze idemo dalje.
[ ZAS011 @ 16.02.2012. 11:09 ] @
Ti se bas zapetljavas k'o pile u kucine.

Nije poenta samo kuckati i kuckati. Programiranje je misaoni i smisaoni proces i ono sto kuckas mora da radis sa razumevanjem.

Ako do sada nisi ukopcao da u MCS postoji HELP, evo ti, jedan u prilogi, u "Statement reference" imas sve "komande" PBP-a, lepo objasnjene i sa primerima.
[ MILANAN @ 16.02.2012. 12:31 ] @
Sve pokusavam da radim sa razumevanjem medjutim ovo sa diodama mi radi ali nerazumem zasto je potrebno ovde zadrzati taster duze da se ugasi ali ako treba uraditi jos nesto sto ne znam ili nerazumem ostavicu ovako dok ne dodje na red.Zapeo sam za ovaj program jer sa njim pic moze da se iskoristi da se napravi neki koristan uredjaj
[ Darko_zed @ 16.02.2012. 15:25 ] @
Pokusacu da ti pomognem i da rastavim ovo sto si napisao na cinioce
Program je krenuo sa radom , portb.0 ti je stalno na 1(preko otpornika od 10koma ) posto ti tasterom dovodis 0 na njega onda rad programa ide ovako :

UPALI: prvo sto radi je da ocitava label upali

F PORTB.0 = 1 THEN prvo na sta nailazi je uslov i ocitava stanje na ulaznom pinu
PORTB.6 = 0 tebi taster nije pritisnut i uslov je da je portb.0 = 1 sto i jeste vec u samom startu
PORTB.5 = 0 sto sam ti rekao pa posto je uslov ispunjen on drzi led diode ugasene i vrti stalno
PORTB.4 = 0 u krug label dok ne pritisnes taster i dovedes nulu na pinu RB0
ENDIF
PAUSE 50
IF PORTB.0 = 0 THEN UGASI kada pritisnes taster onda program skace na label ugasi
GOTO UPALI
END
UGASI

IF PORTB.0 = 1 THEN pritisnuo si i pustio taster program je skocio na label ugasi , taster je otpusten
PORTB.6 = 1 pin rb0 je automatski 1 sto je uslov u programu da krene da pali diode jednu po
PAUSE 1000 jednu. Sve dok je na labelu ugasi on ocitava uslov IF na pocetku i prolazi kroz
PORTB.5 = 1 ceo tok ponovnog izvrsenja uslova i pauza koje su u ovom slucaju 2sekunde skupa
PAUSE 1000 Pa ti kada pritisnes taster ako se program nalazi na pocetku labela sa citanjem
PORTB.4 = 1 on ce ispostovati pauze od 2 sekunde dok ne dodje do tvoje komande za
ENDIF portb.0 = 0 da skoci na label upali i to ce uraditi i zato ti se desava ta zadrska
PAUSE 50 dok ne uradi ono sto zelis ,a to je da pocne da ih gasi .
IF PORTB.0 = 0 THEN UPALI
GOTO UGASI
END
Nadam se da si razumeo ovo sto sam ti napisao
Mozda sam malo nepregledno napisao ovo jer sam radio na brzaka
[ Darko_zed @ 16.02.2012. 15:52 ] @
to sto bi ti hteo da se momentalno vrsi prekid tog dela programa bez obzira na sve moras koristiti
prekide-interupt instrukciju koja prati promene na odredjenim pinovima ili pinu koji ti definises i odmah po promni skace i izvrsava dalju naredbu koji su postavio . Moras jos malo da izvezbas ovo da bi dosdao do ovde jer ti jos dosta toga nije bas najjasnije ali boze moj iz dana dan si sve bolji .Pozdrav
[ MILANAN @ 16.02.2012. 16:47 ] @
Ne nije nepregledno,znao sam da kasni jer nesto ceka dok se pritisne taster a sad znam sta ceka,sad razumem odakle dolazi kasnjenje.
[ MILANAN @ 17.02.2012. 21:08 ] @
Moze li neki prost primer sa naredbama FOR i GOSUB
[ Darko_zed @ 17.02.2012. 21:24 ] @
Code:
TRISB = $00
   cmcon = 7 
   gosub pocetak
   gosub pocetak1

Pocetak:
   PORTB.0 = 0 
   pause 1000  
   PORTB.0 = 1  
   Pause 1000  
return               ;kada program dodje do return vraca se na gosub pocetak i krece sa sledecim u nizu gosub pocetak1 
                          i tako u krug

Pocetak1:
   PORTB.1 = 0  
   pause 1000   
   PORTB.1 = 1  
   Pause 1000   
return


Ovo je najprostiji primer i to mi je palo na pamet inace obicno sluzi da se u glavnom programu pomocu gosub pozove neki pod program skoci na taj label odradi posao i vrati se glavnom programu i nastavi sa instrukcijama .
[ MILANAN @ 17.02.2012. 21:31 ] @
A za naredbu FOR postoji li isto nesto prosto ? pisite ako je kratko da vas ne mucim za duze pisanje.
[ Darko_zed @ 17.02.2012. 21:36 ] @
Code:
TRISB = $00
cmcon = 7
i var byte

pocetak :
 
  for i = 1 to 15       ; broj ciklusa ponavljanja je od 1 do 15 , a kad dodje na 15 onda skace na label kraj 
  if i = 15 then 
  portb.0 = 1
  pause 500
  portb.1 = 1
  pause 500
  portb.2 = 1
  pause 500
  portb.3 = 1
  pause 500
  portb.0 = 0
  pause 500
  portb.1 = 0 
  pause 500
  portb.2 = 0
  pause 500
  portb.3 = 0 
  pause 500
  next i
kraj:
portb.0 = 1
portb.1 = 1
portb.2 = 1
portb.3 = 1
goto kraj
end


ova instrukcija sluzi za ponavljanje nekog programskog ciklusa koliko puta ti zadas u ovom primeru 15 puta , a u svakom ciklusu mozes svasta raditi , uvecavati ili smanjivati neku vrednost koju ti zelis recimo pauze , neki brojac itd . Veoma korisna instrukcija inace .
[ ZAS011 @ 17.02.2012. 21:41 ] @
Evo tebi, Darko malo izmena da bi tvoje pisanije radilo kako treba (izmene pisane VELIKIM slovcima)
Code:
TRISB = $00
   cmcon = 7 
PETLJA:
   gosub pocetak
   gosub pocetak1
GOTO PETLJA

END

Pocetak:
   PORTB.0 = 0 
   pause 1000  
   PORTB.0 = 1  
   Pause 1000  
return               ;kada program dodje do return vraca se na gosub pocetak i krece sa sledecim u nizu gosub pocetak1 
                          i tako u krug

Pocetak1:
   PORTB.1 = 0  
   pause 1000   
   PORTB.1 = 1  
   Pause 1000   
return
[ Darko_zed @ 17.02.2012. 21:43 ] @
Code:
TRISB = $00
cmcon = 7
i var byte
j var byte                       j = je promenjiva u koju smestamo vrednos za svaki prolaz i tu vrednost koristimo kao pauzu

pocetak :
 
  for i = 1 to 6              ; broj ciklusa ponavljanja je od 1 do 6 , a kad dodje na 6 onda skace na label kraj 
  if i = 1 then j = 2000   ; u ovom slucaju u svakom prolazu se vreme blinkanja smanjuje u prolazu 1 je 2 sek
  if i = 2 then j = 1500    ; u prolazu 2 je 1.5 sek u prolazu 3 je 1 sek i tako redom .
  if i = 3 then j = 1000
  if i = 4 then j = 500
  if i = 5 then j = 200
  if i = 6 then kraj
  portb.0 = 1
  pause j
  portb.1 = 1
  pause j
  portb.2 = 1
  pause j
  portb.3 = 1
  pause j
  portb.0 = 0
  pause j
  portb.1 = 0 
  pause j
  portb.2 = 0
  pause j
  portb.3 = 0 
  pause j
  next i
kraj:
portb.0 = 1
portb.1 = 1
portb.2 = 1
portb.3 = 1
goto kraj
end


Nadam se da ti je ovo malo jasnije kako se menja vrednost necega za svaki prolaz
Izvini ako ima gresaka , ovo pisem na brzinu i sve je moguce
[ Darko_zed @ 17.02.2012. 21:48 ] @
Citat:
Evo tebi, Darko malo izmena da bi tvoje pisanije radilo kako treba (izmene pisane VELIKIM slovcima)

Hvala Zorane , rekoh ja da je na brzaka ,a iskreno radim deset stavri od jednom kada sednem za komp
Ma video bih da sam se vratio i procitao sta sam napisao al nema veze
[ MILANAN @ 17.02.2012. 22:06 ] @
Uredu je ljudi hvala vam puno sad imam domaci za nekoliko dana.
[ Darko_zed @ 17.02.2012. 22:08 ] @
Code:
i var byte
      j var word
     
       
         
      TRISB = $00    ' Svi pinovi porta B su izlazni
      
      
 
  Pocetak:
  
'-----------Pali jednu po jednu diodu i gasi od pocetka---------
     for i = 1 to 4
      if i = 1 Then j = 1000   ' Pauza 1 sekund
      if i = 2 Then j = 500    ' Pauza 0.5 sekunda
      if i = 3 Then j = 250    ' Pauza 0.25 sekunda
      if i = 4 Then j = 100    ' Pauza 0.25 sekunda
 
      High PortB.0   ' Upali Led 0
      pause j
 
      High PortB.1   ' Upali Led 1
      pause j
 
      High PortB.2   ' Upali Led 2
      pause j
      
      High PortB.3   ' Upali Led 3
      pause j
 
      High PortB.4   ' Upali Led 4
      pause j
 
      High PortB.5   ' Upali Led 5
      pause j
 
      High PortB.6   ' Upali Led 6
      pause j
 
      High PortB.7   ' Upali Led 7
      pause j
 
      Low PortB.0    ' Ugasi Led 0
      pause j
 
      Low PortB.1    ' Ugasi Led 1
      pause j
 
      Low PortB.2    ' Ugasi Led 2
      pause j
 
      Low PortB.3    ' Ugasi Led 3
      pause j
 
      Low PortB.4    ' Ugasi Led 4
      pause j
 
      Low PortB.5    ' Ugasi Led 5
      pause j
 
      Low PortB.6    ' Ugasi Led 6
      pause j
 
      Low PortB.7    ' Ugasi Led 7
      Pause 1000     ' Pauza 1 sekunda
      next i
      goto pocetak
 


Mozes i ovako definisati stanje portova umesto portb.0 = 1 i portb.0 = 0 , definises ih kao HIGH i LOW

[Ovu poruku je menjao Darko_zed dana 17.02.2012. u 23:24 GMT+1]
[ veselinovic @ 17.02.2012. 22:23 ] @
Jos samo da definises i kao integer ( to i,j,k,l,m,n je ostalo jos od Fortrana. Tamo se nije moglo definisati tip promenljive, pa su pomenute bile int, a ostale real), i da mu das neku vrijednost.
Poz.
[ MILANAN @ 17.02.2012. 22:26 ] @
Znam za to,te osnovne komande znam.Samo jos nesto zasto prvo blinka portb.0 jednom pa portb.1 jednom pa onda portb.0 dva puta pa portb.1 jednom tj zasto taj redosled prvi put po jednom a posle 2x pa 1x
i ne znam jos uvek zasta je cmcon = 7

TRISB = $00
cmcon = 7
PETLJA:
gosub pocetak
gosub pocetak1
GOTO PETLJA

END

Pocetak:
PORTB.0 = 0
pause 1000
PORTB.0 = 1
Pause 1000
return


Pocetak1:
PORTB.1 = 0
pause 1000
PORTB.1 = 1
Pause 1000
return
[ ZAS011 @ 17.02.2012. 22:41 ] @
Pogledaj u datasheet-u sta je CMCON registar uC-a

Citati, citati, citati, ... da bi znao sa cime radis



[ Darko_zed @ 17.02.2012. 22:55 ] @
Citat:
Znam za to,te osnovne komande znam.Samo jos nesto zasto prvo blinka portb.0 jednom pa portb.1 jednom pa onda portb.0 dva puta pa portb.1 jednom tj zasto taj redosled prvi put po jednom a posle 2x pa 1x

Ne razumem stvarno sta si pitao.
Zar ne vidis kako programcic radi , upali diodu kada izlazi iz podprograma pa je gasi kada ponovo dodje na njega i isti slucaj sa drugim pinom i u programu za njega. Probaj da zamenis da je 1 na pocetku programa ,a 0 na izlazu pa da ukapiras ako mozes kako i zasto .
[ MILANAN @ 18.02.2012. 09:12 ] @
Znam sta je CMCON i da ima nekoliko nacina rada sa komparatorima ali nisam u uputstvima nasao sta je =7 a onaj program je uredu samo sto je meni na rb0 taster pa sam nabrzinu stavljao diode na druge pinove i napravio gresku u pisnju.
[ ZAS011 @ 18.02.2012. 09:56 ] @
Da si lepo procitao "uputstvo" za 16F62x, naisao bi na jednu sliku gde su objasnjene funkcuje bitova CMCON.0, CMCON.1 i CMCON.1.

Kada su sva tri setovana (1), onda je komparatorski modul isklucen.

111 Binarno = 7 Decimalno

1 * 23 + 1 * 22 + 1 * 20 = 7 * 100 = 7

Prouci malobrohne sisteme, trebace ti:
Binarni - osnova brojanja 2
Decimalni - osnova brojanja 10
HaksaDecimalni - osnova brojanja 16

I jos jednom da ti napomenem, SVE sto je vezano za odredjeni mikrokontroler pise u njegovom datasheet-u, samo treba citati.
[ Darko_zed @ 18.02.2012. 12:37 ] @
Milane sa kojim PIC-om vezbas ???
[ MILANAN @ 18.02.2012. 15:04 ] @
Sa 16f628a
[ MILANAN @ 19.02.2012. 21:50 ] @
Pozdrav.Ja da pitam nesto ali za sad nevezano za ucanje programa.Interesuje me ako se na pic 16f628a ukljuci interni oscilator sta se vezuje na pinove 15 i 16 ? nalazio sam neke seme ali nista da je lepo objasnjeno i ono najbitnije koliko je temperaturno stabilan 16f628 sa internim oscilatorom ako bi se na primer napisao program da na nekom pinu on salje frekvenciju 4mhz (ako moze toliko) da li bi se menjala ta frekvencija sa promenom spoljne temperature? Nameravam da ga stavim kao spoljni oscilator na drugi pic,mozda je glupa zamisao ali vredi pitati.
[ ZAS011 @ 19.02.2012. 22:01 ] @
Podesavanje uC-a da koristi interni oscilator se vrsi setovanjem/resetovanjem jednog bit-a u konfiguracionoj reci, na pinove 15 i 16 se ne vezuje nista. Takodje se jednim konfiguracionim bitom moze izvrsiti da jedan od ta dva pina bude CLKOUT (Fosc/4)

Interni oscilatori bas i nisu preterano temperaturno stabilni, a ni naponski, posto su RC tipa.

Da bi na CLKOUT dobio 4MHz, PIC-onja bi morao da radi na 4*4MHz=16MHz, a to nece da moze sa internim oscilatorom.

Ideja ti je budalasta, kvarc + 2 kondenzatora kostaju mnogo manje od jednog PIC-onje.
[ MILANAN @ 19.02.2012. 22:22 ] @

Hteo sam da izbegnem blok kondenzator u oscilatoru jer mi je frekvencmetar mnogo temperaturno zavistan od tih blokova na 15 i 16 pin a inace meri fenomenalno tacno.Probao sam i stavljao nekoliko razlicitih blokova ali nista.Znam da je ideja glupa ali nadao sam se da moze.

Kako se ovde pravilno prevodi ( i )

for i = 1 to 6

Posto su mi ove komande do sad jasne da krenem dalje.
[ ZAS011 @ 19.02.2012. 22:26 ] @
Ja stvarno ne bih znao kako da ti prevedem slovo i. Stvarno ne znam

U FOR petlji to i je samo jedna od promenljivih koju moras da definises negde u programu.
[ MILANAN @ 19.02.2012. 22:30 ] @
To je to uvezi ( i ) nista vise,sad da malo radim sa ovim primerima koje ste mi poslali pre neki dan vezano za FOR.
[ MILANAN @ 23.02.2012. 13:00 ] @
Pozdrav.Znate li mozda gde da nadjem semu i kod za punjac akumulatora ili baterji sa 16f84 ili 18f628 ? Hteo bih ta da pravim za sebe i ujedno da proucim taj kod ako mogu.Hebih da budem dosadan i da vas mucim da pisete kod samo ako znate neku adresu gde to da nadjem.Video sam nesto sa 12f ali ko zna kad cu za Nis da bih ga kupio a i $ me zeza pa zato bih da iskoristim "84 i "628 kad ih vec imam.
[ Darko_zed @ 23.02.2012. 17:42 ] @
Imas ovde na temi sa 12F675 i kod i semu .
Sa ovim pomenutim ces malo teze to odraditi jer nemaju AD ulaz i skoro nemoguce je ocitati tako napon samo sa tim PIConjama .12F675 kosta nekih 200 din , nije skup ,a zavrsice ti posao samo tako i postedece te muka i gubljenje vremena ako pokusavas tezim putem da to radis sa 16F628-84.
[ MILANAN @ 23.02.2012. 18:14 ] @
Pretpostavljam da je to ovaj kod.Ako moze bar ukrako objasnjenje bar za ovo sto sam obelezio zvezdicama jer stvarno ne znam gde da nadjem knjigu i citam o programiranju a ujedno postoji li neka tabela kako se obelezava koji je napon u pisanju koda kao na pr ovo 620 i 460 valjda je to napon ?

Device 12F675
Xtal 4

Config INTRC_OSC_NOCLKOUT, BODEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF, CPD_OFF, CP_OFF

Declare Adin_Res 10 ****
Declare Adin_Tad frc ****
Declare Adin_Stime 50 ****

ANSEL = %00110001 ****

Input GPIO.0
Output GPIO.2
Output GPIO.4
Output GPIO.5

Symbol Rele GPIO.2
Symbol Crvena GPIO.4
Symbol Zelena GPIO.5

Dim Temp As Word *********

Clear

Pocetak:
' Izmeri napon akumulatora
Temp = ADIn 0 ********

If Temp > 620 Then *************
GoTo Iskljuci
EndIf

High Zelena ' Upali Zelenu LED
Low Crvena ' Ugasi Crvenu LED
High Rele ' Ukljuci Rele
GoTo Pocetak

Iskljuci:
Low Zelena ' Ugasi Zelenu LED
High Crvena ' Upali Crvenu LED
Low Rele ' Iskljuci Rele

Petlja1:
' Izmeri napon akumulatora
Temp = ADIn 0 *********

If Temp < 460 Then *********
GoTo Pocetak
EndIf

' Blinka zelena
High Zelena
DelayMS 300 *********
Low Zelena
DelayMS 300
GoTo Petlja1


End
[ shpiki @ 23.02.2012. 19:22 ] @
Ne trosim PicBasic, ali da ti odgovorim, da ne cekas...

Sva sa declare je deklaracija promenljivih,
ANSEL je podesavanje registra (pronacices detaljan opis u datasheetu od kontrolera koji koristis)
Dim Temp as Word deklarisanje promenljive sa imenom Temp, tip Word (ako nije jasno sta je Word - Googlaj)
If Temp<460 Then klasican If Then uslov (Googlaj)
Temp = ADIn 0 u promenljivu Temp se smesta rezultat AD konverzije na pinu 0 AD konvertora
DelayMS 300 kasnjenje u milisekundama (u konkretnom slucaju 300ms)

Pozdrav.

@edit
Evo ti manual za PBP
[ MILANAN @ 25.02.2012. 18:12 ] @
Pozdrav.Moze li da se ovaj asm prepravi da radi na 4mhz ? ako ne zahteva mnogo vremena i ako nema mnogo pisanja molio bih za pomoc
[ ZAS011 @ 25.02.2012. 19:03 ] @
Taj program za 12F675 nije pisan u PBP nego u Proton+ Pic Basic-u (JA ga napisao, 'nako na brzaka za drugara)

Declare su instrukcije kojima kompajleru dajes do znanja kako da se "ponasa" kada pravi .asm pa iz njega .hex za oidredjeni kontroler.

Declare Adin_Res 10 ****
Daje do znanja kompajleru da je rezolucija AD konvertora 10 bit-a

Declare Adin_Tad frc ****
Daje do znanja kompajleru kako da setuje registre kada se koristi interni RC oscilator kao klok za AD konvertor

Declare Adin_Stime 50 ****
Daje do znanja kompajleru da je minimalno vreme potrebno za punjenje kondenzatora u AD konvertoru 50 uS

Dim Temp As Word *********
Isto sto i: Temp VAR Word u PBP

DelayMS 300 *********
isto sto i Pause 300 u PBP

Vise koristim Proton od PBP (ne secam kada sam zadnji put koristio PBP za nesto ozbiljnije).
[ MILANAN @ 25.02.2012. 19:52 ] @
Ja sam poceo nesto sa picbasic,znam samo nikoliko komandi pa mi je zato ovo izgledalo toliko strano a ovaj asm iz prethodne porike je asembler samo bih da ga prepravim da bide za 4mhz ali ne znam kako
[ ZAS011 @ 25.02.2012. 20:16 ] @
A zasto ti ne odgovara 10 MHz? Ne razumem u cemu je "gvint" .

Ako je 4 MHz jedini kristal koji imas, onda ...
[ MILANAN @ 25.02.2012. 20:53 ] @
To je za frekvencmetar ali sa 10mhz kristal nemeri tacno( oko 1mhz pokazuje manje),trebao bi mi 9.99... da bi merio kako treba a to nema a ne moze da se nadesi ni kondenzatorima u oscilatoru pa mi zato odgovara da je za 4 mhz jer imam dosta kristala od 3.xxx do 4.xxx i mogao bih rako da kombinujem i da ga podesim
[ rsinisa @ 26.02.2012. 09:12 ] @
Citat:
MILANAN: To je za frekvencmetar ali sa 10mhz kristal nemeri tacno( oko 1mhz pokazuje manje)
Taj podatak nam ne govori mnogo. Za koju merenu frekvencu ti pokazuje 1 MHz manje? Ako si stavio kristal od 10 MHz ne bi trebalo da greši više od onoga koliko greši kristal, a to je obično 20 ppm-a, sem ako nisi stavio neadekvatne kondenzatore, ili je xtal toliko loš.


Citat:
a ne moze da se nadesi ni kondenzatorima u oscilatoru pa mi zato odgovara da je za 4 mhz jer imam dosta kristala od 3.xxx do 4.xxx i mogao bih rako da kombinujem i da ga podesim
Ako treba fino podešavanje oscilatora, onda se u paralelu sa kondom koji ide na pin 17 stavi 1 trimer kond tako da ukupan kapacitet bude što bliže propisanim granicama.

A što se tiče .asm programa, poigraj se sa vrednostima koje se upisuju u promenljive 'HighCOU' i 'LowCOU' - prva je za grubo, a druga za fino podešavanje. Samo koliko ja vidim, ovaj program ima dva načina merenja (sa i bez preskalera) pa se i navedene promenljive na dva mesta pune različitim vrednostima tako da ćeš morati za oba načina da eksperimentišeš sa vrednostima.

Pozdrav.
Sinisha
[ rsinisa @ 26.02.2012. 09:31 ] @
Sad sam još nešto uočio - u programu piše da bez preskalera može da meri do 64 MHz, ali moram da ti skrenem pažnju da to nije tačno. Zbog principa koji ovaj frekvencmetar koristi i činjenice da TMR0 ne može da "izdrži" više od 50 MHz, to znači da je upravo 50 MHz gornja granica bez preskalera i to u idealnim uslovima. Ja bih procenio da više od 40 MHz nije pouzdano meriti na taj način.

Pozdrav.
Sinisha

P.S. I još nešto: ovo je tema za PBP, ne za asembler, pa bih te zamolio da otvoriš drugu temu ako imaš još pitanja.
[ PedjaZ @ 26.02.2012. 11:40 ] @
Citat:
ZAS011:
Vise koristim Proton od PBP (ne secam kada sam zadnji put koristio PBP za nesto ozbiljnije).


Koji je razlog ako se moze znati?
Hvala
[ ZAS011 @ 26.02.2012. 12:01 ] @
Ima nesto vise funkcija od PBP, ili je pre dosta vremena imao, koje su mi "legle k'o kec na deset" kada mi je trebalo.

Sve u svemu, sintaksa se malko razlikuje, nista sto se ne moze prevazici za 10 minuta, i, cinimi se, pravi nesto kompaktniji kod. Nadji, probaj.

HINT : Sonsivri
[ MILANAN @ 26.02.2012. 14:27 ] @
Frekvencmetar pokazuje 10 cifre i samim tim nemora da se pokusava bez preskalera.U semi je kristal 10mhz i 2x33pf blok ali tako sve pokazuje 1mhz manje pa sam na grubo povecavao (eksperimentisao)kapacitet i trimerom podesio ali priblizno,ne moze tacno jer kad se poveca kapacitet onda pomeranjem trimera pravi se neli korak oko 5khz pa ne moze da se tacno podesi.Nemam drugi nijedan kristal od 10mhz a od 4 imam razne varijante od po nekoliko khz gore dole.
[ MILANAN @ 05.03.2012. 13:39 ] @
Hteo bih da pitam nesto u vezi pull-up otpornika,nalazio sam nesto o tome ali bih ipak ovako sa se javim jer ne znam da li moze greskom oko ukljucenja ili iskljucenja pull-up da se unisti pic.Na pr. mozda je glupo pitanje da li kad se otpornik ukljuci na pr na rb0 16f84 ili 16f628 da li to znaci da na pin rb0 mogu da se dovedu direkno 5v i ako ukljucimo izlazni otpornik da li moze na pr da se veze dioda bez otpornika izmedju pina i diode ?
[ rsinisa @ 06.03.2012. 04:18 ] @
Nisam baš shvatio sve detalje tvog pitanja, ali ako sam dobro razumeo, moraš najpre da shvatiš (a to i piše u uputstvima) da se pull-up isključi automatski (ako su uključeni) kada je pin postavljen kao izlazni, tako da mislim da je to generalno odgovor na tvoja pitanja. A vrednost pull-up otpornika kod PIC-eva je oko 20 Koma.

Moje dugogodišnje geslo je "Čitati, čitati i samo čitati.", drži se toga i biće ti sve jasno.

Pozdrav.
Sinisha
[ MILANAN @ 06.03.2012. 06:17 ] @
nije problem oko citanja nego samo sam hteo da znam iz prakse o cemu je rec da nebih unistio pic jer eksperimentisem a kod nes nema da se kupe delovi,moram u Nis za bilo sta pa bi be obican 16f628 kostao vise od 10e zato sam pitao.
[ bogdan.kecman @ 06.03.2012. 08:01 ] @
Citat:
MILANAN: da li moze greskom oko ukljucenja ili iskljucenja pull-up da se unisti pic.

tesko


Citat:
MILANAN:kad se otpornik ukljuci na pr na rb0 16f84 ili 16f628 da li to znaci da na pin rb0 mogu da se dovedu direkno 5v i ako ukljucimo izlazni otpornik da li moze na pr da se veze dioda bez otpornika izmedju pina i diode ?


pogledaj datasheet unutra ces da vidis semu kako je spojen pull up otpornik. Ako si ti upalio pull up na RB0 i dovedes na RB0 Vdd - nista se nece desiti (nece prolaziti nikakva struja kroz taj port). Ako dovedes na RB0 Vss onda ce kroz pull up na RB0 prolaziti struja (oko 200uA).

Dakle ako ti je RB0 setovan kao ulaz, potpuno je nebitno sta ces dovesti na njega (Vdd - Vss) ne mozes da ga "spalis". Naravno ako mu dovedes 100V ima da prsne ko zvecka ali to nema veze sa ovom pricom :D.

Pull up ima veze jedino sa tim sta ces ti citati ako je pin "floating" iliti ako ne dovedes nista na njega.

E sad, ako je pin setovan kao IZLAZ, tu opet pull-up nije preterano bitan (cim postavis tris da je port izlazni pull-up se automatski iskljucuje) a tu sada mozes lagano da spalis port no to opet nema veze sa pull-up-om, vec ako ti izbacis tu npr LOW, to znaci da port vuce na Vss i moze da povuce max 20mA. Ako ti diretkno na taj izlaz koji si spojio sa Vss (izlaz low) spojis Vdd imas kratak spoj i kroz port ce da krene struja koja je veca od 20mA i jeli u 99% slucajeva port ce da izgori (pic ce da radi, samo taj pin vise nece raditi), isto u obrnutom slucaju, ako ti izbacis HIGH output (Vdd) koji moze max da sorsuje ako se dobro secam samo 10mA a spojis ga kratko sa Vss opet imas kratak spoj, opet ce da krene velika struja kroz port i opet moze da rikne port....

Zbog ovog kratkog spoja je zgodno da uvek ako na neki pin dovodis neki digitalni signal dovedes to preko nekog otpornika da limitiras struju na 10mA tako da ako i napravis kratak spoj slucajno - ne spalis nista :)
[ bogdan.kecman @ 06.03.2012. 08:03 ] @
btw a za "skupe delove" pogledaj onaj spisak firmi koje prodaju elektroniku u srbiji, 99% firmi sa spiska salju delove postom (sto normalnom sto post expresom/aks-om i ekipom) tako da ne moras da izlazis iz gajbe, stigne ti na kucnu adresu sutradan :D

[ MILANAN @ 06.03.2012. 19:02 ] @
To me je zanimalo jer ipak po meni najbilje shvatanje je iz prakse,procitao sam dosta toga li ipak ajde da pitam jer imam samo jos jedan pic i ako sam nesto pogresno shvatio iz citanja i unistim pic onda mi negine crvena za gorivo i 320din za pic.Hvala vam na objasnjenju.
[ ZAS011 @ 06.03.2012. 19:33 ] @
Zasto crvena za gorivo? Za jednog PIC-onju Post Express ti nece uzeti vise od 160 dindzi
[ MILANAN @ 06.03.2012. 20:51 ] @
Neznam sta radi taj Post Express,nedavno sam narucio lupu 40x uvecanje ali mala,staje u kutiji duplo manjoj od kutije cigareta i naplatili su mi 250din i to ne na kucnu adresu vec da sam podignem u posti ( ispod 2,5kg treba da nose na kucnu adresu ) gde se kod nas ceka i po dva sata,za njih tamo je prevelika guzva i sa samo tri stranke a da ne pricamo za vise.Lepota
[ Darko_zed @ 07.03.2012. 01:07 ] @
A da ti ja donesem da se ti ne maltretiras , sta je to 70-80km puta , pa da onda potrosimo tu crvenu u kafani ''kamiondzije'' , cuo sam da je extra i da je hrana vrhunska sa razlicitim specijalitetima i salatama od mesa .
Ako si za tu varijantu samo reci .Pozdrav
P.S Mozemo i Zorana da povedemo ako hoce da se proseta koji kilometar juznije
[ ZAS011 @ 07.03.2012. 07:19 ] @
Njah, ne isplati se zbog jednog PIC-onje potezati putovanje.

Da li si bio kod kuce kada ti je postar dolazio? Morao je da dodje inace ne bi imao ceduljce da odes i podignes posiljku .

Ako nisi bio kod kuce, to je tvoj problem. Post Express naplacuje postarinu prema tezini posiljke i njenoj vrednosti i otkupnini. Relativno skoro sam slao jedan DMX interfejs sa otkupom i, cini mi se, postarina je bila reda velicine 220 dindzi.

I dalje tvrdim da je 250 dindzi < 1000 dindzi
[ rsinisa @ 07.03.2012. 09:06 ] @
@ MILANAN
POST EXPRESS bi trebalo da donosi na vrata, ja sa njima radim godinama i prezadovoljan sam.
Pošto ne želim da Darku kvarim užitak u salatama od mesa, kad uništiš taj PIC koji će on da ti donese, ja ću vrlo rado da ti pošaljem drugi ako si spreman da platiš 150 din poštarine. Iznos za PIC ćeš da mi platiš na tekući kako ne bi plaćao troškove povratka novca otkupninom - jeftinije od toga mislim da ne možeš da prodješ, jedino moraš da čekaš u toj pošti radi uplate.

Pozdrav.
Sinisha
[ Darko_zed @ 07.03.2012. 10:36 ] @
Citat:
Pošto ne želim da Darku kvarim užitak u salatama od mesa

a ne ne i ti si pozvan ,izvini na tebe sam zaboravio .Pazi organizujte se i ti i Zoran , skoknete do mene na aperitiv i ''laku'' salaticu za tezu se cuvamo , pa cemo lagano krenuti put Svrljiga i odneti mu svi po jedan PIC kao poklon , a on ce nas u kafanicu ako moze pa tamo nek ispituje sta ga sve interesuje u vezi PicBasica .Pozdrav
[ Darko_zed @ 07.03.2012. 23:08 ] @
a jbt al se ljudi plase kafana pa niko ne sme rec da kaze
[ rsinisa @ 08.03.2012. 06:08 ] @
Ma ne plašim se nego, što reče Šćepa, daleko za uživanje u salati, a nešto mi nije usput. :) Zadnji put sam u tom kraju bio pre nekih 5 godina.

Pozdrav.
Sinisha

[ goran_68 @ 08.03.2012. 07:25 ] @
Koliko ja znam u kafani "Kamiondžije" roštilj se prodaje na metar. Bar je tako bilo davno, davno... Uživajte!
[ Darko_zed @ 08.03.2012. 08:05 ] @
Citat:
goran_68: Koliko ja znam u kafani "Kamiondžije" roštilj se prodaje na metar. Bar je tako bilo davno, davno... Uživajte!

Aha gledaj ga i ovaj je upoznat pa onda si i ti automatski pozvan ,a sta reci tebi Sinisa nego da nadjes neku dobru kafanicu u tvom kraju koja se vredi posetiti jer mislim da cu uskoro prolaziti kroz tvoj kraj pa da svratimo na salaticu .Pozdrav
[ MILANAN @ 08.03.2012. 11:10 ] @
Za kamiondzije iskreno nebi bio problem da bar malo bolje stoim finansiski,iako nesmem da pijem ipak idalje volim dobru kafanu,porcije jesu ogromne ali pice mu je preskupo i sto mi se ne svidja nikad nije imao muziku a inace lepo je mesto,bio sam par puta.Sto se tice poste VERUJTE ako hocete da nijednom mi paket nisu doneli na kucnu adresu,samo da papir da sam podignem,zadnji put mi je stigla jedna knjiga oko 300grama i postar sretne moju majku na ulici i da joj papir da mi da da dodjem da podignem knjigu u posti gde sam izgubio celo popodne bez potrebe.Zato mi je lakse,a jeste i pomalo gluplje resenje da odem kupim sta mi treba,sve lepo kulturno i bez nerviranja.
[ Darko_zed @ 08.03.2012. 13:58 ] @
Za finansije ne brini , ne cvetam ni ja ali za to se ima jer bi u nekom pogledu bio i poslovni sastanak pa da imam opravdanja samo vidis ovi uzvodno koce stvari daleko im je kao !!!
[ MILANAN @ 09.03.2012. 20:14 ] @
Ja sam za da se napravi neki dogovor da se vidimo naravno kad svima odgovara a za cvetanje vidim i sam,malopre sam pravio mrezu na jedan tv za 500din. bedno
[ MILANAN @ 09.05.2012. 17:45 ] @
Pozdrav.Javljam se posle duzeg vremena ako mozete da mi pomognete oko lcd displeja 2x16.Potrebno mi je da ga programski povezem na pic16f84a na portb odnosno kako za to da napisem program od pocetka pa do na pr. da na displeju pise milan.Nalazio sam previse toga na internetu ali neuspeva mi a inace sve je lepo povezano,kad ubacim neki drugi hex sve radi sto se plocice tice.
[ rsinisa @ 09.05.2012. 22:21 ] @
Nisi rekao za koji jezik. Što se tiče PBP-a i PROTON-a, imaš u uputstvu shemu spajanja i sve što je potrebno, veoma je jednostavno. Ako govoriš C, verujem da je i tamo to rešeno na jednostavan način.

Pozdrav.
Sinisha
[ MILANAN @ 10.05.2012. 06:40 ] @
Mislio sam na pic basic.Znaci da spojim programski 16x2 sa 16f84a i da se upotrebi portb. od pocetka pisanja,definisanja portova i lcd do glavnog programa na pr da na displeju pise milan.Dalje mislim da cu moci sam

[Ovu poruku je menjao MILANAN dana 10.05.2012. u 07:55 GMT+1][/sub

na pr ovaj raspored pinova

[Ovu poruku je menjao MILANAN dana 10.05.2012. u 07:56 GMT+1]
[ ZAS011 @ 10.05.2012. 07:40 ] @
Ajde ti nama, lepo, postavi ovde kod koji ti ne radi (nece da ispise "Milan" na displeju).

Imas tone primera i za PBP i za Proton vezanih za displej.
Treba ih samo prostudirati i ukljuciti vijuge (studirati sa razumevanjem).
[ rsinisa @ 10.05.2012. 11:45 ] @
Imaš ovde sve objašnjeno, trebalo bi da je sasvim dovoljno, imaš i 3 primera.

http://melabs.com/resources/pbpmanual/5_32-5_35.htm#535

Ili bolje da pojasnim još malo.
Podrazumevano podešavanje je za shemu kao na slici, a pošto ti imaš drugačije povezan displej, potrebno je sa onim DEFINE komandama da podesiš prema tvojoj shemi, a zatim sa jednostavnim LCDOUT komandama ispišeš šta ti treba.

Pozdrav.
Sinisha
[ MILANAN @ 16.06.2012. 21:42 ] @
Pozdrav.Probao sam nesto da napravim u picbasicu sa 16f84a i naravno neide.Ako moze pomoc kako bi izgledao izvorni kod da napr. pic broji inpulse na nekom pinu i kad izbroji koliko mu zadam onda da na drugom pinu pojavi napon, na pr upali led.Probao sam,neide pa ako moze pomagajte
[ Darko_zed @ 17.06.2012. 09:45 ] @
Ima vise nacina da se ovo izvede , mozes sa interaptima , a mozes i ovako prostije pa ti uklop iu ostatak programa .

Code:
start:
if porta.0=1 then                 
    counter=counter+1                                          ' kad dodje 1 na pinu on registruje promenu i broji
    endif                                                               

if counter = (zadati broj impulsa) then                 
    portb.1 = 1                                                   ' pali led diodu na pinu
endif
[ ZAS011 @ 17.06.2012. 11:20 ] @
Citat:
MILANAN: Pozdrav.Probao sam nesto da napravim u picbasicu sa 16f84a i naravno neide.Ako moze pomoc kako bi izgledao izvorni kod da napr. pic broji inpulse na nekom pinu i kad izbroji koliko mu zadam onda da na drugom pinu pojavi napon, na pr upali led.Probao sam,neide pa ako moze pomagajte


Ajde, Milane, sedi malko i pocni da ucis najosnovnije stvari.
Prvi i osnovni program, koji se veoma cesto naziva "Hello World" u svetu mikrokontrolera je Blink LED.
Ako do sada to nisi naucio (kako upaliti i ugasiti LED), onda batali mikrokontrolere i pocni da se bavis drugim stvarima gde ti ucenje nije potrebno.
Inace, batali taj 16F84A vec jednom. To smo ti napisali vec nebrojeno puta.
Ako ti je problem cena tog kontrolera, POKLONICU ti, barem jedan, 18F1320.
[ MILANAN @ 17.06.2012. 11:58 ] @
Hvala Darko ja sam pisao slicno to samo sam pokusavao nesto sa > i < i nije htelo.Pokusavam ja da ucim ali tesko ide sa interneta jer nemogu dugo ispred monitora pa sam pre neki dan zvao u Nisu u infoelektronici da narucim knjigu PICBASIC 2 autor valjda bese Vojo Milanovic ali gazda otiso na odmor tako da za neki dan nista od knjige.Tu knjigu vidim kao jedino resenje jer mi mnogo smeta monitor.Za 16f84 shvatam i vec vidim da mu je odavno proslo vreme ali za ovo sto sam hteo da pravim odgovara kao jeftinije varijanta da da nestavljam skuplji kad vec koristim samo nekoliko pina.Hvala vam jos jednom.
[ ZAS011 @ 17.06.2012. 14:07 ] @
Citat:
MILANAN: %< %< %< Za 16f84 shvatam i vec vidim da mu je odavno proslo vreme ali za ovo sto sam hteo da pravim odgovara kao jeftinije varijanta da da nestavljam skuplji kad vec koristim samo nekoliko pina.Hvala vam jos jednom.


PIC16F84A-04/P => 414,18 din
j
evtinije
PIC16F628A-I/P => 310,18 din

sa manje pinova
PIC16F688-I/P => 271,52 din

sa jos manje pinova
PIC12F609-I/P =>133,81 din
PIC12F615-I/P => 132,54 din
ili
PIC10F200-I/P => 79,13 din

Toliko o skupoci i malom broju pinova.
[ MILANAN @ 17.06.2012. 14:25 ] @
U Nisu u proelektronik je 16f84a 04 320din a 16f628a 220din. pre oko 3 meseca sam kupovao.I sad je toliko,bar tako pise.Te piceve sam kupio nekoliko jer uzeo sam tada neke stveri koji nisu htele da radi i vratio sam ih a umesto novca sam uzeo desetak 16f84. Pic 16f84a 10 im je oko 450din. njega sam kupio za frekvencmetar pa odatle znam cene,e sad sve je to kao i mnoge druge stvari u interhit i mg mnogo skuplje,mozda i vise od toga sto ste mi napisali pa tamo ne idem.
[ ZAS011 @ 17.06.2012. 14:34 ] @
Odustajem
[ MILANAN @ 17.06.2012. 15:10 ] @
Nije sala,stvarno ima dosta stvari koje su tamo mnogo jeftinije
[ introitus @ 17.06.2012. 15:33 ] @
Ti ili ne citas ili ne razumes ili se pravis blesav :)
Lepo ti covek pise da se manes tog 16F84(a) i predjes na nesto
modernije, jeftinije i bolje.
Vec se toliko pisalo ovde o tome da treba bataliti 16F84 i odmah poceti
sa novijim ali izgleda nema efekta.

Jedna knjiga nikako ne moze biti jedino resenje da naucis da radis sa
PICBASICom i PICovima, mozes je eventualno posmatrati kao neki uvod.
U svakom slucaju, nadam se da ce ti pomoci.
[ MILANAN @ 17.06.2012. 18:01 ] @
Dobro sad ti ili necitas ili ces po svaku cenu da se drzis necega samo da bi bio u pravu.Vec imam nekoliko komada i ajde sad da ih bacim pa da kupim bolje iako jos ponesto moze sa njima da se uradi .Znaci sad nemam audi A8 i po tebi ( introitus ) treba moj C4 da gurnem u ambis zato sto nije nov.Mozda poredjenje nije adekvatno ali po tebi tako ispada.
[ ZAS011 @ 17.06.2012. 20:12 ] @
Najbolje bi ti bilo da kupis neki "fabricki" frekvencmetar koji meri do 5GHz.
Sta je to naspram par prestarelih PIC-onja.

I da si te dinosauruse dobio dzabe, opet bismo ti isto pisali. Mikrokontroler se bira prema zahtevima koje imas. Za paljenje LED posle odbrojanih XX impulsa, posao ti odradjuje 10F200. Ako ti treba USB komunikacija, uzeces 18F2(4)550, ...

Ti nastavljas sa "imam ficu al bih da mi ide k'o ferari".

Bez ljutnje, te dinosauruse bih na tvom mestu poklonio nekom klincu da ima cime da pocne, napise 3 - 4 programceta i shvati da su neupotrebljivi za iole ozbiljnije stvari (osim ako nije mazohista da citav program razvija u assembler-u, za, npr., 18Fxxxx).
[ Darko_zed @ 17.06.2012. 20:31 ] @
nemojte ljudi da tema dobije katance , ima dosta korisnih informacija ovde i mislim da i dalje postavljam pitanja o Picbasicu kada mi to zatreba .Pozdrav
[ ZAS011 @ 17.06.2012. 20:36 ] @
Nece Jovancho da turi katance na ovo, nije postalo "opasno".
[ MILANAN @ 17.06.2012. 20:37 ] @
Razumem da mi to pisete iz najbolje namere i hvala vam na svakoj pomoci ali za ovo sto sam ja do sada naucio ( IF THEN FOR ELSE WHILE WEND RETURN GOSUB LOOKUP UPOTREBA DISPLEJA I SL.) zavrsio mi je i 16F84. Nekoliko lc i frekvencmetra sam prodao ostali mi jos 2 16f84 i 1 16f628 a videcu kad stigne knjiga koji se pic obradjuje pa cu nadalje sa njim.Fabricki frek bi i kupio samo ne onaj victor mada i ovaj sto imam je odlican,ako nekog zanima postavicu adresu.MIKIKG mi je dao ideju za osc pa je sad dosta stabilniji i zavrsava poso.Ako hocete napisite mi ono za odbrojavanje inpulsa i paljenje leda ubi se od kucanja.Darko je sigurno lepo napisao sustinu toga ali ja neumem dalje.Iako ja mozda ne znam ali poslusajte me i nebacajte nake stvari,uvek ima mesta gde da se stave,malopre sam ubacio kaskadu u ei tv i to PETICU , za crvenu,a sasija tva za delive mi na tavanu nije trazila sto kazu ni leba ni vodu.
[ rsinisa @ 18.06.2012. 08:32 ] @
Milane, ja te razumem potpuno, radiš sa onim sa čime raspolažeš. Ja sam pristalica teorije da čovek treba da uči na onome što će i da koristi - šta će meni učenje na dsPIC-u kada mi on verovatno nikada neće biti potreban.
Obzirom da je kod tebe 16F628 najjeftiniji, predlažem da ostaneš na njemu ako ti je dovoljan za tvoje potrebe. Ja sam nedavno prešao na 16F1827 jer je on u COMET-u najjeftiniji od 18-pinaca, a meni su oni najčešće potrebni, plus što ima jako puno novog hardvera u sebi. Na 10 kom. je cena oko 190 din + PDV, ako se dobro sećam. Ako hoćeš da predješ na tu novu seriju sa proširenim 14-bitnin jezgrom, potreban ti je PBP3 (a nije loše i da se svakako prebaciš na PBP3) i neki programator koji može da ih programira. Pošto radiš pod WINDOWS-ima, PicKit2 je sasvim dovoljan s tim da mora da se skine fajl sa novim definicijama, tj. novi .dat fajl sa Microchip sajta.

Da se vratim tvom problemu. Darko ti je dao pola rešenja (ili malo manje, zavisi šta je izvor impulsa), tj. njegovo rešenje će da ti uvećava brojač sve dok traje impuls. Napisaću ti program uz pretpostavke da je ulaz na RB0, a izlaz na RB1, da je aktivno stanje logička jedinica, i da PIC može da se vrti u petlji dok broji, tj. da ne mora da radi ništa drugo dok se ne dostigne zadati broj:

Code:

cekaj_log1:
  if PORTB.0=0 then cekaj_log1                   ; čekamo da se pojavi log. 1
  brojac=brojac + 1                                   ; kad se pojavi, uvećamo brojač
  if brojac=zadata_vrednost then upali_led    ; dostignuta zadata, idemo dalje, palimo LED
cekaj_log0:
  if PORTB.0=1 then cekaj_log0                   ; čekamo da ulaz padne na log.0 kako ne bi imali lažno brojanje
  goto cekaj_log1  
upali_led:
  PORTB.1=1


E sad, ovo ovako može da prodje ako je impuls koji brojiš čist, tj. ako je iz nekog elektronskog brojača ili sl (i to bi bilo tih pola rešenja od Darka). Ako je iz tastera, mikroprekidača ili nekog drugog mehaničkog elementa, 99,9% da će doći do treperenja kontakata i do lažnog brojanja (u zavisnosti od kvaliteta izrade prekidača). Treperenje se na engleskom naziva baunsing (bouncing - poskakivanje), a metod za eliminisanje tog treperenja debaunsing (debouncing). Postoje softverske i hadrverske metode, a pošto već radimo sa mikrokontrolerima, softversko je uglavnom prihvatljivo pošto je dovoljno da detekcija treperenja traje 5 do 20 ms, što u većini aplikacija ne predstavlja problem.
Softverskih rešenja ima nekoliko, od prostog testiranja ulaza, tzv poling (polling) pa do rešenja sa upotrebom interapta. U 99% mojih aplikacija koristim ovo prvo rešenje i to u trajanju od 5 do 10 ms. To moje rešenje je takvo da pored eliminisanja treperenja ujedno detektuje samo momenat pritiska na taster, nebitno koliko dugo je taster pritisnut tako da se jednim udarcem ubiju dve muve. U prevodu, to znači da u gornjem primeru nije potrebno čekati da ulaz padne na logičku nulu. Taj potprogram je pisan u ASM-u pa ga neću dati ovde (napisao sam ga još kad nije postojalo ništa sem ASM-a za PIC) i tako ga i dan-danas koristim (dao sam ga pre godinu-dve u nekoj od tema), ali ako ti treba, napisaću ga u PBP-u.

A ako je potrebno da kontroler radi još nešto dok se ne pojavi logičko 1 na ulazu, umesto da se vrti u petlji može da ide da radi nešto drugo pod uslovom da to što radi ne traje duže od trajanja impulsa, kako se ne bi neki impuls preskočio.

Pozdrav.
Sinisha
[ MILANAN @ 18.06.2012. 12:50 ] @
Da ti zahvalim rsinisa pre svega na razumevanju pa na programu.Ja sam poceo da radim kad se jos uvek ponegde kotistio TV lampas i dugo sam radio TV ,mreze bezicni tel r stanice video pravio pojacala i sl. kasnije dekodiranje ark dvd i td.Drugim recima radio sam sa stvarima od kojih vecina sada ide u djubre.Za programiranje sam poceo da se interesujem oko nove gotine i naravno da su mi mnoge stvari strane i jasno je kao dan da se programiranje ne uci za nekoliko meseci vec i po nekoliko godina a drugo sve sto sam ucio bilo je srazumevanjem inace mehanicki nista.Kad sam poceo vidjao sam cesto taj 16f84 pa ajde da kupim njega i tako je pocelo.Imam veliku zelju da idem dalje ali nema se uvek vremena i para a tu su i druge obaveze pa moram polako i dokle stignem inace sam zadovoljan sa ovim do sada,imam cak napravljen i vec ugradjen da ga nazovem vrlo vrlo prost plc za masinu za eksere.Sto se tice programa on treba da broji do dvadesetak inpulsa pa da upali diodu,inpulsi mislim da ce biti cisti.Nekad sam pravio slico nisto i secam se da su imala kola valjda bese u ttl verziji za
ciscenje treperenje sa releja.


cekaj_log1:
if PORTB.0=0 then cekaj_log1 ; čekamo da se pojavi log. 1
brojac=brojac + 1 ; kad se pojavi, uvećamo brojač
if brojac=zadata_vrednost then upali_led ; dostignuta zadata, idemo dalje, palimo LED
cekaj_log0:
if PORTB.0=1 then cekaj_log0 ; čekamo da ulaz padne na log.0 kako ne bi imali lažno brojanje
goto cekaj_log1
upali_led:
PORTB.1=1


Sad samo da pitam jos i ovo: ako je port B na nulu onda ... znaci port B je na tasteru za pocetak programa
portb.1 pali diodu posle zadati br inpulsa
Na kom pinu uvodim inpulse ? kako da ga definisem ili sobzirom da je 16f84 pa da se podrazumeva da ide na RB3
Na kraju znam ide ENDIF END ali na pocetku ne znam ovo za ulaz inpulsa.
Pokusavam da idem jedno po jedno i prosto receno nisam jos stigao da pregledam sve u vezi brojaca,znam da ga vezem da briji u zadato vreme i to pokaze na displej ali ovo jos nisam proucio.Jos sam na poslu pa nemogu da probam.
[ veselinovic @ 18.06.2012. 13:33 ] @
Procitaj jos jednom Sinisinu poruku.
Kazace ti se "samo" poslije pazljivog citanja.
[ rsinisa @ 18.06.2012. 13:43 ] @
Ja sam napisao koje su pretpostavke, a ti sad moraš da znaš tačno gde šta ide.
Citat:
rsinisa:Napisaću ti program uz pretpostavke da je ulaz na RB0, a izlaz na RB1, da je aktivno stanje logička jedinica

To znači da je ulaz za impulse na RB0, da je izlaz za diodu na RB1, da je na davaču logička jedinica u trenutku kada da impuls, u protivnom je logička nula.
Ti sad prilagodi to prema tvojoj shemi, a ako je aktivno stanje davača obrnuto, samo zameni 0 i 1 u naredbama gde se isputuje stanje RB0.

Nadam se da je sada jasnije. Ako nije, daj šemu pa ćemo da rešimo konkretno.

Pozdrav.
Sinisha

P.S. RB0 je isto što i PORTB.0 i tako redom.
[ MILANAN @ 18.06.2012. 14:07 ] @
Da sad je jasnije samo sto jos nemogu nista da radim jer ceo dan sam na poso,do 20h pa cim stignem kuci pocinjem sa radom.Hvala vam
[ MILANAN @ 18.06.2012. 19:09 ] @
INPUT PORTB.0
OUTPUT PORTB.1
cekaj_log1:
if PORTB.0=0 then cekaj_log1 ; cekamo da se pojavi log. 1
brojac=brojac + 1 ; kad se pojavi, uvecamo brojac
if brojac = 15 then upali_led ; dostignuta zadata, idemo dalje, palimo LED
cekaj_log0:
if PORTB.0=1 then cekaj_log0 ; cekamo da ulaz padne na log.0 kako ne bi imali lažno brojanje
goto cekaj_log1
upali_led:
PORTB.1=1
ENDIF
END

Probao sam ovako iz MicroCode Studio i pocrveni - brojac=brojac+1 - a kad sklonim crtice izmedju cekaj lo1 i 0 onda pocrveni u prvom redu cekaj log1 . stavio sam za probu 15 inpulsa da izbroji pa da upali led.
[ veselinovic @ 18.06.2012. 20:08 ] @
Prije upotrbe promenljive ( u tvom slucaju brojac) istu moras deklarisati, koliko se sjecam ide
brojac var int
[ rsinisa @ 18.06.2012. 20:10 ] @
Jesi definisao promenljivu 'brojac'? Sve mi se nekako čini da nisi savladao definisanje promenljivih i podešavanje registara, a to je neophodno. Kod 16F84 ih i nema mnogo, ali kod 16F1827 ih ima mnooogo više. Doduše, dobra stvar je što nije potrebno sve podešavati jer kod većine je početna vrednost po uključenu odgovarajuća za obične I/O operacije.

Za onaj primer bi podešavanje, koje ide pre programa, izgledalo otprilike ovako:
Code:

brojac var byte

TRISB=%11111101
PORTB=0
brojac=0


Probaj pa javi.

Što se tiče crtica, nisam shvatio koje i zašto ih sklanjaš? Crtice u nazivu labele? Ako je tako, čemu to?

Ako sam u pravu da nisi još savladao osnovne stvari, onda pročitaj ovo na mom sajtu, mislim da će da ti pomogne.
http://sinel.freehostia.com/pic/pic_kontroleri.htm

A što se tiče PBP prpgrama, on treba na početku da ima konfiguracione podatke (za CONIG registar), DEFINE pseudonaredbe ako su potrebne, zatim definisanje promenljivih, konstanti, podataka za EEPROM, zatim inicijalizaciju pa tek onda glavni program sa eventualnim potprogramima.
Evo primer iz jednog mog PBP3 programa za 16F627:

Code:

#config
  __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _CP_ON & _MCLRE_OFF
#endconfig

define osc 3
define NO_CLRWDT 1
define INTHAND myint

same        con 1
led_crv     var PORTA.0
led_zel     var PORTA.1
statusc     var STATUS.0

wsave       var byte $70 system
ssave       var byte bank0 system
psave       var byte bank0 system

stoti       var byte    ; stotinke
sekunde     var word    ; sekunde

...

    data  @0, word 0, word 0, 0  
    data  @5, word 7, word 300, 1
    data @10, word 7, word 3, 5

...
    goto inic
...
asm
; pocetak interapt rutine, ako postoji        
myint
; Snimamo W, STATUS i PCLATH registar

    movwf   wsave
    swapf   STATUS, W
    clrf    STATUS
    movwf   ssave
    movf    PCLATH, W
    movwf   psave
...
   retfie
endasm        

...

; inicijalizacija
;----------------
inic:
    TRISB=%00000000
    TRISA=%11111100
    PORTB=255
    PORTA=0
    CMCON=7
    OPTION_REG = %10000100
    INTCON = %10100000 

    rezim=0
    tasteri=0
...

glavni:

; i odavde ide glavni deo programa

  END


Pozdrav.
Siniha

[ MILANAN @ 18.06.2012. 21:53 ] @
Ovako radi samo sto se led upali posle 6. nekad 7. put ali nije problem to je sigurno zbog tastera na ispitnoj plocici.

brojac var byte

TRISB=%11111101
PORTB=0
brojac=0
cekaj_log1:
if PORTB.0=0 then cekaj_log1 ; cekamo da se pojavi log. 1
brojac=brojac + 1 ; kad se pojavi, uvecamo brojac
if brojac=10 then upali_led ; dostignuta zadata, idemo dalje, palimo LED
cekaj_log0:
if PORTB.0=1 then cekaj_log0 ; cekamo da ulaz padne na log.0 kako ne bi imali lažno brojanje
goto cekaj_log1
upali_led:
PORTB.1=1
end

Crtice sam sklanjao jer vise nisam znao sta cu iako su u nazivu i znam da nesmeta a brojac var byte sam jednostavno zaboravio da stavim,moja greska neiskustvo ili neznanje,sta se moze.
Ovaj duzi ( vidim ima i deo asemblera ) kod sam probao nabrzinu ali nece jer odmah na pocetku pocrveni #config mada nije bitno jer ovaj kraci ce sigurno da radi kad sredim plocicu a ovaj duzi cu malo radi sebe da probam da napravim.Najiskrenije vam hvala za pomoc i na razumevanju.
[ rsinisa @ 18.06.2012. 22:42 ] @
Citat:
MILANAN: Ovako radi samo sto se led upali posle 6. nekad 7. put ali nije problem to je sigurno zbog tastera na ispitnoj plocici.

Kao što sam rekao, skoro svi elektro-mehanički elementi (kao što je taster) imaju treperenje, zato se i dešava da se LED upali posle 6 ili 7 pritisaka umesto posle 10. Mada, brojač radi ispravno, on je izbrojao tačno 10 promena. Zato je potrebno eliminisati to treperenje, a kao što rekoh, u ovom slučaju je to najoptimalnije rešiti softverski.

Citat:
Crtice sam sklanjao jer vise nisam znao sta cu iako su u nazivu i znam da nesmeta

U redu je to što znaš da ne smeta, ali moraš da priznaš da "nabadanje" može da napravi velike probleme u praksi.

Citat:
Ovaj duzi ( vidim ima i deo asemblera ) kod sam probao nabrzinu ali nece jer odmah na pocetku pocrveni #config mada nije bitno jer ovaj kraci ce sigurno da radi kad sredim plocicu a ovaj duzi cu malo radi sebe da probam da napravim.

Ja sam jasno napisao da je to primer kako se piše program za PBP, da je pisan u PBP3 i da je za 16F627. Verujem da zbog umora, tj. celodnevnog rada, ne čitaš pažljivo, u protivnom ne bi ni pokušao da kompajliraš taj drugi deo pošto to nije nikakav program, samo izvadjeni delovi iz jednog mog gotovog programa koji nema veze sa tvojim pitanjem, plus što ti nemaš instaliran PBP3 već PBP (verovatno neka verzija 2.x).
Budi pažljivi u čitanju, ne "nabadaj" napamet, slobodno pitaj sve što te zanima, ali se seti uvek moje izreke koja glasi:
"Čitati, čitati i samo čitati".

Pozdrav.
Sinisha
[ MILANAN @ 19.06.2012. 06:49 ] @
Pa iskreno nisam stigao ni slovo da procitam od onog drugog programa,samo sam u brzini probao copy-paste video nece i gotovo a sad tek vidim ovo - ; i odavde ide glavni deo programa.Ako imate vremena bar ukratko me usmerite kako softverski da eliminisem treperenje da radim to zbog sebe inace kad sklopim to sto hocu neverujem da ce se treperenje pojaviti iz optokaplera jer odatle ce ici inpulsi.Valjda cu da savladam i to trperenje ako ne onda cu ako se pojavi da to resim hardverski.Mozda gresim ali mislim da nisam izabrao los nacin ucenja da savladavam komada po komandu,da savaku proucim koliko mogu i da sa svakom eksperimentisem i videm kako se ponasa.Bas me cudi da se na ovoj temi samo ja javljam za savete valjda bi trebalo da ima jos ljudi zainteresovani za basic.Svakom ko radi elektroniku mnogo moze da olaksa pravljenje sklopova koji ce se lakse i braze i jeftinije napraviti i biti precizniji a i zanimljiviji.
[ ZAS011 @ 19.06.2012. 07:30 ] @
Poznavaoca Basic-a ima kol'ko hoces, samo je nacin pristupa problematici programiranja taj koji odredjuje kako ce ko da se postavi prema postavljenim pitanjima.
Lepo ti je sinisa napisao, a i ja cesto koristim isto: Citati, citati i samo citati.
PBP ima dobar Help, u njemu je svaka komanda objasnjena. Tvoje je da slozis "kockice".
Kao sto sam i ranije napisao, pocni od najosnovnijih programcica, tipa treptalje LED, pa nastavi sa kompleksnijima, uz pokusaj RAZUMEVANJA sta koji progeam radi.
Samo copy/paste pa onda kompajliranje ti nece nista pomoci u daljem usavrsavanju sebe kao programera.
[ MILANAN @ 19.06.2012. 09:46 ] @
' Count # of pulses on Pin1 in 100 milliseconds
COUNT PORTB.1, 100, W1

' Determine frequency on a pin
COUNT PORTA.2, 1000, W1 ' Count for 1 second
SEROUT PORTB.0, N2400, [W1]

Ovo je sve sto sam nasao za count i helpu sto je savrseno jasno a ono brojac=brojac+1 nisam nigde mogao da nadjem neko objasnjenje pa da pocnem odatle.Kako sad da nadjem da upisem trajanje inpulsa da bih izbegao treperenje tastera ili na pr releja ?
[ rsinisa @ 19.06.2012. 11:18 ] @
Citat:
ZAS011:Samo copy/paste pa onda kompajliranje ti nece nista pomoci u daljem usavrsavanju sebe kao programera.

Apsolutno se slažem sa ovim.

Kažeš da učiš sa razumevanjem, a onda odradiš copy/paste bez čitanja; moraš da priznaš da su to suprotne stvari, zar ne?

Što se tiče debaunsinga, evo da probam iz glave, bez testiranja, ali trebalo bi da radi:

Code:

petlja      var byte    ; brojač za FOR petlju
taster_uk  var bit    ; indikator (fleg u programerskom žargonu od eng. reči "flag" - zastava, zastavica) da je taster pritisnut

...

; potprogram za proveru stanja tastera, smetiš ga npr. na kraj programa
proveri_ulaz:
    taster_uk=0
    for petlja=0 to 100
      if PORTB.0=0 then return
      pauseus 100
    next petlja
    taster_uk=1
    return


Kako radi ovaj potprogram? Prvo se postavi fleg za taster na 0, tj. indikuje se da taster nije pritisnut. Zatim se proverava 100 puta da li je taster pritisnut sa 100 mikrosekundi pauze izmedju testiranja. Ako samo jednom od tih 100 puta stanje na ulazu bude 0, izlazi se odmah iz potprograma i ostaje indikacija da taster nije pritisnut. Ako svih 100 puta stanje na ulazu bude 1 (ukupno oko 10 ms), setuje se flag čime se indikuje da je taster sigurno pritisnut. Onda bi ceo program izgledao ovako:

Code:

brojac     var byte
petlja     var byte    ; brojač za FOR petlju
taster_uk  var bit     ; indikator (fleg u programerskom žargonu od eng. reči "flag" - zastava, zastavica) da je taster pritisnut

TRISB=%11111101
PORTB=0
brojac=0

cekaj_log1:
    gosub proveri_ulaz ; cekamo da se pojavi log. 1
    if taster_uk=0 then cekaj_log1
    brojac=brojac + 1 ; kad se pojavi, uvecamo brojac
    if brojac=10 then upali_led ; dostignuta zadata, idemo dalje, palimo LED
cekaj_log0:
    gosub proveri_ulaz ; cekamo da ulaz padne na log.0 kako ne bi imali lažno brojanje
    if taster_uk=1 then cekaj_log0
    goto cekaj_log1
upali_led:
    PORTB.1=1    ; upali LED
    pause 3000    ; pauziraj 3 sekunde
    PORTB.1=0    ; ugasi LED
    goto cekaj_log1    ; sve ispočetka

proveri_ulaz:
    taster_uk=0
    for petlja=0 to 100
      if PORTB.0=0 then return
      pauseus 100
    next petlja
    taster_uk=1
    return

end


Analiziraj program dobro pa ga tek onda kompajliraj i probaj. Ja ga nisam testirao, ali trebalo bi da radi.

Pozdrav.
Sinisha


[Ovu poruku je menjao rsinisa dana 19.06.2012. u 12:34 GMT+1]

[Ovu poruku je menjao rsinisa dana 19.06.2012. u 12:34 GMT+1]

[Ovu poruku je menjao rsinisa dana 19.06.2012. u 12:39 GMT+1]
[ rsinisa @ 19.06.2012. 11:27 ] @
Evo ti slika sa osciloskopa gde se vidi kako izgleda signal zbog poskakivanja tastera, jedino što je ovde obrnut slučaj u odnosu na tvoj, dok taster nije pritisnut stanje je logičko 1, a kad se pritisne, stanje je logička 0, samo što vidiš da ima nekoliko promena pre stabilnog stanja.
http://www.labbookpages.co.uk/...nics/files/debounce/bounce.png

I praksa je da je aktivno stanje nula, tj. da se na ulaz veže pull-up (onaj koji podiže) otpornik, a taster ide na masu. Evo, pogledaj ovde prvu sliku:
http://www.labbookpages.co.uk/electronics/debounce.html
Ako je signal iz nekog davača, senzora ili sl., onda zavisi kako je u konkretnom slučaju.
Pozdrav.
Sinisha
[ MILANAN @ 19.06.2012. 12:11 ] @
Tako sam i ja pravio plocicu,znaci 5v idu preko R i to je log1 kad stosnem taster 5v iz R idu na masu i to je log 0 Nisam mogao da cekam pa sam na brzinu pobego sposla i dosao kuci da probam ovaj program i ovako:

proveri_ulaz:
taster_uk=0
for petlja=0 to 100
if PORTB.0=then return
pauseus 100
next petlja
taster_uk=1
return

Sad malo nesigurno ali mislim da je nedostajala nula ispred then pa sam je dopisao ( vidim da je menjana poruka pa sam mislio namerno postavljena zamka da li cu da vidim ) i pali se posle devetog pritiska tastera,po meni,nisam siguran,broji i sam pocetak dok ceka,znaci cekanje 1 i plus 9 pritiskanja pa sa zamenio mesta ,prvo uk=1 a dole uk=0 i sad rari tacno na 10. put

cekaj_log1:
gosub proveri_ulaz ; cekamo da se pojavi log. 1
if taster_uk=1 then cekaj_log1
brojac=brojac + 1 ; kad se pojavi, uvecamo brojac
if brojac=10 then upali_led ; dostignuta zadata, idemo dalje, palimo LED
cekaj_log0:
gosub proveri_ulaz ; cekamo da ulaz padne na log.0 kako ne bi imali lažno brojanje
if taster_uk=0 then cekaj_log0
goto cekaj_log1

Ma pravi sam programer a? Kao kad corava kokosta pogodi zrno.
[ rsinisa @ 19.06.2012. 12:29 ] @
Citat:
MILANAN: Tako sam i ja pravio plocicu,znaci 5v idu preko R i to je log1 kad stosnem taster 5v iz R idu na masu i to je log 0

He, pa sve vreme pretpostavljamo da je aktivno stanje log.1, a ti ne pričaš da je obrnuto. Nebitno, bitno da si se snašao.

Citat:
Sad malo nesigurno ali mislim da je nedostajala nula ispred then pa sam je dopisao ( vidim da je menjana poruka pa sam mislio namerno postavljena zamka da li cu da vidim ) i pali se posle devetog pritiska tastera,po meni,nisam siguran,broji i sam pocetak dok ceka,znaci cekanje 1 i plus 9 pritiskanja pa sa zamenio mesta ,prvo uk=1 a dole uk=0 i sad rari tacno na 10. put

Ma nije namerno, omaklo se pa sam promenio kad sam video.
Da, brojalo je do 9 jer je početno stanje kod tebe bila log.1, a ne 0 kakva je bila pretpostavka. Bitno da si shvatio gde je problem i promenio program.

Citat:
Ma pravi sam programer a? Kao kad corava kokosta pogodi zrno.

Samo polako i sa razumevanjem i bićeš super programer, ali treba dosta i veoma pažljivo da čitaš.

Pozdrav.
Sinisha
[ MILANAN @ 19.06.2012. 12:47 ] @
Hvala rsinisa sad imam debeo domaci zadatak da ovo razumem pa ako neka sledeca komanda neide eto mene opet da dosadjujem.Moglo bi se reci da zamenom 0 i 1 u programu mozemo da se prilagodimo na pr tasteru,da li vodi kad je stisnut ili kad nije.Hvala jos jednom.
[ rsinisa @ 19.06.2012. 14:04 ] @
Bez uvrede, ali nekako mi se čini da bi prvo trebalo da otvoriš temu "Osnove digitalne elektronike" pa da prvo to savladaš, a tek onda da se vratiš ovamo. Ali dobro, može i ovako, biće ti malo teže, ali ako budeš uporan savladaćeš paralelno i to.

Pozdrav.
Sinisha
[ ZAS011 @ 19.06.2012. 14:58 ] @
Da ne bude samo: Dajem jevino casove digitalne elektronije, saljem u cosak i lupam cvrge
[ MILANAN @ 19.06.2012. 16:03 ] @
Evo kako sam sredio sa while wend da se upali tek kad se zavrsi log0

brojac var byte
petlja var byte ; brojac za FOR petlju
taster_uk var bit ; indikator (fleg u programerskom žargonu od eng. reci "flag" - zastava, zastavica) da je taster pritisnut

TRISB=%11111101
PORTB=0
brojac=0

cekaj_log1:
gosub proveri_ulaz ; cekamo da se pojavi log. 1
if taster_uk=1 then cekaj_log1
brojac=brojac + 1 ; kad se pojavi, uvecamo brojac
if brojac=10 then upali_led ; dostignuta zadata, idemo dalje, palimo LED
cekaj_log0:
gosub proveri_ulaz ; cekamo da ulaz padne na log.0 kako ne bi imali lažno brojanje
if taster_uk=0 then cekaj_log0
goto cekaj_log1
upali_led:
WHILE PORTB.0=0
PORTB.1=0
WEND
PORTB.1=1 ; upali LED
goto cekaj_log1 ; sve ispocetka

proveri_ulaz:
taster_uk=0
for petlja=0 to 100
if PORTB.0=0 then return
pauseus 100
next petlja
taster_uk=1
return

end

log0 je kad se stisne taster
LED NA PORTB.1 SE PALI TEK KAD SE PUSTI TASTER DESETI PUT.
DOK SE DRZI 10. PUT PRITISNUT LED NE SVETLI,PALI SE TEK KAD
SE PUSTI TASTER
STARTUJE TAKO STO JE RB0=1 I VIDI 10 LOG O ODNOSNO
10 PREKIDA +5V NA RB0
[ rsinisa @ 19.06.2012. 17:34 ] @
E vidiš, namerno sam stavio da se LED upali čim se pritisne taster 10-ti put da vidim da li će to da ti smeta ili ne. Obzirom da si se potrudio da to odradiš, očigledno da ti smeta, i lepo je to što si sam odradio, ali ima bolji način bez dodatnih linija, treba samo da se prebace dve programske linije (može i jedna, ali logičnije je da se prebace obe) na drugo mesto. I da bi sve bilo i logično, obzirom da su nivoi koje koristiš suprotni od pretpostavljenih, ceo program bi izgledao ovako:

Code:

brojac     var byte                    ; brojač za impulse
petlja     var byte                    ; brojač za FOR petlju
taster_uk  var bit                     ; indikator (fleg u programerskom žargonu od eng. reči "flag" - zastava, zastavica) da je taster pritisnut

TRISB=%11111101
PORTB=0
brojac=0

cekaj_log0:
    gosub proveri_ulaz                 ; čekamo pritisak na taster, tj. da se pojavi log. 0
    if taster_uk=0 then cekaj_log0     ; ako nije pritisnut, čekamo i dalje
cekaj_log1:
    gosub proveri_ulaz                 ; čekamo da se taster otpusti odn. da se ulaz vrati na log.1 kako ne bi imali lažno brojanje
    if taster_uk=1 then cekaj_log1     ; ako je i dalje pritisnut taster (log. 0), vraćamo se na čekanje
    brojac=brojac + 1                  ; kad se pojavi log. 1, tj. kada se otpusti taster, uvećamo brojač
    if brojac=10 then upali_led        ; ako je dostignuta zadata, idemo palimo LED
    goto cekaj_log0                    ; u protivnom čekamo novi pritisak na taster
upali_led:
    PORTB.1=1                          ; upali LED
    pause 3000                         ; pauziraj 3 sekunde
    PORTB.1=0                          ; ugasi LED
    goto cekaj_log0                    ; sve ispočetka

proveri_ulaz:
    taster_uk=0                        ; postavimo fleg za taster na 0, tj. da taster nije pritisnut
    for petlja=0 to 100                ; provera 100 puta
      if PORTB.0=1 then return         ; ako taster nije pritisnut, vraćamo se nazad
      pauseus 100                      ; ako jeste, pravimo pauzu od 100 us
    next petlja                        ; i idemo opet u proveru
    taster_uk=1                        ; nakon 100 provera (oko 10 ms), taster je sve vreme bio pritisnut i postavljamo fleg na 1 kao indikaciju
    return                             ; vraćamo se nazad

end


Bilo bi dobro da program smestiš u CODE tagove, lepše izgleda, mada se tada ekran raširi malo više, verovatno greška u skripti za forum.

Pozdrav.
Sinisha


[Ovu poruku je menjao rsinisa dana 20.06.2012. u 07:36 GMT+1]
[ rsinisa @ 19.06.2012. 18:30 ] @
Kad si već upotrebio WHILE ... WEND da kažem par reči na tu temu.
Dugogodišnje iskustvo u programiranju je pokazalo da su GOTO naredbe potencijalno veliki izvor grešaka pa su tvorci programskih jezika osmislili petlje koje ne zahtevaju GOTO, a to su REPEAT ... UNTIL, i WHILE ... WEND, i smatra se dobrom programerskom praksom ne koristiti GOTO ako je to moguće. Obzirom da ja obilato koristim GOTO jasno je da pripadam "staroj školi", ali evo da napišem program koji neće da ga koristi, pa bi bilo dobro da ti usvojiš tu praksu kad si već na početku programerske karijere:

Code:

brojac     var byte                    ; brojač za impulse
petlja     var byte                    ; brojač za FOR petlju
taster_uk  var bit                     ; indikator (fleg u programerskom žargonu od eng. reči "flag" - zastava, zastavica) da je taster pritisnut

TRISB=%11111101
PORTB=0
brojac=0

    while 1=1                          ; izvršavaj dok je 1=1, tj. beskonačno
      repeat                           ; ponavljanje koje se odnosi na stanje promenljive "brojac"
        repeat                         ; ponavljanje koje se odnosi na pritisnut taster
          gosub proveri_ulaz           ; provera da li je taster pritisnut
        until taster_uk=1              ; ako nije pritisnut, ponavljaj

        repeat                         ; ponavljanje koje se odnosi na otpušten taster
          gosub proveri_ulaz           ; proveri stanje tastera
        until taster_uk=0              ; ako nije otpušten, ponavljaj
        brojac=brojac + 1              ; u protivnom, uvećaj brojač
      until brojac=10                  ; ako nije došao do 10, ponavljaj

      PORTB.1=1                        ; upali LED
      pause 3000                       ; pauziraj 3 sekunde
      PORTB.1=0                        ; ugasi LED
    wend                               ; kraj WHILE bloka

proveri_ulaz:
    taster_uk=0                        ; postavimo fleg za taster na 0, tj. da taster nije pritisnut
    petlja=0                           ; početna vrednost za promenljivu "petlja"
    repeat                             ; ponavljanje koje se odnosi na stanje promenljive "petlja"
      if PORTB.0=1 then return         ; ako taster nije pritisnut, vraćamo se nazad
      pauseus 100                      ; ako jeste, pravimo pauzu od 100 us
      petlja=petlja + 1                ; uvećamo brojač za petlju
    until petlja=100                   ; ako nije 100, ponovi petlju
    taster_uk=1                        ; nakon 100 provera (oko 10 ms), taster je sve vreme bio pritisnut i postavljamo fleg na 1 kao indikaciju
    return                             ; vraćamo se nazad

end


Ja sam ovo samo propustio kroz kompajler (prolazi kompajliranje), ali nisam testirao da li radi ispravno, to ostavljam tebi.
Ono što je meni zanimljivo je da ovaj program zauzima dve programske lokacije manje, što me iznenadilo jer sam očekivao sasvim suprotno. Eto još jedan razlog da se izbegava IF u kombinaciji sa GOTO.

Pozdrav.
Sinisha
[ MILANAN @ 19.06.2012. 18:35 ] @
Smetalo bi jer u slucaju da pic ganja neku masinu kao sto bi trebalo doslo bi do toga da se poklope dve operacije na 10. sto bi prouzrokovalo mehanicka ostecenja i jos gore da na pr nesto zaglavi bas na 10. put.Sad jos ostaje da doradim da sve ovo postane aktivno na dodir rastera i da se tako gasi ovaj prog,znaci pritisni i pusti na pr.rb5 upaljen sklop i pritisni i pusti rb5 ugasen.Na ovaj nacin valjda moza,videcu

drugi pocetak

trisb = %00000001
portb.7 = 0

while 1 = 1
while portb.5 = 1
pause 30
wend

portb.7 = ~portb.7 i ovde drugi program

while portb.5 = 0
wend
wend

Jos nisam stigao da razgledam ovaj vas drugi nacin ali kasnije obavezno.Doradio sam obe verzij da pocinje sa rb0 =0 i vidi 10 jedinica i drugu rb0=1 i vidi 10 nula i isto da saceka kraj nule ili jedinice pa da pali diodu
[ MILANAN @ 30.08.2012. 19:49 ] @
Pozdrav svima.Evo ponovo se javljm da budem malo dosadan sa pitanjima iz picbasica.Hteo bih i kako da napravim program kad na pr pritisnem cetiri tastera jedan za drugim da se upali led dioda i kad ih ponovo pritisnem istim redom da se ugasi.Najvise sto sam uspeo bilo je ovo ali svaki taster pali po jednu diodu sto nije to to.

trisb = %10001111
portb.4 = 0
portb.5 = 0
portb.6 = 0

while 1 = 1
while portb.0 = 1
pause 30
wend

portb.4 = ~portb.4

while portb.0 = 0
wend
while portb.1 = 1
pause 30
wend

portb.5 = ~portb.5

while portb.1 = 0
wend
while portb.2 = 1
pause 30
wend

portb.6 = ~portb.6

while portb.2 = 0
wend
[ Darko_zed @ 30.08.2012. 20:38 ] @
Citat:
Pozdrav svima.Evo ponovo se javljm da budem malo dosadan sa pitanjima iz picbasica.Hteo bih i kako da napravim program kad na pr pritisnem cetiri tastera jedan za drugim da se upali led dioda i kad ih ponovo pritisnem istim redom da se ugasi.Najvise sto sam uspeo bilo je ovo ali svaki taster pali po jednu diodu sto nije to to.

Definisi ovo malo bolje , ne razume se sta si hteo reci , koliko dioda je u pitanju , svaki taster pali jednu po jednu redom kako se pritiskaju ili sta ???
[ rsinisa @ 30.08.2012. 20:46 ] @
Tebi treba praktično kodirana brava, jel tako?

Pozdrav.
Sinisha
[ Darko_zed @ 30.08.2012. 20:50 ] @
Citat:
rsinisa: Tebi treba praktično kodirana brava, jel tako?

Pozdrav.
Sinisha

Meni je to palo na pamet ali kada sam procitao ovo nije mi bilo jasno

Citat:
svaki taster pali po jednu diodu sto nije to to.
[ MILANAN @ 30.08.2012. 20:59 ] @
Da nesto kao kodirana brava.Na pr pritisnem prvi pa drugi pa treci pa cetvrti i onda se tek upali dioda i gasim je isto tako sto ponovo pritisnem iste tastere redom
[ Darko_zed @ 30.08.2012. 21:13 ] @
E ovo je lepo definisano pitanje

Pa napravi za svaki taster label tako da je uslov za skok na sledeci (koji je u nizu ) da se taj taster pritisne ciji je label i tako redom dok se ne upali led dioda ,a za gasenje isto ovako samo obrnutim redom , ovako je najprostije .
[ MILANAN @ 30.08.2012. 21:19 ] @
Probao sam ali nije htelo da radi samo sto tu neuspesnu probu ( bas ) nisam sacuvao da moze da se vidi gde gresim
[ MILANAN @ 30.08.2012. 21:30 ] @
Ma ne ide,jednostavno ne znam kako to da uradim
[ rsinisa @ 31.08.2012. 11:33 ] @
Evo ti krajnje pojednostavljeno pa ti posle doradi kako ti odgovara.
Pretpostavka da su ti tasteri na RB0 do RB3, da je log 0 kada se pritisne taster i da je redosled pritiskanja od RB0 do RB3:

Code:
tasteri var byte
cekaj_1:
  let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri = 15 then cekaj_1       ; ako nije pritisnut ni jedan, čekaj
  if tasteri != 14 then cekaj_1      ; ako nije pritisnut prvi, idi na početak
cekaj_1a:
  let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri != 15 then cekaj_1a     ; ako taster nije otpušten, čekaj
cekaj_2:
  let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri = 15 then cekaj_2       ; ako nije pritisnut ni jedan, čekaj
  if tasteri != 13 then cekaj_1      ; ako nije pritisnut drugi, idi na početak
cekaj_2a:
  let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri != 15 then cekaj_2a     ; ako taster nije otpušten, čekaj
cekaj_3:
  let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri = 15 then cekaj_3       ; ako nije pritisnut ni jedan, čekaj
  if tasteri != 11 then cekaj_1      ; ako nije pritisnut treći, idi na početak
cekaj_3a:
  let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri != 15 then cekaj_3a     ; ako taster nije otpušten, čekaj
cekaj_4:
  let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri = 15 then cekaj_4       ; ako nije pritisnut ni jedan, čekaj
  if tasteri != 7 then cekaj_1       ; ako nije pritisnut četvrti, idi na početak
cekaj_4a:
  let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri != 15 then cekaj_4a     ; ako taster nije otpušten, čekaj
; zadnje 3 linije mogu da se izostave pa će program da nastavi čim se pritisne poslednji taster, bez čekanja da se pusti

; kada dodje do ovde znači da je pritisnuta prava kombinacija


Eto, to je onako iz glave, mislim da je sasvim dobro za tvoju potrebu.

Pozdrav.
Sinisha
[ MILANAN @ 31.08.2012. 22:07 ] @
Hvala Sinisa probacu sutra da vidim sta mogu.Evo ja sto sam pisao.Znaci rb0 rb1 rb2 i pali led zatim rb0 rb1 rb2 gasi.Problem je sto ce upaliti i ako po nekoliko puta pritisnem redom rb0 rb1 i rb2 pa ako mozes napisi mi kako to da resim da ako na pr 2 puta pritisnem rb0 pa rb1 pa rb2 da ne upali vec da pali kad se pritiskaju redom po jednom .Ovaj kod koji si mi poslao cu malo vise da proucim jer nisam ni blizu da napisem tako nesto.Evo sta sam ja pisao

SYMBOL LED = PORTB.4
SYMBOL taster1 = PORTB.0
SYMBOL taster2 = PORTB.1
SYMBOL taster3 = PORTB.2
INPUT taster1
input taster2
input taster3
OUTPUT led
ugasena 'desava se da se upali cim dam napon na pic,sad je uredu'
low led
pocetak
IF TASTER1 = 1 THEN pocetak
IF taster1 = 0 THEN
pocetak1 'radi i bez goto'
ENDIF
pocetak1
if taster2 = 1 then pocetak1
if taster2 = 0 then
pocetak2
endif
pocetak2
if taster3 = 1 then pocetak2
if taster3 = 0 then
pocetak3
endif
pocetak3
high led
goto pocetak5
pocetak5
IF TASTER1 = 1 THEN pocetak5
IF taster1 = 0 THEN
pocetak6
ENDIF
pocetak6
if taster2 = 1 then pocetak6
if taster2 = 0 then
pocetak7
endif
pocetak7
if taster3 = 1 then pocetak7
if taster3 = 0 then
pocetak8
endif
pocetak8
low led
goto ugasena

end
[ rsinisa @ 01.09.2012. 01:11 ] @
Citat:
MILANAN:napisi mi kako to da resim da ako na pr 2 puta pritisnem rb0 pa rb1 pa rb2 da ne upali vec da pali kad se pritiskaju redom po jednom.

Ne razumem te, tražiš da ti napišem ono što sam ti već napisao. Doduše, program sam pisao direktno u browseru, nisam ga propustio kroz kompajler mada bi trebalo da radi. Ako ne radi, javi da rešimo gde zapinje. Naravno, treba dopisati podešavanja za potrebne registre.

Pozdrav.
Sinisha
[ ZAS011 @ 01.09.2012. 07:55 ] @
Milane, evo tebi jedan link: http://www.picbasic.co.uk/forum/showthread.php?t=5695&page=2 post #42, pa prostudiraj, a mogao bi i da pročitaš tu diskusiju, nije loša.

Ako hoćeš da se baviš programiranjem mikrokontrolera, pa makar to bio 16F84A, MORAŠ da se baviš i čitanjem datasheet-ova i da se naučiš kako se koristi Help opcija samog razvojnog okruženja koje koristiš, znaš, tu mogo dobrih informacija ima.

Pre 25, 26 godina je moje znanje C-a bilo dosta skromno, a i od mog drugara sa kojim sam na kraju napisao veoma ozbiljan program za PC računar, sa puno grafike, i sve je radilo iz DOS-a, na 286 računaru sa 512 kb RAM-a, bez HDD-a,... i sve to uz pomoć Help-a i code snippet-a koji su se u njemu nalazili. Kompajler, Borland Turbo C.

Od sada, ukoliko ti i budem odgovarao na pitanja/zahteve, dobijaćeš semo generički pseudo kod, a na tebi će biti da to primeniš. Sažvakavanje programa do u detalje, jokmori.

Inače, onaj link, gore, je dobijen prostom pretragom sa sledećim: 'picbasic pro code lock' i to je bio prvi 'pogodak' kod prijatelja gugla.
[ Darko_zed @ 01.09.2012. 09:12 ] @
Code:
pocetak8
low led
goto ugasena

end


U programu ne postoji label ugasena koliko ja vidim



[Ovu poruku je menjao Darko_zed dana 01.09.2012. u 10:24 GMT+1]
[ ZAS011 @ 01.09.2012. 09:40 ] @
Sada, pošto sam se izkafenisao, da još malko pridodam mom prethodnom pisaniju.
Programčiće stavljaj u CODE tagove da bi bili pregledni, lakši za praćenje.

Imaš nepotrebnih delova programa koji ne služe apsolutno nočemu osim da te zapetljaju k'o pile u kučine. npr:

Code:
pocetak2:
if taster3 = 1 then pocetak2
if taster3 = 0 then
    goto pocetak3
endif

pocetak3:
high led
goto pocetak5

pocetak5:
IF TASTER1 = 1 THEN pocetak5
IF taster1 = 0 THEN
    goto pocetak6
ENDIF


tvoj deo programa:

if taster3 = 0 then
GOTO pocetak3
endif


pocetak3

Plavo je nepotrebno pošto će i bez proveravanja program nastaviti od labele početak3:
Boldovano je deo sintakse, bez velikog znanja i analiziranja asemblerskog listinga teško da možeš da tvrdiš da "radi i bez goto"

Ex, da, fale ti i dvotačke koje označavaju labele (:)
[ MILANAN @ 01.09.2012. 11:40 ] @
Za Sinisu.Program moj radi ali ovako : pritisnem po jednom rb0 rb1 rb2 i pali a pali i kad pritisnem po 2 ili tri puta rb0 rb1 rb2 na pr. pritiskam ovim redom rb0 rb0 rb1 rb1 rb2 rb2 rb2 i opet ce da upali pa sam zato pitao kako napraviti da pali kad stisnem samo po jednom a kad stisnem po vise puta ovako -rb0 rb0 rb1 rb1 rb2 rb2 rb2- da ne pali .
[ ZAS011 @ 01.09.2012. 12:20 ] @
Milane, sačekaj da Siniša dovrši serijal: TUTORIJAL: PicBasic Pro 3 i PIC16F1827 tada će ti sve biti mnogo jasnije.
I Siniša i ja pokušavamo da ti pomognemo. Siniša ti je već dao deo programa koji samo treba da implementiraš, a prethodno da ga natenane pročitaš i RAZUMEŠ. Ja ti dadoh link prema forumu odakle možeš da preuzmeš arhivu sa programom kakav tebi treba (možda uz malu prepravku), ali da ti bilo ko napiše ceo program, nemoj da očekuješ.

Već smo ti ukazivali na greške koje si napravio, ti nastavljaš i dalje po svome. Takvim stavom samo ćeš postići da ti niko ne odgovori sledeći put kada budeš imao neki drugi problem.

Inače, Siiša ti je u poruci http://www.elitesecurity.org/p3161035 SVE sažvakao osim konfigurisanja kontrolera i šta treba da se radi kada je izpritiskana ODGOVARAJUĆA sekvenca tastera.
[ Darko_zed @ 01.09.2012. 12:21 ] @
Jesi li ti kupio neku knjigu recimo Voje , knjiga je mislim oko 1000 din . sve je lepo sazvakano unutra sa puno primera i objasnjenja , ovako ne ide . Mislim da nije puno para da se odvoji za to , procita i nesto osnovno ukapira i nauci ,a posle ostatak se kalemi lagano i unapredjuje znanje . Ti ovako evo vec skoro godinu dana stojis u mesto i bez uvrede ne napredujes nista . Nemoj da se ljutis tako sam i ja poceo ali sam ubrzo video da bez adekvatne literature nema nista , a ovde na forumu su clanovi koji samo dopunjuju i objasnjavaju ti gde zapne . Mozes pogledati pocetak ove teme jer sam ja autor i videces kako sam lagano isao korak po korak , postavljao primere i detaljnom analizom programa uz pomoc ovih clanova koji su i sada aktivni i tebi pomazu uspeo sam da osnovne stvari savladam u samom startu (nedeljla dve , prakticnog rada , primera svega i svacega ) i nije se ovoliko oduzlo kao u tvom slucaju. Sada mogu uraditi dosta toga ozbiljnog iz ove oblasti mada sam jos dosta mlad sto se tice prakse i iskustva za razliku od ovih clanova ovde ali i dalje ucim konstanto i gde zapnem pitam ,razjasnimo i idemo dalje.Kupio sam razvojne sisteme , programatore itd sto mi je itekako pomoglo u ucenju i radu tako da je to savet iza tebe ako mislis ozbiljno ovim da se bavis moras se malo i zrtvovati jbg tako je . Od prilike smo poceli u isto vreme interesovanje za ovu oblast ali se nisi mnogo potrudio da napredujes , izvini na ovome ali je tako i ne mogu vise gledati kako se mucis i polako ponestaje ljudima sa foruma zivaca da ti pomazu,a napretka nema uopste.
Pozdrav i ovo je sve bilo dobro namerno ,bez ljutnje.

[Ovu poruku je menjao Darko_zed dana 01.09.2012. u 13:37 GMT+1]
[ Darko_zed @ 01.09.2012. 12:23 ] @
Zorane ista prica , preteko si me za minut , nadam se da se nece naljutiti i sve je bilo dobro namerno ,a vidim da si i ti video o cemu se radi pa si mu lepo objasnio .Pozdrav
[ Darko_zed @ 01.09.2012. 12:29 ] @
Citat:
Inače, Siiša ti je u poruci http://www.elitesecurity.org/p3161035 SVE sažvakao osim konfigurisanja kontrolera i šta treba da se radi kada je izpritiskana ODGOVARAJUĆA sekvenca tastera.


On (bez ljutnje) ne zna sta je ovo i napisao je sledece

Citat:
Ovaj kod koji si mi poslao cu malo vise da proucim jer nisam ni blizu da napisem tako nesto.


na zalost ne razume osnove ,a sve je tako lepo sazvakano , sve pohvale.


Code:
let tasteri= portb & %00001111     ; uzmi stanja prva 4 bita
  if tasteri = 15 then cekaj_2       ; ako nije pritisnut ni jedan, čekaj
  if tasteri != 13 then cekaj_1      ; ako nije pritisnut drugi, idi na početak


zasto jednostvno ne pitas kako ovo funkcionise i da ukapiras da je to u stvari isto sto i ovo manje vise

Code:
pocetak1
if taster2 = 1 then pocetak1
if taster2 = 0 then
pocetak2 


Mada znam da je Sinisa mogao to na Milanovom jeziku da napise najprostije sto moze ali je mozda coveku bilo lakse da ovako prezentuje program sa misljenju da Milan zna osnove ali tu je pogresio i video da dalje ucestvovanje ne vodi nikuda ako se ovako nastavi .
[ ZAS011 @ 01.09.2012. 12:40 ] @
Jbg, Darko, bez znanja jezika (engleskog, čitanja datasheet-ova, čitanja Help-a (iz istog se da mnogo naučiti), čitanja knjiga koje je neko drugi napisao sa sve objašnjenjima, nema ništa od programiranja mikrokontrolera.

Bilo bi neprikladno da postavim link ka PBP3 Reference Manual-u u kome su oblašnjene sve komande dotičnog programskog jezika, a i šire.

Ovako ostaje mi samo da na pitanja tipa zašto mi
Code:
ngdjxg ,jgl jhg mghf gh ,jg mhgf mgh
kh,kjh,jh ,ggfkhg,jgkfm mghfvjgh mhfg

ne radi

samo ignorišem post. Manje se troši tastatura i manje bole jagodice od kuckanja objašnjenja i primera koje druga strana, očigledno, ignoriše.

Poz,
ZAS011 ex Sepa011 (da se Milan ne zajebuni ako počne da čita temu od početka)

PS. Aktuelna verzija PBP-a je 3.0.6
[ MILANAN @ 01.09.2012. 12:50 ] @
Ma ne ljutim se na nikog daleko od toga i hvala vam za svaki savet i svaku pomoc.Trazio sam neku osnovu i Darko je prvi put napisao da idem sa labele na labelu i tek tada sam napisao ovo sto sam postavio samo mi nije bilo jasno kako da resim da se ne ukljuci kad tastere ptitiskam po vise puta vec da se ukljuci kad pritisnem po jednom,eto to mi je zapelo i zato sam sa javio.Sinisa mi je mnogo pomogao i ujedno mi je uvek dao i domaci zadatak za ptoucavanje.

pocetak1
if taster2 = 1 then pocetak1
if taster2 = 0 then
pocetak2

Ovo znam kako funkcionise ali ne znam sta da ubacm da kad rb2 pritisnem dva i vise puta da se led ne pali vec da prog radi kad se samo po jednom pritisnu redom 1 2 3
[ ZAS011 @ 01.09.2012. 13:11 ] @
Pošto i dalje teraš po svome, prvo prouči kako radi naredba I
Code:
F ... THEN ... (ELSE) ... ENDIF

Posle toga pogledaj šta si napisao pa nam se ponovo javi.

Drugi put ti već pišem da labele na svom kraju MORAJU da imaju dvotačku (:)
Fića bez kočnica se GARANTOVANO ščuka na nizbrdici.
Poštuj sintaksu jezika koji koristiš za pisanje programa (PBP) kao sintaksu maternjeg.

Labele u programu su ti kao papirići koje stavljaš u knjigu kojima obeležavaš karakteristična/interesantna mesta na koje možeš u svakom trenutku da se prebaciš (umesto papirića u knjigama možeš da praviš i "magareće uši", ako čitaš).
[ MILANAN @ 01.09.2012. 13:17 ] @
Zaboravio sam da dodam,vidim da je darko poceo kad i ja i naucio dosta dobro picbasic ali svako ucenje pa cak i da se motaju cigare zahteva vreme.Ja slabo imam vreme,nekad izgubim i po 2-3 sata uz necija kola sto mu na pr nerade zmigavci,imam u zadnje vreme po neki tv dosta radio st pc napajanja a o auto kas i cd da ne govorim prko leta kad dodju nasi iz inostranstva i donesu sve i svasta.Koliko sam imao vreme izdvoio sam maksimalno i naucio sam koliko sam mogao,iako je picbasik isuvise prost kazem ipak treba vreme.Engleski mi nije problem,ne umem da govorim niti mogu da prevedem kad neko prica ali znam dosta dosta da prevedem sto procitam (text) a tako sam i poceo da ucim po neku pisanu rec jos od amige atarija pa do sada.Picbasic me zanima jedan od razloga jer jedan obican 16f84 moze da zameni dota veliki sklop sa dosta digitalni ic . Da kazem jos jednom da svaki savet prihvatam i da se na nikog neljutim,napravio sam puno jos ranije detektora za metal pa se i na mene niko nije ljutio sto nije pronasao zakopano blago
[ rsinisa @ 01.09.2012. 13:26 ] @
Milane, dao si mi ideju za još jednu teorijsku lekciju pod nazivom "Algoritam", koju ću da napišem pre praktičnog dela tutorijala.
Pošto si slab u ovim vodama, tebi je najbolje da na papiru napišeš redosled SVAKOG POJEDINAČNOG KORAKA na govornom jeziku koji najbolje razumeš (verovatno srpski u tvom slučaju) koji mora da se uradi da bi se postiglo to što želiš, a kad to napišeš, onda možeš da prevodiš u koji god hoćeš programski jezik.
Citat:
MILANAN: Ovo znam kako funkcionise ali ne znam sta da ubacm da kad rb2 pritisnem dva i vise puta da se led ne pali vec da prog radi kad se samo po jednom pritisnu redom 1 2 3

Zato moj program ne ispituje da li je pritisnut jedan taster, već proverava sva 4 tastera odjednom, samo tako možeš da izbegneš istovremeno uzastopne ili pogrešno pritisnute tastere.
Ajde ti polako prouči onaj moj program i pitaj šta ti sve nije jasno, objasniću ti sve što te zanima. A pogledaj i npr. u uputstvu za PBP šta radi operator "&" pa zatim napiši na papiru šta se dobija u promenjlivoj "tasteri" za svaki od pritisnutih tastera.

Citat:
ZAS011:Fića bez kočnica se GARANTOVANO ščuka na nizbrdici.

Neće ako ima ugradjen mićkov ABS: Ako Bog-da Staće (referenca: "Nazovi M ili će on tebe") ;)

Pozdrav.
Sinisha
[ MILANAN @ 01.09.2012. 13:29 ] @
IF (ako) uslov THEN (onda)
operacija1
ELSE (u suprotnom)
ako operacija nije uspesna
ENDIF (kraj ispitivanja operacije)
WHILE (dok je operacija uredu)
odvija se...
WEND (kraj operacije dok je operacija 1 zadovoljna)

To znam ali nesto sto treda na pr proracunati snimiti pozvati kasnije tu se slabo snalazim
[ MILANAN @ 01.09.2012. 13:48 ] @
Tu mi nista nije jasno (prvi put vidim i ovo LET),mislim na program ali probacu da shvatim pa ako NESTO neide javicu se a ako sve neide vec me je i sramota da vam dosadjujem pa necu ni da se javljam.Da za picbasik ima literatura kao nekad kad sam poceo analo.el. pe je bilo knjiga za pocetak od Ratko Opacic,Bozo_Metzger i sl sve bi islo lako a ovo mi ide kao m. . a op ziletu ali probacu koliko mogu.Od analogne el nemam vise sta da ucim niti to vise ide dalje a volim ovaj poso pa sem hteo da naucim bar nesto i o programiranju.Hvala ti Sinisa na velikom razumevanju i za pomoc
[ rsinisa @ 01.09.2012. 14:09 ] @
Citat:
MILANAN: Tu mi nista nije jasno (prvi put vidim i ovo LET)
Svi ti pričamo da pročitaš PBP uputstvo, ali ti nikako da poslušaš.

Citat:
probacu da shvatim pa ako NESTO neide javicu se a ako sve neide vec me je i sramota da vam dosadjujem pa necu ni da se javljam.
Tvoja volja; ja sam raspoložen da ti objasnim detaljno (ionako se sve ponavlja 4 puta pa nije problem objasniti), a ti kako hoćeš. Ali prvo PROBAJ da razumeš i PROČITAJ uputstvo za PBP bar za one komande koje se koriste u tom primeru.

Pozdrav.
Sinisha
[ ZAS011 @ 01.09.2012. 14:10 ] @
LET je zaostavština iz praistorijskih BASIC interpretera na mainframe računarima. To već može ali i ne mora da se piše. GoTo MORA. Dvotačka koja označava labelu MORA.

Kada bi ti znako koliko analogna elektronika i dalje napreduje. Bez analogne ne bi bilo ni digitalne, još bi se koristio Abakus za računanje.
Inače, analogni računari su svojevremeno "lupali čvrge" digitalnim, jedina im je mana što se prave namenski, za obradu specifičnog problema.
Primer analognog računara ti je drajver za servo motor, starije, analogne izvedbe. Gomila operacionih pojačavača koji se bave matematikom )potraži na guglu šta je to PID regulacija).
[ rsinisa @ 01.09.2012. 14:22 ] @
Citat:
ZAS011: GoTo MORA.
Čisto radi preciznosti: ima jedan slučaj kod PBP-a kada GoTo ne mora da se piše, a to je upravo posle THEN - ako u tom IF-u posle THEN ima samo GoTo, može da se stavi samo labela odmah posle THEN, ali posle toga ne ide više ENDIF, već sledeća naredba.

Pozdrav.
Sinisha
[ MILANAN @ 01.09.2012. 14:31 ] @
Normalno da napreduje ali mislim na svakidasnje stvari,na pr nema vise crt monitor i a i to ponesto nevredi vise pogledati.ves masine sa dig programator mada ih izbegavam i jos puno tiga je preslo u digitalno inace za dosta stvari analogna je zakon i treba pratiti inovacije ali i ujedno ici dalje.
[ ZAS011 @ 01.09.2012. 14:50 ] @
Sorry Siniša, nisam se precizno izrazio, ne znam šta mi bi, ali, Milanovo:

Code:
SYMBOL LED = PORTB.4
SYMBOL taster1 = PORTB.0
SYMBOL taster2 = PORTB.1
SYMBOL taster3 = PORTB.2
INPUT taster1
input taster2
input taster3
OUTPUT led

ugasena: 'desava se da se upali cim dam napon na pic,sad je uredu' ' NEDOSTAJALA JE DVOTAČKA
low led
pocetak: ' NEDOSTAJALA JE DVOTAČKA
IF TASTER1 = 1 THEN pocetak
IF taster1 = 0 THEN
    pocetak1 'radi i bez goto'  <=== NA OVO SAM MISLIO
ENDIF

pocetak1: ' NEDOSTAJALA JE DVOTAČKA
if taster2 = 1 then pocetak1
if taster2 = 0 then
    pocetak2
endif

pocetak2: ' NEDOSTAJALA JE DVOTAČKA
if taster3 = 1 then pocetak2
if taster3 = 0 then
    pocetak3
endif

pocetak3: ' NEDOSTAJALA JE DVOTAČKA
high led
goto pocetak5
pocetak5: ' NEDOSTAJALA JE DVOTAČKA
IF TASTER1 = 1 THEN pocetak5
IF taster1 = 0 THEN
    pocetak6
ENDIF

pocetak6: ' NEDOSTAJALA JR DVOTAČKA
if taster2 = 1 then pocetak6
if taster2 = 0 then
    pocetak7
endif

pocetak7: ' NEDOSTAJALA JE DVOTAČKA
if taster3 = 1 then pocetak7
if taster3 = 0 then
    pocetak8
endif

pocetak8: ' NEDOSTAJALA JE DVOTAČKA
low led
goto ugasena

end


sam malko 'nazubio' da bude lakše za čitanje i dodao malko komentara
Trebalo bi da izgleda 'vako:

Code:
SYMBOL LED = PORTB.4
SYMBOL taster1 = PORTB.0
SYMBOL taster2 = PORTB.1
SYMBOL taster3 = PORTB.2
INPUT taster1
input taster2
input taster3
OUTPUT led

ugasena:
pocetak
IF TASTER1 = 1 THEN pocetak
IF taster1 = 0 THEN
    goto pocetak1
ENDIF

pocetak1:
if taster2 = 1 then pocetak1
if taster2 = 0 then
    goto pocetak2
endif

pocetak2:
if taster3 = 1 then pocetak2
if taster3 = 0 then
    goto pocetak3
endif

pocetak3:
high led
goto pocetak5
pocetak5
IF TASTER1 = 1 THEN pocetak5
IF taster1 = 0 THEN
    goto pocetak6
ENDIF

pocetak6:
if taster2 = 1 then pocetak6
if taster2 = 0 then
    goto pocetak7
endif

pocetak7:
if taster3 = 1 then pocetak7
if taster3 = 0 then
    goto pocetak8
endif

pocetak8:
low led
goto ugasena

end


a moglo bi i 'vako, kada se izbace potpuno bezpotrebni delovi programa (oni koji ama baš ničemu ne služe osim za vežbanje kucanja)

Code:
SYMBOL LED = PORTB.4
SYMBOL taster1 = PORTB.0
SYMBOL taster2 = PORTB.1
SYMBOL taster3 = PORTB.2
INPUT taster1
input taster2
input taster3
OUTPUT led

ugasena:
pocetak
IF TASTER1 = 1 THEN pocetak

pocetak1:
if taster2 = 1 then pocetak1

pocetak2:
if taster3 = 1 then pocetak2

pocetak3:
high led
goto pocetak5
pocetak5
IF TASTER1 = 1 THEN pocetak5

pocetak6:
if taster2 = 1 then pocetak6

pocetak7:
if taster3 = 1 then pocetak7

pocetak8:
low led
goto ugasena

end


Složićeš se da ova dva rade identično, pošto kada neki taster !=1, onda je =0 i nema potrebe proveravati da li je =0
[ rsinisa @ 01.09.2012. 15:28 ] @
Ma da, video sam to odmah, i znam na šta si mislio, ali nisam imao volje da reagujem, reko, probaće prvo ovo što sam mu nakuckao.

Pozdrav.
Sinisha
[ ZAS011 @ 01.09.2012. 15:47 ] @
Neće da proba, to je tvrdoglavo (a mora i da vežba kucanje)
[ MILANAN @ 01.09.2012. 15:50 ] @
Probao sam kod koji je Sinisa napisao (Copy Paste) dobio hex iz MicroCode Studio ali nije radio pa sam zato ono probao ja da napisem a ovaj kod sinisin cu probati da razumem. na pr IF tasteri !=13 ne znam zasto znak ! i 13 (i ostali brojevi u kodu 11 14 ... ) ali valjda cu negde da nadjem zasto
[ Darko_zed @ 01.09.2012. 16:30 ] @
Citat:
MILANAN: Probao sam kod koji je Sinisa napisao (Copy Paste) dobio hex iz MicroCode Studio ali nije radio pa sam zato ono probao ja da napisem a ovaj kod sinisin cu probati da razumem. na pr IF tasteri !=13 ne znam zasto znak ! i 13 (i ostali brojevi u kodu 11 14 ... ) ali valjda cu negde da nadjem zasto



na pocetku programa on posmatra stanje na ulazu 00001111=15 , vraca na pocetak labela na kome je ukoliko nije pritisnut ni jedan i ceka izvrsenje uslova (14 , 13 , 11 i 7) kada dodje do toga i skoce na sledeci

posle prati promenu , evo tabela kako posmatra ulaze i sta se desava kada se pritisne taster ali da napomenem i ja da preko tastera dovodis 0 i da su ulazi definisani na jedinici (otpornik 10koma pa na plus hardwerski)

14 - 00001110
13 - 00001101
11 - 00001011
7 - 00000111
15 - 00001111

posmatraj ovo kao pinove da lakse shvatis , kod broja 14 ti je portb.0 = 0 , a portovi RB1 , RB2 i RB3 na jednici i kako pritisnes RB1 onda je slika 13 ,a da recimo pritisnes RB0 i RB1 u isto vreme dobio bi 00001100 ili prevedi pomocu kalkulatora binarni u decimalni i dobices 12 , nadam se da shvatas sada ovo .Da pritisnes sve od jednom bile bi sve nule 00000000
Pokusao sam najprostije da ti objasnim bez zamerki ako sam nesto izostavio
[ ZAS011 @ 01.09.2012. 16:59 ] @
!=13 znači Nije (!) jednako (=) 13 ili kraće različito od 13

Citat:
na pr IF tasteri !=13 ne znam zasto znak ! i 13 (i ostali brojevi u kodu 11 14 ... ) ali valjda cu negde da nadjem zasto


Vidiš li sada o čemu ja pišem svo vreme? O RAZUMEVANJU.
Počni da čitaš Sinišin TUTORIJAL, znaš, tu piše i o brojnim sistemima, mada ti je Darko već napisao zašto 13, 14 i ostale brojke.

Umesto 13, Siniša je mogao da napiše i $0D ili %00001101. Ima isto značenje.
[ rsinisa @ 01.09.2012. 17:43 ] @
Citat:
MILANAN: Probao sam kod koji je Sinisa napisao (Copy Paste) dobio hex iz MicroCode Studio ali nije radio
Ajde, proveriću ga ja, možda se negde i potkrala greška.

Citat:
na pr IF tasteri !=13 ne znam zasto znak ! i 13 (i ostali brojevi u kodu 11 14 ... ) ali valjda cu negde da nadjem zasto

He, zar je toliko teško pročitati dokumentaciju??? Ako imaš uputstvo u PDF-u (a treba da ga imaš u PBP3 direktorijumu, poddirektorijum DOCUMENTATION, fajl PBP_Reference_Manual.pdf, strana 85, deo "3.3.3 Not Equal To ( <> or != )", ako nemaš skini ga odavde
http://pbp3.com/downloads/PBP_Reference_Manual.pdf.
Ili idi na ovaj link
http://melabs.com/resources/pbpmanual/4_0.htm#418

Mislim da preciznije od ovoga ne može; ako sad ne saznaš šta to znači i kako da UBUDUĆE saznaš bilo šta oko PBP-a, ja onda ne umem da ti pomognem.

Ili jednostavno batali ovo pošto izgleda da to nije za tebe kao što sam ja batalio zavojnice i generalno sve što ima veze sa VF-om - jednostavno imam averziju prema tome, to je za mene teška oblast i ne bavim se time.

Pozdrav.
Sinisha

[ ZAS011 @ 01.09.2012. 18:27 ] @
Milane, mislim da bi ti najpametnije bilo da počneš da praviš sitnu dečicu. Ovako, kako si počeo, ima žena da ti da otkaz.
[ Darko_zed @ 01.09.2012. 18:33 ] @
Covek rece da ne zna engleski
Pomaze samo domaca literatura ,a savete je vec i tu dobio tako da je sada sve na njemu.
Pozdrav
[ ZAS011 @ 01.09.2012. 18:41 ] @
Darko, ne paziš na času!

Citat:
Zaboravio sam da dodam,vidim da je darko poceo kad i ja i naucio dosta dobro picbasic ali svako ucenje pa cak i da se motaju cigare zahteva vreme.Ja slabo imam vreme,nekad izgubim i po 2-3 sata uz necija kola sto mu na pr nerade zmigavci,imam u zadnje vreme po neki tv dosta radio st pc napajanja a o auto kas i cd da ne govorim prko leta kad dodju nasi iz inostranstva i donesu sve i svasta.Koliko sam imao vreme izdvoio sam maksimalno i naucio sam koliko sam mogao,iako je picbasik isuvise prost kazem ipak treba vreme.Engleski mi nije problem,ne umem da govorim niti mogu da prevedem kad neko prica ali znam dosta dosta da prevedem sto procitam (text) a tako sam i poceo da ucim po neku pisanu rec jos od amige atarija pa do sada.Picbasic me zanima jedan od razloga jer jedan obican 16f84 moze da zameni dota veliki sklop sa dosta digitalni ic . Da kazem jos jednom da svaki savet prihvatam i da se na nikog neljutim,napravio sam puno jos ranije detektora za metal pa se i na mene niko nije ljutio sto nije pronasao zakopano blago
[ MILANAN @ 01.09.2012. 18:42 ] @
Za sitnu decicu mi treba teska operacija koju bih morao da platim i za koju necu da vidim tolike pare ni na slici tako da od toga nema nista a i nije me ostavila zena zbog toga.Ovo za picbasic bar neboli i nekosta.Pisao sam i ranije,nemogu mnogo da citam jer mi smeta monitor ali ponesto koliko mogu procitam.Da mogu dugo ispred monitora bilo bi drugacije pa sam zato sto retko mogu da citam za ovo i zaboravio
14 - 00001110
13 - 00001101
11 - 00001011
7 - 00000111
15 - 00001111

a tako sam ucio da pisem brojeve za led displej dok nisam dosao do lakseg nacina,jednostavno me sprecavaju stvari protiv kojih nemogu inace nisam lenj i ODLICNO znam sta treba ali j . . e me visa sila pa zato ispadam glup cim se javim sa pitanjima oko picbasica.
[ MILANAN @ 01.09.2012. 19:01 ] @
Sad tek vidim gore da je ono u vezi engleskog oznaceno crvenim pa nevidim kako da kazem sta je tu smesno i toliko pametno da se to izdvaja,jednostavno sam ucio reci engleskog namenski za sta mi treba i mogu da kazem da mi dosta koristi a na koji cas mislis da Darko ne pazi ne znam.Sdruge strane svako moze da se snadje za bilo koji jezik jer se raspolaze sa veliki br. el. prevodioca tako da ni to nije neki problem
[ ZAS011 @ 01.09.2012. 20:07 ] @
Crveno nije upućeno tebi već Darku.
[ MILANAN @ 01.09.2012. 20:11 ] @
Pa ja sam ga pisao a ne Darko.Sto jeste jeste,nije za nikakvu pohvalu moje znanje engleskog ali pomogne,neman skim da pricam na engleskom pa mi je dovoljno da procitam i prevedem stoga nevidim razlog za ismevanje
[ MILANAN @ 01.09.2012. 20:20 ] @
Kad smo tu da pitam nesto mozda znate.Da li ide postexpres na kosovo precizno Gnjilane ? prodao sam nesto na kupindu pa je sad problem oko slanja a treba da cekam ponedeljak da pitam u posti
[ ZAS011 @ 03.09.2012. 09:09 ] @
Evo tebi, Milane, precizno, jedna knjiga sa primerima, da se malo učiš.
Biće na ovom mestu do sutra (04.09.2011) u podne.

http://zastos.biz/ForShare/Exp...asic_Pro_Compiler_-_Source.rar
[ MILANAN @ 03.09.2012. 16:50 ] @
Hvala Zaso011 za knjigu i izvinjavam se ako sam juce bio malo neprijatan,nesto drugo me je malo pogodilo,da me pogresno ne shvatite nije nista oko programiranja.Nadam se da mi verujete jer ja sam i pisao da nemam mnogo vremena i da mi smeta monitor pa je i logicno sto sporo napredujem u picbasicu i naravno tu mi niko nije kriv pa zato stvarno izvinite za nekoliko zadnjih poruka od juce jer nije nista vezano za picbasic.Inace stvarno ste mi pomogli i zahvalan sam vam svima.Kad vec pisem da pitam i ovo.Danas mi je otiso zadnji 16f84 pa bih kupio neki sa 40pina sa kojim bi da nastavim ali da ima sve: ad , da , komparatore i sve sto je potrebno.Koji pic vi savetujete da kupim za vezbanje nadalje i da moze da ga programira all pic prog ( njega imam ) ?
[ ZAS011 @ 03.09.2012. 18:27 ] @
Ako ti smeta monitor, ti lepo da odeš kod nekog dobrog očnog lekara. Vidiš, ja nosim naočare čitav svoj život i kada mi je pre izvesnog vremena počeo da smeta monitor, ja lepo put pod noge i kod očnog. Čuvaj svoje oči, trebaće ti (da se ne bi kasnije snalazio na sluh i pipanje).

Za tvije drugo pitanje, 16F887. Nešto malkice je skuplji od 16F84A-04/P a jevtiniji od 16F84A-20/P. Ima sve što ti treba, osim D/A, to retko koji ima.

================

Knjiga sa primerima sklonjena, kome je bila namenjena taj je preuzeo
[ MILANAN @ 03.09.2012. 21:25 ] @
Ima dve god. kako nisam kontrolisao dioptriju,od danas do sutra i tako ali moracu.(strasna stvar,u Nisu 1000e laserski skidaju dioptriju cujem vrlo uspesno mada raspitacu se,jedna od zivotnih zelja mi je da skinem naocare zauvek)Knjigu sam preuzeo,hvala jos jednom. D/A mislim i ja da nije od velikog znacaja,resava se i sa 741 tako da ce 16f877 da odgovara u svemu,otstampao sam uputstvo da ga imam na papiru radi lakseg citanja pa dokle stignem.Hvala jos jednom "cujemo se" Pozdrav svima
[ MILANAN @ 05.09.2012. 17:35 ] @
Pozdrav.Poceo sam da citam i citam -16f877- i odma ali mali problem,nekapiram koja je razlika izmedju ADCON0 i ADCON1 ? citao sam na pocetku jos Darkova pitanja,pronalazio projekte,slicne seme gde sa koriste ti registri a seme skoro ista i za adcon0 i adcon1 (ako mora prtazicu seme,ja sam ih otstampao i sed ne znam tacno odakle su)ali nije mi najjasnije pa ako moze UKRATKO primer (ne kucan bas) -tad i zato adcon0 tad i zato adcon1 ukratko bar u jednoj recenici i koja je razlika u na pr merelju napona ako je pic potavljen kao 8bit ili 10bit Sve to ima ali nisam siguran u sebe da li sam oravilno ukapirao
[ ZAS011 @ 05.09.2012. 20:20 ] @
Pročitaj šta je funkcija svakog od registara i šta koji bit u tim registrima znači.
Evo ti registri za

16F877





i 16F887





Ako ovo ne možeš da svariš i razumeš, onda stvarno batali druženje sa mikrokontrolerima.

[ MILANAN @ 05.09.2012. 21:14 ] @
E jesi za profesora,otvori mi oci iz prve,ne zezam se.Sad iz prakse na pr zasta se koristi levo zasta desno poravnanje,mislim za koji uredjaj kad se pravi se koristi na pr levo ili desno i sta ustvari radi adc clock Sad ne znam koliko su mi pitanja pametna ali pitam cisto sta i koliko u praksi,nadam se da me razumete
[ MILANAN @ 08.09.2012. 20:34 ] @
Pozdrav.Sklopio sam kod ovako i mislim jer proba je iz proteusa da kod radi.Kad prekoraci napon na displeju je uvek 255 a ispod zadatog je 0 , izmedju su vrednosti zavisno od merenja.Ono sto mi neide je kako da na nekom pinu napisem da svetli led a kad se napon prekoraci ili padne ispod zadatog da se led ugasi.I jos jedna nejasna stvar u datasheetu za ADCON1 ,sta znace za bitove 3-0 u zadnjoj koloni 0/8 7/1 5/0 ... Ako moze molio bih vas za pomoc





Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1


Define ADC_BITS 8
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50

adval Var Byte


TRISA = %11111111
ADCON1 = %00001100
Low PORTE.2

Pause 100

mainloop:
ADCIN 0, adval

Lcdout $fe, 1
Lcdout "Value: ", DEC adval

Pause 500

Goto mainloop

End
[ ZAS011 @ 08.09.2012. 21:59 ] @
Citat:
MILANAN: I jos jedna nejasna stvar u datasheetu za ADCON1 ,sta znace za bitove 3-0 u zadnjoj koloni 0/8 7/1 5/0 ... Ako moze molio bih vas za pomoc

Natenane pročitati datasheet!

Dokle više da polovično savlađuješ gradivo i da čitaš na preskok. Kada bi ti samo znao koliko sam datasheet-ova u životu morao da pročitam da bih se bavio elektronikom uopšte. Ljudi iz škola i fakulteta znaju da iziđu k'o arhiduduci i da bi radili u struci, tek moraju da "zagreju" stolicu, a kamo li wannabee "programatori". A datasheet-ove i dan danas čitam, prema potrebi one malko starije, da se podsetim, a one novije da se "upoznam sa novim neprijateljem" koji mi po karakteristikama "završava pos'o".

Da ti olakšam, Broj ADC kanala/Broj REF pinova.
[ MILANAN @ 09.09.2012. 18:07 ] @
Pomagajte ako hocete,sve zivo sam probao ali neide da napravim da se pali led kad se napon prekoraci ili padne ispod zadate.Uspeo sam i ovako nesto da sastavim ali ovo jednostavno nece mada i sumnjam na proteus jer ponekad se zacrveni tackica pored pina koji bi palio led ali led se ne pali.Ako moze pomozite za ovaj kod -jedan-
[ ZAS011 @ 09.09.2012. 18:18 ] @
Kog tipa ti je promenljiva adval?

Kako misliš da u promenljivu veličine 8 bita strpaš 10 bita rezolucije AD konvertora i da još radiš neku "matematiku" sa BAJTOM?

Code:
adval= (adval*500)/1024
!!!

Lepo ti ja pisah, žena će da ti da otkaz.
[ MILANAN @ 09.09.2012. 18:22 ] @
Vidim sad da sam zeznuo na copi paste mada vise nemogu da gledam u mon pa ako hocete pomagajte jer sve radi iz proteusa osim ovo za led
[ MILANAN @ 09.09.2012. 18:34 ] @
Pa i ako da otkoz nema veze otkazi sad prelaze u modu,nista strasno
[ ZAS011 @ 09.09.2012. 20:21 ] @
Ono što sam ti naglasio u CODE u mom prethodnom postu za sobom vuče još nešto, a ti i dalje ne primećuješ:

adval, ako je veće od 131, odnosno $83, odnodno %10000011, prilikom mnioženja sa 500 će premašiti vrednost promenljive tipa WORD, tako da za sve vrednosti vrednosti AD konvertora tvoja računica pada u vodu.

To ti dođe kao kada bi na dvocifarskom displeju 'teo da prikažeš broj veći od 99

Ne vidim razlog zašto adval množiš sa 500. Šta pokušavaš da postigneš, odnosno kolike napone 'oćeš da meriš.
[ MILANAN @ 09.09.2012. 21:18 ] @
Najvise do 24v vise mi netreba da meri,ako mozetedajte ispravku ostado bez oci
[ ZAS011 @ 09.09.2012. 21:45 ] @
Razdelnik napona proračunaš da ti za ulazni napon od 30,7V na AD pinu bude 5V.
Iščitaš AD 3 puta (sa sabiranjem)

Code:
adval = 0

for i = 1 to 3
  adval = adval + adcin 0
next i

NaponCelo = adval /100
NaponDeci = adval - NaponCelo * 100


Ovo ti je za prikaz na displeju, na primer.
Tvoje uslove za paljenje gašenje LED-are ćeš lako dopisati.
[ MILANAN @ 12.09.2012. 20:23 ] @

Pozdrav.Samo jedno pitanje,kako se dolazi do ovih vrednosti 5V/256stanja= 0.0195V ili b'00000001 To je na pocetku ove teme prikazano pa bih da pitam kako se 0.0195V prevode u b'00000001




[ ZAS011 @ 12.09.2012. 21:10 ] @
Izvini što moram da te pitam, da li si ti kojim slučajem neki varioc?
Meni se barem tako čini, znaš, preterano varenje ume da poremeti normalan način logičkog razmišljanja.
[ MILANAN @ 12.09.2012. 21:31 ] @
Bas i ne razumem tu mudrost,ajde budi ljubazan pa mi prevedi to sto si napisao.Inace ovo dole je iskopirano sa prve strane ove teme pa "odatle" pitam.

Postoje opet PIC16 mikrokontroleri koji imaju integrisane A/D
konvertore. Na primer PIC16F88, PIC16F870, PIC16F877...
U PIC16 seriji postoji par tipova ovih A/D konvertora.
8-bitni A/Dkonvertor
10-bitni A/D konvertor
12-bitni A/D konvertor.

Glavna razlika izmedju ovih A/D konvertora je rezolucija merenja.
Ukoliko se meri napon izmedju 0 i +5V osmobitnim A/D konvertorom koji
daje b'00000000' za 0V i b'11111111' za 5V, rezolucija je
5V/256stanja=0.0195V.

Znaci
b'00000000' = 0V
b'00000001' = 0.195V
b'00000010' = 0.390V
b'00000011' = 0.234V
...
b'11111101' = 4.610V
b'11111110' = 4.805V
b'11111111' = 5V

Ukoliko imate 10-btini A/D konvertor, rezolucija je
5V/1024stanja=0.00488V odnosno sledeca:

b'00 00000000' = 0V
b'00 00000001' = 0.00488V
b'00 00000010' = 0.00976V
...
b'11 11111101' = 4.99024
b'11 11111110' = 4.99512
b'11 11111111' = 5V

Isto vazi i za 12-bitni A/D konvertor.

Kod nekih mikrokontrolera sa A/D konvertorima moguce je podesiti da se
umesto maksimalnog napona od +5V (uobicajenog) odabere neki drugi
(nizi). Ovo je pozeljno uraditi ukoliko mikrokontrolerom na primer
merite napon baterije od 1,5V. Nema svrhe uzeti kao maksimalni napon
5V, jer se on nikada nece moci dostici. Logicnije bi bilo odabrati
manji maksimalan napon (ovaj napon naziva se referentni), jer se
ukoliko je maksimalni napon npr. 2V dobilo sledece:

b'00000000' = 0V
...
b'11111111' = 2V
[ Genie_1984 @ 12.09.2012. 22:07 ] @
Odgovor na prvi deo pitanja odakle 5V/256stanja= 0.0195V :
5V / ( 2^8 ) = 0.0195V jer je u primeru 8-bitni A/D

Drugi deo pitanja...hm...ajd kad tako postavljaš pitanje,tako i da odgovorim... "prevodi" A/D konvertor, tj. on vraća tu vrednost (s tim da su ovde ispisane binarne vrednosti :

0.195V = b'00000001' = 1
0.390V = b'00000010' = 2
0.234V = b'00000011' = 3
itd...

Što bi značilo sledeće... Ako je refernetni napon 5V, koristiš 8-bitni A/D i dovedeš na ulaz napon od 0.390V, A/D konvertor će vratiti vrednost 2

Nadam se da je malo jasnije

Pozdrav
[ MILANAN @ 12.09.2012. 22:18 ] @
Hvala vam.Sad mi je jasno znacanje ali sam ja citajuci prvu stranu ove teme to bio shvatio drugacije.
[ ZAS011 @ 12.09.2012. 22:34 ] @
Ja ovde više ne učestvujem. Ne vredi.
[ MILANAN @ 26.09.2012. 22:06 ] @
Pozdrav.javljam se ponovo pa ako neko moze nek pomaze.Pokusavam sad za sebe da napravim cetvorostruki voltmetar sa LCD ali neide mi da mi meri tacno,mozda je problem iz proteusa,ne znam.Dao sam ova dva koda samo kao primer,problem je da mi meri tacno a dogagja se ovo:stavim da meri baterju i na pr 10v meri mi tano a kad skinem ili podignem napon baterje za na pr 2v on pravi gresku po 5 6v pa i vise.Potrebna mi je izmena u ovim kodovima (to su kodovi sa interneta)u vezi toga i koje vrednosti R da stavim da bi bilo tacno.Znam da ulaz nesme biti veci od 5v probao sam sve sto sam mogao ali neide.Problem pravim valjda u ovom delu:

Lcdout $fe, 1 ' Clear screen
Lcdout "Value: ", DEC adval ' sta pomnoziti ili podeliti u ovom delu

[ Darko_zed @ 26.09.2012. 22:27 ] @
u tom delu ne mozes nista uraditi jer ti je to izvrsna komanda za ispis vrednosti na displeju i to tako redom sto prvo obrise predhodni zapis komandom Lcdout $fe, 1 ' Clear screen pa tek onda ispise vrednost promenjive adval u koju je smesteno ocitavanje vrednosti AD ulaza .
Za merenje napona moras definisati gornju granicu koju zelis meriti i prema njoj proracunas razdelnik napona tako da kada vrednost napona bude na maksimumu koji meris onda da je na razdelniku oko 5V . Prostom matematikom i poznavajuci rezoluciju AD ulaza (zavisno koliko je bita)
mozes lako napisati to sto ti treba .
[ Darko_zed @ 26.09.2012. 22:32 ] @
Ovu semu sto si postavio i program je klasican primer iscitavanja stanja potenciomnetra sa 8 bitnim Ad ulazom (255 stanja )
[ Darko_zed @ 26.09.2012. 22:38 ] @
Evo ti jedna mala pomoc posto vidim da volis da se pomucis pa izracunaj da na recimo20V ti bude 4.9V i obavezno stavi zenericu na ulaz da nesto ne zaebes

http://www.raltron.com/cust/tools/voltage_divider.asp
[ MILANAN @ 26.09.2012. 22:41 ] @
-Za merenje napona moras definisati gornju granicu koju zelis meriti i prema njoj proracunas razdelnik napona tako da kada vrednost napona bude na maksimumu koji meris onda da je na razdelniku oko 5V . Prostom matematikom i poznavajuci rezoluciju AD ulaza (zavisno koliko je bita)
mozes lako napisati to sto ti treba -

Znam sve sta treba od ovog sto ste napisali ali ne znam kako.Ako mozete dajte bar nesto sta i kako u ovim kodovima da dodam da meri do 30v vise mi netreba
[ MILANAN @ 26.09.2012. 22:45 ] @
Imam taj kalkulator,to mi je najmanji problem ali oko pisanja ko sta radi ja samo to i neide.U petak mi stize knjiga Voije M. pa cu da vidim ima li vajde
[ Darko_zed @ 26.09.2012. 22:55 ] @
Citat:
Znam sve sta treba od ovog sto ste napisali ali ne znam kako

Ovo je najbolje napisano od svega .
[ MILANAN @ 26.09.2012. 23:02 ] @
Pa sta da kazem,jeste smesno ali stvarno sam sve probao i uvek se javlja greska.
[ Darko_zed @ 26.09.2012. 23:11 ] @
Evo ti jedan primer ispisa vrednosti 10 bitnog voltmetra u dva reda to jest sa natpisom u prvom redu ''NAPON'' pa se uklapaj kad procitas knjigu , menjaj itd. Ne pitaj za rasklapanje kodova na cinioce makar dok ne procitas nesto iz knjige i ne naucis osnovno jer veruj mi samo ces se zbuniti i neces nista ukapirati

Code:
Pocetak:    

  Procitaj 1 kanal na RA2 i prikazi
      
        Lcdout $fe, 1        ' Izbrisi ceo LCD displej
    Lcdout $fe, 2        ' Pozicioniraj se na prvi red prvi karakter
        Lcdout " A/D kanal br.1" ' Ispisi “A/D kanal br.1 u prvom redu

        ADCIN 2, AD_Rez       ' Izvrsi konverziju na RA2 i 10 bita rezultata smesti u AD_Rez.
    Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda LCD-a 2x16 karaktera 
        Dummy = AD_Rez * 5 * 100
        Napon = Div32 1024
        Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda
  Lcdout "   Napon:", DEC Napon DIG 2,".", DEC2 Napon, "V"         ' Ispisi vrednost na displeju ' rezultat AD konverzije  
          Pause 10000            ' Pauza 10 sec
      goto pocetak





Pogledaj P.P

[Ovu poruku je menjao Darko_zed dana 27.09.2012. u 00:22 GMT+1]
[ MILANAN @ 26.09.2012. 23:17 ] @
Hvala Darko.Video sam negde taj kod ali nisam obratio paznju i nisam ga ni probao ali sutra hocu cim dodjem sposla.Pozdrav i hvala jos jednom
[ jmikica @ 09.10.2012. 08:32 ] @
pozdrav svim ucesnicima ovog foruma,evo ovako kupih knjigu od milanovica PIC basic da se upustim u te vode programerske
i jos pratim nekoliko pocetnickih kurseva ali nadje problem.naime nadjoh da skinem jedan program u PBP kad on nece da se kompajlira kod mene jer moj kompajler (dobiven uz knjigu )kompajlira samo do 31 linije (tako mi deca prevedose).probah da skinem sa njihovog sajta demo ali ne dobijam kljuc(ne znam zasto).molio bi sve dobre ljude da mi pomognu da nadjem punu verziju PBP2.6 - 3.0 jos mi je rano da kupim pbp3 za 50setak evrica.pozdrav mikica
[ electron2008 @ 09.10.2012. 09:06 ] @
Dali neko ima ideju, okvirno, kako sa 4 tastera i dve ledice odraditi kod tako da kad je pritisnut T1 upali se LED1 svetli sve dok se ne pritisne T2, kad se gasi led1 i ponovo upali tek kad se opet aktivira T1, to sam odradio, ali kako da u isto vreme to radim sa T3, T4 i LED2, da pojasnim, moglo bi se iskoristiti kao regulacija vode u dva odvojena bazena i slicno za sve sto treba da regulie dva nivoa, dve temperature....znaci kako u PBP odrditi nadgledanje dve stvari u isto vreme?
[ rsinisa @ 09.10.2012. 10:13 ] @
Ako si uradio za 2 tastera i 1 LED, onda si na pola posla. Kad odradiš to za prvu kombinaciju, samo u nastavku odradiš i za drugu, i tek onda se vratiš na početak programa.

Pozdrav.
Sinisha
[ MILANAN @ 09.10.2012. 20:05 ] @
Pozdrav svima.Evo i mene najboljeg programera na svetu (sala).Ja samo da kazem jmikica da ne kupuje knjigu jer sve to ima i na internetu cak i na srpskom.Pre desetak dana sam kupio i nista posebno jedino kog mrzi da trazi po internetu pa ovako da ima sve na jednom mestu a meni odgovara papir zbog monitora
[ MILANAN @ 10.10.2012. 21:26 ] @
Evo za dva tast. i 1 led,sad dodaj dalje.Valjda ce da radi

trisb = %00000011
portb.3 = 0

while 1 = 1
while portb.0 = 1
pause 30
wend

portb.3 = ~portb.3


while portb.1 = 1
pause 30
wend
portb.3 = ~portb.3

wend
[ Darko_zed @ 10.10.2012. 23:01 ] @
Citat:
Ja samo da kazem jmikica da ne kupuje knjigu jer sve to ima i na internetu cak i na srpskom.Pre desetak dana sam kupio i nista posebno jedino kog mrzi da trazi po internetu pa ovako da ima sve na jednom mestu a meni odgovara papir zbog monitora


Ne bih se slozio sa tobom , to sto je u knjizi obradjeno neces naci nigde na netu , lepo objasnjeno i skockano i plus primer program kako se sta i kada od komandi koristi . Naravno nije samo do knjige , kupis knjigu i resena stvar , kupi neki razvojni sistem ili napravi eksperimentalno kolo iz knjige pa samno napred jer tada neces napisati ovo sto si napisao u zadnjem postu
Citat:
Evo za dva tast. i 1 led,sad dodaj dalje.Valjda ce da radi


da si nparavio ili uz sve to kupio neki razvojni sistem mogao bi sa sigurnoscu da potvrdis ispravnost programa i u tome jeste stvar da savladas maksimalno pocetne korake i budes siguran u ono sto odradis jer je proslo dosta vremena i nema mesta vise za ''valjda ce raditi ''.


[Ovu poruku je menjao Darko_zed dana 11.10.2012. u 00:23 GMT+1]
[ MILANAN @ 11.10.2012. 06:21 ] @
U proteusu ovo radi a na plocici nisam probao,ipak sam za to da bez probe nemozes biti siguran.Imam razvojni za 16f84 ali nemam pic trenutno tako da nemogu da probam.Ako nadjm adresu poslacu,ima oko tridesetak knjiga,sve objasnjeno samo sto je na engleskom ali nema veze ipak dosta pomaze
[ jmikica @ 22.10.2012. 10:04 ] @
posto mi niko ne odgovori za PBP3 (gde skinuti punu verziju)molio bih ponude na PP
pozdrav mikica
[ rsinisa @ 22.10.2012. 11:07 ] @
Ne čitaš PP, ima više od mesec dana. Doduše nisi jedini, ima još ljudi koji nisu pročitali moje PP. Valjda ne vide da imaju gore crveno polje u kome piše "Privatne poruke".

Pozdrav.
Sinisha
[ jmikica @ 24.10.2012. 15:17 ] @
izvinjavam se za ove neuspele postove,pozdrav svima.(pregledao PP)
[ Darko_zed @ 02.01.2013. 10:45 ] @
Trebao bih umanjiti broj ulaznih pinova Pic-a ,a da pritom ostane broj ulaza (senzora isti ) pa sam dosao na ideju da to realizujem nekim multiplekserom .
Znaci imam 7 senzora (granicnih prekidaca recimo) koji se trebaju povezati sa tim multiplexereom ili nekim binary to BCD convereterom jos bolja varijanta , a da pritom imam 4 izlaza .
Znaci ne bitno koja je kombinacija ukljucenja tih sedam granicnih prekidaca uvek trebam imati dati izlaz za datu ulaznu kombibaciju koji cu iscitavati sa PIC-om i tako prepoznati koji su sve granicni prekidaci aktivirani. Ovih dana sam trazio neko kolo i nisam nasao u potpunosti odgovarajuce jer mi treba recimo sedam ulaza ,a maksimalno cetiri izlaza .
Nalazio sam neka decimal to Bcd converter kola i po broju pinova ulaz-izlaz mi u potpunosti odgovaraju ali nisam siguran da mi mogu zavrsiti posao za ovo sto meni treba.
Veliki pozdrav i hvala
[ rsinisa @ 02.01.2013. 11:50 ] @
Hm, nije mi sve jasno. Ako imaš 7 prekidača, oni mogu da ostvare 128 kombinacija tako da sa 4 bita ne možeš ništa da uradiš jer već imaš 7 bitova.
Jedino ako je istovremeno uključen SAMO jedan, onda može nešto da se uradi. Ja sam pre jedno 2 godine otprilike razvio dekoder matrične tastature koji ne radi u multipleksu (zbog RF smetnji), a ima 4 izlaza, ali naravno da može da detektuje pritisak na samo 1 taster. Tačnije, zbog principa rada on može da ima više ulaznih stanja, ali je nemoguće postaviti na izlaz od 4 bita sve kombinacije itd, itd, da se ne upetljavamo u sitna crevca. Poslao sam ga jednom drugaru da ga testira, ali mislim da on to do danas nije uradio, ili mi bar nije javio da li to radi kako treba u praksi.

Evo ti dokument, pročitaj, pa ako vrši posao dobiješ jedan na testiranje.

Pozdrav.
Sinisha
[ rsinisa @ 02.01.2013. 22:30 ] @
Citat:
rsinisa:Poslao sam ga jednom drugaru da ga testira, ali mislim da on to do danas nije uradio, ili mi bar nije javio da li to radi kako treba u praksi.


Htedoh reći, radilo to kod mene na stolu bez problema, ali ne znam kako se ponaša u relanim uslovima na duže staze.
[ Darko_zed @ 03.01.2013. 11:46 ] @
Hvala Sinisa na odgovoru i ponudi , mislim da mi ovo nece zavrsiti posao jer se upravo desava da vise granicnih tastera budu pritisnuti od jednom i tu kombinaciju trebam detektovati .
Nisam se mozda najbolje izjasnio u pitanju ,a to je da sam mislio da postoji mozda kolo koje ima recimo 7 bitni ulaz pa moze i vise nije problem ,a da imam recimo digitalni izlaz(jedan ili vise) koji cu iscitavati , recimo princip kao kod digitalnog senzora DS1820 samo umesto temperature cita ulaznu kombinaciju i salje kontroleru .
Mislio sam da ima neko konvertor kolo upravo da radi na ovaj nacin i evo trazim vec par dana i nista .
Veliki pozdrav i hvala
[ pedja089 @ 03.01.2013. 12:11 ] @
A zasto jednostavno ne bi uzeo neki PISO shift registar. Odma imas 8 bita, sa shiftin citas stanja ulaza u pbp direktno u bajt.
Za ovo ti trebaju 3 pina. Tako da sa tih 4 slobodna pina, bez ikakvih zajebancija mozes citati 8 ulaza i imas jedan pin viska. Ako bi napravio svoju rutinu za citanje mozes i 16 ulaza. Napravis 2 registra sa zajednickim klokom i resetom, i posebnim ulazima za podatke. Resetujes ih, posaljes 1 klok procitas oba ulaza na kontroleru, smestis ta 2 bita u promenljive, i tako 8 puta. I imas 16 ulaza.
EDIT:
Primeri u pbp:
http://www.picbasic.co.uk/forum/showthread.php?t=14105
http://www.picbasic.co.uk/foru....php?t=287&p=5730#post5730

[Ovu poruku je menjao pedja089 dana 03.01.2013. u 13:29 GMT+1]
[ rsinisa @ 03.01.2013. 12:30 ] @
Da, tebi onda treba to što ti Pedja kaže, paralelni ulaz - serijski izlaz. Imaš taj što ti Pedja reče, a možeš da uzmeš i 74HC597.

Pozdrav.
Sinisha
[ goran_68 @ 03.01.2013. 13:46 ] @
Ako već ne može da ide MCU sa više pinova, da bi čitao stanja tih prekidača jedno od rešenja može da bude i manji PIC umesto gotovog IC. Prednost je što ga možeš fizički odvojiti, ukoliko je to potrebno, pa da ga spojiš sa glavnim MCU preko RS232 ili RS485. Možeš i da mu dodaš neke dodatne funkcije, recimo još neki digitalni izlaz ili ulaz. Mana je što moraš da pišeš softver, za koji ti istina ne treba puno vremena, ali opet mora da se uradi. Kad jednom uradiš softver imaš gotovo rešenje i za druge situacije.
[ Genie_1984 @ 03.01.2013. 15:02 ] @
Možeš i da improvizuješ DAC sa otpornicima i prekidacima pa ti je onda potreban samo jedan pin uC (ADC ulaz)
[ Darko_zed @ 03.01.2013. 21:54 ] @
Hvala ljudi na ovome i mislim da mi bas to i treba , mada sam iskreno vec poceo uveliko da prilagodjavam PCB-u Pic sa vise pinova tako da ce mi to zavrsiti posao ali cu obavezno da se pozabavim ovim sto ste mi predlozili .

Citat:
goran_68: Ako već ne može da ide MCU sa više pinova, da bi čitao stanja tih prekidača jedno od rešenja može da bude i manji PIC umesto gotovog IC. Prednost je što ga možeš fizički odvojiti, ukoliko je to potrebno, pa da ga spojiš sa glavnim MCU preko RS232 ili RS485. Možeš i da mu dodaš neke dodatne funkcije, recimo još neki digitalni izlaz ili ulaz. Mana je što moraš da pišeš softver, za koji ti istina ne treba puno vremena, ali opet mora da se uradi. Kad jednom uradiš softver imaš gotovo rešenje i za druge situacije.


Gorane veruj mi da sam i na to razmisljao ali bi mi to bio veci posao nego da uglavim jedan veci PIC sa vise pinova i manje je mogucnosti da zabrljavi u radu jer su u blizini releji koji sigurno prave smetnje prilikom varnicenja kontakta .

Citat:
Genie_1984: Možeš i da improvizuješ DAC sa otpornicima i prekidacima pa ti je onda potreban samo jedan pin uC (ADC ulaz)


Ovo sam vec davno experimentisao kada sam kacio na 12F675 tastaturu ovako odradjenu i na svakoj tipki je bio drugi otpornik i mogu ti reci da radi bez greske , ali je problem sto se to ne moze primeniti u mom slucaju kako god da okrenes .

Veliki pozdrav i hvala na pomoci
[ goran_68 @ 03.01.2013. 22:03 ] @
Kad u tutorijalu koji pišem za C i PIC16F1827 dođem do serijskog porta odradiću jedan primer za ovo.
[ Darko_zed @ 21.02.2013. 18:58 ] @
Koje je najbolje hardversko resenje za ulaz mikrokontrolera da bi smanjio smetnje sa tastera ili mikroprekidaca sa kojih dobija signal .
Hteo bih da isprobam varijantu bez softverskog resenja , znam da ima vise semica ali me interesuje koja je isprobana i pouzdana u praksi mada iskreno ne mogu ni te neke koje sam imao da nadjem jer sam vecinom softverski resavao .
Pozdrav
[ shpiki @ 21.02.2013. 19:36 ] @
http://www.ganssle.com/debouncing-pt2.htm
[ bogdan.kecman @ 21.02.2013. 20:25 ] @
schmidt + rc sa diodicom radi do dzadza
schmidt sam za sebe - radi upotrebljivo (ja cesto idem samo sa ovim)
samo rc ume mnogo da ne radi
[ goran_68 @ 21.02.2013. 21:01 ] @
Obrati pažnju da pojedini pinovi kod PIC-a već imaju Schmitt Trigger Input tako da možeš i to koristiti. Ništa te ne sprečava da koristiš istovremeno oba rešenja. Još i bolje.
[ Darko_zed @ 22.02.2013. 15:33 ] @
Sta reci vise nego veliko hvala svima .
Pogledao sam link sto je @spiki postavio i odradicu po njemu i to za jednopolni taster sa shmid triger-om i stavicu diodu kao sto Bogdan rece i verujem da ce raditi extra .
Gorane hvala na savetu takodje , uradicu kao sto kazes nije na odmet da budu oba resenja u funkciji .

Veliki pozdrav
[ MILANAN @ 17.06.2013. 15:18 ] @
Pozdrav svima i ako moze mala pomoc.Da ne opisujem ceo uredjaj koji sam pravio (predugacko je) samo cu ukratko sta mi treba.Kad na rb0 dodje log1 upali se led na rb3 , log1 na rb0 traje 60sek i izgubi se log1 a na rb3 idalje svetli led sve dok na rb2 ne dodje log1 i onda se led gasi,pa ide pauza od 2min i ponovo se ceka log1 u trajanju od 2min na rb0 i sve u krug.To mi sve radi,meni samo treba da tu ubacim da ako log1 na rb0 traje duze od 2min da se NE ukljuci led na rb3.Nebitno je desetak sek gore dole
Log1 dolazi iz nekog uredjaja i zato traje 2min a to nemogu da promenim
Pic je 16f84a,nemogu da postavim sada kako sam pisao prog jer pisem sposla
[ rsinisa @ 17.06.2013. 21:41 ] @
Na koji način meriš vreme?

Pozdrav.
Sinisha
[ MILANAN @ 18.06.2013. 11:58 ] @
Nism merio vreme,log1 dolaci iz nekog plc-a i zato trje 60sek ,moglo bi da traje i jednu sek. nebitno jer kas se pojavi upali se led na rb3 i kad se izgubi posle 60sek rb3 ostaje ukljucen dok na rb2 ne dodje log1.To mi sve radi vec desetak dana,ja sam samo hteo da se ubaci deo koji ce ako log1 na rb0 traje duze od 60sek (na pr 70sek) da se na rb3 ne pojavi log1
U pitanju je neki plc (iz kog dolazi log1 60sek) na koji neradi displej i ako neko nesto ispritiska po njemu napamet moze da napravi problem a desetak sek gore dole nisu bitne za log1 iz plc-a.Postavicu popodne to sto sam napisao a pisao sam tako da na rb0 uvek dolazi 5v pa kad se iz plc-a pojavi taj napon u trajanju od 60sek on dolazi na bazu tranzistora koji provede i onih 5v koji su od pocetka dolazili na rb0 odvede na masu,tj pic vidi log0 u trajanju od 60sek.Postavicu popdne sad sam na poso a sinoc sam kasno dosao kuci pa nisam stigao da postavim.
Vreme log1 iz plc-a nije bitno,moze da traje i jednu sek log1 ali da ne predje na pr 100sek
[ MILANAN @ 18.06.2013. 13:14 ] @
trisb = %00000011
portb = %00000000

while 1 = 1
while portb.0 = 1
pause 30
wend

portb.3 = ~portb.3


while portb.1 = 1
pause 5000
wend
portb.3 = ~portb.3
sleep 120
wend

Evo programa
[ rsinisa @ 18.06.2013. 13:53 ] @
Ima tu 3 stvari koje mi nešto "ne pasuju" u svemu ovome:
1. U tvojoj priči ima nekih nelogičnost što se tiče zahteva.
2. Tvoja priča i program se ne podudaraju za nešto sitno.
3. Program mi se ne svidja baš, ja bih to malo drugačije odradio.

Sad je kraj radnog vremena, vreme da se ide, razradiću ti sve tačke kad stignem kući.

Pozdrav.
Sinisha
[ rsinisa @ 18.06.2013. 15:40 ] @
Citat:
rsinisa:
Ima tu 3 stvari koje mi nešto "ne pasuju" u svemu ovome:
1. U tvojoj priči ima nekih nelogičnost što se tiče zahteva.

Prvo kažeš da treba da se upali LED ako dodje log. 1 na RB0, a malo kasnije kažeš da LED ne treba da se uključi ako je log. 1 na RB0 duži od 2 minuta. Hm, po tome sledi da prvo mora da se premeri dužina impusla pa tek onda da se odluči da li paliti LED ili ne.

Citat:
2. Tvoja priča i program se ne podudaraju za nešto sitno.

U poruci kažeš da se LED gasi kada na RB2 dodje 1, a u programu se proverava stanje na RB1. Verovatno je greška u poruci.

Citat:
3. Program mi se ne svidja baš, ja bih to malo drugačije odradio.

Kao prvo, ne razumem čemu pauze od 30 ms i 5 s? Programu je svejedno da li se vrti u mrtvoj petlji ili proverava stalno stanje na pinu.
Drugo, ne svidja mi se što radiš negaciju stanja na RB3, bolje bi bilo da postaviš fiksno stanje jer nikad se ne zna da li će neka smetnja, opterećenje ili nešto treće da promeni očitavanje stanja na pinu.

Daj prvo da vidimo šta je tačno zahtev, tj. razreši ovo sa zahtevom od 2 minuta iz tačke 1. pa ćemo da vidimo dalje.

Pozdrav.
Sinisha

[ MILANAN @ 18.06.2013. 16:46 ] @
>>Prvo kažeš da treba da se upali LED ako dodje log. 1 na RB0, a malo kasnije kažeš da LED ne treba da se uključi ako je log. 1 na RB0 duži od 2 minuta. Hm, po tome sledi da prvo mora da se premeri dužina impusla pa tek onda da se odluči da li paliti LED ili ne <<

-ovako:led na rb3 se ukljuci cim se na rb0 pojavi log1.ona traje 60sec pa se iskljuci a rb3 i dalje sverli i dok ima lod1 od 60sec i kad nestane log 1 od 60sec rb3 i dalje svetli.

>>U poruci kažeš da se LED gasi kada na RB2 dodje 1, a u programu se proverava stanje na RB1. Verovatno je greška u poruci.<<
-jeste greska u poruci.u pitanju je rb1


>>Kao prvo, ne razumem čemu pauze od 30 ms i 5 s? Programu je svejedno da li se vrti u mrtvoj petlji ili proverava stalno stanje na pinu.
Drugo, ne svidja mi se što radiš negaciju stanja na RB3, bolje bi bilo da postaviš fiksno stanje jer nikad se ne zna da li će neka smetnja, opterećenje ili nešto treće da promeni očitavanje stanja na pinu.<<

Pauzu 30ms sam stavio da se odmah ukljuci a 5sek pauzu jer toliko vreme prolazi magnet preko ridreleja.Ovo za negaciju sam stavio jer iskreno neumem drugacije.
Iz nekog plc-a se pojavljuje taj log1 od 60sec a bilo bi dovoljno da se log1 pojavi i jednu sekundu i da se ukljuci rb3.E sad posto je stvar takva da na tom plc-u ne moze nista da se uradi onda mora da se pojavljuje log1 u trajanju 60sec.
-pojavi se log1 na rb0 i odmah se pali led na rb3 -na rb0 idalje ima log1 od 60sec,pa nestane log1 sa rb0 a rb3 idalje svetli sve dok na rb1 ne dodje log1 i onda se gasi rb3 pa za 2min opet dolazi log1 od 60sec na rb0.Meni samo treba iz bezbedonosnih razloga da ako zezne taj fabricki plc i ostane trajno log1 iz njega na rb0,tj ako se to desi da se onda na rb3 ne pojavi log1. Znaci dodje log1 na rb0,ostane duze od 60sec i sve se gasi.Mose da ostane i 70sec ili 80sec ali ne vise.
--Postavicu popodne to sto sam napisao a pisao sam tako da na rb0 uvek dolazi 5v pa kad se iz plc-a pojavi taj napon u trajanju od 60sek on dolazi na bazu tranzistora koji provede i onih 5v koji su od pocetka dolazili na rb0 odvede na masu,tj pic vidi log0 u trajanju od 60sek.Postavicu popdne sad sam na poso a sinoc sam kasno dosao kuci pa nisam stigao da postavim.--


Sinisa ako nisam dovoljno jasan tj ako me ne razumes nemoj uopste da se mucis,hvala ti na svemu u savkom slucaju jer i previse si mi pomogao do sada.

[ rsinisa @ 18.06.2013. 20:45 ] @
Citat:
MILANAN:
-pojavi se log1 na rb0 i odmah se pali led na rb3
-na rb0 idalje ima log1 od 60sec,pa nestane log1 sa rb0 a rb3 idalje svetli sve dok na rb1 ne dodje log1 i onda se gasi rb3 pa za 2min opet dolazi log1 od 60sec na rb0.
Meni samo treba iz bezbedonosnih razloga da ako zezne taj fabricki plc i ostane trajno log1 iz njega na rb0,tj ako se to desi da se onda na rb3 ne pojavi log1. Znaci dodje log1 na rb0,ostane duze od 60sec i sve se gasi.Mose da ostane i 70sec ili 80sec ali ne vise.


OK, sad je jasno, nisi bio dovoljno jasan u prvoj poruci. Sad mi još samo reci da li se na RB1 pojavi log. 1 i u slučaju da stanje na RB0 ostane trajno, odnosno duže od 80 sekundi, na log1? Ili stanje na RB1 nikada ne dodje na 1 ako RB0 ostane duže od 80 sekundi na 1?

Pozdrav.
Sinisha

[ MILANAN @ 18.06.2013. 21:33 ] @
Log1 mora da dodje na rb1 jer dolazi iz senzora (nezavisno)e sad sustina je da ako na rb0 ostane log1 duze od na pr 70sec onda da se ne ukljuci led na rb3 kad na rb1 odje log1
[ rsinisa @ 18.06.2013. 22:45 ] @
Vidi, ne može da se ne uključi LED, ali može da se isključi ako je signal duži od 80 sekundi, i može da se nikada više ne uključi LED dok RB0 ponovo ne padne na 0 pa ode na 1. Ili dok se ručno ne resetuje PIC, kako tebi pasuje.
Ajde videću sutra da ti nešto napišem na brzinu, sad nemam vremena.

Pozdrav.
Sinisha
[ MILANAN @ 19.06.2013. 07:33 ] @
>>Vidi, ne može da se ne uključi LED, ali može da se isključi ako je signal duži od 80 sekundi, i može da se nikada više ne uključi LED dok RB0 ponovo ne padne na 0 pa ode na 1. Ili dok se ručno ne resetuje PIC<<

Odlicno,bolje da se nikad ne ukljuci dok se rucno ne resetuje pic ali to kad imate vremena,nije toliko hitno.Ja sam pokusavao nesto sam ali neide
[ rsinisa @ 19.06.2013. 13:18 ] @
Evo ti nešto na brzinu, trebalo bi da ti radi posao, ali se u ovom programu ne proverava da li se RB1 vratio na 0, mada to i ne postoji u tvojim zahtevima.

Code:
#CONFIG
    __config _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON
#ENDCONFIG

brojac    var byte

    trisb=%00000011
    
pocetak:
    portb.3=0
    brojac=0
cekajrb0:
    if portb.0=0 then cekajrb0
    portb.3=1
cekajrb1:
    pause 1000
    brojac=brojac + 1
    if brojac > 75 then kraj u
    if portb.1=0 then cekajrb1    
    portb.3=0
    if portb.0=1 then cekajrb1    
    goto pocetak
kraj:
    portb.3=0
    goto kraj    
end


Princip je jednostavan, postoji pauza od 1 sekunde izmedju 2 provere tako da će LED da se isključi maksimalno jednu sekundu nakon što se na RB1 pojavi log 1. Ako ti je to velika rezolucija, smanji pauzu recimo na 10 ms i promeni tip promenljive "brojac" na word. Naravno, ako smanjiš pauzu na 10 ms, onda 75 u if treba da promeniš na 7500.
Na ovaj način vreme neće biti tačno 75 sekundi, biće nešto malko veće, par ms možda, ali tebi to ionako nije bitno pa nećemo da uvodimo TMR0 i interapt u igru.
  Pozdrav.
Sinisha
[ MILANAN @ 21.06.2013. 10:46 ] @
Hvala Sinisa.Tek sad sam stigao da vidim poruku i ujedno da vam se zahvalim pa za neki dan da seve to "ispovezem"
[ MILANAN @ 07.07.2013. 20:40 ] @
Pozdrav.Da ne duzim pisao sm program ovako i radi kako ja hocu pa mi je palo napamet da probam sa repeat i until i imam jednu nejasnocu tj zasto se ukljucuje tek posle oko 30 sekundi a mislio sam da bi trebalo za 5 sec da se ukljuci rb1 ?


TRISB=%00000000
PORTB=%00000000
BROJAC VAR BYTE
POCETAK:
REPEAT
BROJAC=BROJAC+1
PAUSE 1000
UNTIL BROJAC=5
PORTB.1=1
GOTO POCETAK:


dok verzija ovako radi super na 20sec

brojac var byte

TRISB = %0000001
portb=%00000000
brojac=0

Pocetak:

if portb.0=0 then



brojac=brojac+1
pause 1000
if brojac=20 then
portb.4=1
pause 2000
portb.4=0
pause 2000
brojac=0
endif
endif

Goto Pocetak:



[ MILANAN @ 07.07.2013. 20:43 ] @
Izvinjavam se na glupom pitanju video sam sta je problem ali mi je promaklo u brzini
[ MILANAN @ 21.08.2013. 19:06 ] @
Hteo sam nesto da uradim sa PWM signalom (nista previse precizno) ali neide.Na pr. ovako je uredu
PWM portb.1,50,100 a hteo bih da napisem da moze da se menja i probao sam ovako ali neide

IF portb.0=0 THEN
PWM portb.2,50,100
IF portb.1=0 THEN
PWM portb.2,100,100
,
,
i td ali neide.
Moze li nekako na ovaj nacin da se napise da menja sirinu inpulsa? i ujedno ima li neka literatura na srpskom gde se moze procitati o upotrebi TMR0 , 1 , 2 i ostalog vezano za taimere i pwm signal za 16f877a
[ yt1nvs @ 21.08.2013. 19:52 ] @
taj PIC ima HPWM pa je mnogo bolje koristiti taj modul.

http://www.micro-examples.com/...ig/doc/097-pwm-calculator.html

jeste da je za C jezik ali podesavanje je isto i za basic.

a u tvom prg. valjda hvali endif za te IF naredbe.

a imas i narebu HPWM

[Ovu poruku je menjao yt1nvs dana 21.08.2013. u 21:03 GMT+1]
[ MILANAN @ 21.08.2013. 20:21 ] @
Stavio sam ENDIF samo sto ovde nisam napisao.Dobar calc hvala ti na ovom
[ MILANAN @ 05.10.2013. 19:36 ] @
Pozdrav.Probao sam da napravim brojac inpulsa sa prikazom na lcd i iako sam se nadao da ce da mi proradi iz prve ipak neide.Radi se o brojacu koji kad stisnem i pustim taster na displeju pojavi 1,kad stisnem i pustim taster drugi put da se pojavi broj 2 i td.Probao sam u proteusu sa ovim primerom i na jos nekoliko nacina i samo mi broji sam od sebe od 1 pa nadalje pa ako moze mala pomoc kako to da uredim

TRISB = %00000010
PORTA = %11111111
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 3
DEFINE LCD_LINES 2
pause 100 'cekanje inicijalizacije displeja
BROJ VAR WORD
BROJ=0
pause 500
lcdout $FE, 1
POCETAK:
IF PORTA.0=0 THEN
BROJ =BROJ+1
GOTO LCD
ENDIF
lcd:
lcdout $FE, $80, "BROJ =", dec broj ;

GOTO POCETAK:
END
[ veselinovic @ 05.10.2013. 19:48 ] @
Ispred linije broj=broj+1 stavis

petlje : if PORTA.0=0 then petlja

Inace se program da urediti, ovako je nepregledan.
I da, na port a.0 trebas staviti pulup otpornik.
[ MILANAN @ 05.10.2013. 20:02 ] @
Sema je uredu samo sto program nikako da proradi.Cim se pusti iz proteusa pocinje sam da broji od 1 pa nadalje
[ ZAS011 @ 05.10.2013. 20:06 ] @
Nemas nigde cekanje na otpustanje tastera tako da ce tvoja promenljiva Broj veoma brzo da rpetrči 65535

Code:
TRISB = %00000010
PORTA = %11111111
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 3
DEFINE LCD_LINES 2

pause 100 'cekanje inicijalizacije displeja
BROJ VAR WORD
BROJ=0
lcdout $FE, 1

POCETAK:
IF PORTA.0=0 THEN
    BROJ =BROJ+1
    lcdout $FE, $80, "BROJ =", dec broj
ENDIF

CekajOtpustanje:
if porta.0 = 0 then
    pause 50
    if porta.0 = 0 then ; i dalje je taster pritisnut?
        goto CekajOtpustanje
    endif
endif
GOTO POCETAK:
END
[ MILANAN @ 05.10.2013. 20:56 ] @
Hvala ZASO,za otpustanje tastera se nisam setio samo sad mi na displeju stoji samo broj 1 Za svaki slucaj da napisem,stavio sam da 5v idu preko R1k na RA0 a RA0 preko tastera na masu,kad se stisne taster RA0 je log0.Sad stoji br 1 na displeju bez obzira da li se pritiska taster ili ne.
[ ZAS011 @ 05.10.2013. 21:55 ] @
Code:
GOTO POCETAK:


treba da bude

Code:
GOTO POCETAK


bez dvotačke na kraju. jbg i ja napravih previd (mada ne trošim PBP već PDS a to bi kompajler već safat'o k'o grešku)
[ MILANAN @ 05.10.2013. 22:34 ] @
Opet isto stoji 1 na displeju.Jasno mi je zasto broji od 1 pa nadalje ali mi nije jasno po onome sto sam ja napisao zasto pocinje da broji i dok je porta na log1? trebalo bi da pocne sa izvrsenjem tek kad se stisne tester i porta bude na log0
[ ZAS011 @ 06.10.2013. 09:22 ] @
Pošto trošiš PBP, napiši samo koji je PIConja u pitanju.
Za simulacije bih ti preporučio neki razvojni sistem ili hardver koji ćeš sam da napraviš, simulatori znaju i da ne rade baš najbolje
[ MILANAN @ 06.10.2013. 11:01 ] @
Za ovo sto pravim uzeo sam 16f84a jer njega imam a i za brojac je dovoljan.Radim sa 16f877a jer njega sam "razgazio" skoro u detalje nekih 80% pa spremam kintu za razvojni sistem ali da bude maximalno kompletan,naravno prihvatam svaki savet u vezi toga.Inace desavalo mi se da nesto neradi u proteusu a ovako radi,na pr. adc sa 16f877a konktetno voltmetar.
[ ZAS011 @ 06.10.2013. 12:17 ] @
Paz' 'vako, 16F84A imam i ja, jedno 5-6 komada i ne koristim ih nizašta drugo osim za skupljanje prašine i zauzimanje mesta u klaseru.
Za sve neke sitne stvari koristim 628A, jevtiniji od 84A i to osetno.
Umesto da "razgazuješ" 16F877A, uzmi 16F887, takođe je jevtiniji, ima i interni oscilator, ...

Razvojni sistem imaš kod MikroElektronike, košta 99 € + PDV + poštarina, vredi SVAKU PARU.

Sve u svemu, zaboravi na kojekakve simulatore, samo mogu da ti zagorčaju život i da izazovu neviđene frustracije.
[ mikikg @ 06.10.2013. 12:23 ] @
Hehe, tako isto ja mogu da kazem i za neke druge procesore umesto 16F887, recimo dsPIC33EP128MC502, kosta 1$ vise a ima 10x vise memorije, 16bit jezgro, cudo od dodatnih periferija a isto kuciste kao spomenuti 16F887 :)
[ MILANAN @ 06.10.2013. 12:27 ] @
Nisam ni ja kupio 16f84a,imam od ranije neke stvari sa kojima sam se igrao pa sad odatle imam jos 3kom 16f84a a ovaj brojac mi stvarno treba pa ajde da iskoristim,sad mi dodju kao poklonjeni
[ ZAS011 @ 06.10.2013. 13:15 ] @
Miki,
ti, verovatno, primećuješ da Milan koristi BASIC
Osim mikroelektronike, nisam siguran da ima još BASIC slengova drugih proizvođača kompajlera. PDS: jok, za Swordfish nisam siguran, PBP: jok, ...
DSP su lepe i zgodne stvarčice, al' ponekad za quick'n'dirty 8-mo bitna boranija završava pos'o uz manje glavobolje oko konfigurisanja.
[ rsinisa @ 06.10.2013. 17:17 ] @
Kreni da čitaš odavde:
http://www.elitesecurity.org/p3324893

Malo sam zastao sa pisanijom zbog nedostatka vremena, ali vrlo brzo nastavljam sa tekstovima, nemaš tu baš sve, ali za koji dan (nadam se) će biti gotov deo o obradi tastera.

Pozdrav.
Sinisha
[ MILANAN @ 07.10.2013. 13:11 ] @
rsinisa

Pisao sam i tako i problem je sto meni nije jasno zasto pocinje da broji dok jos nije pritisnut taster.
IF PORTA.0=0 THEN
BROJ=BROJ+1
ENDIF
Znaci brojenje bi trebalo da pocne kad porta bude log0 a meni brojenje pocinje odmah dok je porta log1 i to ispisuje na displeju pocevsi od 1 pa nadalje.A bio sam siguran da ce da mi proradi iz prve, j....a zeznuo sam se.
[ MILANAN @ 09.01.2014. 14:25 ] @
Pozdrav svima.Ima li neko neki primer (gotov kod ili adresu gde se moze naci) kako u picbasic-u napisati program za 16f887 koji daje pwm za most ili polumost i pritom da tu bude odredjeno dead time vreme.NIje mi problem za jedan pwm ali ne znam kako sve to napisati gde idu dva pwm (na pr polumost) i pritom dt vreme.Ako nema nista od primera zmolio bih bar za neko kratko objasnjenje.
[ rasoboy @ 07.02.2014. 12:39 ] @
[quote]Sepa011:
Ako malo bolje analiziras ceo program
Code:
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* Universal thermostat -25/+75 C.  by R.T.G. van Steenis                  *
'* Compiler : PicBasic Pro 2.45                                            *
'* B0 = Mode switch in (In)            A0 = LCD Enable    (Out)            *
'* B1 = + switch in    (In)            A1 = LCD RS        (Out)            *
'* B2 = - switch in    (In)            A2 = "Warm" Output (Out)            *
'* B3 = Not connected  (Out)           A3 = "Cold" Output (Out)            *
'* B4 = LCD Bit 4      (Out)           A4 = DQ DS1820     (In)             *
'* B5 = LCD Bit 5      (Out)                                               *
'* B6 = LCD Bit 6      (Out)                                               *
'* B7 = LCD Bit 7      (Out            PIC16F628 Code size = 1124 Words    *
'*                                                                         * 
'* Oscillator XP (4 MHz.) - Power up timer enabled - MCR enable            *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

TRISA= %11110000                        ' RA0..3=Outputs RA4=Input
TRISB= %00000111             ' RB0..RB2=Inputs, RB3..RB7=Outputs
CMCON=7                                 ' Disable comparators

DEFINE LCD_DREG PORTB                   ' LCD on port B
DEFINE LCD_DBIT 4                       ' Data bits B4..B7
DEFINE LCD_RSREG PORTA                  ' RS on PORTA
DEFINE LCD_RSBIT 1                      ' RS on A1 
DEFINE LCD_EREG PORTA                   ' E on PORTA
DEFINE LCD_EBIT 0                       ' E on A0
DEFINE LCD_BITS 4                       ' LCD 4 bit mode
DEFINE LCD_LINES 2                      ' 2 line LCD display

Temperature     Var    Word        ' Temperature storage
TargetTemp    Var    Word        ' Desired Temperature
Hyst        Var    Word        ' Hystereris
V        Var    Word        ' Var. for display
B1              Var     Byte            ' Byte for TargetTemp calculation 
B2              Var     Byte            ' Byte for TargetTemp calculation
Count_Remain     Var     Byte        ' Count remaining
Count_Per_C     Var    Byte        ' Count per degree C
Sign        Var    Byte        ' +/- sign
Mode         Var    Byte        ' 0=Temp. display, 1=Set Temp, 2=Set Hysteresis
DQ        Var    PORTA.4        ' One-wire data pin

DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10

PORTA.2=0                               ' Warm Output Low
PORTA.3=0                               ' Cold Output Low
Mode=0                                  ' Temperature display mode  

LCDOUT $FE, 1, $FE, $0C                 ' Clear display, cursor off

Read 0, B1                              ' Read TargetTemp MSB
Read 1, B2                              ' Read TargetTemp LSB
TargetTemp=B1*256+B2                    ' Calculate TargetTemp value (Default=20.0 C.)
Read 2, B1                              ' Read Hysteresis 
Hyst=10*B1                              ' Calculate Hysteresis value (Default= 2.0 C.)  

MainLoop: 
 If PORTB.0=0 then                      ' Mode switch pressed
  Pause 50                              ' Debounce 
  LcdOut $FE, $8F, "*"                  ' Show that command is accepted 
  If PORTB.0=0 then MainLoop            ' Wait until button is released  
  Mode=Mode+1                           ' Increment mode
  If Mode=2 then                        ' Save Target Temperature (Mode1 -> Mode2)
   Write 0, TargetTemp / 256        ' TargetTemp MSB
   Write 1, TargetTemp MOD 256          ' TargetTemp LSB
  EndIf
  If Mode > 2 Then                      ' Save Hysteresis (Mode 2 -> Mode 0) 
   Mode=0                       ' Only 0, 1, 2 are valid
   Write 2, Hyst / 10                   ' Divide Hyst value to fit in Byte
  EndIf
 EndIf

 If Mode =1 then                        ' Set Target Temperature
  LcdOut $FE, $80, "SET TEMPERATURE "   ' Show function
  V=TargetTemp                          ' TargetTemp in V  
  Gosub SelectSign                      ' Select +/blank/- 
  Gosub DisplayTemp                     ' Display Target Temperature
  If (PORTB.1=0) Or (PORTB.2=0) then    ' Up or Down button pushed
   If PORTB.2=0 then                    ' Down button 
    If TargetTemp > 7500 then           ' Not lower than -25 C. (10000-MinTemp * 100)
     TargetTemp=TargetTemp-25           ' Decrease temperuture with 0.25 C.
    EndIf
   EndIf
   If PORTB.1=0 then                    ' Up button
    If TargetTemp < 17500 then          ' Not higher than 75 C. (10000+MaxTemp * 100)
     TargetTemp=TargetTemp+25           ' Increase temperature with 0.25 C.
    EndIf
   EndIf
   GoSub SetTargetTemp                  ' Display TargetTemp and delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode=2 then                         ' Set Hysteresis    
  LcdOut $FE, $80, "HYSTERESIS      "   ' Show function
  Sign=" "                              ' No sign  
  V= 10000+Hyst                         ' Set value for V  
  Gosub DisplayTemp                     ' Display Hysteresis
  If (PORTB.1=0) Or (PORTB.2=0) then    ' Up or down button pushed  
   Sign=" "                             ' No sign for Hysteresis
   If PORTB.2=0 then                    ' Down button
    If Hyst > 10 then Hyst=Hyst-10      ' Not less than 0.1 C.
   EndIf
   If PORTB.1=0 then                    ' Up button
    If Hyst < 1000 then Hyst=Hyst+10    ' Not more than 10.0 C.
   EndIf 
   V= 10000+Hyst                        ' Set value for V
   Gosub DisplayTemp                    ' Display Hysteresis 
   Pause 250                            ' Delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode > 0 then Mainloop              ' Setting TargetTemperature or Hysteresis

 LcdOut $FE, $80, "TEMPERATURE     "    ' Show function

 Output DQ                         ' Make Pin Output
 DQ=0                    ' OneWire line Low
 PauseUs 480                            ' Keep down for 480 µS  
 Input DQ                               ' Make Pin Input
 PauseUs 70                             ' Wait 70 µS
 If DQ=1 then                           ' No presence pulse from DS1820   
  LcdOut $FE, $1, "** No sensor! **"    ' Show message
  Pause 500                             ' Wait 0.5 Sec. 
  Goto MainLoop                         ' Check again
 EndIf

 OWOut DQ, 1, [$CC, $44]               ' Start temperature conversion
WaitLoop: OWIn DQ, 4, [Count_Remain]    ' Check for still busy converting
 If Count_Remain = 0 Then WaitLoop      ' Busy 
 OWOut DQ, 1, [$CC, $BE]        ' Read the temperature
 OWIn DQ, 0, [Temperature.LowByte, Temperature.HighByte, Skip 4, Count_Remain, Count_Per_C]
 Temperature = (((Temperature >> 1) * 100) - 25) + (((Count_Per_C - Count_Remain) * 100) / Count_Per_C)
 if Temperature > 32767 then
  Temperature= ~Temperature
  V= 10000 - Temperature                ' 25 C=12500  0 C=10000  -10 C=9000 
 else
  V= 10000 + Temperature
 EndIf

 If V < TargetTemp - Hyst then          ' Below Target temperature - Hysteresis
  PORTA.2=1                             ' Activate   Warm Output
  PORTA.3=0                             ' Deactivate Cold Output
 EndIf

 If V > TargetTemp + Hyst then          ' Above Target temperature + Hysteresis
  PORTA.2=0                             ' Deactivate Warm output
  PORTA.3=1                             ' Activate   Cold Output
 EndIf

 GoSub SelectSign                       ' +/blank/- Sign 
 GoSub DisplayTemp                      ' Temperature to LCD

Goto MainLoop                ' Do it forever

' SUBROUTINES:
'----------------------------------------
SelectSign:
 If v = 10000 then                      ' Temperature = 0 C.
  Sign=" "                 ' No sign
 Else 
  If v < 10000 then                  ' <> 0
   Sign="-"                ' Temperature below 0 C.     
  Else
   Sign="+"                ' Temperature above 0 C.
  EndIf
 EndIf
Return

'----------------------------------------
DisplayTemp:
 If V >= 10000 then                     ' Above 0 C.      
  Temperature=V-10000                   
 Else                                   
  Temperature=10000-V                   ' Below 0 C. 
 EndIf
 LcdOut $FE, $C0, Sign, DEC (Temperature / 100), ".", DEC2 Temperature, " ",223,"C "
Return

'-----------------------------------------
SetTargetTemp:
 V=TargetTemp
 Gosub SelectSign
 Gosub DisplayTemp 
 Pause 250
Return

'-----------------------------------------


Pozdrav svima.
Interesuje me kako iz gore navedenog koda mogu dobiti temperaturu za prikaz na 7 segmentnom displeju.
npr. var1=dig 1 temperatura
odnosno da razdvojim cifre za prikaz na 7seg displeju
[ ZAS011 @ 07.02.2014. 12:50 ] @
Zavisi kako povezuješ 7-segmentne. Da li u multipleksu ili preko 74HC595
Ako je u multipleksu, prvo dobro prouči tajmerske interapte, trebaće ti.
Inače, ovo što si citirao nije moj program (Sepa011 = ZAS011 ), ja ne koristim PBP već Proton+, al' to je jako slično.
[ rasoboy @ 07.02.2014. 12:59 ] @
Slao bi na 74hc595,samo cijeli broj.Decimala mi nije bitna.Pokusavao sam i u Protonu slicno je to sve
[ rasoboy @ 08.02.2014. 15:02 ] @
Sve je ok,isis simulator mi je brljao
digit1=(Temperature / 100) dig 0
digit2=(Temperature / 100) dig 1
[ MILANAN @ 10.05.2014. 20:02 ] @
Pozdrav.Hteo bih u ovom kodu da ubacim da se na porta.1 neprestano pojavljuju 100Hz a ostalo-mernje frekvencije da radi nezavisno od toga.Ako to moze kako i gde da ubacim u ovom kodu ?



TRISB = %00000010
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 3
DEFINE LCD_LINES 2
pause 100
BROJ VAR WORD
pause 500
lcdout $FE, 1
POCETAK:
COUNT PORTB.1,1000,BROJ '
lcdout $FE, $80, "COUNT=", dec broj ;
pause 10
GOTO POCETAK:
[ weldinger @ 17.08.2014. 22:00 ] @
Ako mogu da pitam u ovoj temi, radim uspesno sa LCD displejom 2x16 ili 4x16 ali mi je sad potrebno da upotrebim graficki displej.Da li PIC Basic podrzava rad sa grafickim modulima, da li je neko radio slicno?
[ Pioneer cdj 200 @ 11.09.2014. 16:07 ] @
Nadam se da nisam pogriješio temu: programiram PIC18F4680 u Basicu i koristim Proton. U njegovom helpu sam našao ERead i EWrite za čitanje/pisanje po EEPROM-u (internom). Međutim ni jedan ni drugi ne rade. Probao sam u Pickitu izmjeniti neke lokacije u EEPROMU i onda pisati i to se uspiješno upiše međutim ni to ne mogu pročitati u kodu. Kako da koristim EEPROM?
[ ZAS011 @ 11.09.2014. 16:45 ] @
Kako ti izgleda deo koda iz koga ne možeš da pročitaš sadržaj EEPROM-a?

Code:

Device 18F4680
Xtal ...

Podešavanje konfiguracionih bitova



Dim Promenljiva As Byte
.
.
.
.
Promenljiva = ERead adresa
.
.
.
.
End
[ Pioneer cdj 200 @ 11.09.2014. 19:16 ] @
Code:
Bass=ERead 0
Mid=ERead 1
Treble=ERead 2
BassBoost=ERead 3
InputCH=ERead 4


Sve varijable su BYTE, osim BassBoost koja je BIT jer samo označava OFF ili ON. U pitanju je audio pojačalo sa digitalnim upravljanjem bojom zvuka, pri svakoj promjeni neke vrijednosti (ulaz, equalizer, volume) trebam pospremiti vrijednosti u EEPROM tako da kad se uređaj isključi i ponovno isključi da zadrži sve. I onda prilikom paljenja, kod inicijalizacije imam ovaj gore kod dakle vadim sve iz memorije u varijable i šaljem to audio procesoru. Probao sam u PicKitu modificirati EEPROM, stavit neku vrijednost u prvih 8 bita koja odgovara nekoj jačini basa, i kad okinem Write i onda Read, PicKit pokaže da se taj podatak nalazi u EEPROM-u ali program ga ne učita, odnosno varijabla Bass i dalje ima staru vrijednost.

Za spremanje sam napravio ovako:

Code:

StoreData:
     EWrite 0 , [ Bass , Treble, BassBoost, InputCH ]
Return


I taj se potprogram poziva kod svake promjene neke vrijednosti (recimo kad okrenem rotary encoder za volume), nakon što se promjenila vrijednost. U helpu stoji ovako:

Code:

Example

 DEVICE 16F628   ' A PICmicro with on-board eeprom 
 DIM VAR1 as BYTE 
 DIM WRD1 as WORD 
 DIM Address as BYTE 
 VAR1 = 200 
 WRD1= 2456 
 Address = 0    ' Point to address 0 within the eeprom 
 EWRITE Address , [ WRD , VAR1 ] ' Write a 16-bit then an 8-bit value 
 


EDIT: Čudo je proradilo Valjda je bilo pogrešno što sam više varijabla odjednom spremao i valjda je bila greška u zarezu odnosno razmaku oko zareza.

[Ovu poruku je menjao Pioneer cdj 200 dana 11.09.2014. u 23:03 GMT+1]
[ ZAS011 @ 11.09.2014. 22:19 ] @
Posle svakog upisa u EEPROM, dodaj malu pauzu od 10ms i proveri konfiguracione bitove tog kontrolera, kako si ih postavio.

Code:
; IMPORTANT: For the PIC18 devices, the __CONFIG directive has been
; superseded by the CONFIG directive.  The following settings
; are available for this device.
; Oscillator Selection bits:
OSC=LP        ; LP oscillator
OSC=XT        ; XT oscillator
OSC=HS        ; HS oscillator
OSC=RC        ; External RC oscillator, CLKO function on RA6
OSC=EC        ; EC oscillator, CLKO function on RA6
OSC=ECIO        ; EC oscillator, port function on RA6
OSC=HSPLL        ; HS oscillator, PLL enabled (Clock Frequency=4 x FOSC1)
OSC=RCIO        ; External RC oscillator, port function on RA6
OSC=IRCIO67        ; Internal oscillator block, port function on RA6 and RA7
OSC=IRCIO7        ; Internal oscillator block, CLKO function on RA6, port function on RA7
; Fail-Safe Clock Monitor Enable bit:
FCMEN=OFF        ; Fail-Safe Clock Monitor disabled
FCMEN=ON        ; Fail-Safe Clock Monitor enabled
; Internal/External Oscillator Switchover bit:
IESO=OFF        ; Oscillator Switchover mode disabled
IESO=ON        ; Oscillator Switchover mode enabled
; Power-up Timer Enable bit:
PWRT=ON        ; PWRT enabled
PWRT=OFF        ; PWRT disabled
; Brown-out Reset Enable bits:
BOREN=OFF        ; Brown-out Reset disabled in hardware and software
BOREN=SBORENCTRL        ; Brown-out Reset enabled and controlled by software (SBOREN is enabled)
BOREN=BOACTIVE        ; Brown-out Reset enabled in hardware only and disabled in Sleep mode (SBOREN is disabled)
BOREN=BOHW        ; Brown-out Reset enabled in hardware only (SBOREN is disabled)
; Brown-out Reset Voltage bits:
BORV=0        ; Maximum Setting
BORV=1        ;
BORV=2        ;
BORV=3        ; Minimum Setting
; Watchdog Timer Enable bit:
WDT=OFF        ; HW Disabled - SW Controlled
WDT=ON        ; HW Enabled - SW Disabled
; Watchdog Timer Postscale Select bits:
WDTPS=1        ; 1:1
WDTPS=2        ; 1:2
WDTPS=4        ; 1:4
WDTPS=8        ; 1:8
WDTPS=16        ; 1:16
WDTPS=32        ; 1:32
WDTPS=64        ; 1:64
WDTPS=128        ; 1:128
WDTPS=256        ; 1:256
WDTPS=512        ; 1:512
WDTPS=1024        ; 1:1024
WDTPS=2048        ; 1:2048
WDTPS=4096        ; 1:4096
WDTPS=8192        ; 1:8192
WDTPS=16384        ; 1:16384
WDTPS=32768        ; 1:32768
; MCLR Pin Enable bit:
MCLRE=OFF        ; RE3 input pin enabled; MCLR disabled
MCLRE=ON        ; MCLR pin enabled; RE3 input pin disabled
; Low-Power Timer 1 Oscillator Enable bit:
LPT1OSC=OFF        ; Timer1 configured for higher power operation
LPT1OSC=ON        ; Timer1 configured for low-power operation
; PORTB Pins Configured for A/D:
PBADEN=OFF        ; PORTB<4> and PORTB<1:0> Configured as Digital I/O Pins on Reset
PBADEN=ON        ; PORTB<4> and PORTB<1:0> Configured as Analog Pins on Reset
; Background Debugger Enable bit:
DEBUG=ON        ; Background debugger enabled, RB6 and RB7 are dedicated to In-Circuit Debug
DEBUG=OFF        ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
; Extended Instruction Set Enable bit:
XINST=OFF        ; Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
XINST=ON        ; Instruction set extension and Indexed Addressing mode enabled
; Boot Block Size:
BBSIZ=1024        ; 1K words (2K bytes) Boot Block
BBSIZ=2048        ; 2K words (4K bytes) Boot Block
BBSIZ=4096        ; 4K words (8K bytes) Boot Block
; Single-Supply ICSP Enable bit:
LVP=OFF        ; Single-Supply ICSP disabled
LVP=ON        ; Single-Supply ICSP enabled
; Stack Full/Underflow Reset Enable bit:
STVREN=OFF        ; Stack full/underflow will not cause Reset
STVREN=ON        ; Stack full/underflow will cause Reset
; Code Protection Block 0:
CP0=ON        ; Block 0 (000800-003FFFh) code-protected
CP0=OFF        ; Block 0 (000800-003FFFh) not code-protected
; Code Protection Block 1:
CP1=ON        ; Block 1 (004000-007FFFh) code-protected
CP1=OFF        ; Block 1 (004000-007FFFh) not code-protected
; Code Protection Block 2:
CP2=ON        ; Block 2 (008000-00BFFFh) code-protected
CP2=OFF        ; Block 2 (008000-00BFFFh) not code-protected
; Code Protection Block 3:
CP3=ON        ; Block 3 (00C000-00FFFFh) code-protected
CP3=OFF        ; Block 3 (00C000-00FFFFh) not code-protected
; Boot Block Code Protection:
CPB=ON        ; Boot block (000000-0007FFh) code-protected
CPB=OFF        ; Boot block (000000-0007FFh) not code-protected
; Data EEPROM Code Protection:
CPD=ON        ; Data EEPROM code-protected
CPD=OFF        ; Data EEPROM not code-protected
; Write Protection Block 0:
WRT0=ON        ; Block 0 (000800-003FFFh) write-protected
WRT0=OFF        ; Block 0 (000800-003FFFh) not write-protected
; Write Protection Block 1:
WRT1=ON        ; Block 1 (004000-007FFFh) write-protected
WRT1=OFF        ; Block 1 (004000-007FFFh) not write-protected
; Write Protection Block 2:
WRT2=ON        ; Block 2 (008000-00BFFFh) write-protected
WRT2=OFF        ; Block 2 (008000-00BFFFh) not write-protected
; Write Protection Block 3:
WRT3=ON        ; Block 3 (00C000-00FFFFh) write-protected
WRT3=OFF        ; Block 3 (00C000-00FFFFh) not write-protected
; Boot Block Write Protection:
WRTB=ON        ; Boot block (000000-0007FFh)  write-protected
WRTB=OFF        ; Boot block (000000-0007FFh) not write-protected
; Configuration Register Write Protection:
WRTC=ON        ; Configuration registers (300000-3000FFh) write-protected
WRTC=OFF        ; Configuration registers (300000-3000FFh) not write-protected
; Data EEPROM Write Protection:
WRTD=ON        ; Data EEPROM write-protected
WRTD=OFF        ; Data EEPROM not write-protected
; Table Read Protection Block 0:
EBTR0=ON        ; Block 0 (000800-003FFFh) protected from table reads executed in other blocks
EBTR0=OFF        ; Block 0 (000800-003FFFh) not protected from table reads executed in other blocks
; Table Read Protection Block 1:
EBTR1=ON        ; Block 1 (004000-007FFFh) protected from table reads executed in other blocks
EBTR1=OFF        ; Block 1 (004000-007FFFh) not protected from table reads executed in other blocks
; Table Read Protection Block 2:
EBTR2=ON        ; Block 2 (008000-00BFFFh) protected from table reads executed in other blocks
EBTR2=OFF        ; Block 2 (008000-00BFFFh) not protected from table reads executed in other blocks
; Table Read Protection Block 3:
EBTR3=ON        ; Block 3 (00C000-00FFFFh) protected from table reads executed in other blocks
EBTR3=OFF        ; Block 3 (00C000-00FFFFh) not protected from table reads executed in other blocks
; Boot Block Table Read Protection:
EBTRB=ON        ; Boot block (000000-0007FFh) protected from table reads executed in other blocks
EBTRB=OFF        ; Boot block (000000-0007FFh) not protected from table reads executed in other blocks


Edit: Dok sam pročeprkao, ti si se snašao
[ milan-markovic @ 23.12.2014. 20:19 ] @
Zdravo drugari poceo sam da ucim PicBasic imam Sinisin razvoni sistem koji koristi Pic16F1827.
Dosao sam do AD convertora proucio sam kako radi i napisao sam program u MicroCode Studio da merim napon od 0 do 5 volti i da prikaze rezultat na lcd displeju i to radi.E sada ja hocu da merim napon od 0 do 30 volti ali ne znam sta treba da se doda u programu.Znam da treba da napravim razdelnik napona tako da pri naponu od 30 volti imam napon na ulazu AD jednak referentnom.

Code:
'****************************************************************
'*  Name    : LCD Voltmetar                                     *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 22/12/2014                                        *
'*  Version : 1.0                                               *
'*  Notes   : PIC16F1827                                        *
'*          :                                                   *
'****************************************************************
 #CONFIG
 __config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF 
 __config _CONFIG2, _WRT_ALL & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF 
#ENDCONFIG


define OSC 4
define LCD_DREG PORTB  'LCD data port
define LCD_DBIT 4      'LCD pocetni bit podatka o ili 4     

define LCD_RSREG PORTA  'LCD registar select port
define LCD_RSBIT 1      'LCD registar select bit
define LCD_EREG PORTA   'LCD enable port
define LCD_EBIT 3       'LCD enable bit
Define    ADC_BITS    10    ' Broj bita
Define    ADC_CLOCK    3    ' Klok (1=Oscilator /8)
DEFINE LCD_LINES 2      ' Broj linije displeja
 inic:
    OSCCON=%01101000   ' Interni oscilator 4MHz
    ansela=%00000001   ' Port A je digitalni osim RA0
    adcon0=%00000001   ' Omogucen AN0 kanal
    adcon1=%10110000   ' 0 i 5 volti su referentni naponi a rezultat je desno formatiran
    TRISA=%11110101   ' Port A je ulazni osim RA1 i RA3
    TRISB=%00000000   ' Port B je izlazni
    
    AD_Rez var    word    ' Rezultat AD konverzije             
    Napon  var    word    ' Promenljiva za dobijanje napona 
    Dummy  var word     ' Promenljiva za 32 bitno delenje i mnozenje
 
        Pause 500           ' Pauza 0.5 sec
        Lcdout $fe, 1        ' Izbrisi ceo LCD displej
        Lcdout $fe, 2       ' Pozicioniraj se na prvi red prvi karakter
        Lcdout "     PRIMER    "  ' Ispisi "PRIMER" u prvom redu
        Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda
          Lcdout " A/D KONVERTORA" ' Ispisi dati tekst u drugom redu 
        Pause 5000           ' Pauza 5 sec
       
Pocetak:    

            '   Procitaj 1 kanal na RA0 i prikazi
      
        Lcdout $fe, 1        ' Izbrisi ceo LCD displej
        Lcdout $fe, 2        ' Pozicioniraj se na prvi red prvi karakter
        Lcdout " A/D kanal br.1" ' Ispisi “A/D kanal br.1 u prvom redu

        ADCIN 0, AD_Rez       ' Izvrsi konverziju na RA0 i 10 bita rezultata smesti u AD_Rez.
        Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda
        Dummy = AD_Rez * 5 * 100  
        Napon = Div32 1024
        Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda
          Lcdout "   Napon:",DEC napon DIG 2 ,",",dec2 napon," V"  ' Ispisi vrednost na displeju 
        
        Pause 500            ' Pauza 0.5 sec
        
        Goto Pocetak        ' Kreni ponovo na merenje

        End                    ' Kraj programa



Zamolio bih nekog da mi objasni sta trebam dodati ovom programu da mi umesto 5.00v ispise 30.00v.



[Ovu poruku je menjao milan-markovic dana 23.12.2014. u 21:32 GMT+1]
[ ZAS011 @ 24.12.2014. 17:54 ] @
1023*3=3069 To ti je dobitna kombinacija

Razdelnik treba da ti pri 30.69V obori na 5V

AD konvertor iščitavaš 3 puta uzastopno, sabirajući vrednosti i .....

Nadam se da si shvatio
[ milan-markovic @ 24.12.2014. 18:26 ] @
ZAS 011 Hvala na odgovoru Ali ne znam kako da 3 puta iscitam AD i da saberem ja probao ovako ali ne ide:

Code:
Pocetak:    

            '   Procitaj 1 kanal na RA0 i prikazi
      
        Lcdout $fe, 1        ' Izbrisi ceo LCD displej
        Lcdout $fe, 2        ' Pozicioniraj se na prvi red prvi karakter
        Lcdout " A/D kanal br.1" ' Ispisi “A/D kanal br.1 u prvom redu

        ADCIN 0, AD_Rez        ' Izvrsi konverziju na RA0 i 10 bita rezultata smesti u AD_Rez.
        ADCIN 0, AD_Rez 
        ADCIN 0, AD_Rez 
        Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda
        AD_rez = (AD_rez + AD_rez + AD_rez)
        Dummy = AD_rez * 5 * 100  
        Napon = Div32 1024
        Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda
          Lcdout "   Napon:",DEC napon DIG 2 ,",",dec2 napon," V"  ' Ispisi vrednost na displeju 
        
        Pause 500            ' Pauza 0.5 sec
        
        Goto Pocetak        ' Kreni ponovo na merenje

        End                    ' Kraj programa


Krene da ispisuje od 0 do9.99 i ponovo pocne od 0

Vise bih mi pomogao neki primer jer sam pocetnik i tesko se snalazim.

Pozdrav

[ ZAS011 @ 24.12.2014. 19:42 ] @
Code:
        ADCIN 0, AD_Rez        ' Izvrsi konverziju na RA0 i 10 bita rezultata smesti u AD_Rez.
        ADCIN 0, AD_Rez 
        ADCIN 0, AD_Rez 

Ovo gore ti ne pije vodu, imaš rezultat samo jednog merenja, poslednjeg. A ovo

Code:
AD_rez = (AD_rez + AD_rez + AD_rez)

ti je isto kao da si napisao nešto u stilu:
Code:
Rezultat = AD_Rez * 3


Ajde 'vako (mada ja koristim Proton, ali biće ti jasno, predpostavljam):

Code:
Rezultat = 0

For i = 1 to 3
     ADCIN 0, AD_Rez
     Rezultat = Rezultat + AD_Rez
Next i


Promenljiva Rezultat će imati vrednost u rasponu od 0 do 3069.
[ milan-markovic @ 24.12.2014. 21:51 ] @
Hvala na primeru koji ste mi postavili sutra cu da probam to da iskoristim.

Pozdrav

[ ZAS011 @ 28.12.2014. 15:26 ] @
Jesi li uradio štogod?
[ milan-markovic @ 28.12.2014. 22:22 ] @
Jesam uspeo sam da iscitam 3 puta AD i rezultat da ispisem na LCD ali kako da ubacim zarez izmedju dve decimale.

Code:
Pocetak:    

   Lcdout $fe, 1        ' Izbrisi ceo LCD displej
   Lcdout $fe, 2        ' Pozicioniraj se na prvi red prvi karakter
   Lcdout " A/D kanal br.1" ' Ispisi “A/D kanal br.1 u prvom redu
   
   Rezultat = 0
                                                   
For i = 1 to 3
     ADCIN 0, AD_Rez
     Rezultat = Rezultat + AD_Rez
Next i
   
  
Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda
   
 Lcdout "   Napon:", dec4 rezultat, "v"
  
       
 
 Pause 500
 
 goto pocetak 


Pozdrav
[ ZAS011 @ 29.12.2014. 18:23 ] @
Rezultat podeliš sa 100 i to ti je celobrojna vrednost, a modulom dobiješ decimalnu

Code:
Celo = Rezultat / 100
Decimale = Rezultat // 100
[ milan-markovic @ 30.12.2014. 23:49 ] @
Zas011 Nisam imao vreme da probam ovo sto ste mi napisali kad dodjem do malo slobodnog vremena probacu da ukombinujem ovo .

Ako se ne snadjem eto mene ponovo da gnjavim sa pitanjima stacu tek sam na pocetku sa programiranjem i tesko se snalazim a i trenutno sam u nekoj guzvi.

Pozdrav
[ milan-markovic @ 03.01.2015. 22:42 ] @
Evo da se pohvalim da sam uspeo da napisem program za voltmetar radi odlicno a preciznost je 30mv po koraku.Za ispravljac je ovo zadovoljavajuce Ali me interesuje cisto iz radoznalosti da li je moguce softverski povecati preciznost sa 10bit A/D ili se mora ici na 12bit da bih se dobili 10mv po koraku.

Code:
For i = 1 to 3
     ADCIN 0, AD_Rez
     Rezultat = Rezultat + AD_Rez
    Next i
    Celo = Rezultat / 100
Decimale = Rezultat // 100
Lcdout $fe, $C0        ' Podesi kursor na pocetak drugog reda
   
 Lcdout "   Napon:",DEC2 celo,",", dec2 decimale, " V"


Hvala ZAS011 na ukazanoj pomoci.
[ MILANAN @ 10.01.2015. 17:18 ] @
Moze li i za mene jedan mali savet.Koristim 16f88 i treba mi da na displeju ispise broj u desetobitnoj rezoluciji tj na 5V da ispise 1024 a meni ispise 256.Da li u ovom slucaju mora da ispise 256 ili negde gresim ? Kad stavim ovako

ADCIN 0 , BROJ
broj= broj*/1024
lcdout $FE, $80, "DC Volts=",#broj ' sad ispise 1024

onda ispise na displeju 1024 a bez - broj*/1024 - ispisuje 256.Ako neko moze da pomogne sta da prepravim u kodu da mogu da vidim desetobitnu rezoluciju.Probao sam u proteusu.


DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB

DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 3
DEFINE LCD_LINES 2
pause 100

Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50
ANSEL=%11111111
ADCON1=%10000000
ADCON0=%11000101
TRISA = %11111111
BROJ Var WORD

'lcdout $FE, 1
POCETAK:
ADCIN 0 , BROJ

lcdout $FE, $80, "DC Volts=",#broj ' na 5V ispise 256
pause 10
GOTO POCETAK:
END

Nema logike da se ovako ponasa,morlo bi da ispise 1024.Probacu na plocici da vidim a ako neko moze neka napise kako bi po ovom kodu trebalo da bude.

[Ovu poruku je menjao MILANAN dana 10.01.2015. u 19:42 GMT+1]
[ milan-markovic @ 10.01.2015. 20:55 ] @
Neznam koliko cu ti biti od pomoci ali probaj ovako:

Code:
lcdout $FE, $80, "DC Volts=",DEC4 broj,


Misli da bih ovako funkcionisalo probaj i javi rezultate.

Pozdrav
[ MILANAN @ 10.01.2015. 22:31 ] @
Raseno.Ovaj proteus je s**nje za neke stvari.Po stoti put me izradi na isti nacin.
[ electron2008 @ 31.01.2015. 16:43 ] @
Pozdrav svima, u ovaj kod :

Code:
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
'* Universal thermostat -25/+75 C.  by R.T.G. van Steenis                  *
'* Compiler : PicBasic Pro 2.45                                            *
'* B0 = Mode switch in (In)            A0 = LCD Enable    (Out)            *
'* B1 = + switch in    (In)            A1 = LCD RS        (Out)            *
'* B2 = - switch in    (In)            A2 = "Warm" Output (Out)            *
'* B3 = Not connected  (Out)           A3 = "Cold" Output (Out)            *
'* B4 = LCD Bit 4      (Out)           A4 = DQ DS1820     (In)             *
'* B5 = LCD Bit 5      (Out)                                               *
'* B6 = LCD Bit 6      (Out)                                               *
'* B7 = LCD Bit 7      (Out            PIC16F628 Code size = 1124 Words    *
'*                                                                         * 
'* Oscillator XP (4 MHz.) - Power up timer enabled - MCR enable            *
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

TRISA= %11110000                        ' RA0..3=Outputs RA4=Input
TRISB= %00000111             ' RB0..RB2=Inputs, RB3..RB7=Outputs
CMCON=7                                 ' Disable comparators

DEFINE LCD_DREG PORTB                   ' LCD on port B
DEFINE LCD_DBIT 4                       ' Data bits B4..B7
DEFINE LCD_RSREG PORTA                  ' RS on PORTA
DEFINE LCD_RSBIT 1                      ' RS on A1 
DEFINE LCD_EREG PORTA                   ' E on PORTA
DEFINE LCD_EBIT 0                       ' E on A0
DEFINE LCD_BITS 4                       ' LCD 4 bit mode
DEFINE LCD_LINES 2                      ' 2 line LCD display

Temperature     Var    Word        ' Temperature storage
TargetTemp    Var    Word        ' Desired Temperature
Hyst        Var    Word        ' Hystereris
V        Var    Word        ' Var. for display
B1              Var     Byte            ' Byte for TargetTemp calculation 
B2              Var     Byte            ' Byte for TargetTemp calculation
Count_Remain     Var     Byte        ' Count remaining
Count_Per_C     Var    Byte        ' Count per degree C
Sign        Var    Byte        ' +/- sign
Mode         Var    Byte        ' 0=Temp. display, 1=Set Temp, 2=Set Hysteresis
DQ        Var    PORTA.4        ' One-wire data pin

DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10

PORTA.2=0                               ' Warm Output Low
PORTA.3=0                               ' Cold Output Low
Mode=0                                  ' Temperature display mode  

LCDOUT $FE, 1, $FE, $0C                 ' Clear display, cursor off

Read 0, B1                              ' Read TargetTemp MSB
Read 1, B2                              ' Read TargetTemp LSB
TargetTemp=B1*256+B2                    ' Calculate TargetTemp value (Default=20.0 C.)
Read 2, B1                              ' Read Hysteresis 
Hyst=10*B1                              ' Calculate Hysteresis value (Default= 2.0 C.)  

MainLoop: 
 If PORTB.0=0 then                      ' Mode switch pressed
  Pause 50                              ' Debounce 
  LcdOut $FE, $8F, "*"                  ' Show that command is accepted 
  If PORTB.0=0 then MainLoop            ' Wait until button is released  
  Mode=Mode+1                           ' Increment mode
  If Mode=2 then                        ' Save Target Temperature (Mode1 -> Mode2)
   Write 0, TargetTemp / 256        ' TargetTemp MSB
   Write 1, TargetTemp MOD 256          ' TargetTemp LSB
  EndIf
  If Mode > 2 Then                      ' Save Hysteresis (Mode 2 -> Mode 0) 
   Mode=0                       ' Only 0, 1, 2 are valid
   Write 2, Hyst / 10                   ' Divide Hyst value to fit in Byte
  EndIf
 EndIf

 If Mode =1 then                        ' Set Target Temperature
  LcdOut $FE, $80, "SET TEMPERATURE "   ' Show function
  V=TargetTemp                          ' TargetTemp in V  
  Gosub SelectSign                      ' Select +/blank/- 
  Gosub DisplayTemp                     ' Display Target Temperature
  If (PORTB.1=0) Or (PORTB.2=0) then    ' Up or Down button pushed
   If PORTB.2=0 then                    ' Down button 
    If TargetTemp > 7500 then           ' Not lower than -25 C. (10000-MinTemp * 100)
     TargetTemp=TargetTemp-25           ' Decrease temperuture with 0.25 C.
    EndIf
   EndIf
   If PORTB.1=0 then                    ' Up button
    If TargetTemp < 17500 then          ' Not higher than 75 C. (10000+MaxTemp * 100)
     TargetTemp=TargetTemp+25           ' Increase temperature with 0.25 C.
    EndIf
   EndIf
   GoSub SetTargetTemp                  ' Display TargetTemp and delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode=2 then                         ' Set Hysteresis    
  LcdOut $FE, $80, "HYSTERESIS      "   ' Show function
  Sign=" "                              ' No sign  
  V= 10000+Hyst                         ' Set value for V  
  Gosub DisplayTemp                     ' Display Hysteresis
  If (PORTB.1=0) Or (PORTB.2=0) then    ' Up or down button pushed  
   Sign=" "                             ' No sign for Hysteresis
   If PORTB.2=0 then                    ' Down button
    If Hyst > 10 then Hyst=Hyst-10      ' Not less than 0.1 C.
   EndIf
   If PORTB.1=0 then                    ' Up button
    If Hyst < 1000 then Hyst=Hyst+10    ' Not more than 10.0 C.
   EndIf 
   V= 10000+Hyst                        ' Set value for V
   Gosub DisplayTemp                    ' Display Hysteresis 
   Pause 250                            ' Delay 0.25 Sec.
  EndIf
 EndIf 

 If Mode > 0 then Mainloop              ' Setting TargetTemperature or Hysteresis

 LcdOut $FE, $80, "TEMPERATURE     "    ' Show function

 Output DQ                         ' Make Pin Output
 DQ=0                    ' OneWire line Low
 PauseUs 480                            ' Keep down for 480 µS  
 Input DQ                               ' Make Pin Input
 PauseUs 70                             ' Wait 70 µS
 If DQ=1 then                           ' No presence pulse from DS1820   
  LcdOut $FE, $1, "** No sensor! **"    ' Show message
  Pause 500                             ' Wait 0.5 Sec. 
  Goto MainLoop                         ' Check again
 EndIf

 OWOut DQ, 1, [$CC, $44]               ' Start temperature conversion
WaitLoop: OWIn DQ, 4, [Count_Remain]    ' Check for still busy converting
 If Count_Remain = 0 Then WaitLoop      ' Busy 
 OWOut DQ, 1, [$CC, $BE]        ' Read the temperature
 OWIn DQ, 0, [Temperature.LowByte, Temperature.HighByte, Skip 4, Count_Remain, Count_Per_C]
 Temperature = (((Temperature >> 1) * 100) - 25) + (((Count_Per_C - Count_Remain) * 100) / Count_Per_C)
 if Temperature > 32767 then
  Temperature= ~Temperature
  V= 10000 - Temperature                ' 25 C=12500  0 C=10000  -10 C=9000 
 else
  V= 10000 + Temperature
 EndIf

 If V < TargetTemp - Hyst then          ' Below Target temperature - Hysteresis
  PORTA.2=1                             ' Activate   Warm Output
  PORTA.3=0                             ' Deactivate Cold Output
 EndIf

 If V > TargetTemp + Hyst then          ' Above Target temperature + Hysteresis
  PORTA.2=0                             ' Deactivate Warm output
  PORTA.3=1                             ' Activate   Cold Output
 EndIf

 GoSub SelectSign                       ' +/blank/- Sign 
 GoSub DisplayTemp                      ' Temperature to LCD

Goto MainLoop                ' Do it forever

' SUBROUTINES:
'----------------------------------------
SelectSign:
 If v = 10000 then                      ' Temperature = 0 C.
  Sign=" "                 ' No sign
 Else 
  If v < 10000 then                  ' <> 0
   Sign="-"                ' Temperature below 0 C.     
  Else
   Sign="+"                ' Temperature above 0 C.
  EndIf
 EndIf
Return

'----------------------------------------
DisplayTemp:
 If V >= 10000 then                     ' Above 0 C.      
  Temperature=V-10000                   
 Else                                   
  Temperature=10000-V                   ' Below 0 C. 
 EndIf
 LcdOut $FE, $C0, Sign, DEC (Temperature / 100), ".", DEC2 Temperature, " ",223,"C "
Return

'-----------------------------------------
SetTargetTemp:
 V=TargetTemp
 Gosub SelectSign
 Gosub DisplayTemp 
 Pause 250
Return

'-----------------------------------------


sam ubacio da mi uz prikaz temperature u donjem redu LCD odbrojava neko vreme, u gornjem redu LCD, evo primer deo koda:
Code:
Pauza:
 
 read 9,tmp1
 read 10,tmp2
 I.lowbyte =tmp1
 I.highbyte=tmp2 
 
 
 DOZ=0
 GR=0
 ve=1
 for j=0 to I
 if ST=0  then Blokada
 if j=I then  I=0

Output DQ                      ' Make Pin Output
DQ=0               ' OneWire line Low
PauseUs 480                            ' Keep down for 480 µS  
Input DQ                               ' Make Pin Input
PauseUs 70                             ' Wait 70 µS
If DQ=1 then                           ' No presence pulse from DS1820   
  LcdOut $FE, $1, "** No Sensor! **"    ' Show message
  Pause 500                             ' Wait 0.5 Sec. 
  Goto Pauza                         ' Check again
EndIf

'*****************************************************************************
' Temp reading
'*****************************************************************************

OWOut DQ, 1, [$CC, $44 ]             ' Start temperature conversion

waitloop1: 

   WHILE NOT DQ
   WEND
      
    OWOUT   DQ, 1, [$CC, $BE ]                       ' Skip ROM search & read scratchpad                                           memory
    OWIN    DQ, 2, [Temperature.Lowbyte, Temperature.Highbyte]' Read two bytes / end comms
      
Convert_Temp1:                                       

   IF Temperature.15 THEN
   
       Temperature = ~Temperature + 1
      Twist = 1
      
   ENDIF
                                    
    TempC =  ( Temperature & $7FF ) >> 4               ' Partie Entiere '4
                  
    Float = ((Temperature.Lowbyte & $0F ) * 25 )>> 2    ' Partie décimale 100emes
    
    Temperature = TempC*100 + Float                  'Préparation 1/100 degrés
    
IF Twist THEN
   
  V= 10000 - Temperature                ' 25 C=12500  0 C=10000  -10 C=9000
  Twist = 0 
else
  V= 10000 + Temperature
EndIf
'----------------------- Upravljanje relejima ----------------------------------
Read 0, B1                              ' Read TargetTemp MSB
Read 1, B2                              ' Read TargetTemp LSB
TargetTemp=B1*256+B2                    ' Calculate TargetTemp value (Default=20.0 C.)

If V > TargetTemp + Hyst then Mainloop2          ' Above Target temperature + Hysteresis
'-------------------------------------------------------------------------------
GoSub SelectSign                       ' +/blank/- Sign 
GoSub DisplayTemp                      ' Temperature to LCD
LCDOUT $FE,$80, "Pauza   :   "   ,dec3 j
pause 1000
next j
goto Pauza

Problem je sto temperaturu osvezava svake sekunde prilikom odbrojavanja brojaca, kako to resiti drugacije?
[ ZAS011 @ 31.01.2015. 18:36 ] @
A da li treba da ti za vreme odbrojavanja iščitava senzor?

Ne vidi se u kodu gde ti je:

FOR j = od TO do

da bi imao:
Code:
LCDOUT $FE,$80, "Pauza   :   "   ,dec3 j
pause 1000
next j  <= ovo ovde
goto Pauza
[ electron2008 @ 01.02.2015. 12:38 ] @
Da treba da za vreme iscitavanja senzora i odbrojava, ili za vreme odbrojavanja i iscitava senzor
[ ZAS011 @ 04.02.2015. 15:12 ] @
I dalje nisi odgovorio gde ti počinje For petlja pošto imaš:

next j <= ovo ovde
[ electron2008 @ 17.05.2015. 17:16 ] @
Interesuje me sta konkretno znaci "data" u picbasicu, u termostatu iz elektora pise ovako
Code:
    DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10


skontao da su defaultne vrednosti za temperaturu i histerezu, pocetne, za temperaturu 20,00C a za histerezu 2,00C, Ja sam dodao jos jedno podesavanje za temperaturu, sta da upisem da i ona bude tih 20,00C

link

Edit: Skontao sam :)

[Ovu poruku je menjao electron2008 dana 17.05.2015. u 19:21 GMT+1]
[ lm741 @ 21.05.2015. 00:06 ] @
instrukcijom DATA, smesta se vrednost konstanti u interni EEPROM...na zeljene adrese...
[ ZAS011 @ 21.05.2015. 09:59 ] @
Laloš???
[ electron2008 @ 24.01.2016. 19:25 ] @
Citat:
Sepa011:
Code:
DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, Hysteresis DIV 10


46*256+224=12000

Ovde autor programa namerno dodaje 10000 vrednost iscitanu sa DS senzora da bi mu citava matematika bila sa celim i pozitivnim brojevima.

sto se vidi iz podprograma
Code:
SelectSign:
 If v = 10000 then                      ' Temperature = 0 C.
  Sign=" "                 ' No sign
 Else 
  If v < 10000 then                  ' <> 0
   Sign="-"                ' Temperature below 0 C.     
  Else
   Sign="+"                ' Temperature above 0 C.
  EndIf
 EndIf
Return


10000 = 0 stepeni.

Lukavo, nema sta.

A "ono" sto si pitao (DATA 46, 224, 20), svaka READ naredba cita podatak, koji je prilikom kompajliranja programa smesten u programski deo memorije i stoga nepromenljiv (da ne zalazim u kontrolere koji mogu da zvrljaju po svom FLASH-u), prema parametru koji joj je prosledjen tako da

posle
Code:
Read 0, B1                              ' Read TargetTemp MSB

B1 ima vrednost 46,... (0 -> prvi element u DATA listi)
posle
Code:
Read 1, B2                              ' Read TargetTemp LSB

B2 ima vrednost 224,...(1 -> drugi element u DATA listi)
i tako redom.

ako se koriste podesavanja za dve temperature menja se i data?

[Ovu poruku je menjao electron2008 dana 24.01.2016. u 21:14 GMT+1]
[ Darko_zed @ 07.01.2019. 17:30 ] @
Pozdrav drugari, odavno me nije bilo.....
Zapelo pa me eto ovde ponovo .

U svojim aplikacijama skori i ne koristim inetrrupt , mada i kada zatreba koristim samo na rb0 pinu.... Pored ostalih koje imamo od rb4-rb7 skoro da nisam koristio, uglavnom su bili definisani kao izlazni portovi..
E sada pitanje je kojom tacnom naredbom mogu razdvojiti da svaki interupt od rb4 do rb7 ima svoj zasebni podprogram za obradu.
[ milan-markovic @ 07.01.2019. 19:32 ] @
Moja ideja je kada se desi interapt na nekom od RB4 - RB7 pinova kontroler skoci na podprogram i u tom podprogramu se izvrsi skeniranje RB4 - RB7 pinova.

Na osnovu skeniranja se utvrdi na kom pinu je doslo do promenje stanja i tada se dalje ide na sledeci podprogram koji je vezan za taj pin.

Pozdrav Milan
[ Darko_zed @ 07.01.2019. 20:42 ] @
moze ,ali pratio bi stanje svih portova ,po meni bespotrebna petlja ....
mislim da se moze odabrati samo po jedan ili vise, svaki posebno ,a da ostali budi izlazni recimo ..
Potrebno je postaviti To jest naredbom definisati Flag na pinu Rb5 i Rb6 navodim primer , ali kako to izvesti ?
[ veselinovic @ 08.01.2019. 10:28 ] @
Davno sam radio, ali mi se cini da postoji samo jedna interupt rutina.
Onda, kad se desi ti fini ispitas sta se desilo.
Inace interupt na vise pinova zna biti gadan, jer kad se desi prvi interapt u rutini se onemoguce buduci interapti.
Tek po izvrsenju prekidne rutine treba omoguciti prekide.
E sta se desi izmedju je pitanje. Kod ultra brzih procesa svasta se moze desiti.
Takodje kod visenivojskih interupta moze nastati problem kad se desi dva ili vise prekida istovremeno.
S tim sto pojam istovremenosti kod digitalnih i analognih sistema nije bas identican.Kod digitile sve sto se desi u toku jednog kloka je istovremeno.
[ ZAS011 @ 08.01.2019. 12:24 ] @
Za PIConje koji imaju samo jedan nivo interapta, interapt rutina treba samo da setuje fleg da se desio interapt i da iščita stanje pinova i odmah napolje.
U glavnom programu, ako ti je setovan interapt fleg, pogledaš kakvo je bilo stanje pinova u trenutku interapta i na osnovu toga odrađuješ šta ti je potrebno.
Znači:

-desio se interapt

-ulazak u interapr rutinu
-isključi interapte
-iščitaj stanje pinova da bi kasnije obradio događaj
-setuj neki svoj interapt fleg
-očisti PIConjin interapt fleg
-uključi interapte
-izađi iz interapt rutine
-nastavak tvog programa
[ Darko_zed @ 08.01.2019. 16:59 ] @
Hvala puno,
Jovane razumeo sam u potpunosti sta hoces reci , i posto su rb4 i rb5 na istom nivou bilo bi problema...
Zorane to je U sustini je ono sto je Milan rekao.... Taj princip rada , i ne odgovara mi to...

Sledeci primer onoga sto bih trebao je :

PIC 16f887 (16F877)
Da li je moguce sledece bez komplikacija

-Rb0 je standard (prekid 1)
-INTERRUPT na pinovima od rb4 do rb7 postaviti samo rb4 (prekid 2) kao port interrupta dok ostalih 3 porta budi izlazni.... Jer sam jako u skripcu sa izlaznim portovima

- Program

-Prekid 2 (rb4)
-podprogram
Ceka prekid 1
- Prekid 1 (rb0)
Podrpogram prekida 1
- povratak iz podprograma prekida 1
-ceka se promena stanja na rb4
-Povratak iz podprograma prekida 2
-nastavak programa




[Ovu poruku je menjao Darko_zed dana 08.01.2019. u 18:14 GMT+1]
[ ZAS011 @ 08.01.2019. 17:11 ] @
Zašto bi čekqao npotrebno na prekide?
Zato i služi interapt rutina.

Primer jedne interapt rutine:

Code:
Int:
    Context Save
    Bres = Bres + 256
    If Bres >= 1000000 Then
        Bres = Bres - 1000000
        SecFlag = 1
        Inc Sekunde
    EndIf
    T0IF = 0
Context Restore


SecFlag je promenljiva za indikaciju da nešto treba da se uradi kasnije u glavnom programu, i izvršava se samo ako je SecFlag=1.
Ako je =1, prvo postaviš SecFlag na 0, odradiš šta treba i to je to.

Ova interapt rutina je za dobijanje tačne sekunde na PIConji koji radi na 4MHz
[ Darko_zed @ 08.01.2019. 18:16 ] @
Mozda se nismo razumeli, mebi je bitno da se promena stanja odradi bas u prekidu..
Zamisli izvor signala je od 80 do 180hz vodim na ocitavanje preko interrupta rb0.... Kada odem u interrupt sa prekidom 2 ( taster ili signal) cekam prekid 1 na rb0 to jest pocetnu ivicu signala samog impulsa frekvence od 80 do 180hz gde svaki naredni impuls kratim po potrebi i na izlaznom pinu saljem impuls u trajanju koliko sam skratio...
Znaci frekvenca je i dalje ista ali ispuna samog impulsa zavisi od mene... Ulazni signal je cetvrtka

Ostatak programa je prikazivanje vrednosti na displeju
[ Darko_zed @ 08.01.2019. 19:12 ] @
Ili mogu sve ovo odraditi preko promene stanja na ulaznom pinu klasicno .... Sta je vas predlog?
[ ZAS011 @ 08.01.2019. 19:31 ] @
877 ima do 15 izvora interapta koji se svode na samo jednu interapt rutinu. Nije kao kod 18f gde postoje i prioriteti interapta.
Znači, kada si jednom ušao u interapt rutinu, kompajler je na stek gurnuo trenutne sadržaje registara da bi imao odakle da nastaviš po izlasku iz interapt rutine (povlačenje registara sa steka).
Ako ne isključiš interapte dok si u interapt rutini i nastupi sledeći interapt, sa istog ili nekog drugog izvora, ti si u problemu (a i PIConja).
Ako ćeš da čekaš na promene stanja na ulaznom pinu, samo čučiš u petlji, da li ćeš imati vremena da se pozabaviš osvežavanjem displeja?
[ Darko_zed @ 08.01.2019. 20:36 ] @
Razumem te u potpunosti sada.... Hvala jos jednom

Prosto neizvodljivo za ono sto sam zamislio, ali je izvodljivo sa jednim interruptom koji me posalje u podprogram gde zaista cucim u petlji i iscitavam stanje pina i to radi bez greske( mada mi se pojavi nekada kasnjenje u startu ali to su delici sekunde u pitanju, ili sam mozda umislio pa sam zato hteo jos jedan interupt zbog brzeg odaziva) ... Osvezenje 7 segment displeja po broju mi je 2 mili sekunde( dve do tri cifre) , a displej ostane zakocen dok se podprogram ne zavrsi i to nije problem .... Displej pokazuje zadate vrednosti koje se odmah upisuju u unutrasnjem epromu koje sam unesem u startu tasterima + i - , a kasnije u obradi u podprogramu iscitam, sto znaci za par sekundi mi i nije bitno sto je displej ukocen.....
Odmah po zavrsetku sve je ok i radi kako valja sto se displeja tice

[ Darko_zed @ 08.01.2019. 20:58 ] @
Mislim da sam sa tobom pisao o nekom drajveru za 7 segment displej kome upisujes vrednost i on sam drajvuje displej, a u svakom trenutku mozes promeniti vrednost preko pina clear i enable gde prvo izbrise pa preko enable upise novu vrednost preko portova za komunikaciju.... Davno je bilo
[ veselinovic @ 08.01.2019. 21:09 ] @
direktno drajvovanje displeja je out.
Pogledaj, meni se mnogo svidja, TLC 5916, radi fino a vozi konstantnu struju.
Ako hoces kalsiku 74595 i neki ULN da drajvuje.
Ako ti treba TLC imam ja viska x komada, pa salji adresu da ti posaljem ( valjda carina nece praviti problem).
Inace, nevezano, ako ti treba vise interapta fino napravis ili kolo ( sa diodama ili kako god) na jedan interapt pin, a u prekidu kontas sta raditi.
Inace tih 180 Hz je djecija igra za bilo koji kontroler.
[ ZAS011 @ 08.01.2019. 21:28 ] @
Za drajvovanje displeja MAX7219
Ili čitav modul sa 8 7seg cifre.
[ Darko_zed @ 10.01.2019. 16:40 ] @
Hvala Jovane, skoro sam bio do Sarajeva(vogsca) pa sam mogao da pokupim licno() ali nije problem mogu nabaviti ako resim sa tim kolom da odradim....
Hvala Zoranu, na to sam mislio, MAXIM kolo neko je bilo u pitanju i to je to...
Videcemo sta se bolje uklopi jer jos nisam PCB odradio, samo probao na razvojnom sistemu.

Hvala svima na pomoci...
[ electron2008 @ 02.05.2021. 14:06 ] @
Kako bi ovo izgledalo u PicBasicu? Da li neko zna? Na sajtu je u MPAB XC8 Code i u MikroC Code


.
Code:
#include <xc.h>
#define _XTAL_FREQ 20000000 //define crystal frequency to 20MHz
#define digit1 PORTBbits.RB0
#define digit2 PORTBbits.RB1
#define digit3 PORTBbits.RB2
#define digit4 PORTBbits.RB3
// This array stores binary bit pattern that will be send to PORTD
unsigned char binary_pattern[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char display1[10]= {0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xE7};    // with dp turn on
unsigned int a1,a2,a3,a4;
unsigned int counter = 0;
int adc_value; //store output value from Analog Read functoion
unsigned int number;
long tlong;
unsigned int voltage;
void Analog_setting(){
    ADCON0 = 0x81;
    ADCON1 = 0x02;
}

unsigned int Analog_read(unsigned char channel){
    int aadc,bbdc, ccdc;
    if(channel>7)return 0;
    ADCON0 = ADCON0 & 0xC5;
    ADCON0 = ADCON0 | (channel << 3);
    __delay_ms(2);
    ADCON0bits.GO_DONE = 1;
    while(ADCON0bits.GO_DONE);
    aadc = ADRESH;
    aadc = aadc<<2;
    bbdc = ADRESL;
    bbdc = bbdc >>6;
    ccdc = aadc|bbdc;
    return ccdc;

}
void main(void)
{
    Analog_setting();
    TRISD = 0x00; //define PORTD as a output pin
    PORTD=0X00;   // initialize PORTD pins to active low
    TRISB=0X00;
    digit1 = 1;
    digit2 = 1;
    digit3 = 1;
    digit4 = 1;
    while(1)
    {
          adc_value = Analog_read(0);  // read data from channel 0
           tlong = (float)adc_value*0.488768555;
           voltage = tlong;
       
           a1 = voltage / 1000;   // holds 1000's digit
           a2 = ((voltage/100)%10); // holds 100's digit
           a3 = ((voltage/10)%10);  // holds 10th digit
           a4 = (voltage%10);  // holds unit digit value
           
       
PORTD=binary_pattern[a2]; // send 1000's place data to fourth digit
digit1=0;   //  turn on forth display unit
__delay_ms(3);
digit1=1;   //  turn off forth display unit
PORTD=display1[a3];  // send 100's place data to 3rd digit
digit2=0;    //  turn on 3rd display unit
__delay_ms(3);
digit2=1;  //  turn off 3rd display unit
PORTD=binary_pattern[a4];  // send 10th place data to 2nd digit
digit3 = 0;  //  turn on 2nd display unit
__delay_ms(3);
 digit3 = 1;   //  turn off 2nd display unit
PORTD=binary_pattern[a1];  // send unit place data to 1st digit
digit4 = 0;  //  turn on 1st display unit
__delay_ms(3);
digit4 = 1;  //  turn off 1st display unit


    }
    return ;
}






https://microcontrollerslab.co...isplay-pic-microcontroller/amp
Radi se o jednostavnom voltmetru. Ako neko ima.picbasic kod za led displaye, ja imam sa lcd

Code:
    ' Name        : VMETERX.pbp
' Compiler    : PICBASIC PRO Compiler 2.6
' Assembler   : PM or MPASM
' Target PIC  : 40-pin 16F877 or similar
' Hardware    : LAB-X1 Experimenter Board
' Oscillator  : 4MHz external
' Keywords    : ADCIN, LCDOUT
' Description : PICBASIC PRO program to measure voltage (0-5VDC)
' and display on LCD with 2 decimal places.
'

' This program uses the */ operator to scale the ADC result from 0-1023
' to 0-500. The */ performs a divide by 256 automatically, allowing math
' which would normally exceed the limit of a word variable.

' Connect analog input to channel-0 (RA0)

' Define LOADER_USED to allow use of the boot loader.
' This will not affect normal program operation.
Define LOADER_USED 1

' Define LCD registers and bits
Define LCD_DREG  PORTD
Define LCD_DBIT  4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG  PORTE
Define LCD_EBIT  1

' Define ADCIN parameters
Define ADC_BITS     10 ' Set number of bits in result
Define ADC_CLOCK    3  ' Set clock source (3=rc)
Define ADC_SAMPLEUS 50 ' Set sampling time in uS

adval Var Word         ' Create adval to store result

   TRISA = %11111111   ' Set PORTA to all input
   ADCON1 = %10000010  ' Set PORTA analog and right justify result
   Low PORTE.2         ' LCD R/W line low (W)
   Pause 500           ' Wait .5 second

mainloop:
   Adcin 0, adval      ' Read channel 0 to adval (0-1023)
   adval = (adval */ 500)>>2 ' Equates to: (adval * 500)/1024

   LCDOut $fe, 1       ' Clear LCD
   LCDOut "DC Volts= ",DEC (adval/100),".", DEC2 adval ' Display the decimal value 
   Pause 100           ' Wait .1 second
   Goto mainloop       ' Do it forever

   End
       


https://i2.wp.com/microcontrol...jpg?resize=768%2C396&ssl=1


[Ovu poruku je menjao electron2008 dana 02.05.2021. u 15:26 GMT+1]
[ MILANAN @ 21.05.2021. 20:04 ] @
Evo nabrzinu ako se nisi snasao jer tema je odavno postavljena.Nemam za voltmetar,nesto drugo sam pravio ali displej radi pa samo ubaci sta treba za voltmetar.Obrati ovde paznju na pauze,postavljene su vece nego sto treba zbog proteusa.Ovo je za 16f883 koliko se secam i sa zajdnickom katodom a tranzistori pnp,zato je portc = ~Dcd i da bi pobuda bila 0 a ako stavis npn onda pobuda 1 pa netreba nagacija.Nisam skoro nista pravio sa ovim pa mozda ima neka greska ali snaci ces se.Po meni zasto voltmetar sa PIC i LED displej kad sa lcd mozes da izvuces i vise,ja sam pravio za 4 merenja.
Za anodu tranzistor vezan na anodu,pobuda isto kao ovde zavisno od tranzistora i brojevi u Lookup za anodni displej.

c var byte
broj var word
n Var Byte
i var byte

TRISA = %11111111
trisc = 0
trisb = %00000000
broj=0
ANSEL = %00000000

pocetak


COUNT PORTA.0,1000,BROJ



For i = 0 To 7
n=broj Dig i
GoSub display1
Pause 1000

display1:
portc = $ff
Lookup n, [%0111111,%0000110,%1011011,%1001111,%1100110,%1101101,%1111101,%0000111,%1111111,%1101111], portb

portc = ~Dcd i
Next i


goto pocetak
end
[ electron2008 @ 04.06.2021. 13:39 ] @
Ma znam da se sa lcd može više izvući, ali bi ovo za aparat za zavarivanje na nekoj masini, pa mislim da bi lcd više ludeo od 7 segment