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.

zmiana kodu na anode[Atmega8]

mati852.5 13 Maj 2017 21:10 1152 20
  • #1 13 Maj 2017 21:10
    mati852.5
    Poziom 7  

    Witam,
    chciałbym zrobić prosty zegar na Atmega8 wykorzystując ten projekt: http://automatykaprzemyslowa.blox.pl/2010/02/...-oparty-na-ukladzie-Atmega8-16-PU-prosty.html
    Problem polega na tym, że w powyższym projekcie są wyświetlacze ze wspólną katodą a ja mam jeden, czterocyfrowy ze wspólną anodą. Stąd pytanie jak przerobić kod tak aby wyświetlacz działał poprawnie? Wiem, że trzeba zanegować wyjścia ale to nie pomaga lub robię coś nie tak, proszę o pomoc, wskazówki :)

    0 20
  • #2 13 Maj 2017 21:36
    landy13
    Poziom 29  

    Pewnie wystarczy edytować tablicę:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Np. Dla cyfry 1 ustawiany jest segment B i C. Trzeba więc ustawić wszystkie segmenty oprócz B i C. Podobnie dla pozostałych cyfr.

    0
  • #3 13 Maj 2017 21:52
    mati852.5
    Poziom 7  

    Wystarczy zanegować czy w ten sposób?:
    prog_uint8_t cyfry[10] PROGMEM = {
    (1<<LED_G), //0
    (1<<LED_A)|(1<<LED_D)|(1<<LED_E)|(1<<LED_F)|(1<<LED_G),//1
    (1<<LED_C)|(1<<LED_F), //2
    (1<<LED_E)|(1<<LED_F), //3
    (1<<LED_A)|(1<<LED_B)|(1<<LED_D)|(1<<LED_E), //4
    (1<<LED_B)|(1<<LED_E), //5
    (1<<LED_B), //6
    (1<<LED_D)|(1<<LED_E)|(1<<LED_F)|(1<<LED_G), //7
    //8
    (1<<LED_E), //9
    };[/syntax][/film]

    0
  • Pomocny post
    #4 13 Maj 2017 21:59
    squelch
    Poziom 11  

    Tak jak kolega wyżej pisał edytuj sobie tablicę
    czyli dodaj do każdej linii ~(to co masz w każdej linii);
    co spowoduję negację bitów.


    Pozdrawiam

    Dodano po 2 [minuty]:

    skoro twój led jest ze wspólną anodą to musisz pamiętać o podłączeniu kolektora do VCC a nie do GND jak na schemacie

    Pozdrawiam

    0
  • #5 13 Maj 2017 22:00
    mati852.5
    Poziom 7  

    Tak, to wiem, dzięki za pomoc, składam i zobaczę co z tego wyjdzie :)

    0
  • #7 13 Maj 2017 22:09
    mati852.5
    Poziom 7  

    Jeszcze mam pytanie co do tego fragmentu :
    #define LED_A 0
    #define LED_B 1
    #define LED_C 2
    #define LED_D 3
    #define LED_E 4
    #define LED_F 5
    #define LED_G 6
    Czy nie powinienem ustawić segmentów tak jak piny w dokumentacji od wyświetlacza? Przykładowo dla LED_A 11

    0
  • #9 13 Maj 2017 22:28
    landy13
    Poziom 29  

    mati852.5 napisał:
    Czy nie powinienem ustawić segmentów tak jak piny w dokumentacji od wyświetlacza? Przykładowo dla LED_A 11
    Nie. Jeśli segment A wyświetlacza umieszczony jest na pinie 11, to masz go podłączyć do portu B0 mikrokontrolera. Bo z pewnością zauważyłeś, że wyprowadzenia segmentów mają być podłączone do portu B, a cyfr do portu D. Jeśli chcesz inaczej, to zmiany w kodzie muszą być większe.

    0
  • #11 13 Maj 2017 22:48
    mati852.5
    Poziom 7  

    Nie mam pojęcia, kod zmieniony tylko w tym jednym fragmencie, ten sam kontroler a wyświetlacz stoi w miejscu, nie reaguje na przyciski ani nie liczy czasu.. :(

    0
  • #12 13 Maj 2017 22:58
    landy13
    Poziom 29  

    A podłączyłeś zgodnie ze schematem? Oczywiście zmieniając tranzystory na PNP?

    0
  • #13 13 Maj 2017 23:02
    mati852.5
    Poziom 7  

    tak, wszystko jak w tym projekcie, sprawdzałem dokładnie

    Dodano po 1 [minuty]:

    Tranzystory BC557

    0
  • #14 13 Maj 2017 23:08
    landy13
    Poziom 29  

    No tak, zapomniałem. Tranzystory PNP trzeba załączać zerem, nie jedynką. W przerwaniu, przy przełączaniu cyfr.

    mati852.5 napisał:
    tak, wszystko jak w tym projekcie, sprawdzałem dokładnie
    Bez przesady. Nie możesz mieć dokładnie, bo masz wyświetlacz czterocyfrowy, a w projekcie jest sześcio.

    0
  • #15 13 Maj 2017 23:15
    mati852.5
    Poziom 7  

    Czyli muszę zanegować wszystkie PORTD przy włączaniu wyświetlaczy?

    Dodano po 2 [minuty]:

    Racja, nie dokładnie, rezygnuje z wyświetlania sekund, dlatego czterocyfrowy :)

    0
  • #16 13 Maj 2017 23:15
    landy13
    Poziom 29  

    Nie wszystkie. Tylko te cztery, które sterują tranzystorami.

    EDIT
    Coś się tu nie zgadza. Wg kodu z linka cyfry steruje się zerem, powinno być to więc zgodne z Twoim wyświetlaczem.

    0
  • #17 13 Maj 2017 23:44
    mati852.5
    Poziom 7  

    To może tak, kod w tej chwili wygląda tak:
    #define F_CPU 1000000L
    #include <avr/interrupt.h>
    #include <inttypes.h>
    #include <util/delay.h>
    #include <avr/pgmspace.h>
    #include <avr/io.h>

    #define LED_A 0
    #define LED_B 1
    #define LED_C 2
    #define LED_D 3
    #define LED_E 4
    #define LED_F 5
    #define LED_G 6

    prog_uint8_t cyfry[10] PROGMEM = {
    ~( (1<<LED_A)|(1<<LED_B)|(1<<LED_C)|(1<<LED_D)|(1<<LED_E)|(1<<LED_F) ), //0
    ~( (1<<LED_B)|(1<<LED_C) ), //1
    ~( (1<<LED_A)|(1<<LED_B)|(1<<LED_G)|(1<<LED_E)|(1<<LED_D) ), //2
    ~( (1<<LED_A)|(1<<LED_B)|(1<<LED_G)|(1<<LED_C)|(1<<LED_D) ), //3
    ~( (1<<LED_F)|(1<<LED_G)|(1<<LED_B)|(1<<LED_C) ), //4
    ~( (1<<LED_A)|(1<<LED_F)|(1<<LED_G)|(1<<LED_C)|(1<<LED_D) ), //5
    ~( (1<<LED_A)|(1<<LED_F)|(1<<LED_E)|(1<<LED_D)|(1<<LED_C)|(1<<LED_G) ), //6
    ~( (1<<LED_A)|(1<<LED_B)|(1<<LED_C) ), //7
    ~( (1<<LED_A)|(1<<LED_B)|(1<<LED_C)|(1<<LED_D)|(1<<LED_E)|(1<<LED_F)|(1<<LED_G) ), //8
    ~( (1<<LED_A)|(1<<LED_B)|(1<<LED_C)|(1<<LED_D)|(1<<LED_F)|(1<<LED_G) ), //9
    };

    uint8_t cyfra(uint8_t cyfra)
    {
    return pgm_read_byte(&cyfry[cyfra]);
    }

    volatile uint8_t AktWys; // zmienna oznaczająca numer aktywnego wyświetlacza
    uint8_t times = 0;
    uint8_t timem = 0;
    uint8_t timeh = 0;
    uint8_t hdziesiatki=0; //przechowuje cyfrę dziesiątek godzinną
    uint8_t hjednosci=0; //przechowuje cyfrę jednostek godzinną
    uint8_t mdziesiatki=0; //przechowuje cyfrę dziesiątek minut
    uint8_t mjednosci=0; // przechowuje cyfrę jednostek minut
    uint8_t sdziesiatki=0; // przechowuje cyfrę dziesiątek sekund
    uint8_t sjednosci=0; // przechowuje cyfrę jednostek sekund

    //początek programu
    int main(void)
    {
    DDRB = 0xff; //cały port jako wyjściowy
    DDRD = 0xff; //cały port jako wyjściowy
    DDRC = 0x00;
    PORTC = 0x03;
    TCCR0=1<<CS01;
    TIMSK=1<<TOIE0;
    sei(); // Zezwolenie globalne na przerwania

    for ( ; ; )
    {

    // Jeśli pierwszy przycisk wciśnięty
    if(!(PINC & 0x01))
    {
    _delay_ms(80);
    timeh++;
    }

    // Jeśli drugi przycisk wciśnięty
    if(!(PINC & 0x02))
    {
    _delay_ms(80);
    timem++;
    }

    times++;
    sdziesiatki = times / 10;
    sjednosci = times % 10;
    mdziesiatki = timem / 10;
    mjednosci = timem % 10;
    hdziesiatki = timeh / 10;
    hjednosci = timeh % 10;
    _delay_ms(1000);//1s

    if (times == 60)
    {
    timem++;
    times = 0;
    }

    if (timem == 60)
    {
    timeh++;
    timem = 0;
    }

    if (timeh ==24 )
    {
    timeh = 0;
    }
    }

    return 0;
    }
    ISR(TIMER0_OVF_vect)

    {
    TCNT0=128;

    switch (AktWys)
    {
    case 0:
    PORTD =~(0xFE); //włącza wyświetlacz nr 1
    PORTB =cyfra(hdziesiatki);
    AktWys++;
    break;

    case 1:
    PORTD =~(0xFD); //włącza wyświetlacz nr 2
    PORTB =cyfra(hjednosci);
    AktWys++;
    break;

    case 2:
    PORTD =~(0xFB); //włącza wyświetlacz nr 3
    PORTB =cyfra(mdziesiatki);
    AktWys++;
    break;

    case 3:
    PORTD =~(0xF7); //włącza wyświetlacz nr 4
    PORTB =cyfra(mjednosci);
    AktWys=0;
    break;



    }
    }
    usunąłem z niego linijki z wyświetlaniem sekund, a mój wyświetlacz to: FJ-5461BH

    0
  • #19 13 Maj 2017 23:57
    mati852.5
    Poziom 7  

    Emiter do VCC, bazę do pinu kontrolera a kolektor do wejścia wyświetlacza

    0