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

AVR/ATMEGA8 - Błędne działanie programu

GOTHAM 03 Paź 2013 17:43 1347 9
  • #1 03 Paź 2013 17:43
    GOTHAM
    Poziom 14  

    Witam,

    Mam problem z moim programem. A mianowicie niepoprawnie wyświetlają mi się cyfry od 7 do 9. Procesor Atmega8.

    Code:

    * Szkielet prostego programu dla avr-gcc */


    #include <avr/io.h>
    #include <util/delay.h>               
    #define F_CPU 1000000L


    #define LED_1   0x06; // 0000 0110
    #define LED_2   0x5b; // 0101 1011
    #define LED_3   0x4f; // 0100 1111
    #define LED_4   0x66; // 0110 0110
    #define LED_5   0x6d; // 0110 1101
    #define LED_6   0x7d; // 0111 1101
    #define LED_7   0xe0; // 1110 0000
    #define LED_8   0xfe; // 1111 1110
    #define LED_9   0xe6; // 1110 0110

    #define segment_1 0x01 // 0000 0001






    int main(void)
    {
     
      unsigned char i,n;
     
     
     
      /* Wszystkie linie portu D będą wyjściami */
       DDRD = 0xFF;  /* 0xFF binarnie 1111 1111 */
       
       /* Wszystkie linie portu C będą wyjściami */
       DDRC = 0xFF;  /* 0xFF binarnie 1111 1111 */
     
     
     
     
     
     
     
      /* Tutaj wpisujemy instrukcje naszego  programu */
     
     
     
     
     
     
     
      for(;;)
      {   
     
     
      n = 9;
     
      PORTC = 0x01;
     
     
      for(i=1; i <= n; i++)
     
      {
     
      switch(i)
            {
              case 1:
           /* Wyświetla cyfrę 1. Uwaga, poszczególne
           segmenty LED wyświetlacza świecą się przy
           niskim stanie napięcia na portach uC,
           dlatego użyto tu operatora "~" */
              PORTD = ~LED_1;
              break;
              case 2:
              PORTD = ~LED_2; // wyświetli 2
              break;
              case 3:
              PORTD = ~LED_3; // 3
              break;
              case 4:
              PORTD = ~LED_4; // 4
              break;
              case 5:
              PORTD = ~LED_5; // 5
              break;
              case 6:
              PORTD = ~LED_6; // 6
            break;
            case 7:
              PORTD = ~LED_7; // 7
              break;   
            case 8:
              PORTD = ~LED_8; // 8
            break;
             case 9:
              PORTD = ~LED_9; // 9
            break;
        
        
        
         }
     
      _delay_ms(500);
     
      }
     
     
     
     
      /* Instrukcje można umieścić w nieskończonej pętli */
      }
    }

    0 9
  • Pomocny post
    #2 03 Paź 2013 18:07
    BlueDraco
    Specjalista - Mikrokontrolery

    źle się wyświetlają, bo są źle zdefiniowane. Jedynka od siódemki powinna różnić się jednym segmentem, a u Ciebie różni się pięcioma. Definicje 7, 8 i 9 są błędne.

    A poza tym - wrzuć definicje cyfr w tabicę stałych i wyżwetlaj jedną instrukcją, bez switch()

    PORTD = ~cyfry[i];

    0
  • #3 03 Paź 2013 18:51
    GOTHAM
    Poziom 14  

    Jak najbardziej się zgadzam z diagnozą. Jest jeszcze jedna sprawa czy segment który ma wspólną anodę jest wybierany stanem 0 czy 1.

    Code:
    #define segment_1 0x01; // 0000 0001


    Niestety pierwszy segment się nie zapala natomiast wyświetlają się wszystkie inne segmenty.

    0
  • #4 03 Paź 2013 19:40
    BlueDraco
    Specjalista - Mikrokontrolery

    A to zależy do tego, czy masz podłączony wyświetlacz bezpośrednio do uC, czy przez wzmacniacze. Jeśli bezpośrednio, to segmenty wyświetlacza ze wspólną anodą są aktywowane poziomem niskim (zerem).

    0
  • #5 03 Paź 2013 19:48
    GOTHAM
    Poziom 14  

    Jak najbardziej teraz już wszystko działa. Nurtuje mnie jeszcze informacja którą dostaje podczas operacji make file:

    "testowy.c:6:1: warning: "F_CPU" redefined"

    0
  • #6 03 Paź 2013 20:21
    BlueDraco
    Specjalista - Mikrokontrolery

    Są tu tacy, co co drugi dzień piszą, że F_CPU definiuje się w ustawieniach projektu, a nie "ręcznie" w pliku źródłowym.

    0
  • #7 04 Paź 2013 08:00
    GOTHAM
    Poziom 14  

    Czyli definiować ustawienie procesora w pliku źródłowym ? We wszystkich przykładach tak jest.

    0
  • #8 04 Paź 2013 08:38
    BlueDraco
    Specjalista - Mikrokontrolery

    W AVR Studio należy definiować częstotliwość w ustawieniach projektu, NIE w plikach źródłowych projektu. Zapuść szukanie hasła "definiuj F_CPU" na Elektrodzie, a znajdziesz setki postów na ten temat.

    0
  • #10 11 Paź 2013 15:21
    Kociejsko
    Poziom 14  

    Stablicuj to bo az w oczy gryzie. A przy okazji tablice upchnij w kodzie programu.
    Wartosci tablicy oczywiscie tez popraw na prawidlowe


    #include <avr/pgmspace.h>

    PROGMEM uint8_t convTab[10] = {
    0x06,
    0x5b,
    ...
    0xe6
    };

    a potem uzyj

    PORTD = pgm_read_byte(convTab + i );

    i Twój caly switch do wywalenia wtedy

    0