logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Kod C w Bascom -czy to możliwe??

pawelwozniakandrzej 11 Wrz 2009 19:52 2138 8
  • #1 7006871
    pawelwozniakandrzej
    Poziom 10  
    Witam.
    Posiadam wyświetlacz lcd 2x16 którego nie idzie wysterować dostępnymi komendami w Bascomie. Znalazłem jednak na elektrodzie kod w C który poprawnie go obsługuje

    
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <avr/pgmspace.h>
    
    #define F_CPU 4000000
    
    #define DDR_DB4 DDRD
    #define PORT_DB4 PORTD
    #define DB4 PD2
    
    #define DDR_DB5 DDRD
    #define PORT_DB5 PORTD
    #define DB5 PD3
    
    #define DDR_DB6 DDRD
    #define PORT_DB6 PORTD
    #define DB6 PD4
    
    #define DDR_DB7 DDRD
    #define PORT_DB7 PORTD
    #define DB7 PD5
    
    
    #define DDR_RS DDRD
    #define PORT_RS PORTD
    #define RS PD0
    
    #define DDR_E DDRD
    #define PORT_E PORTD
    #define E PD1
    
    #define SET_DB4 PORT_DB4 |= _BV(DB4)
    #define CLR_DB4 PORT_DB4 &= ~_BV(DB4)
    
    #define SET_DB5 PORT_DB5 |= _BV(DB5)
    #define CLR_DB5 PORT_DB5 &= ~_BV(DB5)
    
    #define SET_DB6 PORT_DB6 |= _BV(DB6)
    #define CLR_DB6 PORT_DB6 &= ~_BV(DB6)
    
    #define SET_DB7 PORT_DB7 |= _BV(DB7)
    #define CLR_DB7 PORT_DB7 &= ~_BV(DB7)
    
    #define SET_E PORT_E |= _BV(E)
    #define CLR_E PORT_E &= ~_BV(E)
    
    #define SET_RS PORT_RS |= _BV(RS)
    #define CLR_RS PORT_RS &= ~_BV(RS)
    
    #define LCD_X 16
    #define LCD_Y 2
    
    void _delay_loop_1(uint8_t __count)
    {
       __asm__ volatile (
          "1: dec %0" "\n\t"
          "brne 1b"
          : "=r" (__count)
          : "0" (__count)
       );
    }
    
    void _delay_loop_2(uint16_t __count)
    {
       __asm__ volatile (
       "1: sbiw %0,1" "\n\t"
       "brne 1b"
       : "=w" (__count)
       : "0" (__count)
       );
    }
    
    
    static __inline__ void _delay_ms(double __ms)
    {
       uint16_t __ticks;
       double __tmp = ((F_CPU) / 4e3) * __ms;
       if (__tmp < 1.0)
          __ticks = 1;
       else if (__tmp > 65535)
          __ticks = 0;
       else
          __ticks = (uint16_t)__tmp;
       _delay_loop_2(__ticks);
    }
    
    void out_nibble(char x)
    {
       CLR_DB4;
       CLR_DB5;
       CLR_DB6;
       CLR_DB7;
       if(x & _BV(0)) SET_DB4;
    
       if(x & _BV(1)) SET_DB5;
       if(x & _BV(2)) SET_DB6;
       if(x & _BV(3)) SET_DB7;
    }
    
    
    void write_to_lcd(char x)
    {
       SET_E;
       out_nibble(x >> 4);
       CLR_E;
       SET_E;
       out_nibble(x);
       CLR_E;
       _delay_ms(1);
    }
    
    void write_command(char x)
    {
       CLR_RS;
       write_to_lcd(x);
    }
    
    void write_char(char x)
    {
       SET_RS;
       write_to_lcd(x);
    }
    
    void write_text(char * s)
    {
       while(*s)
       {
          write_char(*s);
          s++;
       }
    }
    
    void lcd_init(void)
    {
       char i;
       DDR_DB4 |= _BV(DB4);
       DDR_DB5 |= _BV(DB5);
       DDR_DB6 |= _BV(DB6);
       DDR_DB7 |= _BV(DB7);
       DDR_E |= _BV(E);
       DDR_RS |= _BV(RS);
       _delay_ms(15);
       CLR_E;
       CLR_RS;
       for(i = 0; i < 3; i++)
       {
          SET_E;
          out_nibble(0x03);
          CLR_E;
          _delay_ms(5);
       }
       SET_E;
       out_nibble(0x02);
       CLR_E;
       _delay_ms(1);
       write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
       write_command(0x08); // wyłącz LCD, kursor i miganie
       write_command(0x01); // czyść LCD
       write_command(0x06); // bez przesuwania w prawo
       write_command(0x0C); // włącz LCD, bez kursora i mrugania
    }
    
    
    void LCD_xy(uint8_t x, uint8_t y)
    {
       switch(y)
       {
          case 1: y=0x40; break;
          case 2: y=0x14; break;
       }
       write_command(0x80+y+x);
    }
    
    void LCD_clr(void)
    {
       write_command(0x01);
       _delay_ms(1);
       LCD_xy(0,0);
    }
    
    
    a potem w programik:
    
    Kod:
    int main(void)
    {
            lcd_init();         
            LCD_clr();
            write_text("Hello");
            return(0);
    }
    


    Czy da się jakoś wkomponować ten kod do bascoma? Czy bascom łyka kod w c?
    Autor tego tematu https://www.elektroda.pl/rtvforum/topic736279.html pisze że kompilował kod c w basomie avr demo ale jak to zrobić ?
  • #2 7006969
    mmacura
    Poziom 18  
    W Baskomie to możesz conajwyżej w programie obsługi programatora wgrać do procesora plik hex lub bin wygenerowany przez cokolwiek innego lub zrobić wstawki assemblerowe.
    Baskom to Basic i nie sądzę aby kiedykolwiek można tam było kompilować jeżyk C.

    Pozdrawiam
    Marek
  • #3 7007513
    mirekk36
    Poziom 42  
    odpowiedź jest prosta - na pewno nie uda ci się ożenić Bascoma i jakiejś wstawki w języku C ;) - to niemożliwe!

    ale z kodu widać, że to zwykły jakiś wyświetlacz który na dodatek sterujesz w uproszczony sposób bo pin RW wyświetlacza jest zwarty do GND.

    zatem jestem na 99,9% przekonany, że można go spokojnie zagospodarować w Bascomie - tyle że coś źle robisz - nie ma bata ;)

    Masz więc 2 wyjścia:

    - albo dzięki lub przez to wydarzenie - zacząć uczyć się C ;)

    - albo zrobić to poprawnie w Bascomie bo można - tam LCD - zawsze działa
  • #5 7008239
    Mat_91
    Poziom 25  
    Panowie czy tak zawsze to nie byłbym pewny:)

    Link
  • #6 7008353
    mirekk36
    Poziom 42  
    Mat_91 --> ja jestem pewny a link, który podałeś to walka świeżo upieczonych adeptów elektroniki cyfrowej i pierwsze w życiu starcie z takim wyświetlaczem. Sam wiesz, bo widziałem jak w tym temacie się "wkurzasz" (i słusznie), że pomimo wielu podpowiedzi autor - nie przejmuje się a to fusebitami, a to wartosciami rezystorów, po drodze pali kilka procków Atmega - no szok ;) .... nie wspominając , że nic nie czyta helpa prawie itp

    dodam, że naaaaawet gdyby te stałe czasowe bascoma - jak napisałeś były zbyt sztywne dla niektórych rzadkich gatunków wyświetlaczy (w co szczerze wątpię - bo ja swego czasu przepuściłem przez swoje ręce i Bascoma chyba z milion róznych typów wyświetlaczy) .... więc nawet gdyby,

    ......... to jest tam także prosta jak drut biblioteka do obsługi wyświetlacza gdzie należy po ludzku użyć pinu RW a nie podłączać go do GND. Dzięki temu można powiem brzydko "olać" te sztuczne zależności czasowe (które tak nawiasem strasznie wydłużają czas osbługi takich wyświetlaczy) .... ponieważ sprawdzana jest BusyFLAG. Proponuję więc młodym adeptom zaczynającym walkę z LCD - po pierwsze poczytać co nieco o tych wyświetlaczach, fusebitach, rezystorach itp itp - a później czytanie helpa Bascomowego

    wtedy zaczyna się na prawdę praca z takim wyświetlaczem a nie zabawa. Ja praktycznie nigdy nie używam w swoich układach rozwiązania z R/W podłączonym do GND
  • #7 7009356
    Mat_91
    Poziom 25  
    mirekk36 tak, może i masz racje, kiedyś zaczynałem z bascomem ale jakoś mi nie siadł więc go nie znam i tak na prawdę mogę się tylko domyślać co to narzędzie potrafi.

    Jeżeli chodzi o sam wyświetlacze to niestety są naprawdę różne, raz na allegro trafiłem na wyświetlacz 4x40 znaków- odziwo był naprawdę tani. Mam jedną bibliotekę którą sam napisałem przy radach kolegów z forum i działa z każdym wyświetlaczem, a z tym ni huhu nie ruszyła. Problemem okazały się czasy strobe lini E. Musiałem je wydłużyć prawie 4 krotnie (z 1uS do 4), przy mniejszych wyświetlacz nie odpowiadał.

    Co do czytania datasheet'a to święta racja, bez tego ani rusz. Sam teraz jade na 2 kompy, na jednym pisze program a na drugim datasheet (przełączanie okienek mnie wkurza) i chyba dojdzie do tego ze sobie tego datasheeta wydrukuje :p

    A do autora tematu to osobiście proponuje posłuchać kolegi mirekk36 i...

    mirekk36 napisał:
    - albo dzięki lub przez to wydarzenie - zacząć uczyć się C Wink
  • #8 7009734
    rpal
    Poziom 27  
    A ja bym podrzucił pomysł, aby kolega pofatygował się i spradził typ wyświetlacza bo tak się składa że kupując np. na allegro lub też z "demontowni" można trafić na wyświetlacz który ma lustrzane odbicie wyprowadzeń, sam mam takich kilka i generalnie nie pasują one do standardu wyprowadzeń. Poznać to można albo czytając dokumentację wyświetlacza albo po temperaturze układów zabudowanych na PCB, jednak wówczas jest zwykle za późno bo gdy parzy w palce to już pod filipku.
  • #9 7009804
    Mat_91
    Poziom 25  
    A ja polecam zajrzeć jeszcze raz do tematu w linku w moim poście wyżej. Problem już jest tam rozwiązany i w bascomie też działa, i tu przyznaje racje mierekk36 :) Nom i zwracam honor dla bascoma:p
REKLAMA