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

atmega128 - 4 x 7seg.- zle wyswietla-nie realizuje funkcji

ohio_o 06 Kwi 2014 12:40 1182 11
REKLAMA
  • #1 13480871
    ohio_o
    Poziom 10  
    Posty: 24
    z gory zaznaczam ze to moj pierwszy program!

    mam atmege 128 i wysw. 7segm. i za zadanie mam jakikolwiek prosty zegarek/stoper napisac

    cos tam napisalam ale niestety zle mi wyswietla tzn wgl nie realizuje kodu
    teoretycznie algorytm jest dobrze napisany, ale jak zmieniam liczby tutaj :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to wtedy ewentualnie cos mi sie zmienia...podejrzewam ze powinnam w datasheet poszukac wiecej info ale nie jestem pewna czy akurat tu blad sie chowa

    na wszelki wypadek przesylam caly kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    na maina:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i na hexa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    prosze o jakiekolwiek wskazowki/pomoc
  • REKLAMA
  • #2 13481536
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    while(1){...}
    Co to ma robić w funkcji obsługi przerwania??? Poza tym że uniemożliwia wyjście z tej funkcji?

    ohio_o napisał:
    i na hexa:

    to nie hex tylko plik nagłówkowy d_led.h
  • #3 13481586
    ohio_o
    Poziom 10  
    Posty: 24
    to mialo w srodku to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    ale prowadzacy powiedzial ze while(1) zawsze powinno byc puste
  • #4 13481684
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    while(1) w przerwaniu jest zbędne, natomiast brakuje inicjalizacji zmiennych sek1, sek2, min1, min2; Po uruchomieniu przerwania mają one wartość przypadkową.
    Zamiast
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    daj
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zmienne będą tworzone tylko raz i inicjowane zerem.
  • REKLAMA
  • #5 13481765
    ohio_o
    Poziom 10  
    Posty: 24
    ale brak tego while(1) powoduje ze wtedy nic mi sie nie wyswietla w ogle na wyswietlaczu:(
  • Pomocny post
    #6 13481820
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ohio_o napisał:
    TCCR3A |= (1<<CS32)|(1<<CS30); //ustawienie preskalera na 1024

    Bity preskalera są w rejestrze TCCR3B
  • REKLAMA
  • #7 13481893
    ohio_o
    Poziom 10  
    Posty: 24
    ah faktycznie, dziekuje bardzo
    ale niestety jezeli chodzi o efekt to ten sam, w sensie nic nie zmienia
    czy to mozliwe ze zle wpisalam ustawienia preskalera ?
    bo caly czas ktorys z segmentow mi w ogole nie swieci sie

    Dodano po 21 [minuty]:

    uhh dalej nic
    chyba caly program jest zle albo nie wiem moze brakuje czegos typu np init timer?
  • REKLAMA
  • Pomocny post
    #8 13482239
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    ohio_o napisał:
    ISR (TIMER0_COMP_vect)
    {

    //cykliczne przełączanie anod w każdym przerwaniu anod każdego wyświetlacza (wartość negowana aby krążyło 0)
    ANODY_PORT = (ANODY_PORT & 0xF0);

    //gdy zapalony wyswietlacz 1, podaj stan zmiennej cy1 itd
    if(licznik==1) LED_DATA = pgm_read_byte(&cyfry[cy1]);
    else if(licznik==2) LED_DATA = pgm_read_byte(&cyfry[cy2]);
    else if (licznik==4) LED_DATA = pgm_read_byte(&cyfry[cy3]);
    else if (licznik=8) LED_DATA = pgm_read_byte(&cyfry[cy4]);

    //operacje cyklicznego przesuwania bitu zapalającego anody w zmiennej licznik

    licznik <<= 1; //przesunięcie zawartości bitów licznika o 1 w lewo
    if(licznik>8) licznik = 1;

    }

    Jakbym nie patrzył nie widzę tutaj przełączania anod. Zapis:
    ANODY_PORT = (ANODY_PORT & 0xF0);
    nie robi tego na pewno.
    Do których pinów portu B są te anody podłączone?
    Jeśli do 0,1,2,3
    napisz np.:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a jeśli do 4,5,6,7
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    ohio_o napisał:
    if(licznik==1) LED_DATA = pgm_read_byte(&cyfry[cy1]);
    else if(licznik==2) LED_DATA = pgm_read_byte(&cyfry[cy2]);
    else if (licznik==4) LED_DATA = pgm_read_byte(&cyfry[cy3]);
    else if (licznik=8) LED_DATA = pgm_read_byte(&cyfry[cy4]);

    Co robi funkcja pgm_read_byte(...)? i dlaczego w ostatnim if jest (licznik=8) zamiast (licznik==8)?
    W tym przypadku wystarczy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 13482325
    ohio_o
    Poziom 10  
    Posty: 24
    do pinow 4,5,6,7

    ale dlaczego nie robi nic przy wczesniejszym ustawieniu?

    i rzeczywiscie jak zmienilam to,to ruszylo sie i teraz zmieniaja sie poszczegolne wyswietlane cyfry...
    tzn teraz wyglada tak ze staly znak tj 6 wyswietla sie pokolei od cyfry z prawej do lewej i tak w kolko
    wiem ze musze zmienic
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    i
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    bo jest efekt migotania
  • Pomocny post
    #10 13482355
    el2010tmp
    Poziom 25  
    Posty: 713
    Pomógł: 97
    Ocena: 44
    ohio_o napisał:
    ale dlaczego nie robi nic przy wczesniejszym ustawieniu?


    Np. dla: ANODY_PORT=0b1000000
    ANODY_PORT = (ANODY_PORT & 0xF0);
    0b10000000
    &
    0b11110000 [0xF0]
    =
    0b10000000
    czyli nic nie robi :)
  • #11 13482367
    ohio_o
    Poziom 10  
    Posty: 24
    dzieki temu pgm_read_byte wyswietla sie, jesli zrobie jak napisales i to usune to nic sie nie pokazuje na wyswietlaczu
    a z tym licznikiem to faktycznie zjadlam jedno "=", dziekuje
  • #12 13484993
    ohio_o
    Poziom 10  
    Posty: 24
    udalo sie problem rozwiazac :) nalezalo jeszcze w timerze 2 rzeczy zmienic, bardzo dziekuje za pomoc :) zamykam temat
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ Użytkownik pracuje nad programem zegarka/stoperu na mikrokontrolerze ATmega128 z wyświetlaczem 7-segmentowym. Napotkał problemy z wyświetlaniem, które nie realizowały kodu. W odpowiedziach zasugerowano, aby usunąć pętlę while(1) z funkcji obsługi przerwania oraz zainicjować zmienne sek1, sek2, min1, min2 jako static, co pozwoliło na ich poprawne działanie. Użytkownik zidentyfikował również problemy z ustawieniami preskalera oraz z przełączaniem anod wyświetlacza. Po wprowadzeniu poprawek, w tym zmian w timerze, problem został rozwiązany, a wyświetlacz zaczął działać poprawnie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA