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

Obsługa wyświetlacza 4-ro cyfrowego - błąd wyświetlania

20rafalo 16 Sie 2009 09:13 2724 20
  • #1 6898247
    20rafalo
    Poziom 19  
    Witam
    Poniżej przedstawiam pełny kod do obsługi wyświetlacza 4-ro cyfrowego.
    Program się kompiluje, ale zamiast wyświetlania kolejno cyfr, które zawarte są w tablicy, zapala mi cały wyświetlacz, gdzie jest błąd??

    Program zawiera liczne komentarze, także nie będzie większego problemu z domyśleniem się co do czego jest :-)

    #include<avr\io.h>
    #include<inttypes.h>
    #include<avr\signal.h>
    #include<avr\interrupt.h>
    #include<avr\pgmspace.h>
    #include<avr\delay.h>
    #include <util/delay.h> 
    //////
    #define SW1 0
    #define SW2 1
    
    volatile uint8_t g_bDelay; //122hz
    uint8_t g_DaneWyswietlacza[4];
    uint8_t g_DaneCom[4] PROGMEM =
    			{~(1<<6), ~(1<<5), ~(1<<4), ~(1<<3)};
    		
    //tablica cyfr			
    uint8_t g_WzorCyfr[9] PROGMEM =
    		{
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<4 | 1<<5) /*0*/, 
       ~(1<<1 | 1<<2 )/*1*/, ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<6)/*2*/,
       ~(1<<1 | 1<<2 | 1<<5 | 1<<6)/*3*/,
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<4 | 1<<5)/*4*/,
       ~(1<<0 | 1<<2 | 1<<3 | 1<<5 | 1<<6)/*5*/,
       ~(1<<0 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6)/*6*/,
       ~(1<<0 | 1<<1 |  1<<2) /*7*/, 
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<8) /*8*/, 
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<5 | 1<<9) /*9*/ 
    		};
    		
    uint16_t g_Licznik=0;	//zlicza  aktualnie zliczoną wartosc
    
    //Funkcja wysw dana liczbe dziesietnie
    void WyswietlDEC(uint16_t vart)
    {
    	uint8_t n;
      if(vart >9999)
      {	
    	for(n=0; n<4;n++)//czesc odpow za wysw kresek na 4 wyświetlaczach ,
    						//jesli zakres został przekroczony
    	{
    	  g_DaneWyswietlacza[n] = ~(1<<6);
    	}
    	return;
      }
      for(n=4; n>0; n--)//petla zbud tak, ze przerwanie nastepuje w chwili,
                         // gdy zmienna przyjmuje wartosc zero
      {
         g_DaneWyswietlacza[n-1] = pgm_read_byte(&g_WzorCyfr[vart%10]);
    	 vart /=10;
      }
    }
    
    int main(void)
    {
    ///////////////////////////////
    //inicjacja
    DDRB=0xff; //ustawienie prtu "D" jako wyjscia (wszystkie 0-7) 
    DDRD = 1<<6 | 1<<5 | 1<<4 | 1<<3;////ustaw prtu "B" jako wyjscia(6,5,4,3)
    //wlaczenie podciagania ma wyprowadzeniach przycisków
    PORTD = 1<<SW1 | 1<<SW2; //SWPORT = PORTD
    //Timer0 
    TCCR0A = 1<<CS01|1; // CK/8 | 1<<CS00; //sygnal takt CK/64, ksiazka s 61
    TIMSK = 1<<TOIE0;
    //globalne zezw na przerw
    sei();
    //kon inicjal
    
    for(;;)
    	{
    	uint8_t a = 1; 
    		WyswietlDEC(a); 
    		if(!(PIND & 1<<SW1))
    		{
    			// usuwanie drgań styków
    			g_bDelay = 6; //50ms
    			while(g_bDelay != 0) {}
    			if(!(PIND & 1<<SW1))
    			{
    				uint8_t a = 100; 
    				--a; 
    				WyswietlDEC(a); 
    				// Oczekiwanie na puszczenie
    				while(!(PIND & 1<<SW1))
    				{
    				}
    			}
    		}
    		if(!(PIND & 1<<SW2))
    		{
    			// usuwanie drgań styków
    			g_bDelay = 6; //50ms
    			while(g_bDelay != 0) {}
    			if(!(PIND & 1<<SW2))
    			{
    				++a; 
    				g_bDelay = 120; //1s
    				while(!(PIND & 1<<SW2))
    				{
    				}
    			}
    		}
    	}
    	
    	return 0;
    	}
    	
    //---------------------------------------------------------------
    //obsługa przerwan
    
    SIGNAL(SIG_OVERFLOW0)
    {
    static uint8_t AktWyswietlacz = 0;	
    
    	// Wpisanie do licznika początkowej wartości
    TCNT0=128;
    								  //WYGASZENIE WYSW
    PORTD |= 1<<6 | 1<<5 | 1<<4 | 1<<3;//tj przelaczanie od 1 -4 wysw (4 nożki ster)
    							//jest to poczworny wyswietlacz. ja mam potrojny :-) 
    PORTB = g_DaneWyswietlacza [AktWyswietlacz];
    PORTD &= pgm_read_byte (&g_DaneCom[AktWyswietlacz]);//wlaczanie odpow wyswietlacza
    					// sktuktóra pgm_read_byte (&... ) oznacza, że odwołujemy się do !!!DANYCH PROGRAMU!!!
    
    ++AktWyswietlacz;//zwieksz stanu zmienej wsk na obslug wysw
      if (AktWyswietlacz > 3)
      {
      //zmienna zapobiegajaca niepotrzebnemi kopiowaniu 
      //zmiennej g_bDelay (typ volatile)
      uint8_t delay;
      AktWyswietlacz = 0;
      //obsługa opóźnien
      delay = g_bDelay;
        if(delay>0)
    	{
    	--delay;
    	g_bDelay = delay;
    	
    	}
      }
    
    }
    


    Z góry dziękuję za odpowiedź
  • #2 6898414
    jubee
    Poziom 2  
    Odniosłęm wrażenie ze czegoś nie robisz:
    // usuwanie drgań styków
    g_bDelay = 6; //50ms
    while(g_bDelay != 0) {} <- tu sie chyba nic nie dzieje
  • #4 6898800
    jubee
    Poziom 2  
    no tak - troche zle odczytalem.
    za szybko z opdowiedzia pospieszylem.
  • #6 6899450
    20rafalo
    Poziom 19  
    Wziąłem to w nawiasy, jednak nic to nie zmieniło.
    Zmieniłem trochę mój program - stał się bardziej przejrzysty:
    mimo to jest ten sam problem - może jest problem z przyciskami? - mam podłączone z PORTD kablem do plusa.

    #include<avr\io.h>
    #include<inttypes.h>
    #include<avr\signal.h>
    #include<avr\interrupt.h>
    #include<avr\pgmspace.h>
    #include<avr\delay.h>
    #include <util/delay.h> 
    //////
    #define SW1 0
    #define SW2 1
    
    volatile uint8_t g_bDelay; //122hz
    uint8_t g_DaneWyswietlacza[4];
    uint8_t g_DaneCom[4] PROGMEM =
    			{~(1<<6), ~(1<<5), ~(1<<4), ~(1<<3)};
    		
    //tablica cyfr			
    uint8_t g_WzorCyfr[9] PROGMEM =
    		{
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<4 | 1<<5) /*0*/, 
       ~(1<<1 | 1<<2 )/*1*/, ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<6)/*2*/,
       ~(1<<1 | 1<<2 | 1<<5 | 1<<6)/*3*/,
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<4 | 1<<5)/*4*/,
       ~(1<<0 | 1<<2 | 1<<3 | 1<<5 | 1<<6)/*5*/,
       ~(1<<0 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6)/*6*/,
       ~(1<<0 | 1<<1 |  1<<2) /*7*/, 
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<8) /*8*/, 
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<5 | 1<<9) /*9*/ 
    		};
    		
    uint16_t g_Licznik=0;	//zlicza  aktualnie zliczoną wartosc
    
    //Funkcja wysw dana liczbe dziesietnie
    void WyswietlDEC(uint16_t vart)
    {
    	uint8_t n;
      if(vart >9999)
      {	
    	for(n=0; n<4;n++)//czesc odpow za wysw kresek na 4 wyświetlaczach ,
    						//jesli zakres został przekroczony
    	{
    	  g_DaneWyswietlacza[n] = ~(1<<6);
    	}
    	return;
      }
      for(n=4; n>0; n--)//petla zbud tak, ze przerwanie nastepuje w chwili,
                         // gdy zmienna przyjmuje wartosc zero
      {
         g_DaneWyswietlacza[n-1] = pgm_read_byte(&g_WzorCyfr[vart%10]);
    	 vart /=10;
      }
    }
    
    void ObslozPrzycisk(uint8_t maska, void(*proc)(void) )
    {
    	if(!(PIND & maska))
    	{
    		// usuwanie drgań styków
    		g_bDelay = 6; //50ms
    		while(g_bDelay != 0) {}
    		if(!(PIND & maska))
    		{
    			proc(); 
    			g_bDelay = 120; //1s
    			do
    			{
    				if(g_bDelay==0)
    				{
    					g_bDelay = 6; //50ms
    					proc(); 
    				}
    			}while(!(PIND & maska));
    		}
    	}
    }
    
    
    void Plus(void)
    {
    	++g_Licznik; 
    	WyswietlDEC(g_Licznik); 
    }
    
    void Minus(void)
    {
    	--g_Licznik; 
    	WyswietlDEC(g_Licznik); 
    }
    
    
    
    int main(void)
    {
    ///////////////////////////////
    //inicjacja
    DDRB=0xff; //ustawienie prtu "D" jako wyjscia (wszystkie 0-7) 
    DDRD = (1<<6) | (1<<5) | (1<<4) | (1<<3);////ustaw prtu "B" jako wyjscia(6,5,4,3)
    //wlaczenie podciagania ma wyprowadzeniach przycisków
    PORTD = 1<<SW1 | 1<<SW2; //SWPORT = PORTD
    //Timer0 
    TCCR0A = 1<<CS01|1; // CK/8 | 1<<CS00; //sygnal takt CK/64, ksiazka s 61
    TIMSK = 1<<TOIE0;
    //globalne zezw na przerw
    sei();
    //kon inicjal
    WyswietlDEC(g_Licznik); 
    
    for(;;)
    	{
    	    ObslozPrzycisk(1<<SW1, Plus); 
    		ObslozPrzycisk(1<<SW2, Minus);
    		
    
    	}
    	return 0;
    	
    }
    //---------------------------------------------------------------
    //obsługa przerwan
    
    SIGNAL(SIG_OVERFLOW0)
    {
    static uint8_t AktWyswietlacz = 0;	
    
    	// Wpisanie do licznika początkowej wartości
    TCNT0=128;
    								  //WYGASZENIE WYSW
    PORTD |= 1<<6 | 1<<5 | 1<<4 | 1<<3;//tj przelaczanie od 1 -4 wysw (4 nożki ster)
    							//jest to poczworny wyswietlacz. ja mam potrojny :-) 
    PORTB = g_DaneWyswietlacza [AktWyswietlacz];
    PORTD &= pgm_read_byte (&g_DaneCom[AktWyswietlacz]);//wlaczanie odpow wyswietlacza
    					// sktuktóra pgm_read_byte (&... ) oznacza, że odwołujemy się do !!!DANYCH PROGRAMU!!!
    
    ++AktWyswietlacz;//zwieksz stanu zmienej wsk na obslug wysw
      if (AktWyswietlacz > 3)
      {
      //zmienna zapobiegajaca niepotrzebnemi kopiowaniu 
      //zmiennej g_bDelay (typ volatile)
      uint8_t delay;
      AktWyswietlacz = 0;
      //obsługa opóźnien
      delay = g_bDelay;
        if(delay>0)
    	{
    	--delay;
    	g_bDelay = delay;
    	
    	}
      }
    
    }


    Z góry dzięki za odp
  • #7 6899971
    zumek
    Poziom 39  
    I ten kod kompiluje Ci się bezbłędnie :?:

    #include<avr\io.h>
    #include<inttypes.h>
    #include<avr\signal.h>
    #include<avr\interrupt.h>
    #include<avr\pgmspace.h>
    #include<avr\delay.h>
    #include <util/delay.h> 

    Albo ten fragment
    
    uint8_t g_WzorCyfr[9] PROGMEM =
          {
      //...
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<8) /*8*/,
       ~(1<<0 | 1<<1 |  1<<2 | 1<<3 | 1<<5 | 1<<9) /*9*/
          };
    

    1<<8 czy 1<<9 w uint8_t raczej się "nie zmieści"

    
    TCCR0A = 1<<CS01|1; // CK/8 | 1<<CS00; //sygnal takt CK/64, 
    ksiazka s 61
    

    A jakiż to uC ... "ujeżdżasz" :?: :D
  • #8 6900846
    20rafalo
    Poziom 19  
    zumek zmieści się bez problemu - nie takie dane by się zmieściły :-P , - jest to 8 bitów!!
    uC mam, ale jak widać jest cienko wytłumaczone, nieraz z błędami, czasem z przestarzałymi metodami :-/

    Powtórzę to kolejny raz na tym forum - gdyby każdy tak pisał techniczne książki jak Jerzy Grębosz pisał o C++ to by problemów nie było, ale niestety... :-/

    Dodano po 1 [minuty]:

    zumek napisał:
    I ten kod kompiluje Ci się bezbłędnie :?:

    #include<avr\io.h>
    #include<inttypes.h>
    #include<avr\signal.h>
    #include<avr\interrupt.h>
    #include<avr\pgmspace.h>
    #include<avr\delay.h>
    #include <util/delay.h> 



    zumek tu nie ma żadnego błędu, chyba nie zabardzie się orientujesz w uC

    W drugiej części jest mały błąd - zamiast 9 czy 8 powinna być 6 ale gdyby tylko taki był błąd to wyświetlacz by chodził, ale bez wszystkich kresek, a u mnie wszystkie się ciągle świecą
  • #9 6901078
    rpal
    Poziom 27  
    20rafalo napisał:
    zumek zmieści się bez problemu - nie takie dane by się zmieściły :-P , - jest to 8 bitów!!
    uC mam, ale jak widać jest cienko wytłumaczone, nieraz z błędami, czasem z przestarzałymi metodami :-/

    Powtórzę to kolejny raz na tym forum - gdyby każdy tak pisał techniczne książki jak Jerzy Grębosz pisał o C++ to by problemów nie było, ale niestety... :-/

    Dodano po 1 [minuty]:

    zumek napisał:
    I ten kod kompiluje Ci się bezbłędnie :?:

    #include<avr\io.h>
    #include<inttypes.h>
    #include<avr\signal.h>
    #include<avr\interrupt.h>
    #include<avr\pgmspace.h>
    #include<avr\delay.h>
    #include <util/delay.h> 



    zumek tu nie ma żadnego błędu, chyba nie zabardzie się orientujesz w uC

    W drugiej części jest mały błąd - zamiast 9 czy 8 powinna być 6 ale gdyby tylko taki był błąd to wyświetlacz by chodził, ale bez wszystkich kresek, a u mnie wszystkie się ciągle świecą

    Nie jestem żadnym autorytetem ale kolego więcej pokory, skoro zaczynasz pouczasz chętnych do pomocy może zacznij od siebie uwagi o nieumięjętności kol.zumka sa po prostu niegrzeczne.
    Twój kod to jak na to co ma zrobić jest po prostu przerośniętym molochem to po pierwsze a po drugie. Wszystkie cyfry palą się dlatego że port sterującym anodami LED, albo wysyła na wszystkie na wszystkie linie sygnał ich zapalenia albo masz zwarcie w układzie . Sprawdź jedno i drugie. Może pora na siegnięcie do lektury przytoczoneg pana Jerzego Grębosza ?
    Mapę dla kolejnych cyfr można rozpisać sobie na kartce papieru w kratkę i przenieść do programu w postaci np. liczb binarnych. Myśle że jest to mniej karkołomne i bardziej czytelne niż plejady <<<<<< w których nie trudno o błędy a i sam procek zamiast przesuwania kolejnycyh liczb zajmie się czymś bardziej konkretnym bo gotowa tablica będzie już na etapie programowania kości wgrana w jego pamięć. To tak na początek.
  • #10 6901088
    kwesoly
    Poziom 15  
    Odnośnie przesuwania bitów w sekwencji znaków - includy wskazują na WinAVR, więc czemu nie użyć 0b10101010 ?

    Po drugie jeśli nie jesteś asem programowania to nie pisz/kopiuj 100 linijek które potem "cudem" nie działają, tylko sprawdzaj działanie na bieżąco - możesz mieć problem z priorytetami operatorów, obsługą program space czy też nawet fizyczny na płytce.

    a odnośnie
    
    #include<avr\delay.h>
    #include <util/delay.h> 


    Czytanie komunikatów kompilatora dramatycznie zwiększy twoje szanse na sukces...

    I faktycznie napisanie jaki to uC mogłoby pomóc...
  • #11 6901422
    20rafalo
    Poziom 19  
    rpal napisał:

    Nie jestem żadnym autorytetem ale kolego więcej pokory, skoro zaczynasz pouczasz chętnych do pomocy może zacznij od siebie uwagi o nieumięjętności kol.zumka sa po prostu niegrzeczne.

    Może pora na siegnięcie do lektury przytoczoneg pana Jerzego Grębosza ?
    ... a i sam procek zamiast przesuwania kolejnycyh liczb zajmie się czymś bardziej konkretnym bo gotowa tablica będzie już na etapie programowania kości wgrana w jego pamięć. To tak na początek.


    Kolego po pierwsze nikogo nie obraziłem! Jedynie zwróciłem uwagę - mam do tego prawo jak każdy inny forumowicz - ponieważ klega mógł by być w nieświadomości, że coś mu umknęło - ostatnio kogoś poprawiłem i mi podziękował

    2- Do lektury Jerzego Grębosza sięgałem, jeśli chodzi o C ++ na PC.
    AVR Szanowny Pan Grębosz nie tłumaczy - a w tym programie składnia C jest ok, błąd jest gdzieś w przerwaniach lub ustawieniach bitów - jak dobrze wiemy tego standard C nie określa.

    3 - masz rację co to tych "<<" ale w mojej lekturze do której sięgam taki sposób polecają (nie wiem czemu - może mniej pomyłek) - ale procesor AVR się z tym nie męczy, ponieważ kompilator to wszystko zamienia na 1100.. :-)

    4 - Jestem wdzięczny za pomoc - uwierz mi - ja też pomagam na forach :)

    Pozdrawiam

    Dodano po 15 [minuty]:

    Wkleję wam cały komunikat - tam jest dużo informacji - np jaki to uC :-)

    > "make.exe" all
    
    -------- begin --------
    avr-gcc (WinAVR 20090313) 4.3.2
    Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    Size before:
    AVR Memory Usage
    ----------------
    Device: attiny2313
    
    Program:     494 bytes (24.1% Full)
    (.text + .data + .bootloader)
    
    Data:          8 bytes (6.3% Full)
    (.data + .bss + .noinit)
    
    
    
    
    Size after:
    AVR Memory Usage
    ----------------
    Device: attiny2313
    
    Program:     494 bytes (24.1% Full)
    (.text + .data + .bootloader)
    
    Data:          8 bytes (6.3% Full)
    (.data + .bss + .noinit)
    
    
    
    -------- end --------
    
    
    > Process Exit Code: 0
    > Time Taken: 00:03
    


    Dodano po 1 [minuty]:

    Tak ja widzicie jest ok - chociaż żeby było jakieś ostrzeżenie..
  • #12 6902225
    kwesoly
    Poziom 15  
    Wrzuć jeszcze make file którego używasz - bo nie widać w tym wywolaniu w ogóle działania kompilatora.

    U mnie (makefile wygenerowany przez eclipse):
    make all 
    Building file: ../main.c
    Invoking: AVR Compiler
    avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=attiny2313 -DF_CPU=1000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
    In file included from ../main.c:10:
    c:/winavr-20090313/lib/gcc/../../avr/include/avr\signal.h:36:2: warning: #warning "This header file is obsolete.  Use <avr/interrupt.h>."
    In file included from ../main.c:13:
    c:/winavr-20090313/lib/gcc/../../avr/include/avr\delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."
    In file included from c:/winavr-20090313/lib/gcc/../../avr/include/avr\delay.h:37,
                     from ../main.c:13:
    c:/winavr-20090313/lib/gcc/../../avr/include/util/delay.h:90:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
    ../main.c:34: warning: large integer implicitly truncated to unsigned type
    ../main.c:36: warning: excess elements in array initializer
    ../main.c:36: warning: (near initialization for 'g_WzorCyfr')
    Finished building: ../main.c
     



    20rafalo napisał:

    3 - masz rację co to tych "<<" ale w mojej lekturze do której sięgam taki sposób polecają (nie wiem czemu - może mniej pomyłek) - ale procesor AVR się z tym nie męczy, ponieważ kompilator to wszystko zamienia na 1100.. :-)

    Ten sposób jest w porzadku, ale w sytuacji gdy wartości przesunięcia nie są na sztywno liczbami, Ja gdyby to było na potrzeby >1 projektu zrobiłbym tak:
    
    #define SEG_A 0
    #define SEG_B 1
    .....
    
    tablica= {
    (1<<SEG_A) | (1<<SEG_B)... //0
    


    Dzięki temu możesz tylko w pierwszych definicjach zmienić przypisania segment - pin (w ramach jednego portu). Wtedy taka kombinacja z przesuwaniem jest użyteczna - ale przesuwanie liczb o liczbę tylko sprawia że kod jest nieczytelny dla użytkownika.

    Kolejna sprawa:
    
    #include<avr\io.h>
    #include<inttypes.h>
    #include<avr\signal.h>
    #include<avr\interrupt.h>
    #include<avr\pgmspace.h>
    #include<avr\delay.h>
    #include <util/delay.h> 
    


    Zarówno nagłówki #include<avr\signal.h> jak i #include<avr\delay.h> są przestarzałe, i wyrzucają ostrzeżenia przy kompilacji (jeśli miałbyś starsza wersję w której przestarzałe nie są, warningi wyrzucą ich nowe wersje (avr/interrupt.h i util/delay.h) bo ich nie bedzie) - więc słusznie kolega zumek zwrócił twoją uwagę zarówno na mieszczenie się w zakresie uinta8 liczby (1<<9) jak i fakt iż ten kod musi wyrzucać ostrzeżenia. Więc sam zastanów się jak w takim kontekście wypadło twoje "zumek tu nie ma żadnego błędu, chyba nie zabardzie się orientujesz w uC "

    Dodano po 30 [minuty]:

    I jeszcze jedno odnośnie tablicy -

    
    uint8_t g_WzorCyfr[9] PROGMEM =
          { 

    masz 9 element-owa tablice o 10 elementach - a raczej chciałbyś mieć :)

    Dodano po 4 [minuty]:

    And one more:
    
    int main(void)
    {
    ///////////////////////////////
    //inicjacja
    DDRB=0xff; //ustawienie prtu "D" jako wyjscia (wszystkie 0-7)
    DDRD = (1<<6) | (1<<5) | (1<<4) | (1<<3);////ustaw prtu "B" jako wyjscia(6,5,4,3) 

    Zamieniony port B z port D - chyba że komentarz kłamie.

    Sam widzisz ile "bugów" jest w tym kodzie, dlatego sensownie byłoby sprawdzać jego działanie bardziej na bieżąco :)

    Dodano po 3 [minuty]:

    I zacznij od sprawdzenia czy twój timer się odpala - bo przynajmniej w AVR studio takiego dzialania nie zauważyłem.

    (a to oznacza że wyjscia mają swoją domyślną wartość 0 i wszystkie segmenty świecą wyświetlacz wspolna anoda, wpiety prosto w uC - zgadlem?)
  • #13 6902378
    20rafalo
    Poziom 19  
    Widzę te błędy - ale one są drobiazgowe, ponieważ z nimi powinno coś się dziać, a tu się nie dzieje nic - mimo iż poprawiłem to i tak jest to samo.
    Zwracam honor zumkowi - nie zrozumiałem o co mu chodziło - myślałem, że chodzi mu o to, że 10 elementowa tablica się nie mieści w uint8_
    Ps mimo iż usunąłem niepotrzebne "includy" nadal mam ostrzeżenie w stosunku do nich.
    PS odnośnie tablicy to w C++ liczymy od zera, czyli od 0 do 9 jest 10 elementów.
    Jeśli się mylę proszę poprawić - już mi się wszystko miesza przez ten program :-P

    Załączam kolejny raz make..
    
    > "make.exe" all
    
    -------- begin --------
    avr-gcc (WinAVR 20090313) 4.3.2
    Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    Size before:
    AVR Memory Usage
    ----------------
    Device: attiny2313
    
    Program:     494 bytes (24.1% Full)
    (.text + .data + .bootloader)
    
    Data:          8 bytes (6.3% Full)
    (.data + .bss + .noinit)
    
    
    
    
    Compiling C: Elektr_Prakt_2.c
    avr-gcc -c -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./Elektr_Prakt_2.lst  -std=gnu99 -MMD -MP -MF .dep/Elektr_Prakt_2.o.d Elektr_Prakt_2.c -o Elektr_Prakt_2.o 
    In file included from Elektr_Prakt_2.c:5:
    c:/winavr-20090313/lib/gcc/../../avr/include/avr\delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."
    Elektr_Prakt_2.c:28: warning: excess elements in array initializer
    Elektr_Prakt_2.c:28: warning: (near initialization for 'g_WzorCyfr')
    
    Linking: Elektr_Prakt_2.elf
    avr-gcc -mmcu=attiny2313 -I. -gdwarf-2 -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Elektr_Prakt_2.o  -std=gnu99 -MMD -MP -MF .dep/Elektr_Prakt_2.elf.d Elektr_Prakt_2.o --output Elektr_Prakt_2.elf -Wl,-Map=Elektr_Prakt_2.map,--cref     -lm
    
    Creating load file for Flash: Elektr_Prakt_2.hex
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock Elektr_Prakt_2.elf Elektr_Prakt_2.hex
    
    Creating load file for EEPROM: Elektr_Prakt_2.eep
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
    	--change-section-lma .eeprom=0 --no-change-warnings -O ihex Elektr_Prakt_2.elf Elektr_Prakt_2.eep || exit 0
    
    Creating Extended Listing: Elektr_Prakt_2.lss
    avr-objdump -h -S -z Elektr_Prakt_2.elf > Elektr_Prakt_2.lss
    
    Creating Symbol Table: Elektr_Prakt_2.sym
    avr-nm -n Elektr_Prakt_2.elf > Elektr_Prakt_2.sym
    
    Size after:
    AVR Memory Usage
    ----------------
    Device: attiny2313
    
    Program:     494 bytes (24.1% Full)
    (.text + .data + .bootloader)
    
    Data:          8 bytes (6.3% Full)
    (.data + .bss + .noinit)
    
    
    
    -------- end --------
    
    
    > Process Exit Code: 0
    > Time Taken: 00:01
  • #14 6902399
    kwesoly
    Poziom 15  
    Nawet kompilator ci mówi
    Elektr_Prakt_2.c:28: warning: excess elements in array initializer
    Elektr_Prakt_2.c:28: warning: (near initialization for 'g_WzorCyfr') 


    deklaracja poprawna to:
    uint8_t g_WzorCyfr[10] PROGMEM= ...

    Oznacza ona że tablica ma 10 elementów, które będą indeksowane od 0-9. W C++ jest tak samo więc odświerz grębosza :)

    A niedziałanie timera (jesli faktycznie występuje) to raczej nie jest mały błąd...
  • #15 6902407
    20rafalo
    Poziom 19  
    Komentarz kłamie - było na zasadzie copy - paste :-P

    Szczerze Ci powiem - nie mogłem przetestować tego programu, gdyż nie wiem jak włączyć obsługę przycisków w AVRStudio
    while(g_bDelay != 0) {}

    W tym momęcie AVR się zapętla, gdyż jest to przerwanie przycisku, a "na ekranie go nie widzę" by włączyć :-P
  • #16 6902416
    kwesoly
    Poziom 15  
    No widzisz - tu jest właśnie problem z skopiowaniem/napisaniem 150 linijek i dziwieniem się że nie działa - rozumiesz ten program na tyle żeby po prostu wywalić przyciski i przetestować wyświetlacz?

    Poza tym ten while jest w kodzie zwykłym (main), natomiast przerwanie powinno i tak przerwać tego while'a - niestety na breakpoincie w jego treści AVR studio się nie zatrzymał. Poza tym jeśli by nie przerywało to także obsługa buttona jest bez sensu.

    Dodano po 10 [minuty]:

    20rafalo napisał:
    Komentarz kłamie - było na zasadzie copy - paste :-P

    Szczerze Ci powiem - nie mogłem przetestować tego programu, gdyż nie wiem jak włączyć obsługę przycisków w AVRStudio
    while(g_bDelay != 0) {}

    W tym momęcie AVR się zapętla, gdyż jest to przerwanie przycisku, a "na ekranie go nie widzę" by włączyć :-P


    Po prawej mozna wybrać port na którym jest ten przycisk i ręcznie zmienić wartość tak jakby stan przycisku się zmienił.
  • #17 6902450
    20rafalo
    Poziom 19  
    Copy - paste - chodziło mi oo komentarze w różnych miejscach

    Ps chyba porzucę ten projekt i zacznę pisać nowy program
    Ps masz może jakiś link do kursu AVR?
    Miałem ich kilka ale były nie za bardzo :-P
    Poduczę się jeszcze :-)

    Dodano po 1 [minuty]:

    Może spróbuję z wyświetlaczem alfanumerycznym - może będzie bardziej przyjazny
  • #18 6902461
    kwesoly
    Poziom 15  
    Cóż - najpierw trochę nauki C, tzw. blade pojecie z dowolnego kursu, potem zaprzyjaźnienie się z datasheetem do używanego uC i czytanie tego co napisali mądrzejsi od nas - innych programów. Ale to już chyba wykracza poza poruszony tutaj temat - zerknij W dziale w którym piszesz jest kilka przyklejonych tematów, znajdziesz tam odpowiedzi na wiele pytań.
  • #19 6902464
    20rafalo
    Poziom 19  
    kwesoly napisał:


    Po prawej mozna wybrać port na którym jest ten przycisk i ręcznie zmienić wartość tak jakby stan przycisku się zmienił.

    jak byś mógł dokładniej - w której zakładce itd.. :-)

    Dodano po 2 [minuty]:

    kwesoly napisał:
    Cóż - najpierw trochę nauki C, tzw. blade pojecie z dowolnego kursu


    Co do C++ to powiedzmy, że w miarę umiem - na PC kilkanaście programów napisałem :-P
    Bardziej chodzi tu o "myślenie jak mikroprocesor" - timery, liczniki, piny, porty itd...
  • #20 6902482
    kwesoly
    Poziom 15  
    W zakładce I/O View wybierasz port, potem u dołu pokazują się powiązane rejestry w których możesz zmieniać ich zawartość. Ale i tak ten while nie sprawdza przycisku tylko sprawdza czy przerwanie zmniejszyło już odpowiednio wartość - więc dopóki nie upewnisz się, że przerwanie jest w porządku to raczej lipa.

    W kursach często zaczyna się od migania diodami etc - naprawdę czasem taki prymitywny sposób się przydaje właśnie do sprawdzania czy coś się wywołuje. Twój program w ogóle nie zmienia wartości portów B i D w trakcie symulacji wiec nie działanie jest raczej do przewidzenia :)

    Nie zaczynaj nauki o copyegopasta czegos z czym sobie nie dasz rady.
  • #21 6902736
    zumek
    Poziom 39  
    20rafalo napisał:
    ...Ps chyba porzucę ten projekt i zacznę pisać nowy program...

    Za szybko się poddajesz :D

    Ponieważ byłem niemal przekonany, że oprogramowujesz ATTiny2313, to nie bez powodu zacytowałem ...
    
    TCCR0A = 1<<CS01|1; // CK/8 | 1<<CS00; //sygnal takt CK/64,
    ksiazka s 61

    ...ten fragment kodu.
    I albo ta książka jest do kitu, albo popełniłeś błąd przy przepisywaniu kodu, bo powyższa linia nie uruchomi Timera.
    Zmień na poniższe i sprawdź :-P
    
    TCCR0B |= (1<<CS01)|(1<<CS00);


    PS
    Do dokumentacji też warto zaglądać :idea:
REKLAMA