Monday, February 20, 2012

Analizator antenowy w/g VK5JST i problem Ohma

Postanowiłem sobie zbudować analizator antenowy w/g koncepcji VK5JST z rozszerzeniami kolegi SP2JJH. Wszystko udało się bez większych problemów, analizator ruszył od pierwszego włączenia. Niestety wszystko psuła jedna mała "rzecz". Na żadnym posiadamym przeze mnie wyświetlaczu nie wyświetlał się prawidłowo symbol Ohma czyli litera Omega.
Pewnie owe chińskie produkty mają inną tablicę kodową, gdyż zdecydowanie był to ichni krzaczek :)

Zajmuje się hobbystycznie też programowaniem mikrokontrolerów, ale jak dotąd nie miałem okazji bawić się PIC'ami a tylko AVR'ami, MSP430 oraz procesorami ARM Cortex-M0. Analizując z pomocą Arduino co tam mają pod adresem 0xF4, którego używa oryginalny program w każdym LCD jaki miałem był ten sam "krzaczor". Ponieważ chciałem aby rozwiązanie było przenośne postanowiłem wykorzystać dostepną pamięć CGRAM. Wycieczka do AVT po programator PIC i zacząłem zabawę.

Każdy wyświetlacz ma  pierwsze 8 rejestrów dostepnych jako zapisywalne przez użytkownika dla jego własnych symboli. Co do szczegółów odsyłam do Wikipedii gdzie jest szczegółowy opis sterownika HD44780.

Największym problemem okazało się skonfigurowanie środowiska MPLAB 8 z kompilatorem CC5X używanym przez VK5JST. Dwie godziny potem środowisko było gotowe i kompilator prawidłogo kompilował oryginalny kod.
Cała reszta to przyjemność programowania :) Co mi się podoba w MPLAB i CC5X:

  • Jeśli wcześniej zadeklarujemy małe makro  np: pragma bit LED_0 @ PORTB.0 to potem zmiana stanu tego portu to poprostu LED_0=1 ! Żadnych &= ~() czy |= na całym rejestrze. Bardzo przyjemna i czytelna sprawa.
  • Pomimo "dziwnego" interfejsu MPLAB 8 - bardzo szybko można zacząć pracować bez dziesiątek wizardów, innych utrudniaczy, czy importowania dziesiątek bibliotek.
A jak wyglądają owe zmiany. Tutaj znajdziecie źródła z moimi poprawkami oraz plikiem wsadowym hex do PIC'a ant-anl-0.04.zip. Napisałem do Vadima, więc może niedługo znajdzie się to w oficjalnym kodzie.
Dla tych co nie chcą dłubać przez cały kod:
  1. Deklaracja tablicy zawierającej opis graficzny litery Omega w pliku lcd_nmix.c
    const char ohm[8] ={0b00000,0b00000,0b01110,0b10001,0b10001,0b01010,0b11011,0b00000};
    
    Każdy bajt opisuje jakie pixele mają być włączone dla każdej z 8 poziomych linii znaku graficznego 5x8 pixeli. Tak więc znaczenia ma tylko pierwsze 5 bitów.
  2. Kod zapisujący znak Omega do pamięci CGRAM w lcd_nmix.c:
    void lcd_add_ohm(void)
    {
    LCD_RS=0;
    lcd_write(0x40);
    LCD_RS=1;
    delay_us(40);
    // send ohm character
    for(k=0;k<8;k++) { lcd_write(ohm[k]);}
    //switch back to DRAM
    LCD_RS=0;
    cd_write(0x80);
    LCD_RS=1;
    delay_us(40);
    
  3. Wywołanie powyższej funkcji w inicjacji wyświetlacza lcd_init(void) w lcd_nmix.c
  4. Zmiana adresu z pod jakiego brać symbol Ohma w aa_defs.h:
    #define LCD_OHM 0x00
I to wszystko. Tak więc programowanie PIC'ów nie takie straszne i w sumie poza drobnymi niuansami różnic pomiędzy 8-bitowcami nie ma.


Followers