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] Problem z LCD

Prezes87 03 Gru 2010 21:45 1212 8
REKLAMA
  • #1 8822348
    Prezes87
    Poziom 11  
    Witam,

    mam problem z wyświetlaczem 2x16, gdy do funkcji która wrzuca na wyświetlacz wrzucam:
    
    unsigned char mam = 'z';
    
    putLCD(mam);
    


    lub pisze poprostu:




    to wyświetla mi się z bez problemu. Jednak gdy chciałbym to zrobić w następujący sposób:

    
    unsigned char mam[] = "zez";
    int i;
    
    for(i=0;i<strlen(mam);i++)
    putLCD(mam[i]);
    


    to na wyświetlaczu wyskakują głupoty. Może ktoś ma pomysł dlaczego tak jest? Ew. jak to rozwiązać. Możliwe że chodzi tu o to że procek traktuje to drugie jako stringa? Wydaje mi się że jest to tab. charów ale może ktoś wie lepiej...
  • REKLAMA
  • #2 8822390
    tmf
    VIP Zasłużony dla elektroda
    W kodzie, który pokazałeś nie ma błędu - wniosek stąd taki, że funkcja putLCD jest skaszaniona - być może kolejny zapis na LCD odbywa się za szybko?
  • REKLAMA
  • #3 8822417
    gaskoin
    Poziom 38  
    Może procesor za szybko pruje ? i wyświetlacz nie nadąża ? Masz jakieś opóźnienia w funkcji put ?
  • #4 8822538
    Prezes87
    Poziom 11  
    Tu jest funkcja putLCD
    
    void putLCD(unsigned char data) //było też int data
    {
    PORTB |= (1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    PORTA = data;
    PORTB &=~(1<<E);
    _delay_us(120);
    
    }
    


    ale wydaje mi się być w porządku... Po za tym działa dla pojedyńczych charów jak pisałem powyżej.
  • REKLAMA
  • #5 8822809
    gaskoin
    Poziom 38  
    a pokaż cały kod ?
  • REKLAMA
  • #6 8823026
    Prezes87
    Poziom 11  
    
    #define F_CPU            1000000ul
    #include <avr/io.h>
    #include <stdio.h>
    #include <util/delay.h>
    #define RS PB0
    #define RW PB1
    #define E  PB2 
    
    
    void initLCD(void)
    {
    
    PORTB &= ~(1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    
    PORTA = 0x3C;   // dwie linie, 5x7 punktow
    
    PORTB &=~(1<<E);
    _delay_us(120);
    
    PORTB |= (1<<E);
    PORTA = 0x0f;   // wlacz wyswietlacz, kursor, miganie
    PORTB &=~(1<<E);
    _delay_us(120);
    }
    
    void clearLCD(void)
    {
    
    PORTB &= ~(1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    PORTA = 0x01;
    PORTB &=~(1<<E);
    _delay_us(120);
    }
    
    void putLCD(unsigned char data)
    {
    PORTB |= (1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    PORTA = data;
    PORTB &=~(1<<E);
    _delay_us(120);
    
    }
    
    void nlLCD(void)
    {
    PORTB &= ~(1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    PORTA = 0xc0;
    PORTB &=~(1<<E);
    _delay_us(120);
    }
    
    
    int main(void){
    int wielk;
    unsigned char Temp;
    DDRD = 0xff;
    PORTD = 0x00;
    DDRA = 0xff;
    PORTA = 0xff;
    DDRC = 0xff;
    DDRB = 0xff;
    PORTB = 0x00;
    _delay_ms(200);
    unsigned char mama[]= "zeze";
    wsk = mam;
    initLCD();
    clearLCD();
    
    //initUSART(MYUBRR);
    
       while(1)
       {
       for(wielk=0;wielk<4;wielk++)
       putLCD(mama[wielk]);
       _delay_ms(200);
       }
    
    return 0;
    }
    



    Sprawdziłem i jeśli tablica mama będzie zadeklarowana tak:
    
    unsigned char mama[]= {'z','e','z','e'};
    


    to wyświetla wszystko ok...
  • #7 8828566
    Prezes87
    Poziom 11  
    Ma ktoś jakiś pomysł żeby to zadziałało?
  • #8 8828935
    michalko12
    Specjalista - Mikrokontrolery
    Chyba podobny problem co miał Mirekk36

    unsigned char mama[]= "zeze";
    zapisz jako:
    static unsigned char mama[]= "zeze";

    lub
    unsigned char mama[]= "zeze";
    przenieś poza funkcję main();
  • #9 8829968
    Prezes87
    Poziom 11  
    Nie działa niestety w ten sposób.

    Próbowałem przekazywania przez wskaźniki itp. nie mam pojęcia co jest...

    Poniżej kod całego programu może ktoś dopatrzy się jakiś poważniejszych uchybień gdzie indziej, ale wątpie...

    Plik main.c
    
    #define F_CPU            1000000ul
    #include <avr/io.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include <string.h>
    #include <avr/interrupt.h> 
    //#include <lcd.h>
    #include <menu.h>
    
    #define FOSC  1000000 
    #define BAUD 4800
    #define MYUBRR FOSC/16/BAUD-1 
    
    int spr = 0;
    int spr1 = 0;
    int satka = 0;
    int GGA[100],GSA[100],GSV[100],GSV1[100],GSV2[100],RMC[100],VTG[100];
    int ktora_tablica = 0;
    
    
    
    void initUSART(unsigned int ubrr)
    {
    	UBRRH = (unsigned char)(ubrr>>8);
    	UBRRL = (unsigned char)ubrr; 								//23-4800,11-9600,7-14400,5-19200,2-38400,1-57600,0-115200
    	UCSRB = (1<<RXEN)|(1<<RXCIE)|(1<<TXEN);	
    	UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);	//8-bitów, brak parzystosci, 1 bit stopu
    	sei();
    }
    
    
    
    int main(void){
    int wielk,i;
    unsigned char Temp;
    DDRD = 0xff;
    PORTD = 0x00;
    DDRA = 0xff;
    PORTA = 0xff;
    DDRC = 0xff;
    DDRB = 0xff;
    PORTB = 0x00;
    _delay_ms(200);
    
    initLCD();
    clearLCD();
    menu();						//to ma wyświetlić!!!!!!!!!!!!!!!
    
    initUSART(MYUBRR);
    
       while(1)
       {
    
       }
    
    return 0;
    }
    
    ISR(USART_RXC_vect)
    {
    	unsigned char Temp;
    	Temp = UDR;
    	
    	if(Temp == '$')
    	{
    		spr = 1;
    		spr1 = 0;
    	}	
    	
    	
    	if(Temp == 0x0D)   			//Carriage return
    	{
    		spr = 0;
    	}	
    	
    	spr1++;	
    	if(spr == 1)
    	{
    		if(spr1 == 4)
    		{
    			if(Temp == 'G')
    				ktora_tablica = 0x00;
    			else if (Temp == 'R')
    				ktora_tablica = 0x06;
    			else
    				ktora_tablica = 0x07;
    		}
    		else if((ktora_tablica == 0)&(spr1 == 5))
    		{
    			
    			if(Temp == 'S')
    				ktora_tablica = 0x00;
    			else
    				ktora_tablica = 0x01;
    		}
    		else if((ktora_tablica == 0)&(spr1 == 6))
    		{
    			if(Temp == 'A')
    				ktora_tablica = 0x02;
    			else
    			switch(satka){
    			case 0:
    				ktora_tablica = 0x03;
    				satka = 1;
    				break;
    			case 1:
    				ktora_tablica = 0x04;
    				satka = 2;
    				break;
    			case 2:
    				ktora_tablica = 0x05;
    				satka = 0;
    				break;}
    		}
    		if(spr1>7)
    		switch(ktora_tablica)
    		{
    			case 1:
    				GGA[spr1] = Temp;
    				break;
    			case 2:
    				GSA[spr1] = Temp;	
    				satka = 0;
    				break;
    			case 3:
    				GSV[spr1] = Temp;
    				break;
    			case 4:
    				GSV1[spr1] = Temp;
    				break;
    			case 5:
    				GSV2[spr1] = Temp;
    				break;
    			case 6:
    				RMC[spr1] = Temp;
    				break;
    			case 7:
    				VTG[spr1] = Temp;
    				break;
    		}
    		
    	}
    	
    } 
    
    ISR(INT0_vect)
    {
    
    }
    


    plik lcd.h
    
    #define RS PB0
    #define RW PB1
    #define E  PB2 
    
    
    void initLCD(void)
    {
    
    PORTB &= ~(1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    
    PORTA = 0x3C;   // dwie linie, 5x7 punktow
    
    PORTB &=~(1<<E);
    _delay_us(120);
    
    PORTB |= (1<<E);
    PORTA = 0x0f;   // wlacz wyswietlacz, kursor, miganie
    PORTB &=~(1<<E);
    _delay_us(120);
    }
    
    void clearLCD(void)
    {
    
    PORTB &= ~(1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    PORTA = 0x01;
    PORTB &=~(1<<E);
    _delay_us(120);
    }
    
    void putLCD(int data)
    {
    PORTB |= (1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    PORTA = data;
    PORTB &=~(1<<E);
    _delay_ms(10);
    
    }
    
    
    
    void nlLCD(void)
    {
    PORTB &= ~(1<<RS);
    PORTB &= ~(1<<RW);
    PORTB |= (1<<E);
    PORTA = 0xc0;
    PORTB &=~(1<<E);
    _delay_us(120);
    }
    


    plik menu.h
    
    #include <lcd.h>
    void menu(){
    int i;
    static unsigned char menu_glowne[5][16] =          {{'M','E','N','U',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '},
    									 {'1','.',' ','M','o','j','a',' ','p','o','z','y','c','j','a',' '},
    									 {'2','.',' ','C','z','a','s',' ','G','T','M',' ',' ',' ',' ',' '},
    									 {'3','.',' ','I','l','o','s','c',' ','s','a','t','e','l','i','t'},
    									 {'4','.',' ','P','r','e','d','k','o','s','c',' ',' ',' ',' ',' '}
    									 };
    									 
    for(i=0;i<16;i++)
    	putLCD(menu_glowne[0][i]);
    nlLCD();
    for(i=0;i<16;i++)
    	putLCD(menu_glowne[1][i]);									 
    }
    


    Dodano po 3 [godziny] 38 [minuty]:

    Problem rozwiązany, tylko byłbym wdzięczny jakby ktoś wytłumaczył czemu tak się dzieje. Jeżeli mam zadeklarowane te tablice:
    
    int GGA[100],GSA[100],GSV[100],GSV1[100],GSV2[100],RMC[100],VTG[100];
    

    to mi nie wyświetla poprawnie. Czy chodzi o to, że pamięć jest zapchana? Czy brakuje rejestrów do przeniesienia danych?
REKLAMA