Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Pitanja u vezi tutorijala | Programiranje PIC mikrokontrolera u jeziku C
#81
Evo ti i nekog mog drivera za displej, malo modifikovanog Microchipovog.
Radi na seriji 16F i seriji 18F, samo se inkluduje picXX.h prema korišćenoj seriji PIC.

Čisto kao primer mogućih varijacija na temu. Kada vidiš više načina posle lakše praviš neki svoj.


Attached Files
.c   lcd_m1.c (Size: 2,58 KB / Downloads: 11)
.h   lcd_m1.h (Size: 1,02 KB / Downloads: 8)
.c   delay_m.c (Size: 502 bytes / Downloads: 5)
Reply
#82
@Nacola

ako moze malo objasnjenje

da li treba ovako

1.ako koristim 16f seriju
onda u lcd_m1.c menjam ono #include <pic18.h> sa #include <pic16.h>
ako uradim ovako dobijem gresku u kompajliranju tipa da nema tog file.

lcd_m1.c9 error: (141) can't open include file "pic16.h": No such file or directory

e sad gde je meni taj file i kako da ga nadjem i ubacim?

2. treba li u Source files da bude sledece

test_lcd.c //ovo je moj fajl gde probam displej i on je main
lcd_m1.c //Macola fajl za lcd
delay_m.c //Macola fajl za lcd

3.treba li u Header files da bude sledece

lcd_m1.h //Macola fajl za lcd

ponavljam da sam tek usao u C vode pa zato problemi,ranije sve radio u basicu.
Reply
#83
Heh, evo baš sam malopre kopao po arhivi da nađem stari MPlab koji je imao podršku za seriju 16F (zbog onog pic16F.h), ali mi je to izgleda otišlo sa jednim od "pucanja" kompa. Ne mogu taj fajl brzo naći, a mnogo bi mi vremena trebalo da kopam po bekapovima.

Između ostalog, moja preporuka ti je da pređeš na seriju 18F iz nekoliko razloga:
-cena im je bliska seriji 16F (na primer, mala je razlika u ceni između 16F628 i na primer PIC18F1220-I/P koji je vrlo sličan, ali bogatiji).
-18F serija ima još uvek, a i potrajaće neko vreme, podršku svežih kompajlera.
-18F se linearno adresira, tj. nema posebno adresiranje banaka memorije.
-18F je vrlo obogaćena hardverskim modulima tipa ADC, PWM, USART i tako dalje, gde se rukovanje tim stvarima svodi na par instrukcija.

Probaj da uporediš 16F628 i 18F1220 po broju timera, ADC, mogućnostima PWM, brzinom clk i vidi šta sve dobijaš za manje od 100 dinara razlike, a pin kompatibilni su, tj. možeš umesto tog 16F samo "zabosti" 18F1220 i radiće ti ta novija podrška koju imaš.

-------------------------------
Van toga, u vezi mog lcd_m.c: dovoljno je da uvezeš samo taj fajl naredbom #include "lcd_m.c" u glavni tvoj fajl, i da imaš u projektu među ostalim fajlovima, lcd_m.h i delay_m.c, a njih već "usisava" taj lcd_m.c jer se na njegovom vrhu nalazi već ovo:

Code:
#include    "lcd_m.h"
#include    "delay_m.c"



Inače taj "moj" (Microchip-ov je samo sam dodao par stvarčica) lcd driver u tom obliku radi na B portu.
Ima interesantnu animaciju gde skroluje neki tekst i još par korisnih sitnica.

Sam taj delay_m.c je inače sasvim dobar i tačan, jer je osnova kraćeg delay napisana u asm. Imaš tamo dve delay funkcije:
delay_ms(neka vrednost do FFFF); i delay_10us(neka vrednost do FF);

Bilo gde da uvezeš delay_m.c, i ako ne koristiš lcd driver, radiće ti dobro i možeš je nezavisno koristiti, samo upiši klok procesora na kom radiš. Tako je napisana jer neće zavisiti od kompajlera. Svaki će je dobro prevesti, jedino se može malo razlikovati naredba PROCESSOR_CLK, koja može biti malo drugačija, ali pogledaš uputstvo od kompajlera pa je namestiš da odgovara.

Pozz

P.S.

Inače, serija 18F će ti odmah "raskomotiti" vreme kao stavku, već zbog dvostrukog clk (40MHz kod 1220).

A pogledaj samo koju količinu fleša, rama i eeproma ima na primer ovaj: PIC18F4620-I/P za oko 800din.
Ili na primer 18F4523 sa gomilom ADC od 12bit.
Reply
#84
Zaboravih da napišem oko toga šta treba da radiš sa tim lcd.
Najbolje će ti poslužiti neki gotov primer.

Evo, isčeprkao sam ti neki primer celog programčeta sa korišćenjem funkcija displeja.
Programče je za test inkrementalnih dvofaznih enkodera ili optičkih mernih letvi.
A, B i Z od enkodera ili letve se vezuju na RB4, RB5 i RB6 pinove.
Displej je na D portu pošto je tada upotrebljen 18F452. Taj ima 40 pinova i ima D port.
Jbg. taj primer je bio dovoljno malecki, a ti nabavi jedan komad 18F452 ili 18F4620 i imaćeš alatku koja čita merne letve i enkodere.

Korišćen je HI-TECH picc-18 kompajler i MPLAB 6.

Samo sve ove fajlove strpaš u isti projekat.

Ima u nekim od fajlova još poneka korisna sitnica koja će ti u budućnosti značiti.

Pozz


Attached Files
.c   delay_m.c (Size: 502 bytes / Downloads: 4)
.h   lcd_m1_d.h (Size: 1,02 KB / Downloads: 2)
.c   lcd_m1_d.c (Size: 2,58 KB / Downloads: 2)
.h   enc_test.h (Size: 1,02 KB / Downloads: 7)
.c   enc_test.c (Size: 3,97 KB / Downloads: 4)
.h   uvek.h (Size: 633 bytes / Downloads: 3)
Reply
#85
@Macola

U potpunosti se slazem da je bolje ici na 18F seriju,16F seriju pa npr. 16F628A sam izabrao iz razloga sto su ovo moji prvi koraci u C.Znaci dovoljno je

CMCON = 7;

pa mi je on OK za dalje sa prostim primerima.

E sad da se vratim na LCD,sve ovo sto si mi PRELEPO objasnio je OK.Izgleda da bi to sve radilo ali se javlja problem u kompajliranju sa

delay_m.c

i to u funkciji

void delay_10us(unsigned char del)
{
del2 = del;
#asm //OVAJ DEO CODE NECE DA SE KOMPAJLIRA SVE DO #endasm

movf _del2,f
btfsc status,2
return
GLOBAL _del1
loop_outer:
movlw del_const
movwf _del1
loop_inner:
nop
nop
decfsz _del1
bra loop_inner
decfsz _del2
bra loop_outer
return
#endasm

jednostavno receno kao da ovaj deo sa

assembler code

ne prolazi u kompajliranju

delay_m.c20 error: syntax error
delay_m.c26 error: illegal instruction for this processor
delay_m.c28 error: illegal instruction for this processor

ja sam probao u mesto

#asm
#endasm

nesto ovako i (slicne fore jer sam trazio to u pdf)

_asm
_endasm

ali ne prolazi.

jednostavno svaka linija CODE u assembler code bloku ima uzvicnik u mesto rednog broja linije

da napomenem da koristim

MPLABX
XC8 kompajler v1.30
Reply
#86
Ne koristim MPLABX pa ne znam sintaksu za miksovanje C i asm koda kod njega.

To će morati da ti objasni neko ko koristi MPLABX.

Inače u folderu MPLABX imaš podfolder Docs, gde se nalazi njegov User Guide, takođe i u folderu gde ti je kompajler.
Mora da piše tamo.

Evo na primer, u uputstvu mog kompajlera piše ovo:
---------------------------------------------------
5.11.3 #asm, #endasm and asm()
PIC18 instructions may also be directly embedded in C code using the directives #asm, #endasmand
the statement asm(). The #asm and #endasmdirectives are used to start and end a block of assembler
instructions which are to be embedded inside C code. The asm()statement is used to embed a single
assembler instruction in the code generated by the C compiler. The following example shows both
methods used to rotate a byte left through carry:
unsigned char var;
void main(void)
{
var = 1;
#asm // like this...
movlb (_var) >> 8
rlcf (_var)&0ffh,f
#endasm
// or like this
asm(“movlb (_var) >> 8”);
asm("rlcf (_var)&0ffh,f");
}
When using in-line assembler code, great care must be taken to avoid interacting with compiler-generated code. If in doubt, compile your program with the PICC18 -Soption and examine the
assembler code generated by the compiler.
IMPORTANT NOTE: the #asmand #endasmconstruct is not syntactically part of the C program, and
thus it does notobey normal C flow-of-control rules. For example, you cannot use a #asmblock with an
ifstatement and expect it to work correctly. If you use in-line assembler around any C constructs such as if, while, doetc. they you should use only the asm("")form, which is a C statement and will
correctly interact with all C flow-of-control structures.
------------------------------------------
Mora da ima toga i u tvom uputstvu. Potraži.

Pozz
Reply
#87
(09-19-2014, 12:39 AM)sax778 Wrote: @Macola

U potpunosti se slazem da je bolje ici na 18F seriju,16F seriju pa npr. 16F628A sam izabrao iz razloga sto su ovo moji prvi koraci u C.Znaci dovoljno je

CMCON = 7;

pa mi je on OK za dalje sa prostim primerima.

Vidi drugar,

Veličina i dodatni hardverski moduli na nekom PIC nisu uopšte neka bitna stavka oko reda kojim treba učiti programiranje.

Čist primer za to je sledeće:

-za taj tvoj komad 16F628A je tebi dovoljno CMCON = 7;

-za neuporedivo moćniji 40 pinski 18F452 je dovoljno ADCON1 = 0x07; ili u decimalnom formatu ADCON1 = 7; , sve jedno.

-za još moćniji 18F4620, sa 64K fleša, oko 4K SRAM i oko 1K EEPROM je dovoljno samo ADCON1 = 0x0f; i još CMCON = 0x07; i za tvoj početnički nivo ti se upotreba svodi na isto.

U principu ti moraš na početku da postaviš config za bilo koji i on se ne razlikuje posebno preterano za ova tri navedena. Naravno, obimniji je kod ovih moćnjih, ali opet ništa posebno preterano. Nekoliko config reči više.

Nije u tome poenta učenja od početka.

Mlađe generacije su navikle na lepe i lake alate, koji rade tako što imaju gomilu sažvakanih prečica i njima obezbeđuju veliki broj potrebnih stvari, ali ne sve.
Ukucaš na primer neku sažvakanu instrukciju poput "button" ili slično, zavisno čim raspolaže neka biblioteka u pozadini, dobiješ softverski filter tastera i nemaš pojma šta stoji u pozadini toga.
Sve je to lepo dok ti ne zatreba tako nešto na drugačiji način, ili ti to nešto dođe u konflikt sa nečim drugim što ti je potrebno, e onda zaglaviš jer ne možeš "da živiš" bez te nečije gotove biblioteke...
------------------------

Neuporedivo važnije je da se počne od početka.
Valja početniku da makar jedan samo malo ozbiljniji programčić od blink led napiše baš u asembleru, gde će napraviti nekoliko delay, nekoliko skretanja, skokova, petlji...
Potom kad malo nauči da se bori sa tim, onda napiše bar još nekoliko još složenijih upravo u asembleru.

I za to ti je dovoljan MPASM kog imaš u svakom MPLAB

Posle toga se prelazi na viši jezik.

To je pravilan red učenja. Danas svi misle da im asembler nije potreban, a bilo kojim jezikom da pišeš to završava kao asemblerski kod,potom se opet kompajlira u mašinski.

Dovoljno je nešto pristojnije imati iskustva sa asemblerom i onda nalaženje problema u kodu bude lako.

PIC kontroleri su relativno skoro dobili privilegiju pisanja u višim jezicima.

Evo ti primera jedne vrlo složene mašine za plastiku, koji je napisan 2002. godine, što i nije bilo tako davno, a gde se koristi bootloader (ORG 100h), jedan PWM, I2C komunikacija, LCD, tastatura, itd itd...
Pisan je u asembleru i napisao ga je moj briljantni ortak Mladen, a ja posle nekoliko godina uradio reviziju prema nekim novim potrebama korisnika.
Trebalo mi je 6 godina da ni iz čega postanem sposoban da uradim veću reviziju tog koda.

Mladen je bio čika Zokijeva škola (počivši otac Mikijakg), a ja Mladenova škola i ako sam bio skoro dvostruko stariji od njega.

Tada nije bilo tih lepih gotovih stvarčica gde se piše upola linija koda i lako rešavaju neke stvari.
Pisalo se "peške", u asembleru. Držalo se na stotine informacija istovremeno u glavi. Bila potrebna enormna koncentracija i nije postojao debuger.
Programer je bio jedini debuger :-).


.txt   F20.txt (Size: 64,37 KB / Downloads: 2)

Samo promeni ekstenziju u .asm da bi ti editor lepo "ofarbao" reči.

Forum nema mogućnost za .asm ekstenziju. TDA reaguj :-)

Postupni red učenja je doneo svoje prednosti. Ja sam samo priučeni neprofesionalni programer, koji mnogo stvari ne piše po tipičnom programerskom protokolu, ali mi programi rade kao sat i sasvim pristojno su efikasni za jednog neprofesionalca. A čitav vek sam proveo na realnim aplikacijama koje kontrolišu mašine sa velikim snagama, silama, brzinama, i po ljude opasnim hodovima.
I to sve radi na par stotina vrlo zahtevnih mašina.

U čitavoj svojoj nadriprogramerskoj praksi, verovao ili ne, nisam još ni jedan jedini put uključio debuger. Ne znam čak ni kako se rukuje njim, a i ne tiče me se! Nema boljeg i sigurnijeg debugera od mene samog.
Ta navika me je naučila da pišem pažljivo sa ekstremnim minimumom grešaka.
Da sve vreme stvari budu pod mojom kontrolom.
Radim kao pipe-line kod procesora: jedan deo mozga piše, drugi se vraća nazad i kontroliše. Posle pola sata ću se setiti da sam nešto pogrešno napisao 1000 linija iznad, vratiti se tamo i ispraviti.

To je sve upravo posledica pisanja u asembleru nekad. Steknu se navike koje povećavaju sigurnost i optimalnost pisanja. Praktično je to model razmišljanja koji je kasnije vrlo zahvalan.
Kad naučiš da voziš raspadnutog "Fiću", posle je sa bilo kojim boljim autom lako...

To je ispravan red učenja.

Sam gabarit MCU nije bitan.

Pozdrav

Još nešto, dok nisam zaboravio.

Čini mi se da si jednom prilikom rekao da si pisao u Basic...

Veruj mi da jezik kojim pišeš nema veze sa programerskim znanjem.
Svaki od tih jezika ili metajezika ima svoja mane i prednosti, nema savršenih.

Evo na primer neke poluautomatske sekvence mašine, napisane u metajeziku Forth (u kome je pokojni Zoki bio car):
Code:
: pauto-seq ( -- )
\ Poluautomatska sekvenca
  toff clrerr  \ clear error message
  imera pp + @ to mera .mera
  mera n / to mera/n \ deo mere
\ Ovde se podrazumeva da su zadate mere prvi parametri!
  0 spok ! ssil silos !
  begin
    pauto-wait  start? if napuni isprazni else isprazni then
  again ;

Izgleda tako jednostavno i ima samo nekoliko linija teksta, a u stvari je čitav program unutra.

Ovo bi se u C moralo napisati sa mnooogo linija koda, međutim, ono što se ne vidi su definicije koje stoje ispred ovog i koje sadrže mnogo linija koda.

Konačni izraz je u Forth jednostavan i kompaktan, ali ukupna količina pisanja je slična.
Neke mogućnosti koje Forth ima su pravi luksuz za C, dok pak C ima neke olakšice za rad i lakši je za reverzno dekodovanje.
Sve je to slično i na kraju završava kao asm...

Pozz
Reply
#88
ima li neko neke lib. za USART  PIC16F seriju koja radi u XC8 kompajleru.Ona koja vec postoji u XC8 je vise za 18F seriju.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)