Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Pitanja u vezi tutorijala | Programiranje PIC mikrokontrolera u jeziku C
#61

Da li ima USBurn8 ili 9 debuger i podrsku za Mplab X ili neki slican besplatan SW?

Reply
#62
<p>Ako se ne varam, najnoviji firmware podržava.</p>
Mali izgubljeni vanzemaljac, 3.000.000.000.000.000 svetlosnih godina udaljen od svog doma
Reply
#63

To bi bilo fino ako je podrzan u Mplab X.

Nego vidim jednu veliku manu, ne podrzava PIC10, PIC12 i PIC16 serije!!!

A i ove sto podrzava serije su vrlo probrane, nema npr PIC18F2550, dsPIC33EP128MC502 ...

Reply
#64
<p>Podržava i te kako: ein USB-Programmiergerät für 40-/28-/20-/18-/14- und 8-pin Flash-PICs<br>
PIC10Fxxxx, PIC12Fxxxx, PIC16Fxxxx, PIC18Fxxxx, dsPIC30Fxxxx</p>
<p><a data-ipb='nomediaparse' href='http://www.sprut.de/electronic/pic/projekte/brenner8/index.htm'>http://www.sprut.de/electronic/pic/projekte/brenner8/index.htm</a></p>
Mali izgubljeni vanzemaljac, 3.000.000.000.000.000 svetlosnih godina udaljen od svog doma
Reply
#65

Aha to je za USBurn8, ovaj USBurn9 je drugaciji.

Reply
#66
<p>Sve je to isto.</p>
Mali izgubljeni vanzemaljac, 3.000.000.000.000.000 svetlosnih godina udaljen od svog doma
Reply
#67
Da li neko moze da mi malo razjasni kad se koristi ovakav tip funkcije:
int moja_funkcija() //primer funkcije

a kad ovako:
moja_funkcija() //primer funkcije

koja je razlika itd.

posto sam ranije sve radio u PBP-u a pokusavam da predjem na C

koristim MPLABX
XC8 kompajler
Reply
#68
Pa prakticno imas 3 ovakva slucaja:

Code:
1) prototip
int moja_funkcija (int ulazna_variabla);

2) definicija
int moja_funkcija (int ulazna_variabla) {
    //telo funkcije
    //neki code ovde
}

3) upotreba
rezultat = moja_funkcija (123);


Pod 1 je tkz definicija prototipa funkcije. To je vise potrebno samom kompajleru nego tebi, moze da se izbaci ali je pozeljno da se ima.
Pise se isto kao i sama funkcija ali nema telo funkcije. Tu se navodi kog tipa je podatak koji se vraca (onaj prvi int) i koje su ulazne varijable i kojeg tipa (ono sto ide u zagradi). Prototip mora da se poklapa po svim argumentima sa kasnijom konkretnom definicijom te funkcije.

Pod 2 je klasicna definicija funkcije koja radi nesto konkretno. Isto i kao kod prototipa, imas definiciju tipova potaka koji izlaze i ulaze u funkciju ali ovog puta ima i telo funkcije u kojoj pises dodatni code.

Pod 3 je upotreba funkcije. Npr, variabli "rezultat" dodeljujes ono sto je funkcija vratila a ulazni parametar u funkciju (argument) je broj 123.

Funkcije mogu a ne moraju da imaju povratnu niti ulaznu vrednost i onda se koristi "void" (npr umesto int) kod prototipa i naravno definicije.
Reply
#69
Da li neko moze da mi malo pomogne?

znam da je ovaj program mogao da se napise prostije,ali ja sam hteo malo da vezbam sa pozivanjem FUNKCIJA.Postavi cu deo CODE sa funkcijama bez pocetnog dela gde su #define,#pragma i sl.

ovako napisan CODE radi

void funk_d(void){
while(1){
led_d = 1;
//KAKO SE NPR. ODAVDE VRATITI U MAIN FUNKCIJU
}
}

void funk_c(void){
while(1){
led_c = 1;
if(tst_d == 0){led_c = 0;funk_d();}
}
}

void funk_b(void){
while(1){
led_b = 1;
if(tst_c == 0){led_b = 0;funk_c();}
}
}


void funk_a(void){
while(1){
led_a = 1;
if(tst_b == 0){led_a = 0;funk_b();}
}
}


void main(void) {

//Opsta konfiguracija
CMCON = 7; //iskljuci komparator

TRISB = 0b00001111; //Konfiguracija za Port B
PORTB = 0;

while(1){
if(tst_a == 0) funk_a();
}

}

sta je problem:
ako pozovem npr. neku funkciju koja je fizicki ispod FUNKCIJE iz koje pozivam

PRIMER:

void funk_c(void){
while(1){
led_c = 1;
if(tst_d == 0){led_c = 0;funk_b();} //funk_b je fizicki napisana
} //ispod ove
}

u kompajliranju dobijem greske tipa:

main.c:52: warning: (361) function declared implicit int
main.c57 error: (984) type redeclared
main.c57 error: (1098) conflicting declarations for variable "funk_a" (main.c:57)

nadam se da sam objasnio problem pa ako moze neka pomoc kako se to resava posto sam pocetnik u C.

koristim
MPLABX
XC8
Reply
#70
PHP Code:
void funk_c (void) {

    while(
1){
        
led_c 
        
if (tst_d == 0) {
            
led_c 0;
            
funk_b();
        } 
    } 
    
    
//funk_b je fizicki napisana     
    //ispod ove


BTW: Pise PHP code iznad, to sam izabrasao samo da bi bilo preglednije i u boji. Popravicu to kad stignem u konfiguraciji foruma da vazi i za C/C++ code.

U ovom primeru moras da koristis prototip funkcije za funk_b() jer je koristis pre nego sto si je definisao (odnosi se na fizicki redosled pisanja code-a).
Samo zamisli kompajler sta ovde radi, ide redom liniju po liniju i gleda sta treba da prevede u masinski code i naidje na funk_b() i dolazi do zakljucka "uh pa ja nemam to definisano, ne mogu dalje, error"!
Kada se koristi prototip ti njemu dajes do znanja "ej bice to negde dole definisano, ne luduj. Ok zapamticu to za kasnije" Smile

Takodje da si definisao funk_b() pre nego sto si je upotrebio nebi bilo greske i to je slucaj kad ne mora da se koristi prototip. Posto to cesto zna da bude problem kad si koju definisao i upotrebio (posebno kad se program razvuce u vise posebnih fajlova), uvek je sigurnije da radis sa prototipovima koje napises negde gore na pocetku programa i nemas problema.

I da, ne mozes da definises funkcije niti prototipove u nekoj drugoj funkciji, to mora da bude nezavisno, "stand-alone".
Opet zamisli sta bi kompajler tu zakljucio, "aha evo usao sam u funkciju i gle sad moram da definisem neku funkijcu ali ce da definicija iznova da se svaki put desava kada se ova 'tata' funkcija pozove".
Kada bi te pustio da to uradis (naravno nece, prijavice error) zavrsio bi na cuvenom sajtu http://stackoverflow.com sa nekim pitanjima jer bi ti se prepunio stack posle 10ak takvih prolaza i sve bi se zaglavilo Smile
---

Sto se tice povratka iz funkcije, kada se izvrsi poslednja linija pre zatvorene velike zagrade "}" tad se program vraca odakle je i usao u tu funkciju. Zavisno od definicije, ako si rekao da ta funkcija ne treba da vrati nikakav rezultat, nista specialno, napises koju god hoces narednu i to je to, ali ako si definisao da funkcija vraca neki podatak onda MORAS da koristi "return xyz;" iskaz.

C/C++ je vrlo rigorozan po pitanju definicije varijabli / funkcija i moras da ispostujes tj da se sve poklopi u svim delovima sto ukljucuje ulazne/izlazne tipove varijable kako kod upotrebe tako i kod definicije funkcija i prototipova. Neki drugi jezici su mnogo fleksibilniji po tom pitanju ali C/C++ je takav i to se zove "strong typing"
http://en.wikipedia.org/wiki/Strong_and_weak_typing
Reply
#71
Osim Mikijevog izvsnog komentara oko prototipa, na tvoje prvo pitanje kako se vratiti u main:

Ako bilo gde napišeš:

Code:
while(1){ //radi telo petlje ako je uslov istina, inace idi na liniju ispod donje viticaste zagrade
  nesto_radis; //radis nesto tamo
}  //vrati se na ispitivanje uslova while petlje (gore je uslov uvek istina,dakle zauvek)
neki_kod_ispod;  //neki kod ispod, ma sta to bilo, koji se nikada nece izvrsiti

, onda ćeš to nesto_radis raditi zauvek pošto ništa ne menja uslov (1) ili citaj (uvek istina) u while petlji.

Jedini moguć način da raskineš while petlju bez obzira na ispunjenost uslova, u C je naredba break;

Ovako na primer:

Code:
while(uslov){  //radi telo petlje ako je uslov istina, inace idi na liniju ispod donje viticaste zagrade
  radis_nesto;  //radis nesto tamo
  break;          //raskini while petlju i idi na prvu liniju ispod viticaste zagrade
}                   //ne pitaj uslov posto je break raskinuo while petlju
neki_kod_ispod; //sada ce se vec ovo raditi, ma sta to bilo

Naravno, možeš u telu while petlje da promeniš njen sopstveni uslov, ako je on neka varijabla, i da ga napraviš neistinitim.
U tom slučaju će po izvršenju tela while biti raskinuta jer je uslov za njen "opstanak" neistinit, i uradiće prvu liniju ispod donje vitičaste zagrade.

Break je naredba koja raskida while, do while i for petlje bez obzira na stanje njihovih uslova, tj. nasilno raskidanje petlje.

Pozz

P.S.

Na primer nešto ovako while(1); tako bez tela znači zakucaj se tu.
Posle ovoga pomaže samo hardverski reset, a i on za kratko jer će po butovanju opet stići do te linije i u njoj zauvek raditi ništa.
Sav kod ispod toga postaje beskoristan.
Reply
#72
ima li neko neki primer CODE za 2 x 16 LCD i 16F seriju PIC.
XC8.
Na netu nema neki dobar primer ili ja ne mogu da natrcim.

Ovo bi mi bio prvi pokusaj u C da tako nesto probam.

kad bi Miki nastavio onaj tutorial bilo bi sigurno lakse...
Reply
#73
Evo poslao sam ti svoju staru biblioteku. Nije savrsena ali radi
Nisam koristio busy flag tako da sta je tu je.
Ako treba samo da prikazes nesto na lcd-u, koristice.

Kod funkcije lcd_clear() na kraju sam stavio delay. Taj delay verovatno mozes da smanjis dosta. Davno sam je pravio pa se ne secam.

Moras da pazis, da u define na pocetku biblioteke stavis LAT registar ako PIC ima te registre. A ako nema onda PORT.

Dokumentu moras da promenis ekstenziju iz .txt u .h
Forum mi nije dao da uploadujem .h


Code:
lcd_init();
    lcd_clear(all);
    __delay_ms(100);               // nije potreban ovaj delay
    lcd_send(cursor_blink_off);

    lcd_goto(0,0);
    lcd_out(" Adjust Current ");
    lcd_goto(0,1);
    lcd_out( "     0.000A     ");


Attached Files
.txt   HD47780.txt (Size: 3,51 KB / Downloads: 7)
Reply
#74
HVALA,
probacu da vidim da li cu se snaci.
Reply
#75
(09-13-2014, 09:43 AM)Risto Wrote: Dokumentu moras da promenis ekstenziju iz .txt u .h
Forum mi nije dao da uploadujem .h

Dodata .h ekstenzija u attachmente. Smile
Face up...make your stand and realise you're living in the golden years!
Reply
#76
moglo bi i .c Big Grin
Reply
#77
Dodata i .c ekstenzija. Smile
Ako kojim slučajem neko želi da okači neki faj čija ekstenzija nije dozvoljena to može učiniti tako što će ga spakovati u .rar ili .zip ...
Face up...make your stand and realise you're living in the golden years!
Reply
#78
@Risto

da li ovaj file ubacujem kao

Header file ili...?

a pozivam ga u

main.c
ovako
#include <HD47780.h>
Reply
#79
Da tako je, ubacis u folder od projekta.
Inkludujes na pocetku programa

#include "HD47780.h"

U tom header fajlu moras da promenis onaj deo sa latb i trisb registrima. Tu ces da napises za svaki pin na lcd-u (RS, EN, D4...) onaj za koji si vezao na MCU.

Moras da vidis u datasheetu MCU koji koristis. Koje registre koristi za pisanje na port pinovima. Ako se u datasheetu pominje LAT registar onda ce ostati ovako, a ako se pominje samo PORT registar onda u svakom redu umesto npr:

#define RS LATBbits.LATB4
ide:
#define RS PORTBbits.RB4

ili PORTC onda:
#define RS PORTCbits.RC4

ista stvar i za tris.

Jedino jos mozda moras da pogledas da li pinove na koje si nakacio lcd imaju analogne funkcije pa moras njih da deaktiviras pre koriscenja.

to resava resetovanje
ANSEL, ANSELH.
ili
ANSELA,ANSELB itd po portovima.

Nisam siguran na kojoj familiji picova je koja kombinacija.

P.S. chip na lcd-u nije hd47780 kako pise u naslovu biblioteke, nego hd44780 Big Grin
Reply
#80
u pitanju je za probu

PIC 16F628A

CMCON = 7; //dec vrednost za off

#define RS PORTBbits.RB4
#define EN PORTBbits.RB5
#define D4 PORTBbits.RB0
#define D5 PORTBbits.RB1
#define D6 PORTBbits.RB2
#define D7 PORTBbits.RB3

#define TRIS_RS TRISBbits.RB4
#define TRIS_EN TRISBbits.RB5
#define TRIS_D4 TRISBbits.RB0
#define TRIS_D5 TRISBbits.RB1
#define TRIS_D6 TRISBbits.RB2
#define TRIS_D7 TRISBbits.RB3
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)