skraceni kurs ucenja picbasica
Moderators: pedja089, stojke369, [eDo], trax
Re: skraceni kurs ucenja picbasica
Program i NE IDE dalje dok ne prođe pauza.
Ajd ispočetka malo pročitaj kurs pa ćeš to riješiti, nije to ništa komplikovano.
Ajd ispočetka malo pročitaj kurs pa ćeš to riješiti, nije to ništa komplikovano.
Ako kaniš pobijediti, ne smiješ izgubiti
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: skraceni kurs ucenja picbasica
Sve u svemu očito krivo pokušavaš, i s krivim stvarima pokušavaš, no evo primjer kako to s "njima" možeš napraviti... U C sam napisao, ali trebao bi moći skužiti logiku.hvarovic wrote: pokušavam to riješiti s pauzama ali izgleda da mi program ne ide dalje dok se ne završi pauza
Code: Select all
unsigned char led_state = 0;
unsigned int t_led1 = 0;
unsigned int t_led2 = 0;
while(1){
_delay_ms(100);
t_led1++;
t_led2++
if(Button() && (led_state == 0)){
Led1On();
LEd2On();
t_led1 = 0;
t_led2 = 0;
led_state++;
}
else if(led_state == 1){
if(t_led1 > 300){
Led1Off();
led_state++;
}
else if(Button()){
led_state = 0;
Led1Off();
Led2Off();
}
}
else if(led_state == 2){
if(t_led1 > 400){
Led2Off();
led_state = 0;
}
else if(Button()){
Led1On();
Led2On();
t_led1 = 0;
t_led2 = 0;
led_state = 1;
}
}
}
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: skraceni kurs ucenja picbasica
Kako bi se reklo: Grijeh je biti rastrošan, pa evo da uštedim 2 byte-a RAM-a i nešto FLASH-a za istu funkcionalnost u prikazanom primjeru c-a:
Code: Select all
unsigned char led_state = 0;
unsigned int my_timer = 0;
while(1){
_delay_ms(100);
my_timer++;
if(Button() && (led_state == 0)){
Led1On();
LEd2On();
my_timer = 0;
led_state++;
}
else if(led_state == 1){
if(my_timer > 300){
Led1Off();
led_state++;
}
else if(Button()){
led_state = 0;
Led1Off();
Led2Off();
}
}
else if(led_state == 2){
if(my_timer > 400){
Led2Off();
led_state = 0;
}
else if(Button()){
Led1On();
Led2On();
my_timer = 0;
led_state = 1;
}
}
}
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: skraceni kurs ucenja picbasica
Znam prijatelju, no da ti bilo što znaš o programiranju vjerojatno bi znao i da programeri ne programiraju sa napisanim tekstom i sintaksom nego sa napisanom idejom programa i rješenjem logike problema.
Znao bi i da programeri potroše 70% vremena na razmišljanje o problemu, a samo 30% na prepisivanje rješenja iz glave po pravilima sintakse...
No vidim ti to očito ne znaš, a ako se adminu ne sviđa moje rješenje ili ga ne želi komentirati, prepisati na BASIC ili bilo što nije nikakav problem da se izbriše nekoliko zadnjih postova. Tu smo da brišemo, zar ne...
Uostalom kolegu je mučila logika sa DELAY naredbom i logično sam sam odgovorio u ovoj temi pošto mi se nešto tipkalo. Pedja je tu da odlučuje koji post ostaje u temi i ako je njegova ideja da ovo treba biti samo basic onda si apsoludno u pravo oko kritike, no sreća pa o tome ne odlučuješ ti...
Znao bi i da programeri potroše 70% vremena na razmišljanje o problemu, a samo 30% na prepisivanje rješenja iz glave po pravilima sintakse...
No vidim ti to očito ne znaš, a ako se adminu ne sviđa moje rješenje ili ga ne želi komentirati, prepisati na BASIC ili bilo što nije nikakav problem da se izbriše nekoliko zadnjih postova. Tu smo da brišemo, zar ne...
Uostalom kolegu je mučila logika sa DELAY naredbom i logično sam sam odgovorio u ovoj temi pošto mi se nešto tipkalo. Pedja je tu da odlučuje koji post ostaje u temi i ako je njegova ideja da ovo treba biti samo basic onda si apsoludno u pravo oko kritike, no sreća pa o tome ne odlučuješ ti...
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: skraceni kurs ucenja picbasica
Code: Select all
my_timer VAR Word
led_state VAR Byte
my_button VAR Byte
SYMBOL LED1 = PORTB.0
SYMBOL LED2 = PORTB.1
OUTPUT LED1
OUTPUT LED2
LOW LED1 ' gasi LED1
LOW LED2 ' gasi LED2
my_timer = 0
led_status = 0
pocetak:
pause 100
my_timer = my_timer+1
if my_button = 1 and led_state = 0 then
HIGH LED1 'pali LED1
HIGH LED2 ' pali LED2
my_timer = 0
led_state = 1
elseif led_state = 1
if my_timer > 300 then
LOW LED1 'gasi samo LED1
led_state = 2
elseif my_button = 1 then
LOW LED1 ' gasi LED1
LOW LED2 ' gasi LED2
led_state = 0
endif
elseif led_state = 2 then
if my_timer > 400 then
LOW LED2 ' gasi samo LED2
led_state = 0
elseif my_button = 1 then
HIGH LED1 ' pali LED 1
HIGH LED2 ' pali LED 2
my_timer = 0
led_state = 1
endif
endif
goto pocetak
Ja nemam niti jedan BASIC instaliran na kompu pa je potrebno uzeti u obzir da ovaj program nije prošao compile jer sam ga pisao direktno na forumu. Treba uzeti i u obzir da je ovo sintaksa BASIC-a, i ne mora biti direktno sintaksa tog BASIC-a o kojem govorimo. U nekim BASICIMA se piše elseif, a u nekima else if, pa su to detalji koje možda treba korigirati. Kao drugo u ovom programu odabrao sam bilo koje portove PIC-a i treba uzeti u obzir da možda pri resetu MCU-a nisu postavljeni kao izlazni port, nego naprosto mogu biti dio druge periferije mikrokontrolera i možda naredbe upravljanja LED-om neće utjecati na stvarnu promjenu na tim pinovima.
InTheStillOfTheNight
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: skraceni kurs ucenja picbasica
Fali jedan "then" u programu nakon "if-a" tako da bi to compiler trebao prijaviti kao grešku. Uostalom ne znam jeli taj BASIC ima osjećaj za "endif" i "end if" kao ni "elseif" i "else if". Razlika je od BASIC-a do BASIC-a. Još će me vragovi nagoniti da skinem BASIC i početni program završim do kraja da ne bi bilo rasprava koje se vode već 2 dana... I dalje će mi ostati komedija toliko loše razmišljanje oko sintakse programa. Ispada kao da sam program napisao na Kineskom, a napisao sam ga samo da prikažem ideju rješenja, a ne ideju sintakse. To tipkanje programa je bauštela i to svi programeri jako dobro znaju i ne prodaju oni vama C ili BASIC program nego razmišljanje kako to napisati.
InTheStillOfTheNight
Re: skraceni kurs ucenja picbasica
InTheStillOfTheNight wrote:Kako bi se reklo: Grijeh je biti rastrošan, pa evo da uštedim 2 byte-a RAM-a i nešto FLASH-a za istu funkcionalnost u prikazanom primjeru c-a:
Code: Select all
unsigned char led_state = 0; unsigned int my_timer = 0; while(1){ _delay_ms(100); my_timer++; if(Button() && (led_state == 0)){ Led1On(); LEd2On(); my_timer = 0; led_state++; } else if(led_state == 1){ if(my_timer > 300){ Led1Off(); led_state++; } else if(Button()){ led_state = 0; Led1Off(); Led2Off(); } } else if(led_state == 2){ if(my_timer > 400){ Led2Off(); led_state = 0; } else if(Button()){ Led1On(); Led2On(); my_timer = 0; led_state = 1; } } }
Puno hvala na odgovoru. ovo mi je dosta pomoglo jer sam skuzio na koji način mora biti logički povezano. Evo ja sam to u PIC basicu napravio ovako
Code: Select all
timer VAR Word
stanje VAR word
symbol tipka = porta.0
SYMBOL LED1 = PORTB.0
SYMBOL LED2 = PORTB.1
input tipka
OUTPUT LED1
OUTPUT LED2
a1:
LOW LED1 ' gasi LED1
LOW LED2 ' gasi LED2
timer = 0
stanje = 0
pause 1000
pocetak:
pause 100
timer = timer+1
if tipka = 0 and stanje = 0 then 'ako je pritisnuta tipka i ugašen izlaz
HIGH LED2 'pali LED1
High led1
stanje = 1
timer=0
endif
select case stanje
case stanje = 1 ' u slucaju da je stanje=1
if timer > 100 then 'ako je timer veći od 10 sekundi
LOW LED1 'gasi samo LED1
stanje = 2
endif
case stanje=2
if tipka = 0 then
high LED1 ' pali LED1
high LED2 ' pali LED2
stanje = 0
timer=0
endif
end select
if stanje = 2 then
if timer > 200 then
LOW LED2
low led1
stanje = 0
endif
if tipka = 0 then
high LED1
high LED2
timer = 0
stanje = 1
endif
endif
If tipka=0 and stanje =1 and timer > 30 then
goto a1
endif
goto pocetak
end
Re: skraceni kurs ucenja picbasica
Citanje eprom_a:
Koristim pic 16f84a; iz IC-prog 1.06c vidim mu sadrzaj eproma.
Ako iz programa upisem string (npr "example") vidim ga kasnije iz pomoc ic-prog_a.
Ali ako iz program upisem u eprom sadrzaj varijable (koja je tipa byte ili word) koji je numerik,
ne mogu ga vidjeti iz ic-prog_a.
Taj numerik nastane mat.operacijama u programu i zanima me da li se i na koji nacin
i on moze vidjeti u epromu kroz ic-prog (ili neki drugi).
Puno hvala.
Koristim pic 16f84a; iz IC-prog 1.06c vidim mu sadrzaj eproma.
Ako iz programa upisem string (npr "example") vidim ga kasnije iz pomoc ic-prog_a.
Ali ako iz program upisem u eprom sadrzaj varijable (koja je tipa byte ili word) koji je numerik,
ne mogu ga vidjeti iz ic-prog_a.
Taj numerik nastane mat.operacijama u programu i zanima me da li se i na koji nacin
i on moze vidjeti u epromu kroz ic-prog (ili neki drugi).
Puno hvala.
Re: skraceni kurs ucenja picbasica
sada sam vidio da se numerik moze procitati u hexa dijelu icprog_a;
- andrejevica
- Pocetnik na forumu
- Posts: 35
- Joined: 07-03-2011, 18:06
Re: skraceni kurs ucenja picbasica
Da li neko moze da mi pomogne.Treba mi vreme izmedju izmenju dve rastuce ivice na rb0 pinu.Sta mi ne valja ovde.
DEFINE OSC 20
define HSER_RXSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 2400
DEFINE HSER_SPBRG 25H
ON INTERRUPT GOTO PREKID
BRZINA VAR WORD
VREME_OBRTA VAR WORD
TRISB = %00000001
VREME_OBRTA = 0
INTCON = 0 ' disable and clear global interrupts, peripheral interrupts
T1CON.1 = 0
T1CON.2 = 1
T1CON.4 = 1 'PRESKALER
T1CON.4 = 1 'PRESKALER
PIR1 = 0 ' clear interupt flags
PIE1 = 1 ' Enable TMR1 overflow interrupt
TMR1H = $00
TMR1L = $00
INTCON = $C0 'OMOGUCI GLOBALNE PREKIDE
T1CON = 1 'UKLJUCI TMR1
Pocetak:
BRZINA = 33901 / VREME_OBRTA
HSEROUT [BRZINA]
goto Pocetak
PREKID:
IF PIR1.0 = 1 THEN
PIR1.0 = 0 'obrisi flag prekida
TMR1L = 0
TMR1H = 0
goto pocetak
else
VREME_OBRTA.lowbyte = TMR1L
VREME_OBRTA.HIGHBYTE = TMR1H
TMR1L = 0
TMR1H = 0
GOTO POCETAK
endif
end
hvala
DEFINE OSC 20
define HSER_RXSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 2400
DEFINE HSER_SPBRG 25H
ON INTERRUPT GOTO PREKID
BRZINA VAR WORD
VREME_OBRTA VAR WORD
TRISB = %00000001
VREME_OBRTA = 0
INTCON = 0 ' disable and clear global interrupts, peripheral interrupts
T1CON.1 = 0
T1CON.2 = 1
T1CON.4 = 1 'PRESKALER
T1CON.4 = 1 'PRESKALER
PIR1 = 0 ' clear interupt flags
PIE1 = 1 ' Enable TMR1 overflow interrupt
TMR1H = $00
TMR1L = $00
INTCON = $C0 'OMOGUCI GLOBALNE PREKIDE
T1CON = 1 'UKLJUCI TMR1
Pocetak:
BRZINA = 33901 / VREME_OBRTA
HSEROUT [BRZINA]
goto Pocetak
PREKID:
IF PIR1.0 = 1 THEN
PIR1.0 = 0 'obrisi flag prekida
TMR1L = 0
TMR1H = 0
goto pocetak
else
VREME_OBRTA.lowbyte = TMR1L
VREME_OBRTA.HIGHBYTE = TMR1H
TMR1L = 0
TMR1H = 0
GOTO POCETAK
endif
end
hvala
Re: skraceni kurs ucenja picbasica
Ne valja HSEROUT [BRZINA]
- andrejevica
- Pocetnik na forumu
- Posts: 35
- Joined: 07-03-2011, 18:06
Re: skraceni kurs ucenja picbasica
I kada stavim ' na liniju koda u kome je hserout isto mi ispisuje stalno Stack overflow executing CALL instruction. molim za pomoc.Znaci treba mi merenje vremena na portu b.0 izmedju 2 pozitivne ivice pomocu tmr1.hvala
Re: skraceni kurs ucenja picbasica
Brzina je promenljiva velicine word, tj 16bita.
Kako korisis standardnu komunikaciju 1 bajt ima 8 bita. I ti nikako ne mozes spakovati 16 bita u 8...
Zato se kompajler buni...
Dalje zavisi sta tebi treba, pa ako malo procitas help mozes videti sta ti treba za zeljeni rezultat...
Ukoliko hoces broj u ascii obliku zapisan, onda mozes dodati # ispred promenljive, mozes dodati DEC ili DEC3 itd ispred promenljive itd...
Ako ti trebaju bas 2 bajta onda u h serout stavljas Brzina.highbyte, brzinalowbyte ili byte1 i byte0...
Kako korisis standardnu komunikaciju 1 bajt ima 8 bita. I ti nikako ne mozes spakovati 16 bita u 8...
Zato se kompajler buni...
Dalje zavisi sta tebi treba, pa ako malo procitas help mozes videti sta ti treba za zeljeni rezultat...
Ukoliko hoces broj u ascii obliku zapisan, onda mozes dodati # ispred promenljive, mozes dodati DEC ili DEC3 itd ispred promenljive itd...
Ako ti trebaju bas 2 bajta onda u h serout stavljas Brzina.highbyte, brzinalowbyte ili byte1 i byte0...
Re: skraceni kurs ucenja picbasica
ljudi pozdrav, evo nabavio sam povoljno lcd displej sa linka
http://pdf1.alldatasheet.com/datasheet- ... 50174.html
Pitanje je kako da to uparim sa picom, pedja ak moze par linija koda.
http://pdf1.alldatasheet.com/datasheet- ... 50174.html
Pitanje je kako da to uparim sa picom, pedja ak moze par linija koda.
- andrejevica
- Pocetnik na forumu
- Posts: 35
- Joined: 07-03-2011, 18:06
Re: skraceni kurs ucenja picbasica
Evo prepravio sam malo program i opet ne radi,znaci treba mi proteklo vreme izmedju 2 impulsa na rb0 portu.Koristim 16f628. Molim za pomoc izludecu sto mi ne radi kako treba.Program mi se kompajlira ali kada ga simuliram samo izbacuje greske.
DEFINE OSC 20
define HSER_RXSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 2400
DEFINE HSER_SPBRG 25H
VREME_OBRTA VAR WORD
INTCON.4 = 1 '1 OMOGUCEN PREKID SA PINA RB0/INT
INTCON.1 = 0 '1 DESIO SE PREKID NA PINU RB0/INT
OPTION_REG.7 = 0 '1 RB PULL-UP OTPORNICI SU UKLJUCENI
OPTION_REG.6 = 1 '1 AKO JE OMOGUCEN PREKID NA RB.0 BICE AKTIVIRAN NA RASTUCU IVICU
PIE1.0 = 1 '1 OMOGUCUJE PREKID NA PREKORACENJE TMR1
PIR1.0 = 0 '1 TMR1 REGISTAR JE PREKORACIO VREDNOST
T1CON = 1
ON INTErRUPT GOTO PREKID
Pocetak:
GOTO Pocetak
DISABLE
PREKID:
IF INTCON.1 = 1 THEN 'da li je na pinu rb0 napravljen prekid
VREME_OBRTA.LOWBYTE = TMR1L
VREME_OBRTA.HIGHBYTE = TMR1H
TMR1L = 0
TMR1H = 0
INTCON.1 = 0
ENABLE
RESUME
endif
IF PIR1.0 = 1 AND PIE1.0 = 1 THEN
PIE1.0 = 1
PIR1.0 = 0
TMR1L = 0
TMR1H = 0
ENABLE
RESUME
ENDIF
END
DEFINE OSC 20
define HSER_RXSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 2400
DEFINE HSER_SPBRG 25H
VREME_OBRTA VAR WORD
INTCON.4 = 1 '1 OMOGUCEN PREKID SA PINA RB0/INT
INTCON.1 = 0 '1 DESIO SE PREKID NA PINU RB0/INT
OPTION_REG.7 = 0 '1 RB PULL-UP OTPORNICI SU UKLJUCENI
OPTION_REG.6 = 1 '1 AKO JE OMOGUCEN PREKID NA RB.0 BICE AKTIVIRAN NA RASTUCU IVICU
PIE1.0 = 1 '1 OMOGUCUJE PREKID NA PREKORACENJE TMR1
PIR1.0 = 0 '1 TMR1 REGISTAR JE PREKORACIO VREDNOST
T1CON = 1
ON INTErRUPT GOTO PREKID
Pocetak:
GOTO Pocetak
DISABLE
PREKID:
IF INTCON.1 = 1 THEN 'da li je na pinu rb0 napravljen prekid
VREME_OBRTA.LOWBYTE = TMR1L
VREME_OBRTA.HIGHBYTE = TMR1H
TMR1L = 0
TMR1H = 0
INTCON.1 = 0
ENABLE
RESUME
endif
IF PIR1.0 = 1 AND PIE1.0 = 1 THEN
PIE1.0 = 1
PIR1.0 = 0
TMR1L = 0
TMR1H = 0
ENABLE
RESUME
ENDIF
END
- andrejevica
- Pocetnik na forumu
- Posts: 35
- Joined: 07-03-2011, 18:06
Re: skraceni kurs ucenja picbasica
izbrisao sam slucajno jedan red u gore navedenom kodu .
trisb.0 = 1
trisb.0 = 1
- andrejevica
- Pocetnik na forumu
- Posts: 35
- Joined: 07-03-2011, 18:06
Re: skraceni kurs ucenja picbasica
Kada se program simulira u ISIS 7 pojavljuje se eror
stack overflow executing call instruction
stack overflow executing call instruction
- InTheStillOfTheNight
- Odlično uznapredovao
- Posts: 938
- Joined: 01-06-2006, 17:54
- Location: Zagreb
Re: skraceni kurs ucenja picbasica
Bilo bi možda čudno da se takva greška ne pojavljuje!
Tko u programu gasi globalne prekide i kada se oni gase u gore navedenom programu???andrejevica wrote:DISABLE
PREKID:
InTheStillOfTheNight
- andrejevica
- Pocetnik na forumu
- Posts: 35
- Joined: 07-03-2011, 18:06
Re: skraceni kurs ucenja picbasica
Skinuo sam disable i enable i opet ista greska.greska se pojavljuje samo kada dovedem signal na rb0. Neka mi neko pomogne ako moze,stvarno ne znam zasto ne radi.
- andrejevica
- Pocetnik na forumu
- Posts: 35
- Joined: 07-03-2011, 18:06
Re: skraceni kurs ucenja picbasica
I zanima me kako se iskljucuje WDT jer mi se kontroler resetuje posle odredjenog vremena kada nema signala na rb0. A kad dovedem signal na rb0 krecu errori....