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.

[atmega8][bascom]Wyswietlacz 7 segmentowy

Macias871 17 Wrz 2008 19:39 3599 5
  • #1 17 Wrz 2008 19:39
    Macias871
    Poziom 12  

    Może ma ktos z was gotowy program do wyswietlania cyfr na dwóch wyswietlaczach? Może w przerwaniu. Mam cos takiego ale wyswietlacz mruga.

    Moderowany przez McRancor:

    Używaj znaczników "code" jak wklejasz kod. Poprawiłem



    Code:

                        $regfile = "m8def.dat"
    $crystal = 8000000


       Config Portd = Output
       Config Pinb.0 = Output
       Config Pinb.1 = Output
       Config Pinb.2 = Output
       Config Pinb.3 = Output
       Config Pinb.4 = Input
       Config Pinb.5 = Input
       Config Pinb.6 = Input
       Config Pinb.7 = Input
       Config Portc = Output

       Set Pinb.5
       Set Pinb.6
       Set Pinb.7


          Dim A As Integer , Licznik As Byte , T As Integer ,
          Dim Setki As Byte , Dziesiatki As Byte , Jednostki As Byte ,
          Dim Mux As Byte ,

       Swstart Alias Pinb.5
       Swstop Alias Pinb.6
       Funk Alias Pinb.7

    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 64
    Dim Wart_ac As Word


    Dim P As Byte                                               'pozycja                                               'x temperatura
    Dim X As Single                                             'temperatura z czujnika
    Dim Z As Byte                                               'czas przedmuchu
    Dim J As Byte                                               'czas pomiedzy przedmuch
    Dim I As Byte                                               'obr min
    Dim S As Single                                             'temperatura w pamieci
    Dim U As Byte

       Config Timer0 = Timer , Prescale = 64




       Enable Interrupts
       Enable Timer0
       On Timer0 Co4ms

    Dmuchawa Alias Pinb.2
    Pompa Alias Pinb.3
    Cz_temp Alias Pinb.4

    Declare Sub Temp
    Declare Sub Przedmuch
    Declare Sub Czas_m_przedmuch
    Declare Sub Obr_min
    Declare Sub Obr_max
    Declare Sub Temperatura
    Declare Sub Pompa
    Declare Sub Dmuchawa_sub
    Declare Sub Praca
    Declare Sub Wyswietl

    Declare Sub Obroty_max_sub
    Declare Sub Obroty_min_sub                                  'end program



    P = 1
    Do

    If Funk = 0 Then
    Waitms 200
    Incr P
    End If
       If P = 5 Then
       P = 0
    End If




    If P = 0 Then
    Portc = &B11111110
    Waitms 100
    If Swstart = 0 Then
    Gosub Praca
    End If
    End If
    If P = 1 Then
    Portc = &B11111101
    Gosub Temp
    End If
    If P = 2 Then
    Portc = &B11111011
    Gosub Przedmuch
    End If
    If P = 3 Then
    Gosub Czas_m_przedmuch
    Portc = &B11110111
    End If
    If P = 4 Then
    Gosub Obr_min
    Portc = &B11101111
    End If
    If P = 5 Then
    Gosub Obr_max
    Portc = &B11011111
    End If
    Loop




    Sub Temp
    Readeeprom X , 1

    If Swstart = 0 Then
     Waitms 10
    If Swstart = 0 Then
     Incr X
     T = X
     Waitms 20


    If X = 91 Then X = 35
    End If
    End If
    If Swstop = 0 Then
     Waitms 10
    If Swstop = 0 Then
     Decr X
     T = X
     Waitms 20


    If X = 35 Then X = 90
    End If
    End If
    Writeeeprom X , 1
    End Sub

    Sub Przedmuch
    If Swstart = 0 Then
     Waitms 50
    If Swstart = 0 Then
     Incr Z
    If Z = 25 Then Z = 1
    End If
    End If
    If Swstop = 0 Then
     Waitms 50
    If Swstop = 0 Then
     Decr Z
    If Z = 0 Then Z = 25
    End If
    End If
    Writeeeprom Z , 2
    End Sub

    Sub Czas_m_przedmuch
    If Swstart = 0 Then
     Waitms 50
    If Swstart = 0 Then
     Incr J
    If J = 99 Then J = 1
    End If
    End If
    If Swstop = 0 Then
     Waitms 50
    If Swstop = 0 Then
     Decr J
    If J = 0 Then J = 99
    End If
    End If
    Writeeeprom J , 3
    End Sub

    Sub Obr_min
    If Swstart = 0 Then
     Waitms 50
    If Swstart = 0 Then
     Incr I
    If I = 12 Then I = 1
    End If
    End If
    If Swstop = 0 Then
     Waitms 50
    If Swstop = 0 Then
     Decr I
    If I = 1 Then I = 11
    End If
    End If
    Writeeeprom I , 4
    End Sub

    Sub Obr_max
    If Swstart = 0 Then
     Waitms 50
    If Swstart = 0 Then
     Incr U
    If U = 11 Then U = 1
    End If
    End If
    If Swstop = 0 Then
     Waitms 50
    If Swstop = 0 Then
     Decr U
    If U = 1 Then U = 11
    End If
    End If
    Writeeeprom U , 5
    End Sub

    Sub Temperatura
    Start Adc

    Wart_ac = Getadc(3)
    S = Wart_ac / 10
    End Sub

    Sub Praca
    Do
    Gosub Temperatura
    If S < X Then
    Gosub Obroty_max_sub
    Set Pompa
    End If
    If S > X Then
    Gosub Obroty_min_sub
    End If
    If S > 90 Then
    Pwm1a = 1
    End If

    Loop
    End Sub

    Sub Obroty_max_sub
    Readeeprom U , 5
    Pwm1a = U * 93
    End Sub

    Sub Obroty_min_sub
    Readeeprom I , 4
    Pwm1a = I * 93
    End Sub








                                                          'end program                                                      'end program


       Co4ms:
       'Standardowa konwersja binarna 0...255 na trzycyfrową BCD
      A = T
          If A > 100 Then
              Setki = 1
              A = A - 100
           Else
              Setki = 10
           End If




        A = Makebcd(a)
        Jednostki = A And 15
        Dziesiatki = A
        Shift Dziesiatki , Right , 4
        'Standardowa obsługa wyświetlaczy
        Incr Mux
        If Mux = 3 Then Mux = 0
        Portb = 127
        Select Case Mux
        Case 0
          Portd = Lookup(jednostki , Tabela)
          Portb.1 = 0
        Case 1
          Portd = Lookup(dziesiatki , Tabela)
          Portb.0 = 0

        End Select
       Return



     Tabela:
    Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110,
    Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111

    0 5
  • #2 17 Wrz 2008 19:42
    ZbeeGin
    Poziom 38  

    Mruga gdyż pewnie nie przestawiłeś oscylatora, zatem procesor nie jest taktowany 8MHz tylko 1MHz.

    0
  • #3 17 Wrz 2008 20:35
    Macias871
    Poziom 12  

    W fuse bitach mam ustawione na 8 mhz. Pierwsza cyfre wyswietla slabo a na drugiej niewiadomo co jest!

    0
  • Pomocny post
    #4 17 Wrz 2008 23:39
    dawid512
    Poziom 32  

    Pokaż schemat to raz.
    Dwa:

    co to jest?

    Code:
    Set Pinb.5
    
    Set Pinb.6
    Set Pinb.7


    Tak po za tym chyba brakuje ci wartości początkowej timera0...
    Nie obraź się ale przy tym oscylatorze i preskalerze 64 otrzymasz przerwanie co najwyżej co 2ms...

    Na koniec zapamiętaj że program zawsze umieszcza się w znacznikach "code".

    0
  • #5 18 Wrz 2008 07:58
    cepelia
    Poziom 20  

    Nie wiem jak koledzy ale ja zawsze jak mam narysować coś na ledach to robię to tak.

    Code:


    tu oczywiście deklaruje zmienne
    i configoruje timer

    Do

      ' display DS1
      Reset Ds4 : Reset Ds3 : Reset Ds2 : Set Ds1
      Led7 = Lookup(zmienna_a , Led7s_table)
      Waitms Ms
      ' display DS2
      Reset Ds4 : Reset Ds3 : Set Ds2 : Reset Ds1
      Led7 = Lookup(zmienna_b , Led7s_table)
      Waitms Ms

    Loop

    przerwanie:

    a tu umieszczam cały program co ma się wyświetlić

    no i oczywiście tabelka ze znakami



    i to zasadniczo sprawdza się zawsze nawet jak jest wyświetlacz z więcej niż 2 kostek. Ważne co by nic więcej nie dawać do pętli do-loop, a jeszcze jedno sprawdź czy nie masz włączonego wathdoga bo to jest domyślne ustawienie w kalkulatorze do fusbitów.

    0
  • #6 18 Wrz 2008 18:32
    Macias871
    Poziom 12  

    Set pinb.5 .. to podciaganie pinów do zasilania, w dalszej czesci progrmu piny te sa uzywane do sprawdzania stanu na przyciskach. Calosc mam zmontowana na zestawie zl2avr a ogolnie to jest progrma do oryginalnego sterownika pieca mialowego. W tamtym uszkodzil sie procesor i probuje napisac program do niego. Napisalem kawalek od nowa i juz lepiej. Chodzi o taki sterownik : http://www.foster-pleszew.com.pl/index.php?go=oferta&cat=msrt&pid=02

    a oto nowy kawalek programu.

    Code:

    $regfile = "m8def.dat"
    $crystal = 8000000

       Config Portd = Output
       Config Pinb.0 = Output
       Config Pinb.1 = Output
       Config Pinb.2 = Output
       Config Pinb.3 = Output
       Config Pinb.4 = Input
       Config Pinb.5 = Input
       Config Pinb.6 = Input
       Config Pinb.7 = Input
       Config Portc = Output

       Set Pinb.5
       Set Pinb.6
       Set Pinb.7

       Swstart Alias Pinb.5
       Swstop Alias Pinb.6
       Funk Alias Pinb.7

       Config Timer0 = Timer , Prescale = 256
       Enable Interrupts
       Enable Timer0
       On Timer0 Co4ms

          Dim Odczyt(2)as Byte , A As Integer , Licznik As Byte , T As Integer ,
          Dim Setki As Byte , Dziesiatki As Byte , Jednostki As Byte ,
          Dim Mux As Byte



    Dim P As Byte                                               'pozycja                                               'x temperatura
    Dim X As Single                                             'temperatura z czujnika
    Dim Z As Byte                                               'czas przedmuchu
    Dim J As Byte                                               'czas pomiedzy przedmuch
    Dim I As Byte                                               'obr min
    Dim S As Single                                             'temperatura w pamieci
    Dim U As Byte



      Declare Sub Praca
      Declare Sub Temp
      Declare Sub Funkcje
    Portc = &B111111110
    Readeeprom X , 1
    Do
    If Funk = 0 Then
    Waitms 200
    Incr P
    If P = 5 Then
    P = 0
    End If

    End If

    If P = 0 Then
    Portc = &B11111110
    Waitms 10
    If Swstart = 0 Then
    Gosub Praca
    End If
    End If


    If P = 1 Then
    Portc = &B11111101

    T = X
    Gosub Temp
    End If

    If P = 2 Then
    Portc = &B11111011
    End If

    If P = 3 Then
    Portc = &B11110111
    End If

    If P = 4 Then
    Portc = &B11101111
    End If

    If P = 5 Then
    Portc = &B11011111
    End If
    Loop



    Sub Temp



    If Swstart = 0 Then


    Incr X
    Waitms 50
    T = X
    Waitms 50

    End If
    If X = 91 Then
    X = 35
    End If


    If Swstop = 0 Then

    Decr X
    Waitms 50
    T = X
    Waitms 50
    If X < 35 Then
     X = 90
    End If
    End If
    If Funk = 0 Then
    Writeeeprom X , 1
    Waitms 10
    Incr P
    End If


    End Sub




    Sub Praca
    Do
    Portc = &B00011000
    Waitms 100
    Portc = &B00101010
    Waitms 100
    Loop Until Funk = 0

    End Sub







       End                                                      'end program                                                      'end program


       Co4ms:
       'Standardowa konwersja binarna 0...255 na trzycyfrową BCD
       A = T
          If A > 100 Then
              Setki = 1
              A = A - 100
           Else
              Setki = 10
           End If




        A = Makebcd(a)
        Jednostki = A And 15
        Dziesiatki = A
        Shift Dziesiatki , Right , 4
        'Standardowa obsługa wyświetlaczy
        Incr Mux
        If Mux = 2 Then Mux = 0
        Portb.0 = 1
        Portb.1 = 1
        Select Case Mux
        Case 0
          Portd = Lookup(jednostki , Tabela)
          Portb.1 = 0
        Case 1
          Portd = Lookup(dziesiatki , Tabela)
          Portb.0 = 0

        End Select
       Return

     Tabela:
    Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110,
    Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111

    0