Zegar + termometr Bascom


Napisałem program i nie działa;/
na symulatorze pokazuje 0:0:0 0.0 C, nie wiem czemu nie odmierza mi sekund;/ a jak wgram do procka to już w ogóle nic nie pokazuje
Proszę o pomoc, Proszę o podpowiedź

$regfile = "m16def.dat"
$crystal = 8000000
 
Config Pinb.1 = Input
Config Pinb.2 = Input
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.0
Config 1wire = Portd.7
 
Config Timer1 = Timer , Prescale = 256
On Timer1 1sekunda
 
S1 Alias Portd.5
S2 Alias Portd.6
 
 
Dim Sekundy As Byte
Dim Minuty As Byte
Dim Godziny As Byte
 
 
Dim Nowa_w As Bit
 
 
Dim Odczyt(2) As Byte
Dim T As Integer
Dim T1 As Single
 
Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
Declare Sub Wyswietl
 
Enable Interrupts
Enable Timer1
 
Counter1 = 34286
Set Nowa_w
Set Portd.5
Set Portd.6
 
Cls
 
Do
Call Wyswietl
 
If S1 = 0 Then
Waitms 25
If S1 = 0 Then
 
Incr Minuty
If Minuty = 60 Then
Minuty = 0
End If
Set Nowa_w
Call Wyswietl
Waitms 200
 
End If
End If
 
If S2 = 0 Then
Waitms 25
If S2 = 0 Then
Incr Godziny
If Godziny = 24 Then
Godziny = 0
End If
Set Nowa_w
Call Wyswietl
Waitms 200
End If
End If
 
Loop
End
Sub Wyswietl
 
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 750
   1wreset
   1wwrite &HCC
   1wwrite &HBE
   Odczyt(1) = 1wread(2)
   T = Odczyt(2)
   Shift T , Left , 8
   T = T + Odczyt(1)
   T1 = T * 0.0625
   If Nowa_w = 1 Then
   Cls
Lcd "" ; Godziny ; ":" ; Minuty ; ":" ; Sekundy ; "   " ; T1 ; "" ; Chr(0) ; "C"
Reset Nowa_w
End If
 
 
1sekunda:
Set Nowa_w
Counter1 = Counter1 + 34286
Incr Sekundy
 
 
Set Nowa_w
 
If Sekundy = 60 Then
Sekundy = 0
Incr Minuty
 
   If Minuty = 60 Then
   Minuty = 0
   Incr Godziny
 
     If Godziny = 24 Then
     Godziny = 0
     End If
 
   End If
End Sub
End If
Return




Portret użytkownika mirley

Re: Program Zegar

Po pierwsze na samym początku dobrze jest przypisać konfiguracje i stan początkowy wszystkich pinów procesora, wpisana częstotliwość i typ procesora muszą się zgadzać z rzeczywistością ale to myślę że wiesz. Nie rozumiem co chcesz uzyskać linijką:

Counter1 = 34286

bo jesli wpisac do timera wartość początkową to użyj Timer1 = ....

Ponadto nie warto dawać przerwania timera co 1s, wypadało by aby program działał synchronicznie a nie żeby wszystko było nawalone na kupę w pętli głównej programu. Popatrz na moje programy, timera przeważnie używam z przerwaniem co 4ms i w obsłudze przrwania ustawiam odpowiednie zmienne bitowe( tak zwane flagi). W pętli główne j zajmuje się sprawdzanie kiedy flaga jest 1 i wtedy wykonuje jakieś czynności. Nadaje to rytm pracy układowi. Instrukcje Wait nie są dobrym pomysłem i używa się ich naprawdę rzadko, poniewasz zatrzymują program na jakiś czas.

Pooględaj moje programy i zacznij pisać od początku, nie uruchamiaj symulatora w bascomie bo sam nie wiem co on pokazuje. Najpier używając wait spróbuj migać diodą co jakiś czas, jeśli zadziała to znaczy że procesor działa poprawnie i można zacząć coś działać. Potem to samo miganie z różnymi częstotliwościami zrealizuj na timerze, potem dołuż sam licznik i wyświetlaj go na LCD itd. W końcu dojdziesz do tego co chcesz napisać bo na raz się nie da, to wymaga trochę czasu. Przede wszystkim poczytaj moje kody źródłowe i zapoznaj się z działaniem flag bitowych w programie.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Problem

Witam. Widzę ze "temat" jest dość stary... Mój problem polega na tym że chce zrobić Zegarek + Temp na LCD ale nie wiem jak się za to zabrać. Wprawdzie kolega podał Jakiś tam Kod ale czy on chodzi naprawdę. Czy można prosić o pewny kod źródłowy ?

Portret użytkownika mirley

Re: Projekt

Możesz rozpocząć zabawę od mojego kodu prostego sterownika domowego, tam jest zrobiony zegarek na PCF + temperatura + wiele innych i jest LCD 16x2

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Jestem początkujący i Pańskie

Jestem początkujący i Pańskie kody są dla mnie za trudne, wiedz będzie mi ciężko wychaczyć elementy przydatne dla mnie.

Portret użytkownika mirley

Najważniejsze są te

Najważniejsze są te procedury, zapisują i odczutują czas z pcf'a

'****************** Zapis RTC ********************
Zapis_rtc:                                                  'zapisuje czas g,m i s do układu RTC
  Godziny_bcd = Makebcd(godziny)
  Minuty_bcd = Makebcd(minuty)
  Sekundy_bcd = Makebcd(sekundy)
 
  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
'************* Zapis RTC Koniec *****************
'****************** Odczyt RTC ********************
Odczyt_rtc:                                                 'odczytuje czas z RTC do zmiennych
  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)
Return
'************** Odczyt RTC Koniec *****************

Stwórz sobie szablon programu, skonfiguruj LCD na odpowiednie piny, i skonfiguruj timer na przerwanie, co np 25ms albo 4ms lub coś podobnego. W pętli głównej bedzie na poczatku obsługa flagi co 500ms, którą musisz ustawiać w timerze (jak przerwanie będzie np co 4ms to dasz licznik do 125 i ustawisz flagę co 500ms). Na samym końcu wklej procedury co wyżej. nie zapomnij zadeklarować zmiennej godziny, minuty i sekundy oraz godziny_bcd itd... potrzebne w tych procedurach. Wszystkie te zmienne są byte.

Jak zrobisz to co mówię to wklej to tu.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Wieslaw.S

gdzie popełniłem błąd

Witam.

Jako początkujący, a już trochę wiekowy (46)proszę o wyrozumiałość.

Na schemacie nie ma tranzystorów PNP w anodach, rezystorów w segmentach - celowo , bo to oczywiste.

'           'Konfiguracja
'****************************
 
$regfile = "m8def.dat"
$crystal = 12000000
 
 
Config Portb = Output
Config Portb = 255
 
Config Portd = Output
Config Portd = 255
 
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Pinc.4 = Output
Config Pinc.5 = Input
 
Config 1wire = Pinc.1
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
Dim Lsb As Byte
Dim Msb As Byte
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw1k As Byte , Wysw10k As Byte , Wysw100k As Byte
Dim Wysw_pomoc As Word
Dim Tempa As Word
Dim Mux As Byte
 
Dim Zezw_wysw As Bit
Dim Pomiar_odczyt As Bit
Dim Minus As Bit
Dim Ur As Bit
'****************************
      'Wartosci Poczatkowe
'****************************
Reset Pomiar_odczyt
Reset Ur
Wysw1 = 191
Wysw10 = 191
Wysw100 = 191
Wysw1k = 191
Wysw10k = 191
Wysw100k = 191
'****************************
'****************************
      'Petla glowna
'****************************
Do
 
If Zezw_wysw = 1 Then
  Reset Zezw_wysw                                           'co 4ms
  Wysw = Tempa
 
  If Ur = 1 Then Gosub Przelicz
  Gosub Wyswietl
End If
 
Loop
End
'****************************
      'Przerwanie timer0
'****************************
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 1 Then
   Co4ms = 0
   '***************************************  co 4ms
   Set Zezw_wysw
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '*************************************** co 100 ms
     'ew flaga obslugi przyciskow
     Incr Co1s
     If Co1s = 1 Then
       Co1s = 0
       '*************************************** co 1s
       Pomiar_odczyt = Not Pomiar_odczyt
 
       Disable Interrupts
       1wreset
 
       If Pomiar_odczyt = 1 Then
        1wwrite &HCC
        1wwrite &H44
       Else
        If Err = 0 Then
 
          1wwrite &HCC
          1wwrite &HBE
          Lsb = 1wread():
          Msb = 1wread():
 
          Minus = Msb.7
 
          Tempa = Msb * 256
          Tempa = Tempa + Lsb
 
 
          If Minus = 1 Then
            Tempa = Not Tempa
            Tempa = Tempa + 1
          End If
 
          Tempa = Tempa * 10                                'temperatura *10
          Tempa = Tempa / 16
 
          If Ur = 0 Then Ur = 1
 
        Else
          Tempa = 10000                                     'Er wyswietli wyswietlacz potem
        End If
       End If
 
       Enable Interrupts
       '***************************************
     End If
     '***************************************
   End If
   '***************************************
 End If
 
Return
'****************************
      'Inne Etykiety
'****************************
Przelicz:
 If Wysw < 1000 Then
 
   Wysw_pomoc = Wysw Mod 10
   Wysw1 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100 = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw1k = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw10k = Wysw_pomoc
   Wysw = Wysw / 10
   Wysw_pomoc = Wysw Mod 10
   Wysw100k = Wysw_pomoc
 
 
 
   If Wysw10 = 0 Then Wysw10 = 10
   If Wysw100 = 0 Then Wysw100 = 10                         'wygaszenie zera wiodącego
   If Wysw1k = 0 Then Wysw1k = 10
   If Wysw10k = 0 Then Wysw10k = 10
   If Wysw100k = 0 Then Wysw100k = 10
 
 
 
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela2)
   Wysw100 = Lookup(wysw100 , Tabela)
   Wysw1k = Lookup(wysw1k , Tabela)
   Wysw10k = Lookup(wysw10k , Tabela)
   Wysw100k = Lookup(wysw100k , Tabela)
 
 
 Else
   Wysw1 = 191                                              '-
   Wysw10 = 175                                             'r
   Wysw100 = 175                                            'r
   Wysw1k = 134                                             'e
   Wysw10k = 191                                            '-
   Wysw100k = 191                                           '-
 End If
 
Return
 
 
Wyswietl:
 
  Incr Mux
  If Mux = 6 Then Mux = 0
 
  Portc.4 = Not Minus
 
  Select Case Mux
 
    Case 0:
 
     Set Portb.0
      Portd = Wysw100k
     Reset Portb.5
 
    Case 1:
 
     Set Portb.5
      Portd = Wysw10k
     Reset Portb.4
 
    Case 2:
 
     Set Portb.4
     Portd = Wysw1k
     Reset Portb.3
 
       Case 3:
 
     Set Portb.3
      Portd = Wysw100
     Reset Portb.2
 
    Case 4:
 
     Set Portb.2
      Portd = Wysw10
     Reset Portb.1
 
    Case 5:
 
     Set Portb.1
     Portd = Wysw1
     Reset Portb.0
 
  End Select
 
Return
 
 
 
 
'*******************************************************************************
                           'Tabele do wyswietlania na wyswietlaczu
'*******************************************************************************
Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
'znak:    0     1     2     3     4     5     6     7     8     9     pusty
 
Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
'znak:    0.    1.  2.    3.   4.   5.  6.   7.   8.  9.    pusty
'*******************************************************************************
 
'*******************************************************************************

Portret użytkownika gosc

nie masz petli do-loop,nie

nie masz petli do-loop,nie masz skonfigurowanego timera,tu brakuje jednej 1 ;Portd = &B1111111.To tak z grubsza.Pooglądaj sobie kody Mirka.Zobaczysz co masz nie tak.Ogólnie sporo do poprawienia.

Portret użytkownika Grzeniu 73

nie dodałem,ze wogole nie

nie dodałem,ze wogole nie masz obsługi pcf 77

Portret użytkownika Wieslaw.S

zegar i termometr

Poszedłem za poradą Mirka .
Przerobiłem jego kod do swoich potrzeb, ogarniając temat blokami.
Kod, który wkleiłem teraz jest juz działający, ale znowu zonk.
Jak dodać obsługę DCF77. Nie wiem jak to ugryźć, bo wszystko co znalazłem w sieci to na LCD lub w języku C.
No i później na przemian wyświetlanie.

Schemat jest aktualny.

Portret użytkownika Grzeniu 73

Nigdy nie robiłem nic z

Nigdy nie robiłem nic z dcf77.Jednak to jest układ ,który daje tylko sygnał dla zegarka.Jak sie nie mylę to jest na stronie mcs elektronics program w bascom z obsługą dcf77.Prostszym sposobem jest dołożenie zewnętrzna zegara.Np PCF8583.Dokładnie obsługa tego zegarka jest opisana tutaj na stronie

Portret użytkownika Wieslaw.S

DCF77

Tak, ale to co znalazłem jest na LCD.

Portret użytkownika Grzeniu 73

Przecież masz juz napisana

Przecież masz juz napisana funkcje wyświetlania temperatury.Jeżeli to działa to dla zegara zrobisz analogicznie
zamiast LCD wyświetlisz na Ledach.

Portret użytkownika Wieslaw.S

dcf

tak, ale jak odebrac tylko bity odpowiedzialne za czas, pomijając datę.
Jeszcze trzeba bity parzystości sprawdzać.
Nie wiem jak się za to zabrać, no i jeszcze wyświetlanie na przemian.
W książkach, które kupiłem nie ma nic na ten temat.

Portret użytkownika Grzeniu 73

nie wiem jak odbiera sie kod

nie wiem jak odbiera sie kod dcf'a ale najpierw dla testów zostaw w spokoju termometr i zacznij pisać obsługę dcf jak to ci sie uda to później dodasz obsługę termometru.

Portret użytkownika Wieslaw.S

dcf

Po co zostawiać termometr jeżeli już działa ?
Teraz trzeba dodać obsługę DCF77.
Ale jak widzę nikt się nie zna na tym ( czyżby ? ),
albo nie chce pomóc.

Portret użytkownika Grzeniu 73

Napisałeś wcześniej ze nie

Napisałeś wcześniej ze nie wiesz jak połączyć dwie funkcje.Temperaturę masz opanowana to teraz baw sie z dcf.Z tego co widziałem jest sporo projektów w sieci.Chyba nawet w samplach bascoma jest.Trzeba tam tylko zmienić wyświetlanie.Jeżeli umiesz wyświetlić temperaturę to nie widzę problemu żebyś w analogiczny sposobi wyświetlał czas.Do testów spróbuj użyć gotowca,a później sobie przerabiaj. Ewentualnie użyj zewnętrznego zegara. Ds3231 jest bardzo dokładny.A obsługa prosta.Ja korzystam,tylko z takich zegarków i mi dokładność wystarczy.