Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

16 Sie 2009 09:13 2562 20
  • 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 :-)

    Code:
    #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ź
  • 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
  • Poziom 19  
    Dzieje się - tak ma być - tu jest odczekanie na badanie portu
  • Poziom 2  
    no tak - troche zle odczytalem.
    za szybko z opdowiedzia pospieszylem.
  • Poziom 20  
    błąd masz tutaj:
    Code:
    DDRD = 1<<6 | 1<<5 | 1<<4 | 1<<3;

    kolejnosc wykonywania nie jest taka jak myslisz. powstawiaj nawiasy:
    Code:
    DDRD = (1<<6) | (1<<5) | (1<<4) | (1<<3);

    analogicznie we wszystkich miejscach gdzie ustawiasz jedynki w ten sposob.
  • 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.

    Code:
    #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
  • Poziom 39  
    I ten kod kompiluje Ci się bezbłędnie :?:

    Code:
    #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
    Code:

    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"

    Code:

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

    A jakiż to uC ... "ujeżdżasz" :?: :D
  • 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 :?:

    Code:
    #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ą
  • 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 :?:

    Code:
    #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.
  • 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
    Code:

    #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...
  • 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 :-)

    Code:
    > "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..
  • 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):
    Code:
    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:
    Code:

    #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:
    Code:

    #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 -

    Code:

    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:
    Code:

    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?)
  • 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..
    Code:

    > "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
  • Poziom 15  
    Nawet kompilator ci mówi
    Code:
    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:
    Code:
    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...
  • 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
    Code:
    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
  • 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
    Code:
    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ł.
  • 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
  • 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ń.
  • 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...
  • 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.
  • 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 ...
    Code:

    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
    Code:

    TCCR0B |= (1<<CS01)|(1<<CS00);


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