Kilka pytań do programowania uC PIC w języku C.



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Grzech" <severyn_at_nospam_go2.pl>
Subject: Kilka pytań do programowania uC PIC w języku C.
Date: Mon, 17 Jan 2005 00:29:35 +0100


Witam!
Jestem w posiadaniu programu na uC PIC12F675. Program ma oczywiście
dołączone includy, a w nich jest kilka definicji, których nie rozumię.
Mianowicie: plik: f675.h posiada takie wpisy:

#bit gpio_0 = 0x05.0
...
#bit gpio_5 = 0x05.5

#bit trisio_0 = 0x085.0
...
#bit trisio_5 = 0x085.5

W programie natomiast, mam przykładowo takie linijki:

(...)
#define red pin_a2
#define out gpio_5 //port sterujacy tranzystorem
main()
{
(...)
pcon=0;
cmcon=7; //porty jako cyfrowe
trisio_5=0;
out=0; //tranzystor wylaczony

Jedncześnie mam dalej w programie np.

output_high(red);
delay_ms(2000);
output_low(red);

Nie wiem czy ktoś odpowie na moje pytania, bo pewnie musiałby mieć includy u
siebie, żeby zobaczyć, no ale spróbuję.

1) Co znaczy definicja np trisio_5 ? Co to jest trisio ? Patrzyłem w manuala
i doszukałem się, że to rejestr za pomocą którego definiować można czy ma
być port wyjściem, czy wejściem. Skoro tak, to dlaczego ktoś, kto tworzył
program akurat tylko pin 5 zdefiniował przez trisio ? Przecież np pin_a2,
też jest wyjściem, skoro daje sygnał na diodę led. Zauwazyłem również, że
inaczej podaje się stany na piny w tych dwóch sposobach (pin_a2 oraz
trisio_5). Dla pinu_a2 jedynkę dajemy przez output_high(red);, a gasimy
output_low(red); W przypadku trisio jest to out=1; i out=0; Jaka jest
różnica w tych dwóch przypadkach ? Poza tym zastanawia mnie, dlaczego port 5
został zdefiniowany jako gpio_5, a nie np. #define out pin_a5 ?

2) Nastepne pytanie to linijki:
pcon=0;
cmcon=7;
Jak rozumieć ten zapis ?

3) I ostatnie pytanie:
Mam dołączony include z obsługą 1-wire (bo to czytnik ROM DS1990). Jest
następujący:

#ifndef TOUCH_PIN
#define TOUCH_PIN PIN_A0
#bit TOUCH_PIN_BIT = 5.0
#endif

(...)

byte touch_write_byte(byte data) { // przy jej pomocy odczytuje się numer
seryjny pastylki Dallas

byte i;

for(i=1;i<=8;++i) {
output_low(TOUCH_PIN);
delay_us(10);
if(shift_right(&data,1,0)) {
output_high(TOUCH_PIN);
if(!TOUCH_PIN_BIT)
return(0);
} else {
output_low(TOUCH_PIN);
if(TOUCH_PIN_BIT)
return(0);

Pytanie brzmi: Co to TOUCH_PIN, a co to TOUCH_PIN_BIT ?
Przepraszam, że tak długaśnie, ale jeśli ktoś będzie mi w stanie
odpowiedzieć na te pytania, to będę wdzięczny. / Pozdrawiam!




Poprzedni Następny
Wiadomość
Spis treści
From: Adam Jurkiewicz <sword_at_nospam_NA_DRZEWO_ajpic.zonk.pl>
Subject: Re: Kilka =?ISO-8859-2?Q?pyta=F1_do_programowania_uC_PIC?=
Date: Mon, 17 Jan 2005 09:37:36 +0100



Jestem w posiadaniu programu na uC PIC12F675. Program ma oczywiście
dołączone includy, a w nich jest kilka definicji, których nie rozumię.
Mianowicie: plik: f675.h posiada takie wpisy:

No to juz jest przesada, żeby pisać w c na 12f ;)

1) Co znaczy definicja np trisio_5 ? Co to jest trisio ? Patrzyłem w manuala
i doszukałem się, że to rejestr za pomocą którego definiować można czy ma
być port wyjściem, czy wejściem. Skoro tak, to dlaczego ktoś, kto tworzył
program akurat tylko pin 5 zdefiniował przez trisio ? Przecież np pin_a2,
też jest wyjściem, skoro daje sygnał na diodę led. Zauwazyłem również, że
inaczej podaje się stany na piny w tych dwóch sposobach (pin_a2 oraz
trisio_5). Dla pinu_a2 jedynkę dajemy przez output_high(red);, a gasimy
output_low(red); W przypadku trisio jest to out=1; i out=0; Jaka jest
różnica w tych dwóch przypadkach ? Poza tym zastanawia mnie, dlaczego port 5
został zdefiniowany jako gpio_5, a nie np. #define out pin_a5 ?

Pomieszanie z poplątaniem, definicje są beznadziejnie zapisane i tyle.
TRISIO - rejestr kierunku portu, adres rejestru 0x85
GPIO - port, adres rejestru 0x05

Możesz sobie wpisywać wartość do tych rejestrów jak Ci się podoba,
albo zapisując cały rejestr albo ustawiając w nim tylko pojedyncze
bity. bit ustawiony na 0 to wyjście, 1 - wejście

2) Nastepne pytanie to linijki:
pcon=0;
cmcon=7;
Jak rozumieć ten zapis ?

Wpisanie wartości do rejestrow procesora, niestety ale manual to musisz
doczytać, bo tam jest wszystko napisane.
CMCON - rejestr komparatora, domyślnie włączony, wartość 0x07 go wyłącza
PCON - rejestr kontroli stanu procersora po resecie

3) I ostatnie pytanie:
Mam dołączony include z obsługą 1-wire (bo to czytnik ROM DS1990). Jest
następujący:
Pytanie brzmi: Co to TOUCH_PIN, a co to TOUCH_PIN_BIT ?

#define TOUCH_PIN PIN_A0

Brak definicji PIN_A0

#bit TOUCH_PIN_BIT = 5.0

Wygląda na bit portu GP0


Pytania o pice możesz kierować tu:

http://www.ekiert.com/cgi-bin/yabb/YaBB.pl?board=pic


sword

--
e-mail: sword_at_nospam_NA_DRZEWO_ajpic.zonk.pl
www: http://ajpic.zonk.pl/
gg#: 1781804

Poprzedni Następny
Wiadomość
Spis treści
From: "Swidr" <masw_at_nospam_wirtualna.polska>
Subject: Re: Kilka pytań do programowania uC PIC w języku C.
Date: Mon, 17 Jan 2005 10:02:54 +0100


Mam nadzieję że nic tam nie pokręciełm ale bawię sie picem trzeci
dzień ;-))

#bit gpio_0 = 0x05.0
#bit gpio_5 = 0x05.5
#bit trisio_0 = 0x085.0
#bit trisio_5 = 0x085.5

Tu z nazwami są kojarzone konkretne bity danych bajtów. Np gpio_5 to
będzie 5 bit bajtu znajdującego sie pod adresem 0x05

#define red pin_a2
#define out gpio_5 //port sterujacy tranzystorem
tu juz dla celów programu żeby łątwiej było zrozumieć o co chodzi
pin_a2 jest wrzucony pod zmienną red - od razu można sie domyślić że
do tego pinu jest podłączona dioda czerwona. Natomiast w zmiennej out
będzie pin portu którym chcemy sterować tranzystor.

main()
{
(...)
pcon=0;
cmcon=7; //porty jako cyfrowe
No tu masz napisane: konfiguruje porty jako cyfrowe

trisio_5=0;
Tu konfiguruje że piąty pin portu będzie outputem.
out=0; //tranzystor wylaczony
a tu wyłącza pin spod zeminnej out (czyli 5 pin portu)

output_high(red);
delay_ms(2000);
output_low(red);
To zapala diodę na 2 sekundy. Mogło by być również zrobione przez

red = 1;
delay_ms(2000);
red = 0;

ale jest zrobione przez dedykowane do zapalania i gaszenia pinu
funkcje, może one robią cos jeszcze oprócz amoego włączania i
wyłaczania pinu.

1) Co znaczy definicja np trisio_5 ? Co to jest trisio ? Patrzyłem w
manuala
i doszukałem się, że to rejestr za pomocą którego definiować można
czy ma
być port wyjściem, czy wejściem. Skoro tak, to dlaczego ktoś, kto
tworzył
program akurat tylko pin 5 zdefiniował przez trisio ? Przecież np
pin_a2,
też jest wyjściem, skoro daje sygnał na diodę led.

trisio to rejestr konfigurujący które piny portu są in a które out. I
akurat ktoś sobie wymyslił że mu pasuje żeby pin 5 był out bo pewnie
domyślnie są in. natomiast pin_a2 (czyii pin 2 portu a) nie jest
konfigurowany bo zdaje się że domyślnie jest out. Aby zmienić pin_a2
na in trzeba by zrobić komendę trisa.2 = 1; (o ile w includzie jest
odpowiednio zdefiniowana nazwa trisa wskazująca na adres rejestru).


Zauwazyłem również, że
inaczej podaje się stany na piny w tych dwóch sposobach (pin_a2 oraz
trisio_5). Dla pinu_a2 jedynkę dajemy przez output_high(red);, a
gasimy
output_low(red); W przypadku trisio jest to out=1; i out=0; Jaka
jest
różnica w tych dwóch przypadkach ? Poza tym zastanawia mnie,
dlaczego port 5
został zdefiniowany jako gpio_5, a nie np. #define out pin_a5 ?

trisio nie jest portem. out jest nazwą pinu portu IO.
#define out pin_a5
to nie jest definicja że pin 5 ma byc typu out. Reszta wyżej.

2) Nastepne pytanie to linijki:
pcon=0;
cmcon=7;
Jak rozumieć ten zapis ?
Było - ustawienie portów w tryb cyfrowy.

3) I ostatnie pytanie:
A tu nie wiem bo nie korzystałem z 1-wire.


Pzdr
Świdr



Poprzedni Następny
Wiadomość
Spis treści
From: "entroper" <entroper_at_nospam_CWD.spamerom.poczta.onet.pl>
Subject: Re: Kilka pytań do programowania uC PIC w języku C.
Date: Mon, 17 Jan 2005 10:49:06 +0100


"Grzech" <severyn_at_nospam_go2.pl> wrote in message
news:cset5k$ptd$1_at_nospam_news.onet.pl...

#define red pin_a2

pin_a[b,c]x sa to predefiniowane w headerach adresy pinow portu
aby pin byl wyjsciem nalezy dodatkowo ustawic rejestr kierunkowy,
lub uzyc funkcji output_low/high, ktora programuje rejestr
kierunkowy sama (ale robi to za kazdym uzyciem) - tak przynajmniej
jest w kompilatorze CCS

2) Nastepne pytanie to linijki:
pcon=0;
cmcon=7;
Jak rozumieć ten zapis ?

to sa wpisy wartosci do rejestrow (rowniez predefiniowanych)
trzeba przekopac sie przez datasheet, zeby wiedziec, co dany wpis
powoduje.

3) I ostatnie pytanie:
Mam dołączony include z obsługą 1-wire (bo to czytnik ROM DS1990).
Jest
następujący:

#ifndef TOUCH_PIN
#define TOUCH_PIN PIN_A0

wybranie pinu 0 portu A na TOUCH_PIN

#bit TOUCH_PIN_BIT = 5.0

zarezerwowanie bitu w RAM do potrzeb programu

pozdrawiam
entrop3r


Poprzedni Następny
Wiadomość
Spis treści
From: "Grzech" <severyn_at_nospam_go2.pl>
Subject: Re: Kilka pytań do programowania uC PIC w języku C.
Date: Mon, 17 Jan 2005 21:14:13 +0100


pcon=0;
cmcon=7;
Jak rozumieć ten zapis ?
to sa wpisy wartosci do rejestrow (rowniez predefiniowanych)
trzeba przekopac sie przez datasheet, zeby wiedziec, co dany wpis
powoduje.

CMCON już rozgryzłem. Teraz PCON: znalazłem coś takiego:


bit 1 POR: Power-on Reset STATUS bit
1 = No Power-on Reset occurred
0 = A Power-on Reset occurred (must be set in software after a Power-on
Reset occurs)
bit 0 BOD: Brown-out Detect STATUS bit
1 = No Brown-out Detect occurred
0 = A Brown-out Detect occurred (must be set in software after a Brown-out
Detect occurs)

Czy w związku z zapisem:
pcon=0;
mam rozumieć, że ustawiam wszystkie bity na 0 ? : czyli: 00000000, stąd mam
włączone funkcje:
0 = A Power-on Reset occurred (must be set in software after a Power-on
Reset occurs)
oraz
0 = A Brown-out Detect occurred (must be set in software after a Brown-out
Detect occurs).
???
Jeśli tak, to prosiłbym o króciutkie wyjaśnienie, co to za opcje i jak
działają, bo widzę, że muszą być ustawione software'owo po zdarzeniu - to
znaczy w jaki sposób się je ustawia.

Przepraszam za lamerskie pytania, ale dopiero zaczynam. / Pozdrawiam



Poprzedni Następny
Wiadomość
Spis treści
From: Adam Jurkiewicz <sword_at_nospam_NA_DRZEWO_ajpic.zonk.pl>
Subject: Re: Kilka =?ISO-8859-2?Q?pyta=F1_do_programowania_uC_PIC?=
Date: Tue, 18 Jan 2005 09:46:31 +0100



Czy w związku z zapisem:
pcon=0;
mam rozumieć, że ustawiam wszystkie bity na 0 ? : czyli: 00000000,

Tak, jakby program był kulturalnie napisany było by 'PCON = 0x00'

stąd mam włączone funkcje:

Nie, to są bity stanu - wynik zadziałania funkcji, a nie jej włącznie.

0 = A Power-on Reset occurred (must be set in software after a Power-on
Reset occurs)

Tym bitem możesz uzyskać informacje czy procek został zresetowany przez
włączenie napięcia czy innym źródłem

0 = A Brown-out Detect occurred (must be set in software after a Brown-out
Detect occurs).

Ten bit daje informację o zresetowaniu procesora przez moduł wykrywania
spadku napięcia 'brown-out', moduł natomiast włącza się w configu bitem
BOREN (lub podobnym)

Jeśli tak, to prosiłbym o króciutkie wyjaśnienie, co to za opcje i jak
działają, bo widzę, że muszą być ustawione software'owo po zdarzeniu - to
znaczy w jaki sposób się je ustawia.

Jak zaczynasz z picami to w ogóle się nie musisz przejmować tymi bitami.
One są potrzebne jak przystosowuje się aplikację do stabilnej pracy
przy wszystkich możliwych sytuacjach krytycznych, typu zanik napięcia
lub reset procesora przez inne czynniki zewnętrzne.

Polecam jeszcze przejrzeć ten wątek:

http://www.ekiert.com/cgi-bin/yabb/YaBB.pl?board=pic;action=display;num=1099516979

sword

--
e-mail: sword_at_nospam_NA_DRZEWO_ajpic.zonk.pl
www: http://ajpic.zonk.pl/
gg#: 1781804