eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › Programowanie AT89Cxx51
Ilość wypowiedzi w tym wątku: 50

  • 11. Data: 2017-02-16 09:18:44
    Temat: Re: Programowanie AT89Cxx51
    Od: Atlantis <m...@w...pl>

    On 16.02.2017 08:40, Zbych wrote:

    > W c nie ma wskaźników na bity. Musisz to rozbić na adres portu (w
    > przestrzeni adresowej __data) i maskę bitową.

    Czyli innymi słowy nie ma możliwości na przekazanie do funkcji, a potem
    przechowanie w strukturze konstrukcji takiej jak P0_2?
    Będę musiał to zrobić tak, jak w AVR-ach? Czyli innymi słowy:

    init(&struktura, &P0, 2);

    wewnątrz tej funkcji adres portu zostanie zapisany w zmiennej
    wskaźnikowej, numer pinu w porcie w zmiennej unsigned char. A potem już
    standardowa operacja:

    key_pressed = !(*port & (1<<pin))

    O to chodzi?


  • 12. Data: 2017-02-20 18:36:12
    Temat: Re: Programowanie AT89Cxx51
    Od: Atlantis <m...@w...pl>

    Mam jeszcze jedno pytanie, dotyczące pamięci RAM w tych MCU.
    Po pierwsze o co dokładnie chodzi o z modelami pamięci (--model-small,
    --model-large) ustalanymi za pomocą flag kompilatora?
    Natknąłem się też na dziwny objaw - po przekroczeniu 128 bajtów w wyniku
    zdefiniowana kilku dodatkowych zmiennych program przestał się
    kompilować, chociaż w tej chwili w makefile mam ustawiony iram na 256
    bajtów (eksperymentuję z AT89C52). Mam rozumieć, że ta druga połowa
    pamięci nie jest bezpośrednio dostępna?


  • 13. Data: 2017-02-20 19:04:57
    Temat: Re: Programowanie AT89Cxx51
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Atlantis" napisał w wiadomości grup
    dyskusyjnych:o8f9ee$on6$...@n...icm.edu.pl...
    >Mam jeszcze jedno pytanie, dotyczące pamięci RAM w tych MCU.
    >Po pierwsze o co dokładnie chodzi o z modelami pamięci
    >(--model-small,
    >--model-large) ustalanymi za pomocą flag kompilatora?
    >Natknąłem się też na dziwny objaw - po przekroczeniu 128 bajtów w
    >wyniku
    >zdefiniowana kilku dodatkowych zmiennych program przestał się
    >kompilować, chociaż w tej chwili w makefile mam ustawiony iram na 256

    kompilowac czy dzialac ?

    >bajtów (eksperymentuję z AT89C52). Mam rozumieć, że ta druga połowa
    >pamięci nie jest bezpośrednio dostępna?

    Tak sobie bezposrednio.
    51 ma 8-bit adresu danych, a gorna polowa przestrzeni zajeta na
    rejestry.

    w 8052 inststrukcje adresujace posrednio (czyli @R0, @R1) dobieraja
    sie do calej pamieci,
    pozostale tryby z adresami 80-FF - do rejestrow.

    http://www.8052.com/tut8052

    MOV R0,#90h ;Set the indirect address to 90h
    MOV A,@R0 ;Read the contents of Internal RAM pointed to by R0

    MOV A,90h ;Reads the contents of SFR 90h (P1)

    Kompilator C musi to jakos respektowac, albo glupoty zrobi :-)

    J.


  • 14. Data: 2017-02-23 08:38:04
    Temat: Re: Programowanie AT89Cxx51
    Od: MKi <e...@t...op.pl>

    > Mam jeszcze jedno pytanie, dotyczące pamięci RAM w tych MCU.
    > Po pierwsze o co dokładnie chodzi o z modelami pamięci (--model-small,
    > --model-large) ustalanymi za pomocą flag kompilatora?

    Model small - wszystkie zmienne, parametry funkcji są alokowane
    w podstawowej pamięci RAM (masz na to 128 bajtów).
    O ile dobrze pamiętam, stos jest w IRAM (czyli górnych 128 bajtach).

    Model large - obiekty te są alokowane w pamięci XRAM
    (zazwyczaj do 64KB). Dostęp do każdej zmiennej poprzedzany
    jest załadowaniem jej adresu do DPTR.
    Stos też jest w XRAM, co bardzo wydłuża jego obsługę.
    Pozdrowienia,
    MKi







  • 15. Data: 2017-02-23 10:20:10
    Temat: Re: Programowanie AT89Cxx51
    Od: Piotr Gałka <p...@c...pl>

    W dniu 2017-02-16 o 08:33, Atlantis pisze:
    > On 14.02.2017 09:31, MKi wrote:
    >
    >> Zerknij do plików nagłówkowych SDCC, np:
    >> __sbit __at (0x87) P0_7
    >>
    >> Jak widać, to jest po prostu liczba, tylko z atrybutami __sbit __at
    >
    > Może to pytanie zabrzmi głupio, ale jak powinna? wyglądać definicja
    > wskaźnika na coś takiego?
    > Chcę mieć funkcję inicjującą strukturę, która będzie przyjmowała jako
    > jeden z argumentów adres pinu (np. &P0_2).
    > Potem ten adres byłby przechowywany właśnie jako zmienna wskaźnikowa
    > wewnątrz struktury.
    >
    Nigdy nie programowałem w assemblerze.
    Nigdy nie programowałem w C mikrokontrolerów.

    Wydaje mi się, że skoro P0_7 jest już samo w sobie adresem pinu (czyli
    wskaźnikiem na pin) to może uda Ci się obejść bez wskaźników na ten
    wskaźnik.
    Warunkiem jest żeby C potrafiło korzystać z rozkazów assemblera z
    adresowaniem bitowym.
    P.G.


  • 16. Data: 2017-02-23 21:07:29
    Temat: Re: Programowanie AT89Cxx51
    Od: Zbych <a...@o...pl>

    W dniu 23.02.2017 o 10:20, Piotr Gałka pisze:
    > W dniu 2017-02-16 o 08:33, Atlantis pisze:
    >> On 14.02.2017 09:31, MKi wrote:
    >>
    >>> Zerknij do plików nagłówkowych SDCC, np:
    >>> __sbit __at (0x87) P0_7
    >>>
    >>> Jak widać, to jest po prostu liczba, tylko z atrybutami __sbit __at
    >>
    >> Może to pytanie zabrzmi głupio, ale jak powinna? wyglądać definicja
    >> wskaźnika na coś takiego?
    >> Chcę mieć funkcję inicjującą strukturę, która będzie przyjmowała jako
    >> jeden z argumentów adres pinu (np. &P0_2).
    >> Potem ten adres byłby przechowywany właśnie jako zmienna wskaźnikowa
    >> wewnątrz struktury.
    >>
    > Nigdy nie programowałem w assemblerze.
    > Nigdy nie programowałem w C mikrokontrolerów.
    >
    > Wydaje mi się, że skoro P0_7 jest już samo w sobie adresem pinu (czyli
    > wskaźnikiem na pin) to może uda Ci się obejść bez wskaźników na ten
    > wskaźnik.
    > Warunkiem jest żeby C potrafiło korzystać z rozkazów assemblera z
    > adresowaniem bitowym.

    Adresowanie bitowe w '51 wymaga podania numeru bitu od razu w rozkazie,
    nie ma trybu adresowania pośredniego przez rejestr.

    Spójrz na przykłady użycia:
    http://www.keil.com/support/man/docs/is51/is51_setb.
    htm
    http://www.keil.com/support/man/docs/is51/is51_clr.h
    tm


  • 17. Data: 2017-02-24 11:01:21
    Temat: Re: Programowanie AT89Cxx51
    Od: Piotr Gałka <p...@c...pl>

    W dniu 2017-02-23 o 21:07, Zbych pisze:
    >> Wydaje mi się, że skoro P0_7 jest już samo w sobie adresem pinu (czyli
    >> wskaźnikiem na pin) to może uda Ci się obejść bez wskaźników na ten
    >> wskaźnik.
    >> Warunkiem jest żeby C potrafiło korzystać z rozkazów assemblera z
    >> adresowaniem bitowym.
    >
    > Adresowanie bitowe w '51 wymaga podania numeru bitu od razu w rozkazie,
    > nie ma trybu adresowania pośredniego przez rejestr.
    >
    Całkiem być może, że nie ogarnąłem sedna zagadnienia.
    Rozumiałem, że:
    Atlantis chce przechowywać wskaźniki na piny. A ponieważ we
    wcześniejszych jego pracach (z innymi procesorami) wymagało to użycia
    jakichś wskaźników w C to teraz też myśli jak zrobić sobie wskaźniki na
    te numerki określające bitowe adresy pinów.
    Z jego wypowiedzi rozumiałem, że dotychczas przechowywał wskaźniki na
    piny, a nie wskaźniki na wskaźniki na piny.
    ---- koniec opisu jak ja to rozumiałem ----

    Chciałem jedynie zwrócić uwagę, że _być_może_ szuka czegoś co ma gotowe,
    że _być_może_ wystarczy posłużyć się (i przechowywać) te bitowe adresy
    pinów.

    > Spójrz na przykłady użycia:
    > http://www.keil.com/support/man/docs/is51/is51_setb.
    htm
    > http://www.keil.com/support/man/docs/is51/is51_clr.h
    tm

    W latach 90-tych napisałem assembler dla 51-ki. Niedawno mnie zmuszono
    aby go przekompilować aby pod Win10 działał. Miałem z tym trochę
    zaskakujących problemów ale się udało.
    Nie pamiętałem oczywiście jak ten adres pinu jest podawany do rozkazu,
    ale nie rozumiem jakie to ma znaczenie.

    Nigdy nie używałem C dla żadnego mikrokontrolera. Wyobrażałem sobie, że
    C musi być trochę rozszerzane pod dany procesor.
    Czyli zakładałem, że w C dla 51-ki powinna być jakaś funkcja
    biblioteczna typu setbit() przyjumująca jako parametr jego adres i
    potrafiąca przetłumaczyć to na assembler nawet jak nie ma adresowania
    przez rejestr.
    P.G.


  • 18. Data: 2017-02-24 11:28:37
    Temat: Re: Programowanie AT89Cxx51
    Od: Zbych <a...@o...pl>

    W dniu 24.02.2017 o 11:01, Piotr Gałka pisze:

    > Nigdy nie używałem C dla żadnego mikrokontrolera. Wyobrażałem sobie, że
    > C musi być trochę rozszerzane pod dany procesor.
    > Czyli zakładałem, że w C dla 51-ki powinna być jakaś funkcja
    > biblioteczna typu setbit() przyjumująca jako parametr jego adres i
    > potrafiąca przetłumaczyć to na assembler nawet jak nie ma adresowania
    > przez rejestr.

    Napiszę najprościej jak potrafię. Numer bitu w setb i clr musi być na
    sztywno wpisany w rozkaz, nie ma możliwości zrobienia z niego parametru.

    Jak chcesz parametryzować, to wracasz do opisywanego wcześniej
    rozwiązania "adres portu + maska bitowa".






  • 19. Data: 2017-02-24 11:38:11
    Temat: Re: Programowanie AT89Cxx51
    Od: Piotr Gałka <p...@c...pl>

    W dniu 2017-02-24 o 11:28, Zbych pisze:
    > W dniu 24.02.2017 o 11:01, Piotr Gałka pisze:
    >
    >> Nigdy nie używałem C dla żadnego mikrokontrolera. Wyobrażałem sobie, że
    >> C musi być trochę rozszerzane pod dany procesor.
    >> Czyli zakładałem, że w C dla 51-ki powinna być jakaś funkcja
    >> biblioteczna typu setbit() przyjumująca jako parametr jego adres i
    >> potrafiąca przetłumaczyć to na assembler nawet jak nie ma adresowania
    >> przez rejestr.
    >
    > Napiszę najprościej jak potrafię. Numer bitu w setb i clr musi być na
    > sztywno wpisany w rozkaz, nie ma możliwości zrobienia z niego parametru.
    >
    Dzięki. W końcu dotarło do mnie :)
    Jakoś nie zauważyłem, że to wymagałoby dynamicznego dopasowywania kodu
    programu w czasie jego pracy :(
    P.G.


  • 20. Data: 2017-02-24 12:06:51
    Temat: Re: Programowanie AT89Cxx51
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Piotr Gałka" napisał w wiadomości grup
    dyskusyjnych:o8p09b$l8c$...@n...chmurka.net...
    W dniu 2017-02-23 o 21:07, Zbych pisze:
    >>> Wydaje mi się, że skoro P0_7 jest już samo w sobie adresem pinu
    >>> (czyli
    >>> wskaźnikiem na pin) to może uda Ci się obejść bez wskaźników na
    >>> ten
    >>> wskaźnik.
    >>> Warunkiem jest żeby C potrafiło korzystać z rozkazów assemblera z
    >>> adresowaniem bitowym.
    >> Adresowanie bitowe w '51 wymaga podania numeru bitu od razu w
    >> rozkazie,
    >> nie ma trybu adresowania pośredniego przez rejestr.
    >
    >Całkiem być może, że nie ogarnąłem sedna zagadnienia.
    >Rozumiałem, że:
    >Atlantis chce przechowywać wskaźniki na piny. A ponieważ we
    >wcześniejszych jego pracach (z innymi procesorami) wymagało to użycia
    >jakichś wskaźników w C to teraz też myśli jak zrobić sobie wskaźniki
    >na te numerki określające bitowe adresy pinów.
    >Z jego wypowiedzi rozumiałem, że dotychczas przechowywał wskaźniki na
    >piny, a nie wskaźniki na wskaźniki na piny.
    >---- koniec opisu jak ja to rozumiałem ----
    >Chciałem jedynie zwrócić uwagę, że _być_może_ szuka czegoś co ma
    >gotowe, że _być_może_ wystarczy posłużyć się (i przechowywać) te
    >bitowe adresy pinów.

    Ale wlasnie nie mozesz.

    Mozesz napisac w C np
    P0_7 = 1
    i miec nadzieje, ze kompilator skompiluje z uzyciem wlasciwych
    rozkazow.

    Ale nie mozesz napisac
    wskaznik = P0_7 ;
    ....
    *wskaznik = 1 ;

    bo ... nie ma takiego rozkazu, ktory moglby kompilator uzyc, aby
    potrafil zaadresowac bit o numerze w jakims rejestrze podanym.

    wiec nie da sie np zrobic funkcji ktora poczeka na nacisniecie
    klawisza,
    cos w rodzaju
    void function wait_for_key(int keynr)
    {
    ....
    }

    (zadziala jako macro)

    Nie da sie tez zrobic petli sprawdzi bity po kolei itp ...

    >Nigdy nie używałem C dla żadnego mikrokontrolera. Wyobrażałem sobie,
    >że C musi być trochę rozszerzane pod dany procesor.
    >Czyli zakładałem, że w C dla 51-ki powinna być jakaś funkcja
    >biblioteczna typu setbit() przyjumująca jako parametr jego adres i
    >potrafiąca przetłumaczyć to na assembler nawet jak nie ma adresowania
    >przez rejestr.

    No i zakladam, ze C jest rozszerzone (w odpowiednio ambitnym
    kompilatorze), i kompilator potrafi to skompilowac ... o ile adres
    jest znany w czasie kompilacji.
    Inaczej, to pozostaja dwie mozliwosci:

    1) przygotowujemy sobie odpowiedni rozkaz w pamieci i wykonujemy go.
    cos typu
    setbit: ; A zawiera nr bitu
    mov setbitr+1, A
    setbitr: setb 0
    ret

    ha, ha - zycze powodzenia na 8051, z jej rozdzielonymi pamieciami
    :-)
    ale jesli system zawiera dodatkowy RAM, ktory bedzie widoczny jako
    pamiec zewnetrzna i programu jednoczesnie, to moze by sie nawet udalo
    (np na tym DScostam z bateryjka).

    2) przygotowujemy sobie siec rozkazow:
    setb 0
    ret
    setb 1
    ret
    setb 2
    ret
    ....

    i wyliczamy sobie to ktorego adresu skoczyc ... imo - niemal
    niedopuszczalne, ale jak trzeba, to trzeba :-)


    J.

strony : 1 . [ 2 ] . 3 ... 5


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: