skraceni kurs ucenja picbasica

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
User avatar
WhiteHead
Pravi forumaš
Pravi forumaš
Posts: 1625
Joined: 28-06-2007, 18:36
Location: 75,35k; B&H

Re: skraceni kurs ucenja picbasica

Post by WhiteHead »

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.
Ako kaniš pobijediti, ne smiješ izgubiti
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: skraceni kurs ucenja picbasica

Post by InTheStillOfTheNight »

hvarovic wrote: pokušavam to riješiti s pauzama ali izgleda da mi program ne ide dalje dok se ne završi pauza :?
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.

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;
        }
    }
}
Jedino moraš obratiti pozornost da ti Button() mora imati debounce. (To nije prikazano u gore navedenom programu)
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: skraceni kurs ucenja picbasica

Post by InTheStillOfTheNight »

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
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: skraceni kurs ucenja picbasica

Post by InTheStillOfTheNight »

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...
InTheStillOfTheNight
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: skraceni kurs ucenja picbasica

Post by InTheStillOfTheNight »

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
Dakle my_button je varijabla koja upravlja grananjem programa, i ovo je identičan primjer onoga što je napisano u C-u. Tamo sam naveo da je na tipkalu potrebno napraviti debounce. U logici programa bitno je znati da postoji samo jedna delay naredba i ona jedina koči ostali program, pa vrijeme izvršavanja ostalog programa ignoriramo. My_button je prikazan kao varijabla, no u programu za ovu svrhu mora se osigurati debounce na tom uvijetu, a ako to ne znate onda ću i to dodati.

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
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: skraceni kurs ucenja picbasica

Post by InTheStillOfTheNight »

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
hvarovic
Posts: 7
Joined: 08-05-2011, 23:32

Re: skraceni kurs ucenja picbasica

Post by hvarovic »

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
Ako imam kakvih grešaka molio bih da me se upozori jer sam u ovome totalni pocetnik. Ne trebate žuriti s odgovorima jer me ovih dana nece biti u zagrebu pa se ne mogu niti baviti programiranjem. vjerojatno postoji i lakši način od ovoga što je meni ispalo, ali isprobao sam ga na exp ploči i normalno mi radi. nekad davno sam radio neke programe u C-u i nije mi bilo problem skuziti o cemu se ovdje radi. hvala jos jednom na pomoci.
mbocan
Pocetnik na forumu
Pocetnik na forumu
Posts: 28
Joined: 29-09-2011, 20:08

Re: skraceni kurs ucenja picbasica

Post by mbocan »

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.
mbocan
Pocetnik na forumu
Pocetnik na forumu
Posts: 28
Joined: 29-09-2011, 20:08

Re: skraceni kurs ucenja picbasica

Post by mbocan »

sada sam vidio da se numerik moze procitati u hexa dijelu icprog_a;
:wink:
User avatar
andrejevica
Pocetnik na forumu
Pocetnik na forumu
Posts: 35
Joined: 07-03-2011, 18:06

Re: skraceni kurs ucenja picbasica

Post by andrejevica »

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
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7873
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

Ne valja HSEROUT [BRZINA]
User avatar
andrejevica
Pocetnik na forumu
Pocetnik na forumu
Posts: 35
Joined: 07-03-2011, 18:06

Re: skraceni kurs ucenja picbasica

Post by andrejevica »

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
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7873
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: skraceni kurs ucenja picbasica

Post by pedja089 »

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...
atom1
Pocetnik na forumu
Pocetnik na forumu
Posts: 36
Joined: 12-09-2011, 22:58

Re: skraceni kurs ucenja picbasica

Post by atom1 »

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.
User avatar
andrejevica
Pocetnik na forumu
Pocetnik na forumu
Posts: 35
Joined: 07-03-2011, 18:06

Re: skraceni kurs ucenja picbasica

Post by andrejevica »

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
User avatar
andrejevica
Pocetnik na forumu
Pocetnik na forumu
Posts: 35
Joined: 07-03-2011, 18:06

Re: skraceni kurs ucenja picbasica

Post by andrejevica »

izbrisao sam slucajno jedan red u gore navedenom kodu .
trisb.0 = 1
User avatar
andrejevica
Pocetnik na forumu
Pocetnik na forumu
Posts: 35
Joined: 07-03-2011, 18:06

Re: skraceni kurs ucenja picbasica

Post by andrejevica »

Kada se program simulira u ISIS 7 pojavljuje se eror
stack overflow executing call instruction
User avatar
InTheStillOfTheNight
Odlično uznapredovao
Odlično uznapredovao
Posts: 938
Joined: 01-06-2006, 17:54
Location: Zagreb

Re: skraceni kurs ucenja picbasica

Post by InTheStillOfTheNight »

Bilo bi možda čudno da se takva greška ne pojavljuje!
andrejevica wrote:DISABLE
PREKID:
Tko u programu gasi globalne prekide i kada se oni gase u gore navedenom programu???
InTheStillOfTheNight
User avatar
andrejevica
Pocetnik na forumu
Pocetnik na forumu
Posts: 35
Joined: 07-03-2011, 18:06

Re: skraceni kurs ucenja picbasica

Post by andrejevica »

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.
User avatar
andrejevica
Pocetnik na forumu
Pocetnik na forumu
Posts: 35
Joined: 07-03-2011, 18:06

Re: skraceni kurs ucenja picbasica

Post by andrejevica »

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....
Post Reply