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.

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

ohio_o 06 Kwi 2014 12:40 828 11
  • #1 06 Kwi 2014 12:40
    ohio_o
    Poziom 9  

    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
    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
    Zaloguj się, aby zobaczyć kod


    na maina:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    i na hexa:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    prosze o jakiekolwiek wskazowki/pomoc

    0 11
  • #2 06 Kwi 2014 14:39
    el2010tmp
    Poziom 25  

    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

    0
  • #3 06 Kwi 2014 14:50
    ohio_o
    Poziom 9  

    to mialo w srodku to:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ale prowadzacy powiedzial ze while(1) zawsze powinno byc puste

    0
  • #4 06 Kwi 2014 15:13
    el2010tmp
    Poziom 25  

    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
    Zaloguj się, aby zobaczyć kod

    daj
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Zmienne będą tworzone tylko raz i inicjowane zerem.

    0
  • #5 06 Kwi 2014 15:33
    ohio_o
    Poziom 9  

    ale brak tego while(1) powoduje ze wtedy nic mi sie nie wyswietla w ogle na wyswietlaczu:(

    0
  • Pomocny post
    #6 06 Kwi 2014 15:48
    el2010tmp
    Poziom 25  

    Kod: c
    Zaloguj się, aby zobaczyć kod


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

    Bity preskalera są w rejestrze TCCR3B

    0
  • #7 06 Kwi 2014 16:29
    ohio_o
    Poziom 9  

    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?

    0
  • Pomocny post
    #8 06 Kwi 2014 17:32
    el2010tmp
    Poziom 25  

    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
    Zaloguj się, aby zobaczyć kod

    a jeśli do 4,5,6,7
    Kod: 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
    Zaloguj się, aby zobaczyć kod

    0
  • #9 06 Kwi 2014 17:54
    ohio_o
    Poziom 9  

    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
    Zaloguj się, aby zobaczyć kod
    i
    Kod: c
    Zaloguj się, aby zobaczyć kod
    bo jest efekt migotania

    0
  • Pomocny post
    #10 06 Kwi 2014 18:04
    el2010tmp
    Poziom 25  

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

    0
  • #11 06 Kwi 2014 18:06
    ohio_o
    Poziom 9  

    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

    0
  • #12 07 Kwi 2014 14:09
    ohio_o
    Poziom 9  

    udalo sie problem rozwiazac :) nalezalo jeszcze w timerze 2 rzeczy zmienic, bardzo dziekuje za pomoc :) zamykam temat

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0