INSTRUKCJA OBSŁUGI

SAPER-UNO

Okolicznościowa, eksperymentalna płytka rozwojowa by ELEKTRON

  1. Instalacja oprogramowania i sterowników

1) Jeśli żyłeś pod kamieniem przez ostatnie 10 lat, nigdy nie używałeś chińskich klonów arduino, tanich kabli USB-UART, to musisz zainstalować sobie na komputerze sterownik dla układu CH340. Jest to układ do komunikacji szeregowej UART za pośrednictwem USB.

Jeśli poprawnie zainstalowałeś sterownik, to płyka po podłączeniu powinna być widoczna w menedżer urządzeń. Zanotuj dokładnie, który to jest port COM.

2)Potrzebujemy kompilator 8051 Najpopularniejszym jest KEIL 51. Występuje on w dwóch wariantach licencyjnych:

Keil MDK Community Edition: Darmowa do użytku niekomercyjnego, zapewnia pełne środowisko programistyczne z kompilatorem C51, ale ma limit rozmiaru kodu 2kB. = czytaj: Dodamy na początek do Twojego każdego wsadu puste miejsce rozmiaru 2kB i dopiero po nim się rozpocznie właściwy kod maszynowy = nie zmieści się na niczym poniżej 2kB

Nie, nie jest możliwe po prostu podmienienie instrukcji 02 08 00
(skok pod adres 0x0800) na coś bliższego. W kodzie jest więcej takich skoków i trzeba by je uwzględnić. Nie przeszkadza to na urządzeniach z pamięcią ROM od 2KB do 64KB (i więcej)

PK51 Professional Developer's Kit : Wersja dla firm, jak chcą z tego robić kasę. Tak na dzień dobry trzeba wyskoczyć z $3300 USD a w promocji 2600 ojrosów. Ograniczeń żadnych, ale cena zrzuca z nóg.

ROZWIĄZANIE PROBLEMU LICENCJI

1) Olać frajerów i korzystać z darmowego kompilatora SDCC

https://sdcc.sourceforge.net/ - Uwaga! Składnia kodu wygląda wtedy trochę inaczej (dyrektywy dla kompilatora). Da się w locie podmieniać kod napisany pod keil tak, by działał na SDCC:

Piszesz sobie kod np. w notepad++ lub notepad.exe (hardkor) Samego SDCC używa się za pośrednictwem CMD:

Potem, po zmianie kodu: strzałka do góry, by powtórzyć polecenie i enter.

2) Metoda na wnuczka – Szczególnie polecana dla początkujących. By wszystko było wręcz bajecznie proste, postawimy na KEIL ale za jedynie słuszną cenę – darmo. Wspominałem, że 8051 jest maksymalnie uniwersalny i wsad do scalaka X będzie się uruchamiał na wszystkich innych z tym rdzeniem. Firma SiliconLabs zalewa rynek swoimi MCU z rdzeniem 8051. Gdyby nie konieczność dedykowanego programatora – byłyby prawdopodobnie najlepszymi na rynku: Piękna dokumentacja, piękne środowisko, bogate wsparcie. Programator: 224 PLN lub dowolna płytka rozwojowa za ułamek ceny, Super szybkie 8051, bogate peryferia takie jak komunikacja szeregowa, DAC, ADC itp. Środowisko: SimplicityStudio – gotowe IDE z interfejsem graficznym:

https://www.silabs.com/software-and-tools/simplicity-studio/simplicity-studio-version-5

 W trakcie instalacji poprowadzą Cię za rączkę co i jak oraz podarują licencję na keil, byś mógł sobie pisać programy na dowolnie duży ROM. Oczywiście ma ich scalaki ;)

Mamy 2025 – trzeba się wszedzie rejestrować, logować. Prawdopodobnie będziesz musiał się zarejestrować na ich stronie (ostatnio instalowałem wiele lat temu i korzystam do dziś). Najlepiej sobie poinstaluj to poza kadrem, przed transmisjami, bo trochę zajmuje to czasu. Nie jest to coś skomplikowanego, ale trzeba po prostu przeklikać. Gdy już raz przez to się przekopiesz, to będziesz miał otwartą drogę na wszystkie 8051 – od DVD po dzwonki do drzwi. NAPRAWDĘ WARTO

NOWY PROGRAM

Otwierasz środowisko:

File > New > Silicon Labs Project Wizard

W Target Device wybierasz cokolwiek, co ma początek C8051, a następnie przycisk NEXT

Wybierasz opcję Empty C Project i klikasz next:

Uzupełniasz nazwę projektu:

Niech sobie skopiuje zawartość (copy contents), najbardziej uniweralne. FINISH

No i to w zasadzie tyle. Po lewej masz eksplorator projektów:

Najważniejszą zmianą jest pierwsza linijka:

#include <SI_C8051F300_Register_Enums.h> 

zmieniamy ją sobie na:

#include <reg51.h>

To znaczy dosłownie tyle, że zamiast korzystać z bardzo specyficznego zestawu SFR – korzystać będziemy z takiego, który jest najbardziej uniwersalny i zgodny ze wszystkimi 8051.

PROGRAM LAMPKI CHOINKOWE
#include <reg51.h> //nagłówek dla 8051. Zawiera wszystkie SFR (Przypisanie adresów rejestrów do przyjaznych nazw. CTRL + prawy przycisk myszy - otwórz)

sbit LED_1 = P3^0; // LED na pinie 0 portu 3 (P3.0)

sbit LED_2 = P3^1; // LED na pinie 1 portu 3 (P3.1)

sbit LED_3 = P3^2; // LED na pinie 2 portu 3 (P3.2)

void SiLabs_Startup (void){} //tylko na potrzeby Simplicity Studio, nic nie robi

void delay(unsigned int us); // Siema kompilator. Będziemy używać funkcji o nazwie "delay". Potem Ci  dokładnie opiszę (tzw. deklaracja funkcji)

void main(void) {

  /* Pod spodem piszesz wszystko, co ma się wykonać tylko raz - coś jak void init() w arduino */

    while(1) { //nieskończona pętla - powtarzana w nieskończoność = void loop()

        LED_1 ^=1; //zmień stan LED_1 na przeciwny

        delay(1000);

        LED_2 ^=1; //zmień stan LED_2 na przeciwny

        delay(1000);

        LED_3 ^=1; //zmień stan LED_3 na przeciwny

        delay(1000);

/* Pod spodem piszesz dokładne definicje swoich fukcji */

void delay(unsigned int us) {

    unsigned int i;

    for(i = 0; i < us; i++) {

      ; //nie rób nic w pętli, marnuj czas

      }

}

Jak już napiszesz kod,  to trzeba go skompilować. Klikasz ikonkę młoteczka:

Jeśli wszystko pójdzie dobrze, to w konsoli kompilator wypluje takie coś:

Zero errorów, 0 ostrzeżeń. Właśnie dokonałeś kompilacji swojego programu i wszystko jest gotowe do wgrywania w układ. W eksploratorze projektów pojawił się nowy folder ”binaries”:

Dostaniesz się do niego tak:

DupaDupa.hex i wzelakie inne pliki z końcówką *.HEX to jest tzw. WSAD – kod maszynowy zrozumiały dla mikrokontrolera/procesora. Ten Twój wygląda tak:

Niesamowite! Twój program zajmuje aż 67 Bajtów (~ 6,54% dostępnego ROM). Napisany w ASM zająłby jeszcze mniej, ale nie ma się co szarpać.

Jest on kodowany w intelHEX, więc w notatniku będzie miał swój specyficzny wygląd:

Wikipedia bardzo dokładnie opisuje co każdy znaczek oznacza. W zasadzie możesz to olać, ciekawostka byś wiedział więcej na przyszłość.  Możesz też skopiować sobie poniżej i zapisać w notatniku jako plik HEX:
:020000040000FA

:10000000020033A2B0B392B012001DA2B1B392B1FC

:1000100012001DA2B2B392B212001D80E67FE87EEC

:1000200003E4FDFCC3ED9FEC9E50070DBD00010CE9

:1000300080F222120042787FE4F6D8FD7581070233

:0300400000032298

:00000001FF

Przydatne polecenia w C:

LED = 1; //Ustaw stan na wysoki wcześniej zdefiniowanego pinu LED

LED = 0; //Ustaw stan na niski wcześniej zdefiniowanego pinu LED

LED ^= 1; // XOR/toogle pinu LED – zmienia na przeciwny

sbit LED = P3^0; // Zdefiniuj pin  P3.0 . Nadanie mu przyjaznej nazwy „LED”

A co z wejściem/wyjściem? Olać temat! W klaycznym 8051 jest co takiego jak quasi-bidirectional. Piny są jednocześnie wejściami i wyjciami, pracują w trybie open-collector:

Dla porównania, wiele nowoczesnych MCU posiada sterowanie pinami metodą PUSH-PULL:

Jak widzisz na uproszczonym schemacie powyżej, w 8051 możesz „twardo” podciągnąć pin tylko do GND, zaś ustawiając stan wysoki: zasilany jest on przez rezystor wewnętrzny (można dodać zewnętrzny dla „mocniejszego” podciągania do góry. Tak kiedyś robiono, dlatego np. I2C korzysta z zewnętrznych rezystorów pull-up. Ma to swoje zalety i wady. Jeśli zepniesz ze sobą dwa urządzenia open-collector na tej samej linii, to nie będzie tragedii, gdy oba będą chciały zapodać przeciwny stan – wygra ten, który zwiera do masy. UWAGA! W nowszych 8051 JEST MOŻLIWOŚĆ ustawienia GPIO jako push-pull dodatkowymi rejestremi:
P0M1 i P0M0 dla Portu 0, P1M1 i P1M0 dla Portu 1, itd.

Na tą chwilę możemy olać temat i korzystać z domyślnego trybu w taki sposób:

A jak z odczytem stanu pinu?

1) Ustaw wybrany pin na stan wysoki (BUTTON = 1;)
2) Sprawdź, czy przycisk zwarł go do GND:
if(BUTTON == 0){jakasFunkcja();} lub if(!BUTTON) {zrobCosTam();}

(oczywiście na górze kodu musi się znaleźć linijka: sbit BUTTON = P3^0; [albo inny pin])

WGRYWANIE W UKŁAD WSADU

Do wgrywaniia kodu dla układów STC służy ich malutki kombajn:

Ta aplikacja zawiera absolutnie wszystko, czego Ci potrzeba do szczęścia a nawet więcej. Nie trzeba jej instalować, możesz ją trzymać np. na pendrive.

1. Wybierz układ, który masz na płytce. Twoim obecnym układem jest


Jest ich tak dużo, że można się pogubić. Jeśli znajdziesz coś innego w śmieciach z ich „stajni”, to na pewno znajdzie się na tej liście. Uwaga! Niektóre są starsze, niektóre nowsze. Te najstarsze będą 6..12x wolniejsze niż ten, który masz obecnie. Będą też miały np. dużo słabsze rezystory pull-up (np. STC90xxx)

Twój scalak jest z architekturą 1T = jeden cykl zegara to 1 rozkaz. Jest więc 12x szybszy od pierwowzoru. Nie wydaje się, ale jest to absolutny demon szybkości.

2. Wybierz sobie port COM, pod którym jest Twoja płytka (np. COM3)

3. Wskaż plik hex, który wygenerowałeś [Open Code File]
4. Wybierz częstotliwość, z jaką chcesz pracować (wbudowany, dokładny oscylator RC):

Nie zawsze trzeba korzystać z największej prędkości, zwłaszcza jak chcesz, by twój układ był energooszczędny. 35MHz to odpowiednik 35 x 12 = 420MHz klasycznego 8051 lub tak, jakby atmega była ~2x szybsza. Jeśli zasilasz układ napięciem <5V to może to wpływać na bardzo duże prędkości. Maksymalną częstotliwość, jaką jesteś w stanie wypuścić na GPIO to coś w okolicach 13MHz (co w zupełności wystarczy jako zegar dla peryferiów)

Teraz wystarczy nacisnąć DOWNLOAD/PROGRAM. Następnie nacisnąć przycisk na płytce – rozwiera on zasilanie i resetuje twardo układ. LEDy migają wesoło w trakcie programowania i zaraz po tym uruchamia się program. Jeśli masz zaznaczony ostatni checkbox, to AUTOMATYCZNIE po każdej kompilacji w simpliityStudio program STC_ISP wykryje zmianę i spróbuje wgrać wskazany plik – wtedy wystarczy kliknąć znów hard reset. Zmiana w kodzie > Młoteczek > Przycisk reset

W zakładkach STC_ISP masz wybitnie przydatne rzeczy:

szczególnie polecam zakładkę Demo Code.