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

Arduino uno i programowanie wyświetlacza.. Pytanie odnośnie transferu danych

kosiner 25 Mar 2020 16:01 636 6
REKLAMA
  • #1 18559533
    kosiner
    Poziom 8  
    Posty: 154
    Ocena: 4
    Witam,

    mam problem z moim wyświetlaczem od radia. Otóż problem polega na tym, że muszę za każdym razem wysyłać na nową cała instrukcję do rysowania mojego wyświetlacza. Wyświetlacz jest oparty o protokół SPI(?). Jest to wyświetlacz wyjęty z radia samochodowego i jest on oparty o scalak SC6523. Znalazłem jego notę katalogową http://www.stanson.ch/files/AutomotivePC/Front_panel/LCD-driver-156segs-PT6523.pdf

    Mój kod: [Zapożyczony]
    
    /*Begining of Auto generated code by Atmel studio */
    // VFD_in 7 
    // VFD_clk 8 /
    // VFD_stb 9
    #include <WString.h>
    //*************************************************/
    
    
    #define LCD_in 7  // This is the pin number 7 on Arduino UNO
    #define LCD_clk 8 // This is the pin number 8 on Arduino UNO
    #define LCD_stb 9 // This is the pin number 9 on Arduino UNO
    
    
    
    //*************************************************//
    void setup() {
      pinMode(LCD_clk, OUTPUT);
      pinMode(LCD_in, OUTPUT);
      pinMode(LCD_stb, OUTPUT);
     
      pinMode(13, OUTPUT);
     
      Serial.begin(9600);
     
      digitalWrite(LCD_stb, LOW);
      delayMicroseconds(5);
      digitalWrite(13, LOW);
      delay(500);
      digitalWrite(13, HIGH);
      delay(500);
      digitalWrite(13, LOW);
      delay(500);
      digitalWrite(13, HIGH);
      delay(500);
    
    
    }
    
    void send_char_without(unsigned char a)
    {
    unsigned char data = 170; //value to transmit, binary 10101010
    unsigned char mask = 1; //our bitmask
      data=a;
      for (mask = 00000001; mask>0; mask <<= 1) {
      digitalWrite(LCD_clk, LOW);
      delayMicroseconds(5);
        if (data & mask){
          digitalWrite(LCD_in, HIGH);
        }
        else{
          digitalWrite(LCD_in, LOW);
        }
       
        digitalWrite(LCD_clk,HIGH);
        delayMicroseconds(5);
      }
     
    }
    void send_char_8bit_stb(unsigned char a)
    {
    //
    unsigned char transmit = 15; //define our transmit pin
    unsigned char data = 170; //value to transmit, binary 10101010
    unsigned char mask = 1; //our bitmask
    int i = -1;
      data=a;
      // This lines is because the clk have one advance in data, see datasheet of sn74HC595
      // case don't have this signal instead of "." will se "g"
      for (mask = 00000001; mask>0; mask <<= 1) { //iterate through bit mask
       i++;
       digitalWrite(LCD_clk, LOW);
      delayMicroseconds(5);
        if (data & mask){ // if bitwise AND resolves to true
          digitalWrite(LCD_in, HIGH);
          //Serial.print(1);
        }
        else{ //if bitwise and resolves to false
          digitalWrite(LCD_in, LOW);
          //Serial.print(0);
        }
        digitalWrite(LCD_clk,HIGH);// need invert the signal to allow 8 bits is is low only send 7 bits
        delayMicroseconds(1);
        if (i==7){
        digitalWrite(LCD_stb, HIGH);
        delayMicroseconds(2);
        }
        //Serial.println(" ");
        
      }
    }
    
    void patternLCD(){
    //send total of 156 bits, the 4 last bits belongs to DR, SC, BU, X;
    digitalWrite(LCD_stb, LOW); //
    delayMicroseconds(2);
    send_char_8bit_stb(0B01000001); // firts 8 bits is address, every fixed as (0B010000001), see if clk finish LOW or HIGH Very important!
    
    send_char_without(0B11111111);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);  
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    send_char_without(0B00000000);  send_char_without(0B00000000);
    
    delayMicroseconds(2);
    digitalWrite(LCD_stb, LOW); //
    delayMicroseconds(2);
    }
    
    void loop() {
     
      patternLCD();
      delay(5000);
    }
    


    Efekt na wyświetlaczu: Arduino uno i programowanie wyświetlacza.. Pytanie odnośnie transferu danych
  • REKLAMA
  • #2 18561410
    ArturAVS
    Moderator
    Posty: 26315
    Pomógł: 2300
    Ocena: 7804
    kosiner napisał:
    Otóż problem polega na tym, że muszę za każdym razem wysyłać na nową cała instrukcję do rysowania mojego wyświetlacza.

    Po wysłaniu "screena", aby odświeżyć/zmienić zawartość wyświetlacza wysyłaj tylko to co w międzyczasie się zmieniło. Robisz w programie flagę, która sygnalizuje że wartość zmiennych się zmieniła i należy odświeżyć zawartość lcd. Po odświeżeniu, kasujesz flagę i program sprawdza czy nie jest ponownie ustawiona. Nie ma sensu w sposób ciągły rysować całego lcd, zajmie to większość czasu procka.
  • REKLAMA
  • #3 18561653
    kosiner
    Poziom 8  
    Posty: 154
    Ocena: 4
    @ArturAVS Właśnie chodzi o to że nie mam pojęcia jak to zrobić. Również w Datasheet nie ma nic o tym, aby zmienić tylko to co się chce w danej chwili.

    Ale chyba chodzi Ci o to, że wysyłam pierwszy raz aby coś się narysowało a później jak coś chce narysować wysyła kolejną ramkę z tymi zmienionymi danymi.
  • REKLAMA
  • #4 18561672
    ArturAVS
    Moderator
    Posty: 26315
    Pomógł: 2300
    Ocena: 7804
    kosiner napisał:
    a później jak coś chce narysować wysyła kolejną ramkę z tymi zmienionymi danymi.

    Dokładnie.
  • #5 18561731
    kosiner
    Poziom 8  
    Posty: 154
    Ocena: 4
    @ArturAVS Miałbyś jakiś pomysł aby literki zakodować? W sensie wiadomo, definiujemy raz daną literkę i przesuwamy się jakimś wskaźnikiem gdzie chcemy włożyć tą literkę, u mnie jeden segment zajmuje 13 bitów. Czyli ramka u mnie wygląda tak:
    [Jakiś znak na wyświetlaczu, jakiś znak na wyświetlaczu] [13 bitowy segment: [0][0][0][0][0][0][0][0][0][0][0][0][0] ]
    [Jakiś znak na wyświetlaczu][Jakiś znak na wyświetlaczu] [13 bitowy segment: [0][0][0][0][0][0][0][0][0][0][0][0][0] ]
    [Napis MUTE][Napis INT] [13 bitowy segment: [0][0][0][0][0][0][0][0][0][0][0][0][0] ]

    Ale kompletnie nie wiem jak zakodować te literki i je wyświetlać w danym miejscu
  • #6 18561807
    ArturAVS
    Moderator
    Posty: 26315
    Pomógł: 2300
    Ocena: 7804
    Dawno w programowanie się nie bawiłem, zresztą to było w Bascom. Idea stosowana niezależnie od języka programowania, musisz zdefiniować tablicę znaków(fontów). A najlepiej własną bibliotekę do obsługi napisać z fontami. Wtedy wyświetlanie mogłoby wyglądać tak; wywołanie procedury, pozycja, znak. Nie musiałbyś za każdym razem definiować tablicy znaków do wysłania. Oczywiście musiałbyś uwzględnić znaki specjalne na wyświetlaczu, bo dla samego sterownika to "wsio rawno".
  • REKLAMA
  • #7 18561821
    kosiner
    Poziom 8  
    Posty: 154
    Ocena: 4
    @ArturAVS Dzięki :D

Podsumowanie tematu

✨ Użytkownik ma problem z wyświetlaczem opartym na protokole SPI, który wymaga ciągłego wysyłania pełnej instrukcji do rysowania. Odpowiedzi sugerują, aby zamiast tego wysyłać tylko zmienione dane, co można osiągnąć poprzez użycie flagi do sygnalizowania zmian. Dodatkowo, użytkownik pyta o sposób kodowania liter, aby można je było wyświetlać w określonych miejscach na wyświetlaczu. Odpowiedzi wskazują na potrzebę zdefiniowania tablicy znaków (fontów) oraz stworzenia własnej biblioteki do obsługi wyświetlania, co uprości proces wyświetlania znaków.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA