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

[atmega8][C/AVRStudio] Brak reakcji wyświetlacza z Astry

zamor89 14 Lut 2010 14:42 2153 8
REKLAMA
  • #1 7692976
    zamor89
    Poziom 10  
    Witam
    Znalazłem taki kod napisany w c na atmega8 do wyświetlania znaków na fabrycznie montowanym wyświetlaczu w Oplu. Ale po trzech dniach walki z kodem oraz braku efektów w końcu się poddałem po prostu ręce mi opadły. I tu zwracam się z prośbą do programistów, którzy już przez to przebrneli. Dodam że używam AVRStudio, prędkość procesora ustawiłem na 8000000Hz, kompilacje bez optymalizacji. Piny w wyświetlaczu podłączyłem bezpośrednio do odpowiednich nóżek w wyświetlaczu(8-znakowy), z adresami już kombinowałem na milion sposobów i efekt ciągle jest ten sam, czyli brak jakiejkolwiek reakcji. Ogólnie to ja bym się przyczepił tylko funkcji send() nie rozumiem jak ona działa. Czekam na drobne podpowiedzi i wracam dalej do nierównej walki z wyświetlaczem:(:(



    
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    #include <util/delay.h>  
    
    #define sda PB1
    #define scl PB2
    #define mrq PB3 
    #define czas_puls_us 400
    #define czas_startpuls 200
    
    
    //int n=0;
    
    unsigned char dana,i, t,s,d,j ,cnt1, z1, p; 
    unsigned int liczba,b,a,cnt;             //zmienne 
    char wi; 
    
    void puls_us(void) 
    { 
    _delay_us(100); //100
    
    } 
    void startpuls(void) //czasy 
    { 
    _delay_us(50); //50
    } 
    void sek(void) 
    { 
    
    } 
    
    void start(void) 
    { 
    DDRB = 0xFF; 
    PORTB=0xFF;  //strat 
     PORTB |=_BV(3); //mrq=0; 
     puls_us(); 
     PORTB &=~_BV(3); //mrq=1;           //bit startu na magistrali I2C START 
     PORTB &=~_BV(1); //sda=1; 
     PORTB &=~_BV(2); //scl=1; 
     startpuls(); 
    PORTB |=_BV(1); //sda=0; 
     startpuls(); 
     PORTB |=_BV(2); //scl=0; 
     startpuls(); 
    
    } 
    void stop(void) //STOP 
    { 
    
     PORTB &=~_BV(3); //mrq=1; 
     PORTB &=~_BV(2); //scl=1; 
     startpuls(); 
     PORTB &=~_BV(1); //sda=1; 
     //portb=28; 
     } 
    
     void send(unsigned char dana)  // wysyłanie 
    { 
    
     for(i=0;i<8;i++)    //będzie 8 bitów 
     { 
     if(dana&0x80)     //badaj najstarszy bit wysyłanego znaku 
     { 
      PORTB &=~_BV(1); //sda=1;   //wyślij "1" 
     } 
     else 
     { 
     PORTB |=_BV(1); //sda=0;    //wyślij "0" 
     } 
     PORTB &=~_BV(2); //scl=1; 
     puls_us(); 
     PORTB |=_BV(2); //scl=0; 
     puls_us(); 
     dana<<=1;    //przygotuj następny bit do wysłania 
     } 
     PORTB &=~_BV(1); //sda=1; 
     PORTB &=~_BV(2); //scl=1; 
     puls_us(); 
     PORTB |=_BV(2); //scl=0; 
     PORTB |=_BV(1); //sda=0; 
     PORTB |=_BV(3); //mrq=0; 
     puls_us(); 
    
     } 
    
    char table[10]={0x61,0x62,0x64,0x67,0x68,0x6b,0x6d,0x6e,0x70,0x73};  //tablica cyf 
    
     void powitanie(void) 
    { 
      for (p=0; p<10;p++) { 
      start(); 
      startpuls(); 
    
      send(0x96); 
    
      startpuls(); 
      PORTB |=_BV(3); //mrq=0; 
      startpuls(); 
    
      send(0x01); 
      send(0x01); 
      send(0x01); 
      send(0x77); 
      send(0x78); 
      send(0x79); 
      send(0x71); 
      send(0x72); 
    
      stop(); 
      _delay_ms(100); 
      } 
      for (p=0;p<8;p++) { 
      start(); 
      startpuls(); 
      send(0x96); 
      startpuls(); 
      PORTB |=_BV(3); //mrq=0; 
      startpuls(); 
      send(0x01); 
      send(0x01); 
      send(0x01); 
      send(0x77); 
      send(0x78); 
      send(0x79); 
      send(0x71); 
      send(0x72); 
    
      stop(); 
      _delay_ms(100); 
      } 
      wi++; 
      } 
     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
    void main () {     //główny program 
    DDRB = 0xFF; 
    PORTB=0xFF; 
    
    
     while(1) 
     powitanie(); 
      
     
    }
  • REKLAMA
  • #2 7695391
    tadzik85
    Poziom 38  
    Funkcja send() to nic innego jak programowa emulacja magistrali I2C , komentarze same na to wskazują.

    Powiedz coś więcej o tym wyświetlaczu może będę mógł coś więcej powiedzieć.
  • REKLAMA
  • #3 7696195
    zamor89
    Poziom 10  
    Jest to wyświetlacz od Opla Astry I, zwany również jako TID ,DID . Jest 8 segmentowy.
    Pracuje na zmodyfikowanej szynie I2C+mrq. Chciałbym za pomocą tego wyświetlacza zrobić komputer pokładowy do mojej astry. Z innymi doprowadzeniami czujników mam nadziej że sobie poradzę. Problemem jest jedynie komunikacja z wyswietlaczem.

    Protokół do tego wyświetlacza wygląda następująco

    1. Idle state all lines are high.
    2. Pull MRQ low for a short period and let it go high again.
    3. Send a "I2C Start"
    4. Send the address byte (0x94).
    5. Pull MRQ low.
    6. Send 10 data bytes
    7. Let MRQ go high
    8. Send "I2C Stop"
    9. We are back in the idle state.
  • #4 7696370
    H0miczek
    Poziom 20  
    Troche mnie niepokoi że wszedzie gdzie komentarz (i specyfikacja i2c) mowi o ustawieniu stanu wysokiego, Ty ustawiasz niski i na odwrot.
    Tak chyba nie ma byc?
    Poza tym mowisz o adresie 0x94 a wysylasz 0x96..?
  • REKLAMA
  • #5 7699402
    zamor89
    Poziom 10  
    To jest zwieranie do masy. A jesli chodzi o adresy to ustawiałem juz rózne znane mi adresy ox94 0x96 0x9B.
  • #6 7699628
    H0miczek
    Poziom 20  
    Jakie zwieranie do masy?? stan wysoki to plus, niski to masa, a Ty masz dokladnie odwrotnie niz powinno byc
  • #7 7700764
    zamor89
    Poziom 10  
    No a czy protokól I2C nie wyglada tak że na szynach jest ciagle +5V i gdy mikrokontroler chce wyslac syganl 1 to w rzeczewistosci wyjscie sterownika jest podciagane do masy?
  • #8 7700946
    H0miczek
    Poziom 20  
    NIE!
    5V (czyli wysoki) to tzw idle.
    i2c start to sda w dol przy wysokim scl, po czym scl w dol (oficjalnie rozpoczyna sie transmisja)
    dalej sie wysyla 8 bitow (zmiana danych na niskim scl) po czym dodatkowy puls na scl w celu "ack".
    pozniej jest i2c stop: sda z niskiego w gore, scl w gore (lub inne warianty zamiast stopu, ale to temat na inną lekcje..)

    A 1(jeden) to 1(jeden) a nie 0(zero)!

    Dodano po 2 [minuty]:

    A do masy się ściąga, nie PODciąga.
  • REKLAMA
  • #9 7701261
    zamor89
    Poziom 10  
    ;\;\ dobra dzieki sproboje przerobic ten kod. Czyli jednym slowem 1 to, 1 0 to 0.
REKLAMA