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

[Atmega16][C]LCD + diody = zegar binarny

schollu 14 Cze 2008 14:39 3971 4
REKLAMA
  • #1 5245348
    schollu
    Poziom 11  
    Witam,
    Schemat: [Atmega16][C]LCD + diody = zegar binarny

    Mam co do programowania oraz zasady działania tego układu pare pytań:
    1. Jakie mają być stany portów oznaczonych jako TRAN oraz DIODY, aby diody się zaświeciły ??

    2. Pytanie to dotyczy programu:
    
    //#define F_CPU 3686000L
    //#include <util/delay.h>
    #define F_CPU        8000000  
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/pgmspace.h>
    #include <avr/interrupt.h> 
    #include <stdio.h>
    
    #define CYCLES_PER_US ((F_CPU+500000)/8000000)
    
    #define RS_ON DDRB |= _BV(PB7); PORTB |= _BV(PB7);     
    #define RS_OFF DDRB |= _BV(PB7); PORTB &= _BV(PB7);
    
    #define EN_ON DDRB |= _BV(PB6); PORTB |= _BV(PB6);
    #define EN_OFF DDRB |= _BV(PB6); PORTB &= _BV(PB6);  
    
    
    #define D7_ON DDRA |= _BV(PA0); PORTA |= _BV(PA0);
    #define D7_OFF DDRA |= _BV(PA0); PORTA &= _BV(PA0);
    
    #define D6_ON DDRA |= _BV(PA1); PORTA |= _BV(PA1);
    #define D6_OFF DDRA |= _BV(PA1); PORTA &= _BV(PA1);
    
    #define D5_ON DDRA |= _BV(PA2); PORTA |= _BV(PA2);
    #define D5_OFF DDRA |= _BV(PA2); PORTA &= _BV(PA2);
    
    #define D4_ON DDRA |= _BV(PA3); PORTA |= _BV(PA3);
    #define D4_OFF DDRA |= _BV(PA3); PORTA &= _BV(PA3); 
    
    unsigned char *wiersz=0;
    unsigned char *kolumna=0;
    
    //void delay(int ms); 
    
    
    
    void PiszInstLCD(char instr){
       int temp = 0x3C;   //piny portu C odpowiadajace linia danych
       char temporary = instr;
       //wysylam starsza czesc bajtu
    
       RS_OFF;
       PORTC = (temporary >> 2) & temp;
       EN_ON;
       delay(10);
       EN_OFF;
       delay(100);
       
       //wysylam mlodsza czesc bajtu
       RS_OFF;
       PORTC = (instr << 2) & temp;
       EN_ON;
       delay(10);
       EN_OFF;
       delay(100);   
    }
    
    void PiszDanaLCD(char dana){
       int temp = 0x3C;   //piny portu C odpowiadajace linia danych PC2-PC4
       char temporary = dana;
       //wysylam starsza czesc bajtu
       EN_ON;
       RS_ON;
       PORTC = (temporary >> 2) & temp;
       PORTC = (temporary >> 2) & temp;
       delayms(1);
       EN_OFF;
       delay(100);
       
       //wysylam mlodsza czesc bajtu
       EN_ON;
       RS_ON;
       PORTC = (dana << 2) & temp;
       PORTC = (dana << 2) & temp;
       delay(1);
       EN_OFF;
       delay(100);   
    }
    
    void czyscLCD(){
       PiszInstLCD(0x01);
       delay(2);
    }
    
    
    void LCDXY(int x, int y){
     PiszInstLCD((x*0x40+y)|0x80);  //standardowy rozkaz sterownika LCD
                                 //ustawiający kursor w określonych współrzędnych
    
    }
    
    
    void LCD_INIT(){
       // wylaczam piny JTAGa PC2-PC5 - normalnie niedostepne - dotyczy tylko portu C
       MCUCSR |= 0x80;
       MCUCSR |= 0x80;
    
       //ustawienie portow jako wyjsciowe
       DDRB = 0xFF;
       DDRC = 0xFF;
    
    
       //czyscimy porty
       PORTB = 0x00;
       PORTC = 0x00;
       
       //czekamy az ustali sie napiecie - wszystkie czasy sa zawyzone tu ok 100ms
       delayms(100);
       
       //Function Set
       //1
       D5_ON;
       EN_ON;
       delay(10);// to z pewnoscia moze byc duzo krotsze, tu 10us
       EN_OFF;
       delay(5);
       PORTC = 0x00;
       
       //2
       D5_ON;
       EN_ON;
       delay(10);
       EN_OFF;
       delay(5);
       PORTC = 0x00;
       
       //3
       D7_ON;// 2 line
       D6_ON;// display ON
       EN_ON;
       delay(10);
       EN_OFF;
       delay(5);
       PORTC = 0x00;
    
       delayms(2);// more than 39us
       
       //Display ON/OFF Controll
       PiszInstLCD(0x08); //display off, cursor off, blink off
       delayms(2);// more than 39us   
       
       // Display Clear
       PiszInstLCD(0x01);
       delayms(5);// more than 1.53ms
       
       //Entry mode set
       PiszInstLCD(0x06); //increment, shift off,
       delayms(2);
    }
    
    /*
    void PiszTekstLCD(char *tekst)        //pisz tekst na LCD wskazywany pointerem *tekst
    {
     char zn;
     char nr=0;
    
     while(1){
       zn=PRG_RDB(&tekst[nr++]);        //pobranie znaku z pamięci programu
       if(zn!=0){                        //czy nie ma końca tekstu?
          if(zn=="\n"){                  //czy znak nowej linii
             wiersz==1?wiersz=0:++wiersz;//przejdź do nowej linii
             kolumna=0;
             LCDXY((int)wiersz,(int)kolumna);      //ustaw obowiązujące po zmianie współrzędne na LCD
          }else{
             PiszDanaLCD(zn);            //umieść pojedynczy znak tekstu na LCD
          }
       }else{
          break;                          //zakończ pętlę, jeśli koniec tekstu
       }
     }
    }
    
    */
    
    
    int main()
    {
       char *tekst1=PSTR("HELLO WORLD");
       char *tekst2=PSTR("www.elektroda.pl");
       
       LCD_INIT();
      // delayms(5);
       PiszInstLCD(0x0C);// display  ON, cursor ON, Blink OFF
     //  delayms(2);
       LCDXY(0, 0);
      // PiszTekstLCD(tekst1);
       LCDXY(1,0);
    //   PiszTekstLCD(tekst2);
    
    return 0;
    }
    

    Programuję w AVR Studio 4.
    Podczas kompilacji tego programu (oczywiście po przerobieniu portów do mojego schematu) wyskakują mi błędy.
    BŁĘDY:
    ../test1.c:37: error: expected identifier or '(' before '}' token
    ../test1.c:47: warning: implicit declaration of function 'delay'
    ../test1.c:68: warning: implicit declaration of function 'delayms'
    ../test1.c:181: warning: unused variable 'tekst2'
    ../test1.c:180: warning: unused variable 'tekst1'

    Są to 4 warningi oraz jeden error.
    Proszę o pomoc nie wiem jak mam to ominąć.
    Program ten jest do układu znajdującego się w załączniku.


    Proszę o pomoc.

    Poprawiłem tytuł , wstawiłem znaczniki [code] https://www.elektroda.pl/rtvforum/topic1015361.html
    [zumek]
  • REKLAMA
  • REKLAMA
  • #3 5245451
    schollu
    Poziom 11  
    W/g tego co masz w schemacie LCD nigdy nie będzie działać.

    Co do kodu.
    Znaczniki [code]
    Dalej brakuje Ci otwarcia jakiegoś nawiasu ( prawdopodobnie i to na początku...

    Witam,
    Nie rozumiem dlaczego wyświetlacz nie będzie działał ?
    Chcę tylko wysyłać dane na wyświetlacz wiec ... ?

    Co to są te znaczniki code ?

    Sprawdzałem nawiasy są ok ?
    Nie potrzebuję czasem jakiejś biblioteki lcd.h ?

    Z tego co widzę to komilator wyrzuca mi delay, delayms ..
    Może brakuje mi jakiejś biblioteki ?
  • REKLAMA
  • #4 5245469
    Balu
    Poziom 38  
    Nie masz zielonego pojęcia o C, nie masz zielonego pojęcia o forum.
    Ja Ci w takim razie pomagać nie będę. Naucz się cytować i wstawiać w znmaczniki [code] swój kod Może wtedy ktoś Ci pomoże.

    A LCD nie będzie działać bo masz R/~W do +5V podłączone.
REKLAMA