eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaProgramowanie AT89Cxx51
Ilość wypowiedzi w tym wątku: 50

  • 1. Data: 2017-02-14 08:30:26
    Temat: Programowanie AT89Cxx51
    Od: Atlantis <m...@w...pl>

    Wiem, że mikokontrolery oparte na 8051 powoli wychodzą z mody, ale
    obecnie muszę napisać nowy wsad do istniejącego urządzenia. Nie mam
    zamiaru uczyć się assemblera tej rodziny ani bawić się w BASCOM-ie, więc
    skorzystam z C. W czasach świetności tych MCU powszechnie korzystano z
    kompilatora Keil, ja jednak postawię na SDCC - z tego co widzę,
    podobieństwa są dość spore, przynajmniej na pierwszy rzut oka. Proste
    projekty przykładowe się kompilują.

    Mam jednak kilka pytań:
    1) Widzę, że możliwy jest dostęp do pinów GPIO za pomocą konstrukcji w
    rodzaju Px_y, gdzie x oznacza numer portu, a y numer pinu w porcie.
    Można dzięki temu przypisywać wartość bezpośrednio do pinu, (np.
    P0_1=1). Czym jest taka konstrukcja? Można zdefiniować jakąś zmienną
    wskaźnikową, która umożliwi mi dostęp do tak zdefiniowanego pinu?
    Chciałbym przeportować pewną prostą bibliotekę do obsługi przycisków.
    Dobrze by było, gdybym mógł przekazać informację o pinie właśnie w ten
    sposób, jako argument funkcji, a potem trzymać ją w strukturze
    opisującej przycisk.
    2) Czy możliwe jest korzystanie z portów w sposób taki, jak w AVR-ach?
    To znaczy coś w rodzaju P0 |= (1<<2).
    3) Dobrze rozumiem, że te mikrokontrolery nie posiadają żadnych
    rejestrów konfiguracyjnych, jeśli chodzi o kierunek pinu i działają
    podobnie do prostych ekspanderów I2C?


  • 2. Data: 2017-02-14 09:31:01
    Temat: Re: Programowanie AT89Cxx51
    Od: MKi <e...@t...op.pl>

    -- Wiadomość oryginalna (wysłana 14.02.2017 08:30) --
    > Wiem, że mikokontrolery oparte na 8051 powoli wychodzą z mody, ale
    > obecnie muszę napisać nowy wsad do istniejącego urządzenia. Nie mam
    > zamiaru uczyć się assemblera tej rodziny ani bawić się w BASCOM-ie, więc
    > skorzystam z C. W czasach świetności tych MCU powszechnie korzystano z
    > kompilatora Keil, ja jednak postawię na SDCC - z tego co widzę,
    > podobieństwa są dość spore, przynajmniej na pierwszy rzut oka. Proste
    > projekty przykładowe się kompilują.

    Podstawowa różnica: inna kolejność bajtów w liczbach wielobajtowych.
    >
    > Mam jednak kilka pytań:
    > 1) Widzę, że możliwy jest dostęp do pinów GPIO za pomocą konstrukcji w
    > rodzaju Px_y, gdzie x oznacza numer portu, a y numer pinu w porcie.
    > Można dzięki temu przypisywać wartość bezpośrednio do pinu, (np.
    > P0_1=1). Czym jest taka konstrukcja? Można zdefiniować jakąś zmienną
    > wskaźnikową, która umożliwi mi dostęp do tak zdefiniowanego pinu?
    > Chciałbym przeportować pewną prostą bibliotekę do obsługi przycisków.
    > Dobrze by było, gdybym mógł przekazać informację o pinie właśnie w ten
    > sposób, jako argument funkcji, a potem trzymać ją w strukturze
    > opisującej przycisk.

    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

    > 2) Czy możliwe jest korzystanie z portów w sposób taki, jak w AVR-ach?
    > To znaczy coś w rodzaju P0 |= (1<<2).

    Oczywiście, dokładnie tak samo.

    > 3) Dobrze rozumiem, że te mikrokontrolery nie posiadają żadnych
    > rejestrów konfiguracyjnych, jeśli chodzi o kierunek pinu i działają
    > podobnie do prostych ekspanderów I2C?

    Tu już nie jestem taki pewny, daawno nie programowałem AT89.
    Ale chyba faktycznie nie ma żadnej konfiguracji, stan niski
    to twarde 0, stan wysoki to wysoka impedancja.

    Pozdrowienia,
    MKi






  • 3. Data: 2017-02-14 10:03:24
    Temat: Re: Programowanie AT89Cxx51
    Od: Zbych <a...@o...pl>

    >> 2) Czy możliwe jest korzystanie z portów w sposób taki, jak w AVR-ach?
    >> To znaczy coś w rodzaju P0 |= (1<<2).
    >
    > Oczywiście, dokładnie tak samo.

    Broń Boże. Porty mają do dyspozycji tylko jeden rejestr, który jest
    wejściem (przy odczycie) i wyjściem (przy zapisie). Kompilator może to
    przetłumaczyć na instrukcję bitową albo na odczyt, modyfikację i zapis.
    I wtedy jak z wejścia odczytasz 0 to 0 zapiszesz na wyjście.

    Albo korzystasz tylko z instrukcji bitowych do manipulowania I/O, albo
    musisz dołożyć do tego maskę ustawiającą na 1 bity, które są wejściami.

    P0 |= P0_INPUTS_MASK | (1 << 2);
    P0 = (P0 | P0_INPUTS_MASK) & ~(1 << 2);

    >> 3) Dobrze rozumiem, że te mikrokontrolery nie posiadają żadnych
    >> rejestrów konfiguracyjnych, jeśli chodzi o kierunek pinu i działają
    >> podobnie do prostych ekspanderów I2C?
    >
    > Tu już nie jestem taki pewny, daawno nie programowałem AT89.
    > Ale chyba faktycznie nie ma żadnej konfiguracji, stan niski
    > to twarde 0, stan wysoki to wysoka impedancja.

    Stan wysoki to słaby pullup, co ciekawe wiele '51 na jeden albo dwa
    cykle zegarowe włącza silny pullup przy zmianie stanu z 0 na 1, żeby
    szybciej przeładować pojemności na linii.


  • 4. Data: 2017-02-14 10:55:09
    Temat: Re: Programowanie AT89Cxx51
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "MKi" napisał w wiadomości grup
    dyskusyjnych:58a2c045$0$15193$6...@n...neostrad
    a.pl...
    > Mam jednak kilka pytań:
    > 1) Widzę, że możliwy jest dostęp do pinów GPIO za pomocą konstrukcji
    > w
    > rodzaju Px_y, gdzie x oznacza numer portu, a y numer pinu w porcie.
    > Można dzięki temu przypisywać wartość bezpośrednio do pinu, (np.
    > P0_1=1). Czym jest taka konstrukcja? Można zdefiniować jakąś zmienną

    Maja taki specjalny tryb adresacji - dla wybranych rejestrow i kawalka
    pamieci dostepny jest tryb bitowy.
    Zapisujesz odpowiedna instrukcja i bit sie zmienia.
    Ale ... kompilator musi wiedziec, ze tu jest potrzebna specjalna
    instrukcja.

    >> wskaźnikową, która umożliwi mi dostęp do tak zdefiniowanego pinu?
    >> Chciałbym przeportować pewną prostą bibliotekę do obsługi
    >> przycisków.
    >> Dobrze by było, gdybym mógł przekazać informację o pinie właśnie w
    >> ten
    >> sposób, jako argument funkcji, a potem trzymać ją w strukturze
    >> opisującej przycisk.

    >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

    Przy czym jak tych przyciskow wiecej, to moze byc jednak lepiej
    oblsugiwac to calymi bajtami.

    >> 2) Czy możliwe jest korzystanie z portów w sposób taki, jak w
    >> AVR-ach?
    >> To znaczy coś w rodzaju P0 |= (1<<2).
    >Oczywiście, dokładnie tak samo.

    Ostroznie, tam sa rozne tryby adresacji, i znow trzeba uwazac co
    kompilator z tym zrobi.
    Raczej zrobi dobrze, ale instrukcja
    ORL P0, #01h
    odczytuje rejestr portu wyjsciowego, ustawia najmlodszy bit i zapisuje
    ponownie.

    Instrukcja
    MOV A, P0
    odczytuje stanu pinow portu.
    Jak potem zrobisz
    ORL A,#01h
    MOV P0,A

    To to nie bedzie to samo (patrz nizej).

    >> 3) Dobrze rozumiem, że te mikrokontrolery nie posiadają żadnych
    >> rejestrów konfiguracyjnych, jeśli chodzi o kierunek pinu i działają
    >> podobnie do prostych ekspanderów I2C?

    >Tu już nie jestem taki pewny, daawno nie programowałem AT89.
    >Ale chyba faktycznie nie ma żadnej konfiguracji, stan niski
    >to twarde 0, stan wysoki to wysoka impedancja.

    Dokladnie - rejestry sa jednoczesnie wejsciowe i wyjsciowe.
    tranzystor wyjsciowy "dolny" jest silny, "gorny" slabiutki, a w
    zasadzie to stale pull-up (+ te 2 cykle).
    Jesli ustawisz bit na "0", to wyjscie bedzie na 0, i nie nalezy
    podawac z zewnatrz stanu wysokiego.
    Jesli ustawisz bit na "1", to wyjscie bedzie w stanie wysokim, ale
    slabym (~1mA), mozna z zewnatrz wymusic zero.

    Bity, ktore maja byc wejsciowe, musisz najpierw ustawic na 1.

    J.


  • 5. Data: 2017-02-14 11:24:16
    Temat: [OT] Programowanie AT89Cxx51
    Od: w systemie siła 'PO/EU <N...@g...pl>

    czy jest jakiś tutorialek do SDCC?


  • 6. Data: 2017-02-15 06:16:31
    Temat: Re: Programowanie AT89Cxx51
    Od: Atlantis <m...@w...pl>

    Ok, wielkie dzięki za informacje.
    Mam jeszcze jedną prośbę. Zauważyłem, że MCU8051IDE samo z siebie nie
    potrafi obsługiwać projektów z wieloma plikami. Każdy plik jest
    kompilowany z osobna i przy próbie skompilowania czegoś z funkcjami
    pomocniczymi wyskakuje błąd informujący o braku funkcji main.
    Z tego co wiem, do projektu można jednak podpiąć makefile.
    W najgorszym razie będę go sobie ręcznie kompilował przez make.

    Ktoś z was ma może działający, przykładowy makefile pod sdcc i mcu z
    serii at89cxxxx?


  • 7. Data: 2017-02-15 09:56:50
    Temat: Re: Programowanie AT89Cxx51
    Od: MKi <e...@t...op.pl>

    -- Wiadomość oryginalna (wysłana 15.02.2017 06:16) --
    > Ok, wielkie dzięki za informacje.
    > Mam jeszcze jedną prośbę. Zauważyłem, że MCU8051IDE samo z siebie nie
    > potrafi obsługiwać projektów z wieloma plikami. Każdy plik jest
    > kompilowany z osobna i przy próbie skompilowania czegoś z funkcjami
    > pomocniczymi wyskakuje błąd informujący o braku funkcji main.
    > Z tego co wiem, do projektu można jednak podpiąć makefile.
    > W najgorszym razie będę go sobie ręcznie kompilował przez make.
    >
    > Ktoś z was ma może działający, przykładowy makefile pod sdcc i mcu z
    > serii at89cxxxx?
    >


    Nie używałem SDCC z AT89, więc precyzyjnie Ci nie pomogę,
    ale może coś moje informacje wprowadzą.

    Kompilowałem SDCC na procesorki SiLabs, przy użyciu Silabs IDE,
    do bezpłatnego pobrania ze strony silabs.com
    Cześć dotycząca programowania i debugowania jest oczywiście
    dedykowana do tych procesorów, ale można w tym kompilować
    programy na inne procesory, wystarczy wskazać ścieżkę do SDCC.

    Jakbyś nie chciał walczyć z nowym środowiskiem, to poniżej
    przykład - jakie polecenia wygenerowało IDE dla dwuplikowego
    programu, może ułatwi tworzenie makefile:

    C:\Programy\SDCC\BIN\sdcc.exe -c --debug --use-stdout -V -I"sciezka"
    "sciezka\plik1.c"

    C:\Programy\SDCC\BIN\sdcpp.exe -nostdinc -Wall -std=c99 -I"sciezka"
    -obj-ext=.rel -DSDCC_MODEL_SMALL -DSDCC=260 -DSDCC_mcs51 -D__mcs51
    -I"C:\Programy\SDCC\BIN\..\include\mcs51"
    -I"C:\Programy\SDCC\BIN\..\include" "sciezka\plik1.c"

    C:\Programy\SDCC\BIN\asx8051.exe -plosgffc "plik1.asm"

    C:\Programy\SDCC\BIN\sdcc.exe -c --debug --use-stdout -V -I"sciezka"
    "sciezka\plik2.c"

    C:\Programy\SDCC\BIN\sdcpp.exe -nostdinc -Wall -std=c99 -I"sciezka"
    -obj-ext=.rel -DSDCC_MODEL_SMALL -DSDCC=260 -DSDCC_mcs51 -D__mcs51
    -I"C:\Programy\SDCC\BIN\..\include\mcs51"
    -I"C:\Programy\SDCC\BIN\..\include" "sciezka\plik2.c"

    C:\Programy\SDCC\BIN\asx8051.exe -plosgffc "plik2.asm"

    C:\Programy\SDCC\BIN\sdcc.exe --debug --use-stdout -V -I"sciezka"
    -o"sciezka\plik.hex" "sciezka\plik1.rel" "sciezka\plik2.rel"

    C:\Programy\SDCC\BIN\aslink.exe -nf "sciezka\plik.lnk"

    SDCC jest zainstalowane w C:\Programy\SDCC, projekt w sciezka,
    pliki źródłowe to plik1.c i plik2.c, pliki wynikowe plik.*.

    Pozdrowienia,
    MKi


  • 8. Data: 2017-02-15 13:27:41
    Temat: Re: Programowanie AT89Cxx51
    Od: Marek <f...@f...com>

    On Wed, 15 Feb 2017 06:16:31 +0100, Atlantis <m...@w...pl>
    wrote:
    > Ktoś z was ma może działający, przykładowy makefile pod sdcc i mcu z
    > serii at89cxxxx?

    Ten co Ci wysłałem do pic32 jest uniwersalny, zdefiniuj tylko LD i
    CC.

    --
    Marek


  • 9. Data: 2017-02-16 08:33:55
    Temat: Re: Programowanie AT89Cxx51
    Od: Atlantis <m...@w...pl>

    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.

    Powinienem zdefiniować jakąś specjalną zmienną wskaźnikową, czy
    wystarczy jawne rzutowanie np. na unsigned char *?

    Będę mógł za pomocą takiej konstrukcji sterować pinem?


  • 10. Data: 2017-02-16 08:40:56
    Temat: Re: Programowanie AT89Cxx51
    Od: Zbych <a...@o...pl>

    W dniu 16.02.2017 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.


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


strony : [ 1 ] . 2 ... 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: