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

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!

Reply to
Grzech
Loading thread data ...

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

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

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

Brak definicji PIN_A0

Wygląda na bit portu GP0

Pytania o pice możesz kierować tu:

formatting link

sword

Reply to
Adam Jurkiewicz

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

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

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.

No tu masz napisane: konfiguruje porty jako cyfrowe

Tu konfiguruje że piąty pin portu będzie outputem.

a tu wyłącza pin spod zeminnej out (czyli 5 pin portu)

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.

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).

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.

Było - ustawienie portów w tryb cyfrowy.

A tu nie wiem bo nie korzystałem z 1-wire.

Pzdr Świdr

Reply to
Swidr

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

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

wybranie pinu 0 portu A na TOUCH_PIN

zarezerwowanie bitu w RAM do potrzeb programu

pozdrawiam entrop3r

Reply to
entroper

CMCON ju¿ rozgryz³em. Teraz PCON: znalaz³em co¶ takiego:

- - - - - - notPOR notBOD

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

Reply to
Grzech

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

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

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

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)

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:

formatting link
sword

Reply to
Adam Jurkiewicz

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.