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

Atmega8 Bascom Zegar nixie modyfikacja kodu potrzebna pomoc.

przemeczek85 30 Wrz 2021 17:50 411 7
REKLAMA
  • #1 19633849
    przemeczek85
    Poziom 10  
    Witam

    Jestem w trakcie robienia zagara nixie ze strony http://mirley.firlej.org/zegar_nixie
    Mikrokontrolerem jest Atmega8 a wkład zrobiony na Bascomie. Potrzebuję dodać opcję chwilowego wyłączenia lamp, w celu zabezpieczenia lamp przed zatruciem. Bardzo proszę o pomoc. To kod:

    '************* Konfiguracja uC *****************
    '***********************************************
    $regfile = "m8def.dat"
    $crystal = 8000000 'oscylator RC wewnetrzny


    Config Portb = &B11111111 : Portb = &B00000001
    Config Portc = &B00000000 : Portc = &B11111111
    Config Portd = &B11111111 : Portd = &B00000000


    Config Scl = Portc.5
    Config Sda = Portc.4
    I2cinit

    Config Timer0 = Timer , Prescale = 64
    Enable Timer0 : On Timer0 Prztimer0

    Enable Interrupts
    '********** Konfiguracja uC Koniec ************

    '****************** Zmienne *******************
    '***********************************************
    Dim Flaga4ms As Bit , Flaga05s As Bit

    Dim Co4ms As Byte , Co05s As Byte
    Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte
    Dim Godziny_budz As Byte , Minuty_budz As Byte
    Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte

    Dim Mux As Byte
    Dim Stan_katod As Byte
    Dim Wartosc_wysw(2) As Byte

    Dim Neonowka As Bit
    Dim Licznik_sw As Byte , Stan_portu As Byte , Sw_port As Byte
    Dim Poz_menu As Byte

    Dim Zezwolenie_budz As Bit
    Dim Autopowrot_ust(2) As Byte
    Dim Temp As Byte
    Dim Sygnal_budzenia As Byte
    '************* Zmienne Koniec ****************
    '************ Warunki Poczatkowe ***************
    '***********************************************
    Poz_menu = 0
    Flaga05s = 1
    Readeeprom Temp , 2
    If Temp = 100 Then Zezwolenie_budz = 1 Else Zezwolenie_budz = 0
    Readeeprom Godziny_budz , 3
    Readeeprom Minuty_budz , 4
    If Godziny_budz > 23 Then Godziny_budz = 8
    If Minuty_budz > 59 Then Minuty_budz = 0
    '******* Warunki Poczatkowe Koniec ***********
    '************** Petla glowna ******************
    '***********************************************
    Do
    If Flaga4ms = 1 Then
    Flaga4ms = 0
    Gosub Wyswietl
    Gosub Przyciski
    End If

    If Flaga05s = 1 Then
    Flaga05s = 0
    Neonowka = Not Neonowka
    Select Case Poz_menu
    Case 0: ' odczyt czasu z rtc
    I2cstart
    I2cwbyte 162 'adres zapisu
    I2cwbyte 2 'rejestr sekund
    I2cstart
    I2cwbyte 163 'adres odczytu
    I2crbyte Sekundy_bcd , Ack
    I2crbyte Minuty_bcd , Ack
    I2crbyte Godziny_bcd , Nack
    I2cstop
    Sekundy = Makedec(sekundy_bcd)
    Minuty = Makedec(minuty_bcd)
    Godziny = Makedec(godziny_bcd)
    Case 1:
    Incr Autopowrot_ust(1)
    If Autopowrot_ust(1) = 8 Then
    Gosub Zapis_rtc
    Poz_menu = 0
    End If
    Case 2:
    Incr Autopowrot_ust(2)
    If Autopowrot_ust(2) = 8 Then
    Writeeeprom Godziny_budz , 3
    Writeeeprom Minuty_budz , 4
    Poz_menu = 0
    End If
    End Select

    If Sygnal_budzenia > 0 Then
    Portb.0 = 0
    Decr Sygnal_budzenia
    If Sygnal_budzenia = 0 Then Portb.0 = 1
    End If

    Gosub Budzenie

    End If
    Loop
    End
    '************ Petla glowna Koniec **************
    '************ Przerwanie timer 0 ***************
    '***********************************************
    Prztimer0:
    'Incr Co4ms
    'If Co4ms >= 2 Then
    'Co4ms = 0
    Set Flaga4ms 'dziala co 2 ms mimo nazwy
    Incr Co05s
    If Co05s >= 250 Then
    Co05s = 0
    Set Flaga05s
    End If
    'End If

    Return
    '******** Przerwanie timer 0 Koniec ************

    '***********************************************
    Wyswietl:
    Incr Mux
    If Mux = 8 Then Mux = 0
    Select Case Poz_menu
    Case 0: 'pokazuj czas
    Portb.1 = Neonowka
    Wartosc_wysw(1) = Godziny 'wysw 1 i 2
    Wartosc_wysw(2) = Minuty 'wysw 3 i 4
    Case 1: 'ustawiaj czas
    Portb.1 = 1
    Wartosc_wysw(1) = Godziny 'wysw 1 i 2
    Wartosc_wysw(2) = Minuty 'wysw 3 i 4
    Case 2: 'ustaw budzik
    Portb.1 = 0
    Wartosc_wysw(1) = Godziny_budz 'wysw 1 i 2
    Wartosc_wysw(2) = Minuty_budz 'wysw 3 i 4
    End Select

    Select Case Mux
    Case 0:
    Stan_katod = Wartosc_wysw(1) / 10
    If Stan_katod = 0 Then Stan_katod = 10
    Gosub Ustaw_katody
    Set Portb.5
    Case 1:
    Reset Portb.5
    Case 2:
    Stan_katod = Wartosc_wysw(1) Mod 10
    Gosub Ustaw_katody
    Set Portb.4
    Case 3:
    Reset Portb.4
    Case 4:
    Stan_katod = Wartosc_wysw(2) / 10
    Gosub Ustaw_katody
    Set Portb.3
    Case 5:
    Reset Portb.3
    Case 6:
    Stan_katod = Wartosc_wysw(2) Mod 10
    Gosub Ustaw_katody
    Set Portb.2
    Case 7:
    Reset Portb.2

    End Select
    Return
    '***********************************************
    Ustaw_katody:
    Select Case Stan_katod
    Case 0 :
    Portb.6 = 0 : Portb.7 = 0 : Portd = 128
    Case 1:
    Portb.6 = 0 : Portb.7 = 0 : Portd = 64
    Case 2:
    Portb.6 = 0 : Portb.7 = 0 : Portd = 32
    Case 3:
    Portb.6 = 0 : Portb.7 = 1 : Portd = 0
    Case 4:
    Portb.6 = 1 : Portb.7 = 0 : Portd = 0
    Case 5:
    Portb.6 = 0 : Portb.7 = 0 : Portd = 16
    Case 6:
    Portb.6 = 0 : Portb.7 = 0 : Portd = 8
    Case 7:
    Portb.6 = 0 : Portb.7 = 0 : Portd = 4
    Case 8:
    Portb.6 = 0 : Portb.7 = 0 : Portd = 2
    Case 9:
    Portb.6 = 0 : Portb.7 = 0 : Portd = 1
    Case 10:
    Portb.6 = 0 : Portb.7 = 0 : Portd = 0
    End Select
    Return
    '***********************************************
    Przyciski:
    Sw_port = Pinc
    Sw_port = Sw_port Or &B11110000
    If Sw_port <> 255 And Stan_portu = Sw_port Then
    Incr Licznik_sw
    If Licznik_sw = 80 Then
    Licznik_sw = 0
    Select Case Stan_portu
    Case 247: '-godziny
    Select Case Poz_menu
    Case 0: 'wylacz budzik
    Zezwolenie_budz = 0
    Temp = 0
    Writeeeprom Temp , 2
    Sygnal_budzenia = 2 'sygnal na 0,5s
    Case 1:
    Decr Godziny
    If Godziny = 255 Then Godziny = 23
    Case 2:
    Decr Godziny_budz
    If Godziny_budz = 255 Then Godziny_budz = 23
    End Select
    Case 251: '+godziny
    Select Case Poz_menu
    Case 0: 'wchodzi do ustawien czasu
    Poz_menu = 1
    Case 1:
    Incr Godziny
    If Godziny = 24 Then Godziny = 0
    Case 2:
    Incr Godziny_budz
    If Godziny_budz = 24 Then Godziny_budz = 0
    End Select
    Case 253: '-minuty
    Select Case Poz_menu
    Case 0: 'wlacz budzik
    Zezwolenie_budz = 1
    Temp = 100
    Writeeeprom Temp , 2
    Sygnal_budzenia = 3 'sygnal na 1s
    Case 1:
    Decr Minuty
    If Minuty = 255 Then Minuty = 59
    Case 2:
    Decr Minuty_budz
    If Minuty_budz = 255 Then Minuty_budz = 59
    End Select
    Case 254: '+minuty
    Select Case Poz_menu
    Case 0: 'wchodzi do ustawien budzika
    Poz_menu = 2
    Case 1:
    Incr Minuty
    If Minuty = 60 Then Minuty = 0
    Case 2:
    Incr Minuty_budz
    If Minuty_budz = 60 Then Minuty_budz = 0
    End Select
    'Case 252:
    End Select

    Autopowrot_ust(1) = 0
    Autopowrot_ust(2) = 0

    End If
    Else
    Stan_portu = Sw_port
    Licznik_sw = 60
    End If
    Return
    '***********************************************
    Zapis_rtc:
    Godziny_bcd = Makebcd(godziny)
    Minuty_bcd = Makebcd(minuty)
    Sekundy_bcd = 0

    I2cstart
    I2cwbyte 162
    I2cwbyte 0 'rejestr kontrolny
    I2cwbyte 8 'ustawienie rejestru zapisu daty

    I2cstop
    I2cstart
    I2cwbyte 162
    I2cwbyte 2

    I2cwbyte Sekundy_bcd
    I2cwbyte Minuty_bcd
    I2cwbyte Godziny_bcd
    I2cstop
    Return
    '***********************************************
    Budzenie:
    If Zezwolenie_budz = 1 Then
    If Godziny = Godziny_budz And Minuty = Minuty_budz Then
    Portb.0 = Neonowka
    Else
    If Sygnal_budzenia = 0 Then Portb.0 = 1
    End If
    End If
    Return
    '***********************************************
  • REKLAMA
  • #2 19633869
    HD-VIDEO
    Poziom 43  
    Multiplex tam jest.

    Niektórzy dodają przemiatanie cyfr co jakiś czas od 0 do 9, nie wiem czy coś to daje
  • REKLAMA
  • #3 19633891
    przemeczek85
    Poziom 10  
    A mogę poprosić o wskazanie, które komendy są za to odpowiedzialne ?
  • #4 19633904
    jony
    Specjalista elektronik
    Zobacz sobie etykietkę "Wyswietl" która jest wywoływana co 4ms.
  • REKLAMA
  • #5 19633913
    przemeczek85
    Poziom 10  
    Czyli to ma zapobiec zatruwaniu lamp ? czy lepiej może wygasić lampy co jakiś czas na parę sekund ?
  • REKLAMA
  • #6 19633981
    HD-VIDEO
    Poziom 43  
    Multiplex to taki sposób sterowania wielu lamp, gdy brakuje wyprowadzeń w mikrokontrolerze aby sterować je statycznie; z zatruwaniem lamp nie ma nic wspólnego
  • #7 19633996
    przemeczek85
    Poziom 10  
    No właśnie , dzięki za wyjaśnienie. A teraz jak dodać wygaszanie lamp lub coś w tym rodzaju aby uniknąć zatruwania lamp ?
  • #8 19634035
    HD-VIDEO
    Poziom 43  
    Nie wiem co z tym zatruwaniem, mam zegary Nixie działające po 15 lat, nic się nie dzieje, lampy też nie były nowe a z multimetrów.

    Wyłączaj całkowicie lampy, włączeniem czujnikiem mikrofalowym czy IR z opóźnieniem wyłaczenia
REKLAMA