Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

at89c2051 c++ początkujący, problem z wyświetleniem wartości

bajkaiwona 15 Oct 2009 21:35 1347 7
  • #1
    bajkaiwona
    Level 2  
    Witam.
    Moje pierwsze początki zapoczątkowałem od procesora At89c2051 i używam kompilatora sdcc, natknąłem się na pewien problem, napisałem coś takiego:
    
    #include "at89x051.h"
    
    unsigned char licznik_x;
    int  wartosc_cz;
    int x;
    int temp=145;
    unsigned char wyswietlacz[4];
    code unsigned char cyfry[] ={0x40, 0x79, 0x24, 0x30, 0x19, 
    0x12, 0x02, 0x78, 0x00, 0x10, 0x40 };
     
     
     operacja(){P1=cyfry[wyswietlacz[licznik_x]];}
     
    wyswietl_czas( ) 
    { wartosc_cz=2999;
    wyswietlacz[0] = x = wartosc_cz%10;                  
      wyswietlacz[1] = x =(wartosc_cz=(wartosc_cz-x)/10)%10;                  
      wyswietlacz[2] = x =(wartosc_cz=(wartosc_cz-x)/10)%10;
      wyswietlacz[3] = x =(wartosc_cz=(wartosc_cz-x)/10)%10;    
    
    if (licznik_x==0) {P3_0=1; operacja(); P3_4=0; } 
    if (licznik_x==1) {P3_4=1; operacja(); P3_5=0; } 
    if (licznik_x==2) {P3_5=1; operacja(); P3_1=0; } 
    if (licznik_x ==3){P3_1=1; operacja(); P3_0=0; } licznik_x ++;
    if (licznik_x==4){licznik_x=0; }
    }
    
    main()
    {
    for(;;) wyswietl_czas();}
    

    i wyświetlana jest wartość 2999, ale gdy podstawie wartosc_cz=temp; lub wartosc_cz=2999; umieszcze poza funkcją wyswietl_czas( ) , to wyświetlacz pokazuje
    jakieś nie określone wartości, proszę o pomoc jak można to zrealizować, końcowy mój
    projekt ma wyświetlać wartość liczników (TH0*256)+TL0.
  • #2
    arrevalk
    Level 25  
    1. Uzywaj znaczników CODE do wstawiania kodu źródłowego.
    2. W ktorym dokladnie miejscu wstawiasz to przypisanie wartosci do zmiennej poza kodem funkcji wyswietl_czas()? Bo jest kilka możliwości:
    a) zmiennej przypisujesz wartość przed pętlą, wtedy program cały czas będzie wyświetlał tą wartość.
    b) zmienną ustawiasz wewnątrz pętli for przed lub za wywolaniem funkcji wyswietl_czas() wtedy powinno być ok
    c) zmienną ustawiasz za funkcją for().., wtedy zmiennej program nigdy nie ustawi bo tam nie dotrze, ponieważ cały czas będzie się znajdował wewnątrz pętli for. Czyli będzie wyświetlał zawartość zmiennej wartosc_cz która nie została zainicjalizowana żadną wartością więc tak naprawde nie można przewidzieć co zawiera.
    I proponuje zawsze inicjalizuj sobie zmienne przy tworzeniu, tak unikniesz różnych dziwnych sytuacji. Np. tak:
    int wartosc_cz = 0;
  • #3
    Freddie Chopin
    MCUs specialist
    arrevalk wrote:
    I proponuje zawsze inicjalizuj sobie zmienne przy tworzeniu, tak unikniesz różnych dziwnych sytuacji. Np. tak:
    int wartosc_cz = 0;

    Zgodnie ze standardem niezainicjalizowane zmienne globalne i statyczne sa inicjalizowane wartością 0 automatycznie. Proces ten realizowany jest przez kod startowy. Dokładanie tego zera ręcznie może skłonić kompilator do przeniesienia zmiennej do obszaru zmiennych "zainicjalizowanych", co wiązać się będzie ze stratą pamięci na inicjalizator.

    4\/3!!
  • #4
    arrevalk
    Level 25  
    Dzięki Freddie za sprostowanie. Rozumiem że zmienne lokalne należy nadal "ręcznie" inicjalizować?
  • #5
    Freddie Chopin
    MCUs specialist
    Lepiej napisać tak - zmienne automatyczne trzeba inicjalizować ręcznie. Automatyczne to są te zmienne, które alokowane są na stosie, czyli zmienne lokalne, ale nie-statyczne.

    void f(void)
    {
        int auto; // zmienna automatyczna - wartosc losowa
        static int stat; // zmienna statyczna - wartosc 0
    ...
    


    4\/3!!
  • #6
    bajkaiwona
    Level 2  
    Zmiennej przypisuje wartość w funkcji wyswietl_czas() poprzez zamianę wartosc_cz=2999; na wartosc_cz=temp; jak pisałem zapis wartosc_cz=2999; jest wyświetlany prawidłowo, po zamianie na wartosc_cz=temp; wyświetlacz pokazuje przypadkowe znaki, nawet nie są to znaki z tablicy wyswietlacz[4];, jeżeli też w funkcji main() wpisze wartosc_cz=2999; , też nie działa, jedynie działa z poziomu przypisania tylko w funkcji wyswietl_czas() ; i tylko pod warunkiem że wpisuje wartosc_cz=?, a nie wartosc_cz=temp; a docelowo mam wpisać wartość z liczników czyli (TH0*256)+TL0.
  • #7
    Freddie Chopin
    MCUs specialist
    Słyszałeś o czymś takim jak zmienne lokalne? Zastanawiałeś się jak to ma działać, skoro jednokrotne wykonanie tej funkcji modyfikuje wartość zmiennej globalnej, a pewnie przypisanie do niej miałeś tylko przed pętlą.

    W ogóle ten program jest napisany w jakimś nieznanym mi języku, bo jaki ma sens pisanie programu w C bez ŻADNYCH zmiennych lokalnych i parametrów?

    4\/3!!
  • #8
    bajkaiwona
    Level 2  
    Zmienne lokalne i globalne już poznałem, jeżeli zrobię to tak też nie działa:
    
    wyswietl_czas() 
    { 
    int x;
    int wartosc_cz=0;
    wartosc_cz=temp;
    
    wyswietlacz[0] = x = wartosc_cz%10;                  
      wyswietlacz[1] = x =(wartosc_cz=(wartosc_cz-x)/10)%10;                  
      wyswietlacz[2] = x =(wartosc_cz=(wartosc_cz-x)/10)%10;
      wyswietlacz[3] = x =(wartosc_cz=(wartosc_cz-x)/10)%10;   .....