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

[attiny2313][C] Sterowanie LCD?

_michasss_ 16 Lis 2008 18:27 2633 15
REKLAMA
  • #1 5746633
    _michasss_
    Poziom 11  
    hej,
    zdaje sobie sprawe ze temat byl walkowany sporo razy, ale niestety nie udalo mi sie znalezc odpowiedzi na to z czym mam problem. Napisalem prosty program w C ktorego zadaniem mialo byc czyszczenie wyswietlacza (czyli zamiast samych kwadracikow w pierwszej linii, nie powinienem widziec niczego), ale niestety gdzies musialem popelnic blad (podlaczenie jest raczej okej - sprawdzalem juz chyba z 10 razy :)). Linie danych wyswietlacza sa podpiete pod uP na caly porcie B, w trakcie pisanie programu korzystalem z -> http://student.agh.edu.pl/~michasss/elektronika/lcd.jpg

    Przy czym chce wywolac funkcje CLEAR DISPLAY wiec RS=1

    
    #include <avr/io.h>
    #define F_CPU 8000000
    #include <util/delay.h>
    
    #define RS PD0
    #define RW PD1
    #define E PD2
    
    int main()
    {
    	while(1)
    	{
    		DDRD |= _BV(RS);           // ustawienie RS na 1
    		DDRD &= ~_BV(RW);           // ustawienie RW na 0
    		DDRD &= ~_BV(E);           // ustawienie E na 0
    		PORTB = 0x01;           // wpisywanie danych
    		_delay_ms(1);           // podtrzymanie
    		DDRD |= _BV(E);           // ustawienie E na 1
    		PORTB = 0x00;           // brak danych
    		_delay_ms(1);           // podtrzymanie
    		DDRD &= ~_BV(E);           // ustawienie E na 0
    		_delay_ms(1);           // podtrzymanie
    		PORTB = 0x01;           // znowu dane
    		DDRD |= _BV(RW);           // ustawienie RW na 1
    		DDRD &= ~_BV(RS);           // ustawienie RS na 0
    
    
    	}
    
    
    }
    


    LCD ze sterownikiem HD44780. Dziekuje za pomoc, pozdrawiam Michal
  • REKLAMA
  • #2 5746909
    dawid512
    Poziom 32  
    RW ma być na stałe podłączone do masy.

    Po za tym np. to:
    DDRD |= _BV(RS);           // ustawienie RS na 1 
    . Komentarz to tylko twoja sugestia a w rzeczywistości uc robi co innego...

    Zapamietaj ze DDRx służy do ustawiania kierunku portu a nie wystawiania nań odpowiedniego stanu.
  • #3 5747098
    _michasss_
    Poziom 11  
    przepraszam za moje prawdopodobnie banalne pytania, ale jest to dopiero moj 2 uklad ...

    w takim razie jak powinno byc poprawnie?

    PORTD=0xff; ?

    nie da rady jakos zrobic tego w jednej linii?
  • REKLAMA
  • #5 5747867
    mirekk36
    Poziom 42  
    _michasss_ napisał:

    zdaje sobie sprawe ze temat byl walkowany sporo razy, ale niestety nie udalo mi sie znalezc odpowiedzi na to z czym mam problem. Napisalem prosty program w C ktorego zadaniem mialo byc czyszczenie wyswietlacza (czyli zamiast samych kwadracikow w pierwszej linii, nie powinienem widziec niczego), ale niestety gdzies musialem popelnic blad


    oczywiście, że popełniłeś błąd i to spory. Nigdy ci się to nie uda w ten sposób - bo w ogóle nie taka jest idea "skasowania" jak ty to nazywasz kwadracików w górnej linijce.

    Po pierwsze to trzeba zainicjalizować wyświetlacz LCD, jeśli ma 2 wiersze to do pracy z 2 wierszami, wtedy zniknie ci ta twoja linijka z kwadracikami na górze. Ale to będzie miało niewiele wspólnego z samym rozkazem CLS, który służy do kasowania znaków na wyświetlaczu i przywracania kursora na początek.

    Musisz się więc na początek zapoznać z metodami inicjalizacji wyświetlacza LCD i to dokładnie a potem dopiero coś na nim wyświetlać i jak będziesz chciał kasować

    (procedura inicjalizacji ma na celu ustawienie najpierw podstawowych parametrów pracy tegoż wyświetlacza - ale jak widzę pominąłeś w ogóle przeczytanie tego najistotniejszego fragmentu informacji n/t pracy z LCD )
  • #6 5748022
    _michasss_
    Poziom 11  
    hmm, w moim ukladziku jest jeszcze przylutowana dioda ktora sobie mrygam - tak na wszelki wypadek zeby wiedziec czy dobrze procek sie zaprogramowal, i przy zmianie DDRx na PORTx przestala mrugac

    
    #include <avr/io.h>
    #define F_CPU 8000000
    #include <util/delay.h>
    
    #define RS PD0
    #define RW PD1
    #define E PD2
    
    int main()
    {
    	while(1)
    	{
    		PORTD |= _BV(PD4);        // czesc odpowiadajaca za diode
    		_delay_ms(10);
    		PORTD &= ~_BV(PD4);
    		_delay_ms(10);
    
    
    		PORTD |= _BV(RS);        // czesc odpowiadajaca za LCD
    		PORTD &= ~_BV(RW);
    		PORTD &= ~_BV(E);
    		PORTB = 0x01;
    		_delay_ms(1);
    		PORTD |= _BV(E);
    		PORTB = 0x01;
    		_delay_ms(1);
    		PORTD &= ~_BV(E);
    		_delay_ms(1);
    		PORTB = 0x01;
    		PORTD &= ~_BV(RS);
    
    	}
    }
    
    


    co do F_CPU to gdzies w internecie znalazlem ze attiny ma 8 MHz. Wracajac do tematu to po przestawieniu z DDRx na PORTx nawet diodka przestala reagowac, jak w takim razie jest poprawnie? Jeszcze raz przepraszam za glupie pytania, ale sie ucze dopiero :) Dziekuje Wam za pomoc :)

    @mirekk36 -> okej, poszukam czegos dziekuje :)
  • #7 5748114
    dawid512
    Poziom 32  
    Kolego najpierw używa się DDRX żeby ustalić czy dana końcówka ma być wejściem czy wyjściem a dopiero wtedy wystawia się na nią odpowiedni stan za pomocą PORTX...Po za tym owszem attiny ma 8MHz ale dopiero wtedy jak ustawi się fuse bity... Po wyjściu z fabryki ma wew. RC 1MHz i jak na razie tego się trzymaj.
  • REKLAMA
  • REKLAMA
  • #9 5748367
    dawid512
    Poziom 32  
    Masz racje Freddie... szkoda tylko że ludzie zanim stworzą nowy temat nie korzystają z wszelkiego rodzaju kursów i dokumentacji. Przecież na forum dostaną wszystko na tacy więc po co się męczyć?
  • #10 5748608
    _michasss_
    Poziom 11  
    Panowie, nikt Was nie zmusza do pomocy, nie chcesz nie pomagaj! Ja nie pytam po to zeby komus zrobic na zlosc albo zajac kolejne MB w bazie danych, zawsze przed zadaniem pytania na jakims forum przeszukuje siec w poszukiwaniu odp. na nurtujacy mnie temat, jednak czasami tego jest zbyt duzo i ciezko wybrac cos wartosciowego i po kilku godzinach spedzonych na googlach czlowiek ma dosc i woli zapytac ludzi ktorzy juz z podobnym problemem mieli stycznosc, bo wiadomo maja juz w tym doswiadczenie i wiedza gdzie sa przydatne inforamcje na dany temat. For uzywam w ostatecznosci i denerwuja mnie posty takiego typu jak napisal Freddie Chopin, jaki to ma cel? jaka wartosc? EOT

    --------------------------------------------------------------------------------------------------------------------------------

    Wracajac do LCD, korzystajac z:
    http://www.elportal.pl/pdf/k09/24_07.pdf
    http://www.elportal.pl/pdf/k09/25_10.pdf

    napisalem funkcje do inicjalizacji LCD, ale znowu cos skopalem - jak zahaszuje linie odpowiedzialna za wlaczenie ekranu LCD to On i tak jest wlaczony (i nadal sa kwadraty; linia lcd_write(0, 0x08); powoduje wylaczenie eranu ... w teorii :) ), wydaje mi sie ze jest cos nie tak w funkcji lcd_write(); czy moglby ktos na nia zerknac? Dzieki Michal

    
    #include <avr/io.h>
    #include <util/delay.h>
    #define F_CPU 1000000
    
    #define RS PD0			// RS config
    #define DDR_RS DDRD
    #define PORT_RS PORTD
    #define SET_RS PORT_RS |= _BV(RS)
    #define CLR_RS PORT_RS &= ~_BV(RS)
    
    #define RW PD1			// RW config
    #define DDR_RW DDRD
    #define PORT_RW PORTD
    #define SET_RW PORT_RW |= _BV(RW)
    #define CLR_RW PORT_RW &= ~_BV(RW)
    
    #define E PD2			// E config
    #define DDR_E DDRD
    #define PORT_E PORTD
    #define SET_E PORT_E |= _BV(E)
    #define CLR_E PORT_E &= ~_BV(E)
    
    #define DDR_LCD DDRB	// LCD config
    #define PORT_LCD PORTB
    
    #define LED PD4			// LED config
    #define DDR_LED DDRD
    #define PORT_LED PORTD
    #define LED_ON PORT_LED |= _BV(LED)
    #define LED_OFF PORT_LED &= ~_BV(LED)
    
    void lcd_write(unsigned char RS2, unsigned char instr)	// when RS2 == 0 -> instruction
    {															           // when RS2 != 0 -> data
    	DDR_RS |= _BV(RS);										// 1 -> output
    
    	if(RS2==1)
    	{
    		SET_RS;												// RS -> 1
    	} else {
    		CLR_RS;												// RS -> 0
    	}
    
    	DDR_RW |= _BV(RW);										// 1 -> output
    	CLR_RW;													// RW -> 0
    	DDR_E |= _BV(E);
    	CLR_E;
    	_delay_ms(1);
    	SET_E;
    	_delay_ms(1);
    	PORT_LCD = instr;    // <<<< ----------- TEJ LINI NIE JESTEM PEWIEN - nie mozna zrobic DDR_LCD |= _BV(PB); wiec nie moge okreslic calego 
    	_delay_ms(1);    // portu PB jako wyjscia (na calym porcie PB sa podpiete linie danych LCD)
    	DDR_E |= _BV(E);
    	CLR_E;
    	_delay_ms(1);
    }
    
    void lcd_init(void)
    {
    	_delay_ms(30);
    	unsigned char i;
    
    	for(i=0;i<3;i++)
    	{
    		lcd_write(0, 0x30);
    		_delay_ms(5);
    	}
    
    	lcd_write(0, 0x38);
    	lcd_write(0, 0x08);										// Display off
    	lcd_write(0, 0x01);										// Display on
    	lcd_write(0, 0x07);
    }
    
    
    
    int main()
    {
    	while(1)
    	{
    		DDR_LED |= _BV(LED);	// LED
    		LED_ON;
    		_delay_ms(5);
    		LED_OFF;
    		_delay_ms(5);
    
    		lcd_init();
    		_delay_ms(1000);
    	}
    }
    
    
  • #11 5748665
    Freddie Chopin
    Specjalista - Mikrokontrolery
    _michasss_ napisał:
    zawsze przed zadaniem pytania na jakims forum przeszukuje siec w poszukiwaniu odp. na nurtujacy mnie temat, jednak czasami tego jest zbyt duzo i ciezko wybrac cos wartosciowego

    do tego tematu potrzebne ci sa DWA dokumenty. datasheet mikrokontrolera i datasheet sterownika LCD HD44780. nic wiecej. nie wiem wiec co cie tak przygniotlo. jesli czujesz potrzebe to mozesz sobie sciagnac jakas gotowa biblioteke i jej uzyc, no wiec to juz beda trzy rzeczy...

    Cytat:
    For uzywam w ostatecznosci i denerwuja mnie posty takiego typu jak napisal Freddie Chopin, jaki to ma cel? jaka wartosc?

    my for uzywamy codziennie i denerwuja nas tematy, gdzie przez pierwsze 10 wiadomosci trzeba sprawdzac czy ktos przeczytal datasheeta (zwykle nie, bo po co), czy zmienil fusebity ('a co to sa fusebity?'), czy aby na pewno podlaczyl wszystko jak trzeba, a potem i tak sie okazuje, ze 'ups, kabelki mi sie pomylily' albo cos rownie trywialnego ('no tak, pisze na 3 stronie instrukcji, dzieki za te 25 postow')...

    co do tematu - po co wylaczac wyswietlacz? pierwszy raz widze takie dzialanie...

    po cholere sto tysiecy razy ustawiasz kierunek linii sterujacych? oczywiscie taka drobnostka jak kierunek portu danych ci juz umknela? faktycznie - godzinami musiales net przeczesywac i mogles nie trafic na ta tajna informacje, ze jak chcesz cos wpisuwac do portu, to wypadaloby aby byl on wyjsciem... w KAZDEJ przykladowej bibliotece do LCD linijka ustawiania kierunku portu raczej nie jest schowana... po jakiego wiec czytasz jakies pdfy z elportalu zamiast zassac pierwsza lepsza dzialajaca biblioteke i ja przerobic do swoich potrzeb...

    4\/3!!
  • #12 5750267
    Darektbg
    Poziom 21  
    https://www.elektroda.pl/rtvforum/topic1137780.html
    I nie pisz, że szukałeś ;-)
    Nie obraż się, ale brać się za pisanie biblioteki nie znając podstaw, to tak jak budować samochód nie znając elementarnych rzeczy z mechaniki.

    Nikogo nie oszukasz, przeskakując kilka tematów, co najwyżej samego siebie, ale to i tak wychodzi po jakimś czasie - sam masz na sobie idealny przykład.
  • #13 5752437
    _michasss_
    Poziom 11  
    Cytat:

    my for uzywamy codziennie i denerwuja nas tematy, gdzie przez pierwsze 10 wiadomosci trzeba sprawdzac czy ktos przeczytal datasheeta (zwykle nie, bo po co), czy zmienil fusebity ('a co to sa fusebity?'), czy aby na pewno podlaczyl wszystko jak trzeba, a potem i tak sie okazuje, ze 'ups, kabelki mi sie pomylily' albo cos rownie trywialnego ('no tak, pisze na 3 stronie instrukcji, dzieki za te 25 postow')...


    nie wszyscy tak robia, ja czasami poprostu potrzebuje jakiegos kopa zeby ruszyc dalej, dlatego szukam/pytam jak czegos nie wiem

    Cytat:

    Nie obraż się, ale brać się za pisanie biblioteki nie znając podstaw, to tak jak budować samochód nie znając elementarnych rzeczy z mechaniki.


    Tak, masz racje, jednak przy takiej budowie szybko uczysz sie jak co dziala


    -----------------------------------------------------------------------------------------

    Temat przedawniony, napisany przeze mnie kod (umieszczony ponizej) dziala, jesli ktos chce z niego skorzystac to prosze bardzo. Jesli ktos ma jakies uwagi (powtarzam uwagi a nie glupie docinki) bo cos mozna lepiej/szybciej/krocej zrobic to chetnie wyslucham


    
    /*
     * wyswietlacz.lcd.c
     *
     *  Created on: 2008-11-16
     *      Author: Michal Dudek
     */
    
    #include <avr/io.h>
    #include <util/delay.h>
    #define F_CPU 1000000
    
    #define RS PD0			// konfiguracja RS
    #define DDR_RS DDRD
    #define PORT_RS PORTD
    #define SET_RS PORT_RS |= _BV(RS)
    #define CLR_RS PORT_RS &= ~_BV(RS)
    
    #define RW PD1			// konfiguracja RW
    #define DDR_RW DDRD
    #define PORT_RW PORTD
    #define SET_RW PORT_RW |= _BV(RW)
    #define CLR_RW PORT_RW &= ~_BV(RW)
    
    #define E PD2			// konfiguracja E
    #define DDR_E DDRD
    #define PORT_E PORTD
    #define SET_E PORT_E |= _BV(E)
    #define CLR_E PORT_E &= ~_BV(E)
    
    #define LCD 0xff		// caly port B ma byc ustawiony jako wyjscia - konfiguracja LCD
    #define DDR_LCD DDRB	//
    #define PORT_LCD PORTB
    
    void lcd_write(unsigned char RS2, unsigned char instr)	// gdy RS2 == 0 -> instrukcja
    {															// gdy RS2 != 0 -> dane
    	DDR_RS |= _BV(RS);										// ustawianie wyjscia
    
    	if(RS2==1)
    	{
    		SET_RS;												// wystawienie na linii RS -> 1
    	}
    	else
    	{
    		CLR_RS;												// wystawienie na linii RS -> 0
    	}
    
    	DDR_RW |= _BV(RW);										// ustawianie wyjscia
    	CLR_RW;													// wystawienie na linii RW -> 0
    	DDR_E |= _BV(E);										// ustawianie wyjscia
    	CLR_E;													// wystawienie na linii E -> 0
    	_delay_ms(1);
    	SET_E;													// wystawienei na linii E -> 1
    	_delay_ms(1);
    	DDR_LCD = LCD;											// wystawienie calego portu danych LCD jako wyjscia
    	PORT_LCD = instr;										// wyslanie danych
    	_delay_ms(1);
    	DDR_E |= _BV(E);										// ustawianie wyjscia
    	CLR_E;													// wystawienie na linii E -> 0
    	_delay_ms(1);
    }
    
    void lcd_init(void)
    {
    	_delay_ms(30);
    	unsigned char i;
    
    	for(i=0;i<3;i++)
    	{
    		lcd_write(0, 0x30);
    		_delay_ms(5);
    	}
    
    //	lcd_write(0, 0x38);		// interfejs 8 bitowy, 2 linie, znaki 5x7
    	lcd_write(0, 0x3c);		// interfejs 8 bitowy, 2 linie, znaki 5x10
    	lcd_write(0, 0x08);		// LCD OFF
    	lcd_write(0, 0x01);		// LCD ON
    	lcd_write(0, 0x06);		// po zapisaniu znaku do wyświetlacza kursor zmienia położenie, a przesuwanie okna jest wyłączone
    							// kursor lub okno wyświetlacza przesuwa się w prawo (inkrementacja adresu znaku)
    	lcd_write(0, 0x0e);		// wlacza wyswietlacz i kursor
    
    }
    
    void lcd_write_text(char line_nr, char *txt) // zmienna ktora przyjmuje wartosc linii wyswietlacza (2 - oznacza druga linie, pozostale wartosci oznaczaja linie pierwsza) 
    {												// oraz tekst do wyswietlenia
    	if(line_nr==2)
    	{
    		lcd_write(0, 0xc0);
    	}
    	else
    	{
    		lcd_write(0, 0x02);
    	}
    
    	while(*txt)
    	{
    		lcd_write(1, *txt);
    		_delay_ms(10);
    		txt++;
    	}
    }
    
    
    int main()
    {
    
    	lcd_init();
    	_delay_ms(1);
    	lcd_write_text(1, "Linia nr 1 ;-)");
    	lcd_write_text(2, "Linia nr 2 ;-)");
    }
    


    Materialy ktore warto przegladnac:
    http://www.elportal.pl/pdf/k09/23_01.pdf
    http://www.elportal.pl/pdf/k09/24_07.pdf
    http://www.elportal.pl/pdf/k09/25_10.pdf
    http://radzio.dxp.pl/hd44780/hd44780_podstawy.htm

    Dziekuje wszystkim za pomoc, pozdr
  • #14 5752624
    Freddie Chopin
    Specjalista - Mikrokontrolery
    beznadziejny kod. pisalem juz dlaczego, ale widac wolisz 'bladzic w ciemnosciach' zamiast posluchac rad. skoro poprzednich bezsensownych rzeczy nie wyeliminowales, to nawet nie bede pisal o kolejnych.

    4\/3!!
  • #15 5756395
    _michasss_
    Poziom 11  
    poprawione

    
    /*
     * wyswietlacz.lcd.c
     *
     *  Created on: 2008-11-16
     *      Author: Michal Dudek
     */
    
    #include <avr/io.h>
    #include <util/delay.h>
    #define F_CPU 1000000
    
    #define RS PD0			// konfiguracja RS
    #define DDR_RS DDRD
    #define PORT_RS PORTD
    #define SET_RS PORT_RS |= _BV(RS)
    #define CLR_RS PORT_RS &= ~_BV(RS)
    
    #define RW PD1			// konfiguracja RW
    #define DDR_RW DDRD
    #define PORT_RW PORTD
    #define SET_RW PORT_RW |= _BV(RW)
    #define CLR_RW PORT_RW &= ~_BV(RW)
    
    #define E PD2			// konfiguracja E
    #define DDR_E DDRD
    #define PORT_E PORTD
    #define SET_E PORT_E |= _BV(E)
    #define CLR_E PORT_E &= ~_BV(E)
    
    #define LCD 0xff		// caly port B ma byc ustawiony jako wyjscia - konfiguracja LCD
    #define DDR_LCD DDRB	//
    #define PORT_LCD PORTB
    
    void lcd_write(unsigned char RS2, unsigned char instr)	// gdy RS2 == 0 -> instrukcja
    {															// gdy RS2 != 0 -> dane
    
    	if(RS2==1)
    	{
    		SET_RS;												// wystawienie na linii RS -> 1
    	}
    	else
    	{
    		CLR_RS;												// wystawienie na linii RS -> 0
    	}
    
    	CLR_RW;													// wystawienie na linii RW -> 0
    	CLR_E;													// wystawienie na linii E -> 0
    	_delay_ms(1);
    	SET_E;													// wystawienei na linii E -> 1
    	_delay_ms(1);
    	PORT_LCD = instr;										// wyslanie danych
    	_delay_ms(1);
    	CLR_E;													// wystawienie na linii E -> 0
    	_delay_ms(1);
    }
    
    void lcd_init(void)
    {
    	DDR_RS |= _BV(RS);										// ustawianie wyjscia
    	DDR_RW |= _BV(RW);										// ustawianie wyjscia
    	DDR_E |= _BV(E);										// ustawianie wyjscia
    	DDR_LCD = LCD;											// wystawienie calego portu danych LCD jako wyjscia
    
    	_delay_ms(30);
    	unsigned char i;
    
    	for(i=0;i<3;i++)
    	{
    		lcd_write(0, 0x30);
    		_delay_ms(5);
    	}
    
    //	lcd_write(0, 0x38);		// interfejs 8 bitowy, 2 linie, znaki 5x7
    	lcd_write(0, 0x3c);		// interfejs 8 bitowy, 2 linie, znaki 5x10
    	lcd_write(0, 0x08);		// LCD OFF
    	lcd_write(0, 0x01);		// LCD ON
    	lcd_write(0, 0x06);		// po zapisaniu znaku do wyświetlacza kursor zmienia położenie, a przesuwanie okna jest wyłączone
    							// kursor lub okno wyświetlacza przesuwa się w prawo (inkrementacja adresu znaku)
    	lcd_write(0, 0x0e);		// wlacza wyswietlacz i kursor
    
    }
    
    void lcd_write_text(char line_nr, char *txt) // zmienna ktora przyjmuje wartosc linii wyswietlacza (2 - oznacza druga linie, pozostale wartosci oznaczaja linie pierwsza)
    {												// oraz tekst do wyswietlenia
    	if(line_nr==2)
    	{
    		lcd_write(0, 0xc0);
    	}
    	else
    	{
    		lcd_write(0, 0x02);
    	}
    
    	while(*txt)
    	{
    		lcd_write(1, *txt);
    		_delay_ms(50);
    		txt++;
    	}
    }
    
    
    int main()
    {
    
    	lcd_init();
    	_delay_ms(1);
    	lcd_write_text(1, "Linia nr 1 ;-)");
    	lcd_write_text(2, "Linia nr 2 ;-)");
    }
    
  • #16 5756765
    Freddie Chopin
    Specjalista - Mikrokontrolery
    wszystkie opoznienia ktore powstawiales maja zbyt duze wartosci - konkretne czasy jakie trzeba odczekac umieszczone sa w datasheecie.

    przy wykonywaniu tzw. strobe'a linia ENABLE nie ma potrzeby ustawiac jej poczatkowo w stan niski, bo juz w takim stanie jest - po zakonczeniu jedynej funkcji jaka modyfikuje ta linie jest ona w stanie niskim, wiec na jej wejsciu tez w takim bedzie. a nawet jesli nie, to i tak nie wazne, bo dane zapisywane sa na opadajacym zboczu.

    i zmienne definiuje sie na poczatku funkcji dla przejrzystosci - to ze zdefiniujesz ja pozniej i tak nic w kodzie wynikowym nie zmieni, bo standardowo wybrany w gcc standard C90 i tak tego nie wspiera.

    4\/3!!
REKLAMA