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

Atmega8 bascom zegarek daqqs

livetevn 17 Sie 2011 17:09 2670 16
  • #1 9834457
    livetevn
    Poziom 11  
    Witam
    Potrzebuje pomocy tym razem w ulepszeniu zegarka http://www.daqq.eu/index.php?show=prj_avr_clock_1. W związku z tym iż uruchomiłem go chciałem polepszyć jego dokładność a nie znam języka c napisałem program w bascomie wzorując się na koledze https://www.elektroda.pl/rtvforum/topic1770011.html powstało takie coś


    $regfile = "m8def.dat"
    $crystal = 8000000
    
    Dim Cyfra1 As Byte
    Dim Cyfra2 As Byte
    Dim Cyfra3 As Byte
    Dim Cyfra4 As Byte
    
    Dim Nr_wysw As Byte
    
    Dim Wyjscie As Byte , Wys_on As Bit
    
    Config Portc = Output
    Set Portc.5
    Set Portc.4
    Set Portc.3
    Set Portc.2
    Set Portc.7
    
    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output
    Portd = &HFF
    
    Config Pinb.3 = Input
    Config Pinb.4 = Input
    
    S1 Alias Pinb.4
    S2 Alias Pinb.3
    
    Config Clock = Soft ,
    
     Config Timer1 = Timer , Prescale = 256
     On Timer1 Wyswietlacz
     Enable Interrupts
     Enable Timer1
     Enable Timer0
     Load Timer1 , 65
    
    Do
    
    If Wys_on = 1 Then
       Cyfra1 = _hour / 10
       Cyfra2 = _hour Mod 10
       Cyfra3 = _min / 10
       Cyfra4 = _min Mod 10
    
    End If
    
    If S1 = 0 Then
    Waitms 25
    If S1 = 0 Then                                              'zwiększ godziny
    Incr _hour
    If _hour = 24 Then
    _hour = 0
    End If
    End If
    End If
    
    If S2 = 0 Then
    Waitms 25
    If S2 = 0 Then                                              'zwiększ minuty
    Incr _min
    _sec = 0
    If _min = 60 Then
    _min = 0
    End If
    End If
    End If
    
    Wyswietlacz:
    
    Load Timer1 , 125
    
    Set Portc.5
    Set Portc.4
    Set Portc.3
    Set Portc.2
    
    Select Case Nr_wysw
    
    Case 0:
    If Cyfra1 = 0 Then
    Cyfra1 = 11
    Else
    Portd = Lookup(cyfra1 , Segmenty )
    Reset Portc.5
    End If
    
    Case 1:
    Portd = Lookup(cyfra2 , Segmenty )
    Reset Portc.4
    
    Case 2:
    Portd = Lookup(cyfra3 , Segmenty )
    Reset Portc.3
    
    Case 3:
    Portd = Lookup(cyfra4 , Segmenty )
    Reset Portc.2
    
    End Select
    
    Incr Nr_wysw
    
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    
    Return
     Loop
    
     Segmenty:
    Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110 ,
    Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111 ,



    Tylko jest jeden mały problem za nic w świecie nie chce wyświetlić godziny. Nie rozumiem tutaj tych kodów wyświetlanych cyfr. Proszę o pomoc
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Moderowany przez _Robak_:

    3.1.17. (10.9, 16) Zabronione jest publikowanie wpisów obniżających ogólny poziom dyskusji, wynikających z lenistwa lub zawierających roszczeniowy charakter wypowiedzi.

  • #2 9834582
    piotrva
    VIP Zasłużony dla elektroda
    1. używaj znaczników CODE
    2. na początek zapoznaj się z obsługą wyświetlaczy led z wykorzystaniem multipleksowania
  • #3 9834682
    livetevn
    Poziom 11  
    A jakiś myk żeby zadziałało ?? wtedy może lepiej bym zrozumiał
  • Pomocny post
    #4 9834711
    piotrva
    VIP Zasłużony dla elektroda
    Przeanalizuj ten fragment i pomyśl co trzeba usunąć, bo tego nie używasz:
    
    If Wys_on = 1 Then
       Cyfra1 = _hour / 10
       Cyfra2 = _hour Mod 10
       Cyfra3 = _min / 10
       Cyfra4 = _min Mod 10
    Else
       Cyfra1 = 11
       Cyfra2 = 11
       Cyfra3 = 11
       Cyfra4 = 11
    
    End If 
    
  • #5 9834738
    livetevn
    Poziom 11  
    Poprawione gdzieś mi się zawieruszyło :D
  • #7 9834961
    livetevn
    Poziom 11  
    Właśnie o to chodzi że nie działa
  • #9 9835170
    livetevn
    Poziom 11  
    dzieje się coś dziwnego. Jak podłączy się do zasilania nic się nie pokazuje ale jak dotknie się do pinów kwarcu to na wyświetlaczu zaczyna się coś pojawiać migać cyfry itp. a jak się puści to pozostają zapalone segmenty d i nic po za tym.
  • #11 9836583
    livetevn
    Poziom 11  
    mam na płytce stykowej i drukowanej układ dzisiaj ruszył po ponownym wgraniu programu świecą się albo odbicie lustrzane 9 albo segmenty F i B raz zapaliły się 0. Dodam iż po wgraniu oryginalnego softu i zmianie kwarcu wszystko jest dobrze. Próbowałem z różnymi zawsze jest to samo
  • #12 9836766
    snnaap
    Poziom 25  
    Bawiłeś się kiedyś wyświetlaczami 7 seg? Bo chyba musimy podejść do tematu z innej strony i małymi kroczkami iść do przodu a nie odraz rzucać się na głęboką wodę.
    Fajnie jak byś pokazał schemat jak masz podłączony wyświetlacz do uK.
    Patrząc na program to zdaje mi się że wyświetlacz ma wspólną anodę, segmenty powinny być podłączone do portu D poprzez rezystory a anody poszczególnych wyświetlaczy sterowane są z PORTU C za pośrednictwem tranzystorów pnp, dobrze myślę czy nie?
  • #13 9836772
    piotrva
    VIP Zasłużony dla elektroda
    Cóż, powiem tylko (już którejś z kolei osobie) - nie rzucaj się na głęboką wodę i gotowce - jeśli chcesz się czegoś nauczyć to zacznij od podstaw. Teraz przychylam się do zdania Kolegi snnaap - na początek pobaw się SAMYM wyświetlaczem led i zrozum zasadę jego sterowania. Potem małymi kroczkami dalej - więcej się nauczysz a i satysfakcja z efektu końcowego proporcjonalnie wzrośnie.
  • #14 9836802
    livetevn
    Poziom 11  
    Wszystko jest podłączone jak na tym schemacie http://www.daqq.eu/img/projects/sch_hodiny_avr.gif Zrobiłem zegarek najpierw na płytce stykowej było ok tylko te odbiegi od czasu rzeczywistego:D dlatego chciałem go ulepszyć kwarcem zegarkowym, a w związku z tym iż nie znam języka c znalazłem projekt napisany w bascom'ie, wykasowałem co jest mi niepotrzebne, dodałem przyciski no i coś jest źle.
  • #15 9836942
    snnaap
    Poziom 25  
    livetevn napisał:
    Wszystko jest podłączone jak na tym schemacie http://www.daqq.eu/img/projects/sch_hodiny_avr.gif. Zrobiłem zegarek najpierw na płytce stykowej było ok tylko te odbiegi od czasu rzeczywistego:D dlatego chciałem go ulepszyć kwarcem zegarkowym, a w związku z tym iż nie znam języka c znalazłem projekt napisany w bascom'ie wykasowałem co jest mi nie potrzebne, dodałem przyciski no i coś jest źle.



    404 - File or directory not found. ;)

    No to pokaż program który był ok, sam go napisałeś czy też był z neta?

    Musisz określić co umiesz, w jakim stopniu łapiesz uK i elementy które wykorzystujesz w tym projekcie wtedy będziemy wiedzieli w jaki sposób Ci pomóc.
    I na pewno wszyscy zrobią to chętnie.

    Dodano po 35 [minuty]:

    Z tego schematu trudno wywnioskować czy to jest wyświetlacz ze wspólną anodą czy katodą.
    Niemniej podłączenie go w taki sposób jest nieprawidłowe, grozi uszkodzeniem uK.



    PS
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Tak zdefiniowane cyfr nie pasuje do danego schematu. W tym przypadku wpisanie cyfry 1 spowoduje zapalenie się segmentów F i A.

    Czy program załączony na początku i schemat jest z 2 różnych wątków?
  • #16 9837172
    livetevn
    Poziom 11  
    oryginalny kod
     #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/wdt.h>
    #include <stdio.h>
    
    
    
    #define _s_A  2
    #define _s_B  0
    #define _s_C  6
    #define _s_D  4
    #define _s_E  3
    #define _s_F  1
    #define _s_G  7
    #define _s_dot 5
    
    const unsigned char segs[] =
    {
        _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F),    //0
        _BV(_s_B) | _BV(_s_C),    //1
        _BV(_s_A) | _BV(_s_B) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G),    //2
        _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_G),  //3
        _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),    //4
        _BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_F) | _BV(_s_G), //5
        _BV(_s_A) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //6
        _BV(_s_A) | _BV(_s_B) | _BV(_s_C), //7
        _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),//8
        _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_F) | _BV(_s_G),//9
       
        _BV(_s_A) | _BV(_s_B) | _BV(_s_C) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),    //A
        _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G),    //B
        _BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F), //C
        _BV(_s_B) | _BV(_s_C) | _BV(_s_D) | _BV(_s_E) | _BV(_s_G), //D
        _BV(_s_A) | _BV(_s_D) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G), //E
        _BV(_s_A) | _BV(_s_E) | _BV(_s_F) | _BV(_s_G) //F
    
    };
    
    
    
    #define _ms(n) (17*n)
    
    void wait(unsigned int a)    //basic wait
    {                           
        volatile unsigned int b,c;
        for(b=0;b!= a; b++)for(c=0;c!= 50;c++);
        return;
    }
    
    
    
    unsigned char prescale=0;
    unsigned char sec=0;
    unsigned char min_1=0;
    unsigned char min_10=0;
    unsigned char hour_1=0;
    unsigned char hour_10=0;
    unsigned char show_t=0;
    
    
    ISR(TIMER1_OVF_vect)
    {
        if(++prescale == 225){prescale = 0;sec++;};
        if(sec>59){min_1++;sec=0;};
        if(min_1>9){min_1=0;min_10++;};
        if(min_10>5){min_10=0;hour_1++;};
        if(hour_1>9){hour_1=0;hour_10++;};
        if(hour_10>1 && hour_1>3){hour_1=0;hour_10=0;};
       
        if(++show_t==4) show_t=0;
        switch(show_t)
        {
            case 0:    //show minutes
                PORTC = 0x04;
                PORTD = (~segs[min_1]);
                break;
            case 1:    //show 10 minutes
                PORTC = 0x08;
                PORTD = (~segs[min_10]);
                break;
            case 2:    //show hours
                PORTC = 0x10;
                PORTD = (~segs[hour_1]) & ~_BV(_s_dot);
                break;
            case 3:    //show 10hours
                PORTC = 0x20;
                PORTD = (~segs[hour_10]);
                break;
            default:
                show_t = 0;
                break;
        }   
        return;
    }
    
    
    #define B1() (bit_is_clear(PINB,3))
    #define B2() (bit_is_clear(PINB,4))
    #define B_WAIT 300
    
    #define nop() asm volatile ("nop;")
    
    int main(void)
    {
    
        TIMSK = 0x04;
        TCCR1B = 0x01;
    
        DDRD = 0xFF;
        DDRC = 0x3F;
        DDRB = 0x00;
        PORTB = 0xFF;
       
        sei();
        while(1)
        {
            if(B1())
            {
                wait(_ms(B_WAIT));
                min_1++;
                sec=0;
            }
            if(B2())
            {
                wait(_ms(B_WAIT));
                hour_1++;
                sec=0;
            }
        }
    }

    schemat Atmega8 bascom zegarek daqqs
    elementy wszystkie takie same jak na tym schemacie, oprócz kondensatorów c1,2 i kwarcu. c1,2 mają 18pf natomiast kwarc 32.768kHz reszta jest taka sama. Zmieniam c1,2 i kwarc ładuje program autora daqqs i działa. Za nic w świecie nie mogę dojść jak mają być sterowane te wyświetlacze.
  • #17 9837183
    piotrva
    VIP Zasłużony dla elektroda
    Tak, z tego co wiem, to schemat jest pod to:
    http://www.daqq.eu/index.php?show=prj_avr_clock_1
    A program (po modyfikacjach) stąd:
    https://www.elektroda.pl/rtvforum/topic1770011.html
    Więc dlatego proponuję Kol. livetevn zacząć przeróbkę od nauki obsługi wyświetlaczy LED - potem stanie się jasna dla Niego zasada wyświetlania w tym programie, który zmodyfikuje odpowiednio do swojego schematu...
    EDIT:
    Wystarczy poszukać w necie, jest dużo stron o sterowaniu multipleksowanym takich wyświetlaczy: http://wortal.majsterkowicza.pl/2011/01/sterowanie-wyswietlaczami-led-multipleksowanie/
REKLAMA