Błąd w programie

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Błąd w programie

Post autor: rezasurmar » 14 paź 2011, 14:02

Witam, staram się napisać program obsługujący 6wyświetlaczy LED wspólna anoda (multiplekserowanie), udało mi się jak do tej pory, korzystając z pomocy książki z ATNEL, napisać większość obsługi, ale stanąłem w martwym punkcie, w main.c gdy wrzucam cyfry w poszczególne zmienne tj. cy1 do cy6, to na wyświetlaczu 1 i drugim, jest ok, ale na pozostałych wyświetla się dokładnie to samo co na drugim (licząc od prawej).
Jestem zielony z tego, już nie wiem gdzie szukać błędu.

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#include "d_led.h" //dołączenie pliku nagłówkowego (obsługa LED)


int main(void) {
	//******* Inicjacja ********
	d_led_init();	// inicjacja wyświetlacza multiplekserowego


uint16_t licznik=60000;
uint8_t d1,d2,d3,d4,d5,d6;
			
		

	sei();	//	Włączenie globalnej obsługi przerywań




		//**********************  pętla główna
		while(1)
		{
			
		licznik--;

				
			cy1=1;
			cy2=3;
			cy3=3;
			cy4=4;
		}


}
plik d_led.c

Kod: Zaznacz cały

/*
 * d_led.c
 *
 *  Created on: 2011-10-13
 *      Author: sylwq
 */

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>	// dołączenie pl. nagłówkowego potrzebnego do odczytu
							// danych zawartych w pamięci programu FLASH
#include "d_led.h" //	dołączenie pliku nagłówkowego
		//	w nim znajdują się definicje preprocesora
		//	definicje zmiennych globalnych przechowujacych cyfry do wyświetlenia
		//	volatile - ponieważ będą wykorzystywane do odczytu i zapisu zarówno
		//	dostępu do nich. (zmienne ulotne)

volatile uint8_t cy1;
volatile uint8_t cy2;
volatile uint8_t cy3;
volatile uint8_t cy4;
volatile uint8_t cy5;
volatile uint8_t cy6;

// definicja tablicy zawierającej definicje bitowe cyfr LED
uint8_t cyfry[15] PROGMEM = {
		(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),			// 0
		(SEG_B|SEG_C),									// 1
		(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),				// 2
		(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),				// 3
		(SEG_B|SEG_C|SEG_F|SEG_G),						// 4
		(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),				// 5
		(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),			// 6
		(SEG_A|SEG_B|SEG_C|SEG_F),						// 7
		(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),	// 8
		(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),			// 9
		0x00											// NIC (puste miejsce)
};

//		definicja funkcji inicjującej pracę z wyświetlaczem multiplexerowym

void d_led_init(void)
{
	LED_DATA_DIR = 0xFF;	// wszystkie piny portu PA jako wyjścia (katody)
	LED_DATA = 0x00; 	// Wygaszenie wszystkich katod - stan niski
	// 6 pinów portu C jako wyjścia (anody)
	ANODY_DIR |= CA1 | CA2 | CA3 | CA4 | CA5 | CA6;
	LED_ANODY |= CA1 | CA2 | CA3 | CA4 | CA5 | CA6;
	LED_ANODY = 0x00;
	// Ustawienie TIMER0
	TCCR0 |= (1<<WGM01);	// Tryb CTC
	TCCR0 |= (1<<CS02)|(1<<CS00); // Preskaler = 1024
	OCR0 = 10;	//	Dodatkowy podział przez 26 (rej. przepełnienia)
	TIMSK |= (1<<OCIE0);	// Zezwolenie na przerywanie CompareMatch
}
//============PROCEDURA OBSŁUGI PRZERYWANIA - COMPARE MATCH==================
ISR(TIMER0_COMP_vect)
{
	static uint8_t licznik=4;		// zmienna do przełączania kolejno anod wyrwietlacza

	//LED_ANODY = (LED_ANODY & 0xFF);

	if(licznik==4) 		LED_DATA = pgm_read_byte( &cyfry[cy1] );	// gdy zapalony wyśw.1 podaj stan zmiennej c1
	else if(licznik==8) LED_DATA = pgm_read_byte( &cyfry[cy2] );	// gdy zapalony wyśw.2 podaj stan zmiennej c2
	else if(licznik==10) LED_DATA = pgm_read_byte( &cyfry[cy3] );	// gdy zapalony wyśw.3 podaj stan zmiennej c3
	else if(licznik==20) LED_DATA = pgm_read_byte( &cyfry[cy4] );	// gdy zapalony wyśw.4 podaj stan zmiennej c4
	else if(licznik==40) LED_DATA = pgm_read_byte( &cyfry[cy5] );	// gdy zapalony wyśw.5 podaj stan zmiennej c6
	else if(licznik==80) LED_DATA = pgm_read_byte( &cyfry[cy6] );	// gdy zapalony wyśw.6 podaj stan zmiennej c6
	
	LED_ANODY = licznik;		
	if(licznik>80) licznik = 2;		// jeśli licznik większy niż 80 to ustaw na 2
	licznik = licznik << 1;
}
plik nagłówkowy d_led.h

Kod: Zaznacz cały

/*
#ifndef D_LED_H_
#define D_LED_H_

// definicje portów i pinów wyświetlacza używanych dla
// ułatwienia w programie jako stałe preprocesora
#define 	LED_DATA	PORTA	// port z podłączonymi segmentami
#define		LED_DATA_DIR DDRA	// rejestr kierunku portu katod wyświetlaczy
#define 	LED_ANODY 	PORTC	// port z podłączonymi anodami
#define 	ANODY_DIR 	DDRC	// rejestr kierunku portu anod wyświetlaczy



// port z podłączonymi anodami 6 bitów od PC2 do PC7
#define 	CA1		(1<<PC7)	// CA1 oznacza bit nr 2 portu C
#define 	CA2		(1<<PC6)	// CA2 oznacza bit nr 3 portu C
#define 	CA3		(1<<PC5)	// CA3 oznacza bit nr 4 portu C
#define 	CA4		(1<<PC4)	// CA4 oznacza bit nr 5 portu C
#define 	CA5		(1<<PC3)	// CA5 oznacza bit nr 6 portu C
#define 	CA6		(1<<PC2)	// CA6 oznacza bit nr 7 portu C


// definicje bitów dla poszczególnych segmentów LED
#define SEG_A (1<<7)
#define SEG_B (1<<6)
#define SEG_C (1<<5)
#define SEG_D (1<<4)
#define SEG_E (1<<3)
#define SEG_F (1<<2)
#define SEG_G (1<<1)
#define SEG_DP (1<<0)

#define NIC 10

// same deklaracje zmiennych globalnych na potrzeby wykorzystania
// ich w innych plikach projektu
// przydomek extern powoduje, iż te zmienne będą dostępne we wszystkich
// modułach. które dołącza plik d_led.h za pomocną dyrektywy include
extern volatile uint8_t cy1;
extern volatile uint8_t cy2;
extern volatile uint8_t cy3;
extern volatile uint8_t cy4;
extern volatile uint8_t cy5;
extern volatile uint8_t cy6;

// obszar deklaracji funkcji udostępnionych dla innych modółów
void d_del_init(void);



#endif /* D_LED_H_ */ // koniec _d_led_h

Ostatnio zmieniony 14 paź 2011, 20:32 przez rezasurmar, łącznie zmieniany 1 raz.

keruseykaryu

Post autor: keruseykaryu » 14 paź 2011, 17:32

Coś chyba źle wkleiłeś te pliki. Chyba, że d_led.c jest taki sam jak d_led.h?

Ale błąd pewnie masz tu:

Kod: Zaznacz cały

    if(licznik==4)         LED_DATA = pgm_read_byte( &cyfry[cy1] );    // gdy zapalony wyśw.1 podaj stan zmiennej c1 
     else if(licznik==8) LED_DATA = pgm_read_byte( &cyfry[cy2] );    // gdy zapalony wyśw.2 podaj stan zmiennej c2 
     else if(licznik==10) LED_DATA = pgm_read_byte( &cyfry[cy3] );    // gdy zapalony wyśw.3 podaj stan zmiennej c3 
     else if(licznik==20) LED_DATA = pgm_read_byte( &cyfry[cy4] );    // gdy zapalony wyśw.4 podaj stan zmiennej c4 
     else if(licznik==40) LED_DATA = pgm_read_byte( &cyfry[cy5] );    // gdy zapalony wyśw.5 podaj stan zmiennej c6 
     else if(licznik==80) LED_DATA = pgm_read_byte( &cyfry[cy6] );    // gdy zapalony wyśw.6 podaj stan zmiennej c6 
     
     LED_ANODY = licznik;        
     if(licznik>80) licznik = 2;        // jeśli licznik większy niż 80 to ustaw na 2 
     licznik = licznik << 1;
Bo jeśli rotujesz licznik bitowo w lewo to w warunkach musisz wartości mieć HEX a nie DEC. Na przykład:

Kod: Zaznacz cały

else if(licznik==0x80) LED_DATA = pgm_read_byte( &cyfry[cy6] );    // gdy zapalony wyśw.6 podaj stan zmiennej c6 

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 14 paź 2011, 20:34

wkleiłem poprawny plik .h, zaraz będę sprawdzał czy to faktycznie to, dzięki z góry wielkie. Jestem jeszcze ciemny z tego jak tabaka w rogu.

keruseykaryu

Post autor: keruseykaryu » 15 paź 2011, 8:59

rezasurmar pisze:zaraz będę sprawdzał czy to faktycznie to
To.
http://zapodaj.net/fbe634796dd5.jpg.html
http://zapodaj.net/994931c36e2d.jpg.html
U mnie są negacje bo wyświetlacz jest aktywny zerami.

I jeszcze jedno a propo wczoraj:

Kod: Zaznacz cały

    if(licznik>80) licznik = 2;        // jeśli licznik większy niż 80 to ustaw na 2
Jak to przerobisz na bardziej poprawną wersję

Kod: Zaznacz cały

    if(licznik>0x80) licznik = 0x02;        // jeśli licznik większy niż 128 to ustaw na 2
to ten warunek się nigdy nie spełni. Zamiast większe > zastosuj równe ==. I będzie gitara.

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 16 paź 2011, 13:23

Jeszcze raz dzięki wielkie, na symulacji działa, graty mam w pracy więc dopiero sprawdzę w poniedziałek na modelu.

Dodatkowe pytanie, czy mając dane na wejściu po rs w których jest zawarty przecinek, wystarczy porównywać po kodach ascii, że nastąpił przecinek i w tym momencie zapalić za pomocą instrukcji operacji na bitach tj. np. PORTA |= _BV(0), wcześniej deklarując #define _BV(bit) (1 << (_bit)), gdyż DP mam podpięte do PA0, a przyjmować będę dane ascii w których zawarte są cyfry i przecinek. Czy np. zrobić jakąś konwersję lepiej z ascii na stringa wyłuskać z stringa cyfry oraz miejsce w stawienia przecinka. Jak najlepiej przeprowadzić wyrzucenie np, takiej liczby 12,542 na na wyświetlacz, ewentualnie -02,999. Potrzebuję zrobić wyświetlanie masy, a dane przychodzą po rs232 w kodach ascii. Nie chodzi mi o gotowy program, tylko o sam zarys algorytmu, ewentualnie najlepszą metodę. Z programowania jestem cały czas w lesie.

Awatar użytkownika
tom5555
Użytkownik
Posty: 625
Rejestracja: 23 sty 2008, 1:20
Lokalizacja: Zabrze
Kontakt:

Post autor: tom5555 » 16 paź 2011, 18:06

A ilość miejsc po przecinku jest stała? Bo jeśli tak, to pobierasz młodsze 3 liczby, kod ascii przecinka sobie odpuszczasz (przecinek zapalasz na stałe), potem wyświetlasz starsze liczby.
Jeżeli masz do czynienia z liczbą zmiennoprzecinkową, to chyba najprościej (przynajmniej ja bym tak to zrobił) będzie odbierać dane bajt po bajcie, w pętli, sprawdzają cza każdym razem czy został odebrany znak przecinka. Jeżeli tak się stanie, to z liczby powtórzeń pętli wiesz na którym wyświetlaczu zapalić przecinek.
Zabawa w konwersję ascii - string i szukanie przecinka w string według mnie nie ma sensu. Większe zużycie ramu i więcej operacji (dla procesora) do wykonania.

keruseykaryu

Post autor: keruseykaryu » 16 paź 2011, 18:06

rezasurmar pisze:Dodatkowe pytanie, czy mając dane na wejściu po rs w których jest zawarty przecinek, wystarczy porównywać po kodach ascii, że nastąpił przecinek i w tym momencie zapalić za pomocą instrukcji operacji na bitach tj. np. PORTA |= _BV(0), wcześniej deklarując #define _BV(bit) (1 << (_bit)), gdyż DP mam podpięte do PA0, a przyjmować będę dane ascii w których zawarte są cyfry i przecinek. Czy np. zrobić jakąś konwersję lepiej z ascii na stringa wyłuskać z stringa cyfry oraz miejsce w stawienia przecinka. Jak najlepiej przeprowadzić wyrzucenie np, takiej liczby 12,542 na na wyświetlacz, ewentualnie -02,999. Potrzebuję zrobić wyświetlanie masy, a dane przychodzą po rs232 w kodach ascii. Nie chodzi mi o gotowy program, tylko o sam zarys algorytmu, ewentualnie najlepszą metodę. Z programowania jestem cały czas w lesie.
Nie jest to takie proste jak sobie myślisz. Wykryć przecinek będzie łatwo bo tak jak napisałeś możesz go wyłuskać z ascii. Problem się pojawi przy wyświetlaniu, bo taka prosta metoda z wstawianiem bitu musi się odbyć w przerwaniu i na określonej pozycji. Nie wiemy czy dane są stałopozycyjne, czyli czy przecinek jest zawsze w tym samym miejscu. Jak jest ramka sztywna:

[znak][dziesiątki:2d],[ułamek:3d]

to przecinek możesz nawet na stale wyświetlać bo masz 6 pól wyświetlacza.
Samą konwersję przeprowadzaj dwuetapowo, najpierw to co przed przecinkiem i ładuj do zmienych led, potem to co po przecinku i ładuj na ledy. Ale jak przecinek raz jest, raz nie ma, albo się przesuwa to trzeba by to jakoś inaczej podejść.

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 16 paź 2011, 19:46

Teoretycznie jest raz, tj, jeżeli waga jest np 15kg, to będzie na stałe 15,000kg, ale wyświetlacz ma być uniwersalny, tj. po podpięciu 1500kg wagi, ma wyświetlić 1500,0kg, wszystko jest ładnie w ascii wysyłane dokładnie jak napisałeś [znak][dziesiątki:2d],[ułamek:3d] , pod czas działania wyświetlacza, zawsze już będzie przecinek w stałej pozycji, ale nie chciał bym by za każdym razem trzeba było coś ręcznie konfigurować, wyświetlacz musi wykryć sam w którym miejscu jest przecinek i zam dodać bit zapalający przecinek w miejscu w którym zostanie wykryty, myślałem o zrobieniu dłuższej tablicy znaków, cyfr, coś na kształt tablicy ascii, czyli po dodaniu offsetu, znak będzie wyświetlany z przecinkiem.

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 16 paź 2011, 20:47

Ja bym to zrobił tak:
Dane odbierane są wrzucane znak po znaku do tablicy jednowymiarowej o odpowiedniej długości.

Przy wyświetlaniu multiplekserowym następowała by konwersja. Pierwszy znak idzie do pierwszego wyświetlacza i inkrementacja licznika elementów tablicy.

Następnie sprawdzenie czy znak w kolejnym polu tablicy jest cyfrą czy przecinkiem. Jeśli przecinkiem to do aktualnego wyświetlacza załączana jest kropka dziesiętna i inkrementacja licznika elementów tablicy żeby przy kolejnym odczycie trafić na liczbę.

Na drugi wyświetlacz idzie znak wskazywany przez licznik elementów tablicy, inkrementacja tego licznika i znowu sprawdzenie czy jest do zaświecenia kropka.


Mam nadzieję że zrozumiesz mój opis algorytmu.

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 16 paź 2011, 22:13

Podobnie myślimy, aczkolwiek, mój pomysł z przesuwaniem znaku o skok, np 20, albo inny by dostać znak z zapaloną kropką, będzie najbardziej uniwersalny. Docelowo zastanawiam się nad trybem charlieplexering, by zmniejszyć wykorzystanie nóg procesora. Tablica znaków do wyświetlenia będzie i tak zawierała jeszcze kilka innych znaków, chociaż by wyświetlić "Err", "nodata" itp. Format danych z wagi idzie zawsze taki sam, znak, masa, przecinek, masa. Więc nie powinno być problemu. Zastanawiam się czym najlepiej wyłuskać dane ascii, case?? then zmiana offsetu tablicy znaku z przecinkiem (kropką). Potem if-then z warunkiem jaki jest offset, i za każdym pobraniem danej już przecinek będzie w stałym miejscu, do następnego wyłączenia wyświetlacza. Myślę czy by tej zmiennej nie umieszczać w eepromie procka. Na pewno będzie watchdog, oraz jakiś algorytm sprawdzania poprawności wprowadzonych danych. Bo nie lubię jak coś zostawia się przypadkowi.

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 18 paź 2011, 1:46

Witam,

Zrobiłbym to tak: osobny bufor na dane z UART, osobny bufor wyświetlacza.
Z wykorzystaniem przerwań odbierasz dane z UART i zapisujesz w buforze, po odebraniu kompletu, ustawiasz flagę gotowości, którą sprawdzasz w main() i w main() następuje konwersja danych z formatu ascii do formatu wyświetlacza, tj. zapełnienie bufora wyświetlacza.

Jeśli chodzi o przerwania związane z UART i wyświetlaczem, to nie robiłbym w nich żadnej konwersji, a jedynie powierzył im funkcje zapisu/odczytu odpowiednich buforów. Myślę, że i tak będziesz musiał wprowadzić pewne opóźnienie, czy pomijanie wyświetlania niektórych danych, żeby zapobiec migotaniu najmniej znaczących cyfr, w związku z tym nie ma obawy, że zgubisz coś z UART (chociaż i bez opóźnienia będzie to mało prawdopodobne).

Można się pobawić i np. dla wyświetlacza zrobić dwa przełączane bufory, żeby ten do którego aktualnie zapisujesz nie był akurat w trakcie wyświetlania, co też może zapobiec dziwnym efektom, ale to już chyba na wyrost.

Jeśli chodzi o bufor wyświetlacza, to jego wielkość odpowiadałaby ilości cyfr (np. 6 bajtów dla 6 cyfr). Jeden z bitów każdego bajtu bufora byłby odpowiedzialny za kropkę - bit ten ustawiany byłby w procedurze konwersji - i teraz nic prostszego jak przesłać te 8 bitów na nóżnki procesora!

Jeśli chodzi o zmniejszenie ilości nóżek procesora to możesz zastanowić się np. nad zastosowaniem rejestru przesuwnego czy innego specjalizowanego scalaka np. na I2C. I teraz najważniejsza rzecz płynąca z zastosowania bufora wyświetlacza - uniezależnia cię on od sposobu komunikacji z wyświetlaczem, gdyż twoim zadaniem jest jedynie przesłanie tego bufora do wyświetlacza, nie ważne, czy wszystkie wyświetlacze są podpięte bezpośrednio, z wykorzystaniem multipleksowania, SPI, I2C, czy czegokolwiek innego;)

Ostatnia rzecz: bufor wyświetlacza na pewno ułatwi ci wyświetlanie dodatkowych komunikatów, o których piszesz. Zastanów się teraz, jeśli konwersja i manipulacja wyświetlaczem miałaby się odbywać w przerwaniu, to ile logiki odpowiedzialnej za rozstrzyganie co wyświetlać musiałbyś dodać? A tak, przerwanie zajmuje się tylko wyświetlaniem bufora, czyli tym, do czego zostało stworzone - do wykonywania możliwie najmniejszej ilości operacji...

Awatar użytkownika
bsw
Użytkownik
Posty: 100
Rejestracja: 14 kwie 2008, 13:13
Lokalizacja: Małopolska
Kontakt:

Post autor: bsw » 18 paź 2011, 12:38

Gotowy kawałek kodu jest w moim programie z projektu okładkowego EdW 7/2010.
(OldTimePlayer)
Jest tam odczyt z Uart i multipleksowanie 8 wyświetlaczy 7seg. A na dodatek definicja znaków ASCII w translacji na 7seg. - możliwość wyświetlania dowolnego tekstu ze scrollem. Polecam przejrzeć.

Pozdrawiam,
bsw

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 19 paź 2011, 12:11

Zrobiłbym to tak: osobny bufor na dane z UART, osobny bufor wyświetlacza.
Z wykorzystaniem przerwań odbierasz dane z UART i zapisujesz w buforze, po odebraniu kompletu, ustawiasz flagę gotowości, którą sprawdzasz w main() i w main() następuje konwersja danych z formatu ascii do formatu wyświetlacza, tj. zapełnienie bufora wyświetlacza.
Po co ci aż dwa bufory ? Skoro można czytać bezpośrednio z jednego, warunek tylko że program komunikujący się przez usart nie zasyfi go.
Konwersja danych z ASCII na 7seg nie wymaga żadnej mocy obliczeniowej praktycznie, wystarczy zapisać wzorzec w FLASH lub EEPROM w odpowiedniej kolejności i go tylko stamtąd odczytywać na zasadzie kod ASCII = adres znaku w stronie pamięci wzorca znaków. Dla EEPROMU.

atelszewski
Użytkownik
Posty: 143
Rejestracja: 12 sie 2005, 9:36
Lokalizacja: Banie

Post autor: atelszewski » 19 paź 2011, 12:36

Witam,
Po co ci aż dwa bufory ? Skoro można czytać bezpośrednio z jednego
Problem można pewnie rozwiązać bez korzystania z buforów w ogóle, ale podejście z buforami wydaje mi się bardziej przejrzyste i rozwojowe. Masz po prostu dwa miejsca - z jednego czytasz, do drugiego piszesz, po drodze robisz np. konwersję. Przerwania tylko odpowiednio zapisują do lub czytają z buforów - to, czy kiedyś będziesz chciał ten kod wykorzystać do wyświetlacza podłączonego na I2C lub o większej ilości miejsc będzie kwestią wprowadzenia nielicznych zmian. Będziesz chciał dodać przewijanie tekstu - nie widzę innej możliwości niż skorzystanie z buforów. Krótko: jeśli kod ma być na tu i teraz, to wolna wola, ale jeśli ma mieć możliwość bycia wykorzystanym w przyszłości - to tylko na buforach;)

rezasurmar
Użytkownik
Posty: 626
Rejestracja: 19 kwie 2009, 15:59
Lokalizacja: Tychy
Kontakt:

Post autor: rezasurmar » 20 paź 2011, 12:03

bsw, dzięki za linka, ciężko skorzystać z czyjegoś programu, ale dzięki i tak. Co do buforów, pomysł ciekawy, szczególnie, że jest możliwość wykorzystania procedury w innych projektach dzięki temu. Jakoś nie mam ochoty za każdym razem wyważać raz otwartych drzwi. Program ogólnie powstaje w wielkich bólach z braku czasu i umiejętności z mojej strony.

ODPOWIEDZ