Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

dsPIC podstawy programowania w C dla tej rodziny

drejas_tcz 20 Lut 2010 20:03 1648 6
  • #1 20 Lut 2010 20:03
    drejas_tcz
    Poziom 8  

    Witam!

    Moja pytanie dotyczy prawdopodobnie nie tylko tej rodziny mikrokontrolerów, a pytanie jest następujące:

    W jaki sposób podzielić port wyjściowy, np. B, który jest 16-bitowy, na 2 oddzielne (wirtualne, używane przeze mnie) porty 8-bitowe. Innymi słowy, normalnie, jak wyślę liczbę 255 na port B, to będzie to tak:

    PORTB=255; //wynikiem będzie 00000000 11111111

    A ja chcę wysłać tą liczbę jedynie na starsze bity. I wiem, że mogę zrobić:

    PORTB=0xFF00; // 11111111 00000000

    ale to nie o to chodzi. Chcę jakąś funkcję, którą mogę wpisać liczbę na ileś konkretnych pinów portu, np. PORTB(15:8), PORTB(12:5), itd, itp... Mam nadzieję, że w miare udało mi się wytłumaczyć o co mi chodzi, proszę o pomoc, bo nie mogłem tego znaleźć...

    0 6
  • Pomocny post
    #2 20 Lut 2010 20:53
    CDMaster
    Poziom 14  

    Zrób sobie pole bitowe jakie sobie chcesz (wiki), a potem rzutuj sobie PORTB na ten typ danych lub zrób wskaźnik tego typu i przypisz mu wartość PORTB.

    0
  • #3 21 Lut 2010 09:00
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Zamiast robić pola bitowe to poczytaj o podstawach C (hint - "rotacja" i "maskowanie");

    4\/3!!

    1
  • #4 24 Lut 2010 14:41
    drejas_tcz
    Poziom 8  

    Freddie chyba nie zrozumiałeś mojego pytania, rotacja i maskowanie nic tutaj nie da, bo na drugie 8 pinów też chce przesyłać lub odbierać jakieś informacje. Chociaż możliwe też, że ja nie zrozumiałem Twojej odpowiedzi :)

    Rozwiązanie CDMaster'a pomogło!! Dziękuję bardzo!!

    Jednak dla tych, którzy w przyszłości będą tego szukać w necie, napiszę kod, żeby wiedzieli o co mu chodziło :)

    so...

    Najpierw tworzymy sobie plik nagłówkowy, np. "haha.h"
    W pliku tym piszemy:

    Code:

    struct PORT{
       unsigned int dol:8;
       unsigned int gora:8;
    };



    Oczywiście można to też napisać u góry nad funkcją main w głównym pliku *.c

    Następnie w naszym pliku program.c w main'ie piszemy

    Code:

    struct PORT *portB=&PORTB;


    W ten sposób stworzyliśmy wskaźnik, czyli to o czym mówił CDMaster.

    I na koniec, jak tego używać?

    Code:

    portB->dol=0x37;  //podajemy 8-bitow na mlodsze bity portu B
    portB->gora=0xAF; //i 8 bitow na starsze bity portu B


    ENJOY! Pozdrawiam!

    0
  • Pomocny post
    #5 24 Lut 2010 14:44
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Brawo! Tyle się napisałeś zamiast zrobić po prostu:

    PORTB &= ~0xFF;
    PORTB |= <dol>;

    albo

    PORTB &= ~(0xFF << 8);
    PORTB |= <gora> << 8;

    Zapisać w postaci makra/funkcji i gotowe, bez żadnych syfiastych pól bitowych.

    4\/3!!

    0
  • #6 25 Lut 2010 00:35
    drejas_tcz
    Poziom 8  

    Dlaczego od razu tak nie napisałeś? pomógł byś bardziej. Co to za pomoc, jeżeli piszesz, że mam sobie pomóc sam? :) Tak czy siak dziękuję Wam obu bardzo za zainteresowanie i odpowiedzi!

    0
  • #7 25 Lut 2010 07:12
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Napisałem przecież, że chodzi o "maskowanie" i "rotację". Wędka to zbyt mało? Koniecznie musi być usmażona i podana na talerzu rybka? A co z samodzielnością, chęcią nauki i poszerzania wiedzy? Jeśli szukasz gotowców które można wkleić i użyć w sposób bezrefleksyjny to zwykle takich nie daje.

    4\/3!!

    0