problemy


Witam.
Kolejny problem.
Mam problem z odczytem PCF8582. Oczywiście pullup'y mam 4,3kOhm.
Coś kombinowałem i w pewnym momencie miałem już wyświetlanie sekund, ale
minuty były jakieś głupoty.Potem kombinowałem dalej i wszystko zepsułem
a Bascom nadpisywał plik *.bas i już nie mogę wrócić do momentu, w którym
chociaż sekundy działały.
Jedyne co mam to plik wyjściowy. Siedzę już 14 godzin nad tym i wymiękłem.
Może ktoś pochyli się nad moim problemem.
Tak, w necie są przykłady ale na LCD.
Oto co mi zostało z kodu.

$regfile = "m8def.dat"
$crystal = 12000000
 
 
Config Portb = Output
Config Portb = 255
 
Config Portd = Output
Config Portd = 255
 
 
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit
 
 
Dim Wysw_pomoc As Word
Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw1k As Byte , Wysw10k As Byte , Wysw100k As Byte
Dim Mux As Byte
 
Dim Sekundy As Byte
Dim Minuty As Byte
Dim Godziny As Byte
 
Declare Sub Odczytaj_czas
Declare Sub Zapisz_czas
 
Config Timer0 = Timer , Prescale = 64
Enable Interrupts
 
'--------------------------------------------------------------
 
Do
 
 
Gosub Odczytaj_czas
 
 
 
Loop
 
End
 
 
 
 
 
'--------------------------------------------------------------
'
'Procedura cyklicznego pobierania informacji z RTC
'
'--------------------------------------------------------------
 
Sub Odczytaj_czas
 
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte Sekundy , Ack
I2crbyte Minuty , Ack
I2crbyte Godziny , Nack
 
 
I2cstop
 
Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
 
 
End Sub
 
'---------------------------------------------------------------
'---------------------------------------------------------------
 
'Procedury zapisu danych do układu PCF
 
'---------------------------------------------------------------
 
Sub Zapisz_czas
 
Sekundy = Makebcd(sekundy)
Minuty = Makebcd(minuty)
Godziny = Makebcd(godziny)
 
I2cstart
I2cwbyte 162
I2cwbyte 0
I2cwbyte 8
I2cstop
I2cstart
I2cwbyte 162
I2cwbyte 2
 
 
I2cwbyte Sekundy
I2cwbyte Minuty
I2cwbyte Godziny
I2cstop
End Sub
 
'-----------------------------------------------------------------
'-----------------------------------------------------------------
 
 
 
 
 
   Wysw1 = Sekundy Mod 10
 
   Wysw10 = Sekundy / 10
 
   Wysw100 = Minuty Mod 10
 
   Wysw1k = Minuty / 10
 
   Wysw10k = Godziny Mod 10
 
   Wysw100k = Godziny / 10
 
 
'------------------------------------------------------------------
 
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela)
   Wysw100 = Lookup(wysw100 , Tabela)
   Wysw1k = Lookup(wysw1k , Tabela)
   Wysw10k = Lookup(wysw10k , Tabela)
   Wysw100k = Lookup(wysw100k , Tabela)
 
 
 
 
 
  Incr Mux
  If Mux = 6 Then Mux = 0
 
 
  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
 
 
'------------------------------------------------------------------------------
 
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

Dziękuję za pomoc i proszę o nie pisanie typu " ---> Google --> szukaj "
bo nie o to mi chodzi.




Portret użytkownika kaktus

głowa do góry

Nie wymiękaj tylko zrób sobie przerwę.

Te zapisy są równoznaczne

Config Portd = Output
Config Portd = 255

Więc z jednego zrezygnuj - oczywiście to nie stanowi problemu.

Na początek powiedz czy adresy I2C są dobre?

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika gosc

są dobre

adresy są dobre.
nowy kod, ale działa tak samo.

$regfile = "m8def.dat"
 
$crystal = 8000000
 
Config Scl = Portc.5
Config Sda = Portc.4
 
 
Config Portb = Output
Config Portb = 255
 
Config Portd = Output
Config Portd = 255
 
 
Config Timer0 = Timer , Prescale = 8
 
 
W1 Alias Portb.5
W2 Alias Portb.4
W3 Alias Portb.3
W4 Alias Portb.2
W5 Alias Portb.1
W6 Alias Portb.0
 
Dim A As Byte
Dim B As Byte ,
Dim C As Byte
Dim D As Byte
Dim E As Byte
Dim F As Byte
Dim Nr_wysw As Byte
Dim Warts As Byte
Dim Wartm As Byte
Dim Warth As Byte
Dim S As Byte
Dim M As Byte
Dim H As Byte
 
Declare Sub Pobr_znaku(cyfra As Byte)
 
On Timer0 Multi_wysw
 
Enable Interrupts
 
Enable Timer0
 
Load Timer0 , 125
 
 
Do
 
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Nack
I2cstop
 
 
Warts = Makedec(s)
 
A = Warts Mod 10
 
B = Warts / 10
 
 
 
 
 
Wartm = Makedec(m)
 
C = Wartm Mod 10
 
D = Wartm / 10
 
 
 
 
Warth = Makedec(h)
 
E = Warth Mod 10
 
F = Warth / 10
 
 
Loop
 
End
 
 
 
Sub Pobr_znaku(cyfra As Byte)
 
If Cyfra < 10 Then
 
Portd = Lookup(cyfra , Tablica)
 
Else
 
Portd = 255
                                               '
End If
 
End Sub
 
 
 
Multi_wysw:
 
Load Timer0 , 125
 
Set W1
Set W2
Set W3
Set W4
Set W5
Set W6
 
Select Case Nr_wysw
 
Case 0:
Call Pobr_znaku(a)
Reset W6
Case 1:
Call Pobr_znaku(b)
Reset W5
Case 2:
Call Pobr_znaku(c)
Reset W4
Case 3:
Call Pobr_znaku(d)
Reset W3
Case 4:
Call Pobr_znaku(e)
Reset W2
Case 5:
Call Pobr_znaku(f)
Reset W1
 
 
End Select
 
Incr Nr_wysw
 
If Nr_wysw = 6 Then
Nr_wysw = 0
 
End If
 
Return
 
Tablica:
 
Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001
Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000

Pytanie, czy dobrze przeliczam sekundy, minuty i godziny ?
Zakładam, że PCF8583 ( poprzednio była pomyłka )ma jakąś godzinę zapisaną
jako początkową.

Portret użytkownika Grzeniu 73

a nie możesz sobie wyświetlić

a nie możesz sobie wyświetlić tego w terminalu?Jeżeli masz przejściówkę RS to wyswietlaj sobie to w terminalu.Będziesz wiedział gdzie leży problem.Czysty PCF powinien zacząć odliczać od zera.Odczyt magistrali masz w pętli głównej bez żadnego opóźnienia,może to jest problem.Ja przeliczanie wartości robię w przerwaniu od wyświetlania.Do testów na początek wyświetl sobie jakaś stalą,będziesz wiedział ,czy prawidłowo to działa,później przejdź do odczytu PCF. Ja tak odczytuje:

'****************** 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 , Ack
  I2crbyte Dzien_bcd , Ack
  I2crbyte Miesiac_bcd , Nack
  I2cstop
  Sekundy = Makedec(sekundy_bcd)
  Minuty = Makedec(minuty_bcd)
  Godziny = Makedec(godziny_bcd)
  Dzien = Makedec(dzien_bcd)
  Miesiac = Makedec(miesiac_bcd)
 
 
Return

Portret użytkownika Wieslaw.S

nadal brak

nadal brak odpowiedzi, czy dobrze przeliczam sekundy, minuty i godziny w celu
wyświetlenia ich na sześciu wyświetlaczach 7-segmentowych.

Portret użytkownika Grzeniu 73

a czy wyświetliłeś sobie

a czy wyświetliłeś sobie cokolwiek tak jak Ci pisałem? A=2,b=3 itp.Zostaw na razie ten PCF i naucz sie wyświetlać na LED.Później ,tylko dopiszesz obsługę zegarka.

Portret użytkownika Wieslaw.S

dzięki Kaktus

faktycznie zdublowałem polecenia. poprawiłem to.
Po włączeniu zegar pokazuje mi 66:66:00 . Sekundy liczą poprawnie od 00 do 59.
Po tym z jedności minut robi się 9 po kolejnych 60 sekundach jakby mała litera "r" ale w lustrzanym odbiciu.
Zrobiłem nowy moduł PCF , dałem 10kOhm pullupy ( poprzednio 4,3 k )nowy PCF
ale nadal to samo. Kondki filtrujące tez 100uF i 100 nF.
Dodawanie i2cinit nic nie zmienia, i2cdelay = 10 tez nic nie zmienia.
Pin 3 PCF-a mam do VCC czyli adres 162 i 163.

Już totalnie wymiękam .
Listing wyżej to ostatni - duble "Config Portd = Output" i
"Config Portd = 255" zlikwidowałem.

Co jest nie tak ?

Portret użytkownika Grzeniu 73

jeżeli sekundy idą poprawnie

jeżeli sekundy idą poprawnie to chyba pcf jest ok.Moze coś z przeliczaniem,po włączeniu bez baterii powinieneś mieć same zera.Moj kod odczytu działa na 100% możesz sobie wyciąć dzień i miesiąc.w pętli głównej daj 100ms opóźnienia .Nie powinno to zaszkodzić.Nie mam sześciu wyświetlaczy wiec nie sprawdze twojego kodu.Jak chcesz to wysle ci na 4 ale termometr.zobaczysz jak ja to mam

Portret użytkownika Wieslaw.S

działa

działa ! Miałem uszkodzony wyświetlacz 7 i 8 maja zwarcia wewnątrz .
Użyłem od 1 do 6 zamiast jak do tej pory 3 do 8 .

Teraz trzeba dopisać odbiór DCF77 żeby automatycznie zrobił wpis do PCF-a.

Portret użytkownika Grzeniu 73

właśnie przetestowałem twoj

właśnie przetestowałem twoj kod i miałem Ci wysłać:) u mnie tez działa:) Na przyszłość kup sobie przejściówkę rs232 na usb kosztuje kilka złotych, a pomaga wykluczyć takie błędy.Na bieżąco śledzisz sobie co sie dzieje w programie .Gdzie kupowales DCF? Mam ochote tez sie nim pobawic

Portret użytkownika gosc

dcf

Wyjąłem z zegara kupionego w lidlu.

Portret użytkownika Wieslaw.S

dcf

wyjąłem z zegara kupionego w lidlu.
ale uważaj, bo mam też wyjętyz zegara wskazówkowego i ten odbiornik jest niezbyt dobry, trzeba zasilać 3V i na wyjściu dać jakiś inwerter poziomów
żeby działał dobrze z Atmelem.

Portret użytkownika kaktus

gratulacje

Nie ma jak samodzielnie rozwiązać problem, experience rośnie (-;
Czyli wygląda na to że uszkodziłeś wyświetlacz, wspominałeś że dziłało przez chwilę prawidłowo, wyciągnij wnioski.

Quote:
dzięki Kaktus

faktycznie zdublowałem polecenia. poprawiłem to.


Nie ma za co ;-)

gdy grzebałem przy moim zegarku - 4xLED 7segmentów bicolor, zastosowałem CA3161E, bardzo fajna kostka.
Gdzieś go pokazałem - o tu ;-)

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Wieslaw.S

wnioski


Tak sobie teraz myślę, bo jestem w pracy.
Czy nie łatwiej zrobić zegar na Atmega8 i tylko ustawiac go co kilkanaście godzin
za pomocą odbiornika DCF ?
Chodzi o to, że gdy zaniknie sygnał DCF to zegar będzie chodził a w nocy gdy poprawi się propagacja fal radiowych
to się skoryguje.

Co o tym myslicie ? Macie jakieś pomysły, a może ktoś to już robił ?

Portret użytkownika Grzeniu 73

Ustawianie to możesz sobie

Ustawianie to możesz sobie zrobić raz na tydzień.Nawet w kiepskich warunkach różnica w czasie będzie parę sekund.Oczywiście po zresetowaniu powinieneś wymusić odbiór z DCF. Ostatnio znalazłem jakaś stronkę gdzie bit po bicie bylo wyjaśnione wszystko co dotyczy odbioru i nadawania.Ale nie pamiętam jak sie nazywała.Druga sprawa jeżeli będziesz miał podłączony DCF to po co Ci zewnętrzny RTC.Wystarczy programowy zegarek.

Portret użytkownika gosc

.

Chodzi o to, że gdy zaniknie sygnał DCF to zegar będzie chodził a w nocy gdy poprawi się propagacja fal radiowych
to się skoryguje.

Portret użytkownika gosc

Może Ty

Kolejny problem początkującego.
Chcę zbudować zegar na led 7-seg. tylko godziny i minuty.
Zbudowany na PCF8583, ale ustawiany automatycznie przez DCF77.
Synchronizowany np. raz na dobę o 23:00 lub gdy odbiornik złapie prawidłową ramkę.
Nikt tego nie robił, albo nie chce pomóc. Może Ty się pochylisz nad moim problemem , bo daremno szukam pomocy na różnych portalach, a przykłady w helpie są na ten przeklęty LCD.

Portret użytkownika Wieslaw.S

Może Ty

Piszę tu do Kaktus-a.

Portret użytkownika kaktus

no hej

Wiesławie, skoro masz obsługę do układu czerpiącego czas atomowy z powietrza to nie rozumiem dlaczego nie działa Ci to. Wyświetlacz jakiego użyłeś nie ma związku z odbieraniem danych, jest to jedynie wyjście do komunikacji z podglądaczem - użytkownikiem.
Zaprowadziłeś inny wątek w którym wkleiłeś część kodu - tak CZĘŚĆ. I to akurat zauważył matrix oraz sygnalizował ten fakt Tobie. Nie możesz się spodziewać że ktoś rozwiąże cały problem za Ciebie. Każdy zajmuje się swoimi projektami na które musi wyłuskać ukraść czas rodzinie by go mieć ociupinkę dla siebie. Tak że ponaglanie nic dobrego tu nie wniesie, najwyżej zniechęcisz forumowiczów do swojej osoby.

Wklej kod w temacie o dcf tym razem cały z obsługą tego wynalazku, dla ułatwienia znalezienia problemu, zrób sobie taki BARDZO PROSTY debugger, podłączając ?C do portu RS komputera, przez stosowną przejściówkę, odpalając program terminala. W stosownych miejscach kodu przesyłaj zmienne do RS-a. Wtedy będziesz wiedział co się dzieje czym się ?C zajmuje. Może teraz wydaje Ci się to skomplikowane, bo być może nie miałeś z tym styczności ale wierz mi nie taki diabeł straszny .... ;-)

Jeżeli chcesz być dobry w te klocki staraj się w miarę możliwości samodzielnie doszukiwać się dyzfunkcji, zdobywaj wiedzę przeglądając czeluścia internetu. Gdy będziesz umiał wyszukiwać problemy nie będziesz zdany na łaskę niełaskę forumowiczów, którzy nie muszą mieć dla Ciebie i Twoich problemów czasu .... każdy ma ich wiele i jest zdany na siebie. Gdy będziesz umiał wyszukiwać błędy, i nieprawidłowości nauczysz się też je rozwiązywać.
Tak że uszy do góry ;-D

I takim optymistycznym akcentem Tobie i całej forumowej braci spokoju ducha, stalowych nerwów, samych udanych projektów, które będą działały za pierwszym odpaleniem - tak jak sobie to konstruktor zażyczył, coraz tańszych i lepiej dostępnych podzespołów, takie drobne życzenia składa kaktus z okazji tegorocznych Świąt Bożego Narodzenia.

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Wieslaw.S

Co mam napisać ?

Odczyt PCF8583 mam zrobiony i działa.
Ale nie wiem jak wkleić obsługę DCF77. Dla tego nie kombinuję
licząc, że ktoś podpowie.

Po co PCF i DCF ?

Jak sygnał DCF zaniknie, o co u mnie nie trudno
to zegar będzie pracował z PCF, a w nocy gdy
propagacja fal radiowych się poprawi i gdy zakłócenia
przemysłowe osłabną odbiornik złapie pełną i prawidłową
ramkę danych z DCF i skoryguje czas PCF .
Po to chcę PCF i DCF.

Obsługę PCF mam i działa - nie mam obsługi przycisków
bo tę robotę zrobi odbiornik DCF.

$regfile = "m8def.dat"
 
$crystal = 8000000
 
Config Portb = Output
Config Portd = Output
 
W1 Alias Portb.1
W2 Alias Portb.0
W3 Alias Portb.3
W4 Alias Portb.2
W5 Alias Portb.5
W6 Alias Portb.4
 
Config Scl = Portc.5
Config Sda = Portc.4
 
Config Timer0 = Timer , Prescale = 8
 
Declare Sub Znak(cyfra As Byte)
 
On Timer0 Timer_multiplexu
 
 
Dim A As Byte , B As Byte ,
Dim C As Byte , D As Byte
Dim E As Byte , F As Byte
Dim Nr_wysw As Byte
Dim Warts As Byte
Dim Wartm As Byte
Dim Warth As Byte
Dim S As Byte
Dim M As Byte
Dim H As Byte
 
Enable Interrupts
 
Enable Timer0
 
Load Timer0 , 125
 
 
Do
 
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Nack
I2cstop
 
' Przeliczenia sekund, minut i godzin
 
Warth = Makedec(h)
 
A = Warth Mod 10
 
B = Warth / 10
 
 
Wartm = Makedec(m)
 
C = Wartm Mod 10
 
D = Wartm / 10
 
 
Warts = Makedec(s)
 
E = Warts Mod 10
 
F = Warts / 10
 
' Koniec przeliczeń
 
Loop
End
 
 
 
Sub Znak(cyfra As Byte)
 
If Cyfra < 10 Then
Portd = Lookup(cyfra , Tablica)
Else
Portd = 255
End If
End Sub
 
 
Timer_multiplexu:
 
'Load Timer0 , 125
 
Set W1
Set W2
Set W3
Set W4
Set W5
Set W6
 
Select Case Nr_wysw
 
Case 0:
Call Znak(a)
Reset W6
Case 1:
Call Znak(b)
Reset W5
Case 2:
Call Znak(c)
Reset W4
Case 3:
Call Znak(d)
Reset W3
Case 4:
Call Znak(e)
Reset W2
Case 5:
Call Znak(f)
Reset W1
 
 
 
End Select
Incr Nr_wysw
If Nr_wysw = 6 Then
Nr_wysw = 0
 
 
End If
Return
 
Tablica:
 
 
Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
 
'znak: 0 1 2 3 4 5 6 7 8 9 pusty

Tu jest obsługa sekund, po to abym widział , że coś się dzieje.
Docelowo ma być tyko godzina i minuty.

Powtórzę, nie wiem jak dodać obsługę DCF.

Spokojnych Świąt Bożego Narodzenia, oraz dużo cierpliwości dla żółtodziobów jak Ja.

Portret użytkownika kaktus

synchronizacja czasu atomowego

1. Czyli generalnie nie masz pomysłu jak do tego dodać synchronizację z eteru za pośrednictwem dcf77 lub podobnego tak?
2. A samą obsługę tego ustrojstwa masz poprawnie zaimplementowaną?

Jeśli dobrze rozumiem i odpowiedź na oba pytania brzmi tak, więc mam propozycję:
czas z (umówmy się dla uproszczenia czas z radia będę nazywał czasem atomowym) atomowy można próbować odczytać powiedzmy raz na dobę o określonej porze (o określonej porze ustawiasz sobie flagę zezwolenia obsługi czasu atomowego, a w programie głównym testujesz tą flagę i w razie potrzeby przechodzisz do obsługi czasu atomowego). Jeżeli owa procedura zakończy się powodzeniem synchronizujesz zmienne od czasu i lub korygujesz zegarek sprzętowy, zapisując doń nowe wartości i zerując setne itp lub też nie zerując jak tam chcesz.
Tak mi się to widzi. Piszesz, że będzie twój sprytny wynalazek sprzętem bezobsługowym. Więc taką procedurę odczytu czasu atomowego można by też uruchomić po załączeniu zasilania, i przeprowadzać do czasu zakończenia jej powodzeniem.
Co do jakości sygnału o której piszesz, też mam uwagę niemniej nie wiem na ile jest prawdziwa bo nie budowałem jeszcze takiego odbiornika. Otóż swego czasu przewracałem zasoby internetu za wiadomościami o takim radiowym odbiorniku czasu atomowego. Z tego co pamiętam to ktoś opisywał fakt, że jakość sygnału jest bardzo zależna od sposobu usytuowania anteny względem nadajnika. Uwaga ta wydaje mi się bardzo prawdopodobna, i mająca odzwierciedlanie w rzeczywistości. Po prosu chodzi o to czy antena jest powiedzmy ustawiona wzdłuż rozchodzącego się sygnału radiowego czy w poprzek. Jeżeli bredzę, niech mnie ktoś kopnie w cztery litery i poprawi ;-)

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Wieslaw.S

dobrze rozumujesz Kaktus

Wszystko się zgadza. Próbowałem zapożyczyć kawałki kodu obsługi DCF z helpa
jak i ze stron www, ale niestety wszystko co znalazłem to jest na LCD.
Ni jak nie potrafię tego przełożyć na 7-seg.
No i gdzie ( w jakim miejscu kodu) wkleić obsługę radia.

P.S.
wcześniej walczyłem z termometrem, ale dzięki Mirka opracowaniu ( czytaj gotowiec) grzebałem w kodzie przerabiając go do swoich potrzeb.
Dzięki Mirkowi opanowałem już multiplex 7-seg oraz obsługę DS18B20 i przeliczanie danych w celu wyświetlania na 7-seg.

Tu listing z jakiejś niemieckiej strony, ale nie działa.

$regfile = "m8def.dat"
$crystal = 1000000
$swstack = 10
$hwstack = 40
 
Config Dcf77 = Pinc.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts
 
Config Portb = Output
Config Portd = Output
Config Portc.2 = Output
Config Portc.3 = Input
 
Segment1 Alias Portb.2
Segment2 Alias Portb.3
Segment3 Alias Portb.4
Segment4 Alias Portb.5
 
Led_dcf Alias Portc.2
 
Segment_anoden Alias Portd
 
 
'Timer für Multiplex
 
Config Timer0 = Timer , Prescale = 256
On Timer0 Anzeige
Const Timervorgabe_0 = 237
 
Enable Timer0
Enable Interrupts
 
 
Dim Hhh As Byte
Dim Mmm As Byte
Dim Ziffer As Byte
Dim Dezimalpunkt As Byte
Dim Einer As Byte
Dim Zehner As Byte
Dim Hunderter As Byte
Dim Tausender As Byte
Dim Stelle As Byte
 
Do
 
Led_dcf = Dcf_status.0
 
Loop
 
End
 
Anzeige:
 
Timer0 = Timervorgabe_0
 
    Mmm = Makedec(_min)
    Hhh = Makedec(_hour)
 
 
Einer = Mmm Mod 10
Zehner = Mmm / 10
 
 
Hunderter = Hhh Mod 10
Tausender = Hhh / 10
 
 
If Stelle < 4 Then
Incr Stelle
Else
Stelle = 1
End If
 
If Stelle = 1 Then Ziffer = Tausender
If Stelle = 2 Then Ziffer = Hunderter
If Stelle = 3 Then Ziffer = Zehner
If Stelle = 4 Then Ziffer = Einer
 
Segment1 = 1
Segment2 = 1
Segment3 = 1
Segment4 = 1
 
Select Case Ziffer
Case 0 : Segment_anoden = 192
Case 1 : Segment_anoden = 249
Case 2 : Segment_anoden = 164
Case 3 : Segment_anoden = 176
Case 4 : Segment_anoden = 153
Case 5 : Segment_anoden = 146
Case 6 : Segment_anoden = 130
Case 7 : Segment_anoden = 248
Case 8 : Segment_anoden = 128
Case 9 : Segment_anoden = 144
 
End Select
 
 
Select Case Stelle
Case 1 : Segment1 = 0
Case 2 : Segment2 = 0
Case 3 : Segment3 = 0
Case 4 : Segment4 = 0
 
End Select
 
Return
 
Sectic:

Jedyne co to mruga dioda od DCFstatus

Ot, po prostu taki sposób nauki przemawia do mnie i powoduje, że rozumiem
to co robię.

Komuś może się wydawać, że czekam na gotowca - nie, tak nie jest.
Gotowce są na elektrodzie, ale tylko schemat i gotowy wsad.
To nie powoduje, że się uczę i poznaję - to tylko bezmyślne kopiowanie,
a nie o to mi chodzi.
Listingi Mirka z komentarzami sprawiają, że wiem co robię.

Portret użytkownika kaktus

no tak wiesz co robisz ...

Moim zdaniem zabierasz się za pracę z niewłąściwej strony, ale nie o tym mowa ... i nie o to tu chodzi.

Aby robić obce wstawki musisz znać składnię jeżyka i doskonale podzespół, z którym masz doczynienia, inaczej będzie to bezowocne zgadywanie. Tyle reprymendy.

Sam niejednokrotnie przekonałem się, że noty katalogowe warto czytać i zaglądać, co tam producent napisał, bo zaoszczędzi to mnóstwo czasu na dochodzenie samodzielnie do tego co jest w nocie zawarte.... postępowanie takie jest słuszne i nawet jeśli wydaje Ci się, że nic z tego nie rozumiesz to nawet przymuszaj się do tego aby choć próbować czytać. Jeżeli nie radzisz sobie z obcym językiem ... pomocny niech Ci będzie komputer i translator google ... Za którymś tam razem złapiesz dryg i będziesz miał satysfakcję z tego, że coś uda się zrobić zupełnie samodzielnie ... Koniec mojego "słowa wstępnego" ... Nie bierz tego co powiedziałem/napisałem do siebie bo się nie znamy dobrze, a są to tylko takie moje ogólne spostrzeżenia, które wcale nie muszą być trafione .... ;-)

Teraz tak, pewno układ modelowy masz na płytce testowej lub stykowej - nie jako gotowy moduł. Więc mam propozycję poszczególne etapy programu (obsługi peryferiów) testuj niezależnie od końcowego wyniku (całego programu jaki chcesz stworzyć).
Piszesz:

Quote:
Próbowałem zapożyczyć kawałki kodu obsługi DCF z helpa
jak i ze stron www, ale niestety wszystko co znalazłem to jest na LCD.
Ni jak nie potrafię tego przełożyć na 7-seg.

Więc powiem to co wcześniej, nie zaprzątaj sobie głowy tym, że masz lepszy wyświetlacz, a jakiś obcy kod jest na LCD.
Z odczytu czasu atomowego zrób sobie podprogram, który będziesz wywoływać w dogodnym dla siebie momencie ...
Skoro wynik tej konwersacji (mikrokontrolera i peryferii) wyląduje w zmiennych Twojego kodu, to przecież dla Ciebie nie będzie problemem wynik pokazać na tym lepszym wyświetlaczu.... bo jak napisałeś znasz zasadę jego obsługi i potrafisz to zrobić ... :-D

Dlatego też wcześniej napisałem, że wyświetlacz nie stanowi problemu, i jest nieistotne czy będzie to LCD, czy 7-seg LED, czy też terminal eReSa w Twoim komputerze. A właśnie czy zastanawiałeś się nad tym rozwiązaniem - połączenie układu z terminalem RS w komputerze?

Potraktuj moduł radiowy jak by to był ten zegar sprzętowy który też umiesz obsłużyć.
Piszesz:

Quote:
Jedyne co to mruga dioda od DCF status

Więc musisz z tego obcego kodu wyłuskać informację kiedy ta dioda ma mrugać, i co dokładnie sygnalizuje. Oraz to co jest najbardziej istotne, co się dzieje jeżeli nie uda się odczytać z powietrza aktualnego czasu daty itp .... Myślę, że jeżeli to będziesz wiedział rozkminisz problem w trzy sekundy. Ale trzeba wykluczyć możliwość słabego sygnału radiowego ... w tym pomoże to co napisałem w tym akapicie na wstępie.
W razie większych problemów z brakiem sygnału będziesz chyba musiał przeprowadzić się z układem modelowym koło okna, lecz jeśli masz nowoczesne okna - wielowarstwowe z gazem w środku, będą dodatkową przeszkodą dla sygnału radiowego (przynajmniej niektórych częstotliwości), więc zostaje spacer na balkon - podwórze. Oile nie mieszkasz w blokowisku. Warto by się też zorientować z którego kierunku w Twojej lokalizacji pochodzi sygnał radiowy czasu atomowego.

Tak, że w chwili obecnej dopóki nie opowiesz szczegółowo jak działa ten moduł radia do czasu atomowego, i nie przedstawisz kodu ze szczegółowymi opisami, które sam zrobisz, obaj nie będziemy więcej wiedzieli czemu Ci nie działa i z czym masz problem.

Więc bierz się do "roboty" i czekam na wyniki Twojej pracy, biorąc się za swoje projekty, które porozpoczynałem miesiące i lata temu ... ;-p

p.s.
Wyszedł mi niezły essej

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Wieslaw.S

Zaczyna gadać :)

Zaczyna gadać :)Ale jeszcze trochę trzeba dopracować.

$regfile = "m8def.dat"
$crystal = 1200000
$swstack = 10
$hwstack = 40
 
Config Dcf77 = Pinc.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts
 
Config Portb = Output
Config Portd = Output
Config Portc.2 = Output
Config Portc.3 = Input
 
Segment1 Alias Portb.2
Segment2 Alias Portb.3
Segment3 Alias Portb.4
Segment4 Alias Portb.5
 
Led_dcf Alias Portc.2
 
Segment_anoden Alias Portd
 
 
'Timer für Multiplex
 
Config Timer0 = Timer , Prescale = 256
On Timer0 Anzeige
 
Enable Timer0
Enable Interrupts
 
 
Dim Hhh As Byte
Dim Mmm As Byte
Dim Ziffer As Byte
Dim Dezimalpunkt As Byte
Dim Einer As Byte
Dim Zehner As Byte
Dim Hunderter As Byte
Dim Tausender As Byte
Dim Stelle As Byte
 
 
Do
 
Led_dcf = Dcf_status.0
 
Loop
 
End
 
Anzeige:
 
Timer0 = 237
 
    Mmm = Makedec(dcf_min)
    Hhh = Makedec(dcf_hour)
 
 
Einer = Mmm Mod 10   
Zehner = Mmm / 10    
 
Hunderter = Hhh Mod 10
Tausender = Hhh / 10
 
 
If Stelle < 4 Then
Incr Stelle
Else
Stelle = 1
End If
 
If Stelle = 1 Then Ziffer = Tausender
If Stelle = 2 Then Ziffer = Hunderter
If Stelle = 3 Then Ziffer = Zehner
If Stelle = 4 Then Ziffer = Einer
 
Segment1 = 1
Segment2 = 1
Segment3 = 1
Segment4 = 1
 
Select Case Ziffer
Case 0 : Segment_anoden = 192
Case 1 : Segment_anoden = 249
Case 2 : Segment_anoden = 164
Case 3 : Segment_anoden = 176
Case 4 : Segment_anoden = 153
Case 5 : Segment_anoden = 146
Case 6 : Segment_anoden = 130
Case 7 : Segment_anoden = 248
Case 8 : Segment_anoden = 128
Case 9 : Segment_anoden = 144
 
End Select
 
 
Select Case Stelle
Case 1 : Segment1 = 0
Case 2 : Segment2 = 0
Case 3 : Segment3 = 0
Case 4 : Segment4 = 0
 
End Select
 
 Return
 
 
Sectic:

Portret użytkownika kaktus

:-)

To chyba ten sam KAWAŁEK kodu, który wkleiłeś w innym miejscu forum, nic nie chcesz wytłumaczyć i opisów nie ma ...
I ten obcy język ...

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika gosc

tylko kosmetyczne zmiany

tylko kosmetyczne zmiany, co tu opisywać ?
Walka trwa, coś z odbiornikami nie tak, ale chyba to sprawa programowa.
Trzy odbiorniki ( różne) zachowują się tak samo.

Portret użytkownika Wieslaw.S

język

Niestety, nie znam tego narzecza. Posiłkowałem się wiki-słownikiem aby
zgłębić co dana linia robi.

Portret użytkownika kaktus

ciekawość to ...

Jakieś postępy?

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Wieslaw.S

na

na razie temat zawieszony.
Muszę opanować PCF8583.
Odczyt juz mam , ale nie wiem jak dodać obsługę przycisków do ustawiania czasu.

           'Konfiguracja
'****************************
 
$regfile = "m8def.dat"
$crystal = 8000000
 
 
Config Portb = Output
 
Config Portd = Output
'
'
'------------- GUZIKI ---------
'Config Portc.3 = Input
'Config Portc.2 = Input
 
'Portc.2 Alias S1
'Portc.3 Alias S2
 
'------------------------------
 
 
Config Scl = Portc.5
Config Sda = Portc.4
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
 
Enable Interrupts
'****************************
      'Zmienne
'****************************
 
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
Dim Wysw1k As Byte
Dim Mux As Byte
Dim Pomoc As Word
Dim A As Word
 
Dim Wartm As Byte
Dim Warth As Byte
Dim S As Byte
Dim M As Byte
Dim H As Byte
 
Declare Sub Pcf_odczyt
Declare Sub Pcf_zapis
 
 
'****************************
      'Petla glowna
'****************************
Do
 
Gosub Pcf_odczyt
 
Loop
End
 
 
Gosub Pcf_zapis
 
 
 
Pcf_zapis:
 
 
 
S = Makebcd(s)
M = Makebcd(nast_min)
H = Makebcd(nast_hour)
 
 
I2cstart
I2cwbyte 162
I2cwbyte 0
I2cwbyte 8
I2cstop
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cwbyte S
I2cwbyte Nast_min
I2cwbyte Nast_hour
I2cstop
Waitms 50
 
 
 
 
Pcf_odczyt:
 
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Nack
 
I2cstop
 
 
 
 
'****************************
      'Przerwanie timer0
'****************************
 
Przerwanie0:
 
Timer0 = 5
 
 
 
   Warth = Makedec(h)
   Wartm = Makedec(m)
 
 
   Wysw1k = Warth / 10
 
   Wysw100 = Warth Mod 10
 
   Wysw10 = Wartm / 10
 
   Wysw1 = Wartm Mod 10
 
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela)
   Wysw100 = Lookup(wysw100 , Tabela2)
   Wysw1k = Lookup(wysw1k , Tabela)
 
 
  Incr Mux
  If Mux = 4 Then Mux = 0
 
 
  Select Case Mux
 
    Case 0:
 
     Set Portb.0
      Portd = Wysw1k
     Reset Portb.3
 
    Case 1:
 
     Set Portb.3
      Portd = Wysw100
     Reset Portb.2
 
    Case 2:
 
     Set Portb.2
     Portd = Wysw10
     Reset Portb.1
 
       Case 3:
 
     Set Portb.1
      Portd = Wysw1
     Reset Portb.0
 
 
 
  End Select
 
Return
 
 
'*******************************************************************************
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
'*******************************************************************************

Może ktoś pomoże ?
Chyba, że nikt tego nie robił :(

Portret użytkownika kaktus

no tak ...

To jest twój program, ale:
1. wywołanie podprogramu poza pętlą główną (po zakończeniu programu) - czy ma sens?
2. naucz się aby w obsłudze przerwania robić ja najmniej - obsługa przewrwania ma się zakończyć jaknajszybciej - zanim zostanie wywołane na nowo - a przecież ?C ma jeszcze co robić ... tak że proponuję ustawiaj sobie flagę w obsłudze przerwania a w programie głównym od flagi uzależniaj wykonanie części kodu ...
Tyle co na szybko popatrzałem.

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika Wieslaw.S

nowy prg

zrobiłem nowy program, ale nie działają przyciski.
Nie wiem dla czego. Oto kod.

$regfile = "m8def.dat"
$crystal = 8000000
 
 
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
 
 
Config Portd = Output
 
Config Portc.3 = Input                                      ' guziki   - min
Config Portc.2 = Input                                      ' guziki   + min
Config Portc.1 = Input                                      ' guziki   - godz
Config Portc.0 = Input                                      ' guziki   + godz
 
 
 
Config Scl = Portc.5
Config Sda = Portc.4
 
I2cinit
 
'------------------------------------Zmienne------------------------------------
 
Dim Wysw1 As Byte
Dim Wysw10 As Byte
Dim Wysw100 As Byte
Dim Wysw1k As Byte
 
Dim Mux As Byte
 
Dim G_b As Byte                                             ' godziny_bcd
Dim M_b As Byte                                             ' minuty_bcd
Dim S_b As Byte                                             ' sekundy_bcd
 
Dim G As Byte                                               'pomocnicza godziny
Dim M As Byte                                               'pomocnicza minuty
Dim S As Byte                                               'pomocnicza sekundy
 
Dim G_d As Byte                                             ' godziny_dec
Dim M_d As Byte                                             ' minuty_dec
Dim S_d As Byte                                             ' sekundy_dec
 
'------------------------------------Pętla_Główna-------------------------------
Do
 
 
   Gosub Odczyt_pcf
 
   Gosub Guziki
 
   Gosub Wyswietl_czas
 
Loop
 
End
 
 
 
'-------------------   Odczyt guzików i zapis do zmiennych  -------------------
 
 
Guziki:
 
 
 
 
    If Portc.0 = 0 Then
   Waitms 1
   If Portc.0 = 0 Then
   Incr G
 
End If
End If
 
        If Portc.1 = 0 Then
        Waitms 1
        If Portc.1 = 0 Then
        Decr G
 
End If
End If
 
 
   If Portc.2 = 0 Then
   Waitms 1
   If Portc.2 = 0 Then
  Incr M
 
End If
End If
 
   If Portc.3 = 0 Then
   Waitms 1
   If Portc.3 = 0 Then
   Decr M
 
End If
End If
 
Gosub Zapis_pcf
 
Return
 
 
'************************* koniec obsługi guzików ******************************
 
 
 
 
'******************************* Zapis RTC *************************************
 
zapis_PCF:
 
'G = 19                                                      '    dla sprawdzenia  wpisana godzina 19
'M = 49                                                      '    dla sprawdzenia  wpisane 49 minut
'                                                                 no i działa , wyświetla 19.49 -> jest OK
 
 
 
 
  G_b = Makebcd(g)
  M_b = Makebcd(m)
  S_b = Makebcd(s)
 
  I2cstart
  I2cwbyte 162
  I2cwbyte 0
  I2cwbyte 8
 
  I2cstop
  I2cstart
  I2cwbyte 162
  I2cwbyte 2
 
  I2cwbyte S_b
  I2cwbyte M_b
  I2cwbyte G_b
  I2cstop
 
Return
 
'**************************** Zapis RTC Koniec *********************************
 
 
 
 
 
 
'******************************* Odczyt RTC ************************************
 
odczyt_PCF:
 
  I2cstart
  I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163
  I2crbyte S_b , Ack
  I2crbyte M_b , Ack
  I2crbyte G_b , Nack
  I2cstop
 
  S = Makedec(s_b)
  M = Makedec(m_b)
  G = Makedec(g_b)
 
 
Return
 
'************************** Odczyt RTC Koniec **********************************
 
 
 
 
'**************************** Wyświetl czas ************************************
 
'******************** wyświetlam tylko godzinę i minuty ************************
 
Wyswietl_czas:
 
 
 
 
 
 
   Wysw1k = G / 10
 
   Wysw100 = G Mod 10
 
   Wysw10 = M / 10
 
   Wysw1 = M Mod 10
 
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela)
   Wysw100 = Lookup(wysw100 , Tabela2)
   Wysw1k = Lookup(wysw1k , Tabela)
 
 
 
    Incr Mux
  If Mux = 4 Then Mux = 0
 
 
  Select Case Mux
 
    Case 0:
 
     Set Portb.0
      Portd = Wysw1k
     Reset Portb.3
 
    Case 1:
 
     Set Portb.3
      Portd = Wysw100
     Reset Portb.2
 
    Case 2:
 
     Set Portb.2
     Portd = Wysw10
     Reset Portb.1
 
       Case 3:
 
     Set Portb.1
      Portd = Wysw1
     Reset Portb.0
 
 
 
  End Select
 
Return
 
 
'*******************************************************************************
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
'*******************************************************************************

Odczyt PCF'a i zapis do zmiennych G,M,S.
Guziki zwiekszaja lub zmnieszają tę wartośc po czym zostaje ona zapisana do PCF'a.

To teoretycznie ale w praktyce "Guziki" w ogóle nie działaja.
Nie wiem dla czego.
Może ktoś mi podpowie.
Aaa, guziki są podciągniete oporami 4,7 kOhm do plus 5 voltów.

Portret użytkownika gosc

Po pierwsze w procedurze

Po pierwsze w procedurze Guziki cały czas skaczesz do zapisu niepotrzebnie. Uzaleznij skok do zapisu od tego czy wartość jakakolwiek sie zmieniła i wymaga zapisu.
Jeśli stan któregoś z portów różny od 1 wtedy sprawdzasz który, zmieniasz wartość zmiennej i skaczesz do zapisu. Jeśli nic nie naciśnieto to Return bez zapisu. Mniej "IF-ów". Tok myślenia powinien być taki:

IF PORTC.0 = 0 OR PORTC.1 = 0 OR PORTC.2 = 0 OR PORTC.3 = 0 Then
 
 IF PORTC.0 = 0 Then Incr G
 IF PORTC.1 = 0 Then Decr G
 IF PORTC.2 = 0 Then Incr M
 IF PORTC.3 = 0 Then Decr M
 
Gosub Zapis_Pcf
End If 

Teraz TYLKO gdy jakikolwiek przycisk naciśniesz wykona się zapis.

Druga sprawa to: Na początku programu konfigurujesz porty, ale dobrym zwyczajem, nawet jeśli sa podciągane rezystorami jest ich wewnętrzne "ustawienie". Więc po "Config port" powinno tez znaleźć się Set port.. albo Port = .. co ustawia go ze stanu nieustalonego ..

Trzecia sprawa:
Filtrowanie przycisków "wait"-em jest prymitywne. Jeśli to taki prosty programik to pod przyciski dodaj jakieś kondensatorki no i te "wait" w tym IF-ie dajesz tylko jedno. Tak bym się jednak nie uczył bo w programach późniejszych zobaczysz że np. na czas czekania przestajesz multipleksować wyświetlacze. Poczytaj o obsłudze przycisków tu na stronie w artykułach. Przykład kodu jedynie ma pokazać że zapis dopiero po naciśnięciu guzika.

Portret użytkownika kaktus

pull up

gość pisze

Quote:
Druga sprawa to: Na początku programu konfigurujesz porty, ale dobrym zwyczajem, nawet jeśli sa podciągane rezystorami jest ich wewnętrzne "ustawienie". Więc po "Config port" powinno tez znaleźć się Set port.. albo Port = .. co ustawia go ze stanu nieustalonego ..

Jest to załączenie wewnętrznego rezystora podciągającego, i nie jest to "dobry zwyczaj" ale jest to tylko i wyłącznie uwarunkowane konstrukcją i funkcjonalnością danego projektu - takie moje zdanie.

Jak już o tym wspominamy to warto dopisać że np dla rodzinki Mega i Tinny
Reset Pull-up Resistor - 30 do 60k? (lub 80k? małe tinny)
I/O Pin Pull-up Resistor - 20 do 50k?

nota katalogowa - Electrical Characteristics -DC Characteristics

Jeżeli przeszkadza ci tak duża tolerancja, to możesz przylutować własny rezystor podciągający.

Jeszcze jedna informacja AVR Tinny i Mega posiadają rezystor podłączany do Vcc, a XMega dodatkowo do GND (pull-down). Tak że w tym wypadku można sobie wybrać podciąganie do zasilania lub masy i sterować stanem przeciwnym.

-

"Cierpliwym być musisz, by wiedzę zgłębiać tajemną, gdyż ciemna strona mocy niszczącą i silną jest.".

Portret użytkownika gosc

no cóż

Twój post niczego nie wniósł do mojego problemu. Problemu , z którym boryka sie początkujący.

Portret użytkownika gosc

Oooo !

Dzięki serdeczne za pomoc, o to chodziło.

Problemem byl zapis portc.0 ... zmieniłem na pinc.0 .... i zadziałało
ale z takim efektem jak piszesz - multiplexowanie.

Czyli, dzięki za pomoc --> Pomogłeś mi .

Portret użytkownika Wieslaw.S

pull up

Jestem zwolennikiem fizycznych rezystorów podciągających .

Za konstruktywną podpowiedzią kolegi "gość" napisałem jak polecał.
zaczęło gadać sensownie.
Dodałem trochę swoich poprawek i jest prawie OK.
Muszę dokleić kondki ( po 100 nF ) do przycisków i zlikwidować waitms.
To już kosmetyka - ogólnie już działa.

Tak dla kogoś , kto tak jak ja zaczyna wklejam kod.

$regfile = "m8def.dat"
$crystal = 8000000
 
 
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
 
Config Portd = Output
 
Config Portc.3 = Input                                      ' guziki   - min
Config Portc.2 = Input                                      ' guziki   + min
Config Portc.1 = Input                                      ' guziki   - godz
Config Portc.0 = Input                                      ' guziki   + godz
 
 
Config Scl = Portc.5
Config Sda = Portc.4
 
 
'------------------------------------Zmienne------------------------------------
 
Dim Wysw1 As Byte
Dim Wysw10 As Byte
Dim Wysw100 As Byte
Dim Wysw1k As Byte
 
 
Dim Mux As Byte
 
Dim G_b As Byte                                             ' godziny_bcd
Dim M_b As Byte                                             ' minuty_bcd
Dim S_b As Byte                                             ' sekundy_bcd
 
Dim G As Byte                                               'pomocnicza godziny
Dim M As Byte                                               'pomocnicza minuty
Dim S As Byte                                               'pomocnicza sekundy
 
Dim G_d As Byte                                             ' godziny_dec
Dim M_d As Byte                                             ' minuty_dec
Dim S_d As Byte                                             ' sekundy_dec
 
'------------------------------------Pętla_Główna-------------------------------
Do
 
 
   Gosub Odczyt_pcf
 
   Gosub Guziki
 
   Gosub Wyswietl_czas
 
 
 
 
 
 
Loop
 
End
 
 
 
'-------------------   Odczyt guzików i zapis do zmiennych  -------------------
 
 
Guziki:
 
 
If Pinc.0 = 0 Or Pinc.1 = 0 Or Pinc.2 = 0 Or Pinc.3 = 0 Then
 
 
 
 If Pinc.0 = 0 Then Waitms 60
 If Pinc.0 = 0 Then Incr G
 If G > 23 Then G = 0
 
 
 
 If Pinc.2 = 0 Then Waitms 60
 If Pinc.2 = 0 Then Incr M
 If M > 59 Then M = 0
 
 
 
Gosub Zapis_pcf
 
End If
 
 
Return
 
 
'************************* koniec obsługi guzików ******************************
 
 
 
 
'------------------------------- Zapis RTC -------------------------------------
 
Zapis_pcf:
 
 
 
 
  G_b = Makebcd(g)
  M_b = Makebcd(m)
  S_b = Makebcd(s)
 
  I2cstart
  I2cwbyte 162
  I2cwbyte 0
  I2cwbyte 8
 
  I2cstop
  I2cstart
  I2cwbyte 162
  I2cwbyte 2
 
  I2cwbyte G_b
  I2cwbyte M_b
  I2cwbyte S_b
  I2cstop
 
Return
 
'**************************** Zapis RTC Koniec *********************************
 
 
 
 
 
 
'------------------------------- Odczyt RTC ------------------------------------
 
Odczyt_pcf:
 
  I2cstart
  I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163
  I2crbyte S_b , Ack
  I2crbyte M_b , Ack
  I2crbyte G_b , Nack
  I2cstop
 
  S = Makedec(s_b)
  M = Makedec(m_b)
  G = Makedec(g_b)
 
 
Return
 
'************************** Odczyt RTC Koniec **********************************
 
 
 
 
'---------------------------- Wyświetl czas ------------------------------------
 
'-------------------- wyświetlam tylko godzinę i minuty ------------------------
 
Wyswietl_czas:
 
 
 
 
 
 
   Wysw1 = M Mod 10
 
   Wysw10 = M / 10
 
   Wysw100 = G Mod 10
 
   Wysw1k = G / 10
 
 
 
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela)
   Wysw100 = Lookup(wysw100 , Tabela2)
   Wysw1k = Lookup(wysw1k , Tabela)
 
 
If Wysw1k = 192 Then Wysw1k = 255                           ' wygaszanie zera wiodącego zamiast godziny 07:28 jest 7:28.
 
 
 
    Incr Mux
  If Mux = 4 Then Mux = 0
 
 
  Select Case Mux
 
    Case 0:
 
     Set Portb.0
      Portd = Wysw1k
     Reset Portb.3
 
    Case 1:
 
     Set Portb.3
      Portd = Wysw100
     Reset Portb.2
 
    Case 2:
 
     Set Portb.2
     Portd = Wysw10
     Reset Portb.1
 
       Case 3:
 
     Set Portb.1
      Portd = Wysw1
     Reset Portb.0
 
 
 
  End Select
 
Return
 
 
'*******************************************************************************
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
'*******************************************************************************

Tabela 2 jest po to aby druga cyfra była wyświetlana z kropką.
To widać . --> kody zaczerpnięte z projektu Mirka.

Portret użytkownika EDC

Gość :)

Czyściłem rejestr kompa i nie zauważyłem że mnie nie zalogowało automatycznie :D

Jak do niczego go nie potrzebujesz to oprogramuj Timer0. Będzie robił za sygnał zegarowy który przyda sie do wszystkiego. Sciągasz sobie np. mkAVR Calkulator darmowy ze strony Atnel. W nim oprócz pomocy do Fusebitów jest też narzędzie do Timerów. Wpisujesz częstotliwośc swojego kwarca i czas co jaki chciałbys żeby robił przerwanie. Przykład: masz 8MHz i chcesz co 4ms - daje taki wynik -> preskaler 256, i załaduj do licznika 132. To wykorzystasz w programie.
Obsługa multipleksowania wyświetlacza może być wykonywana np. co 4ms i oko tego nie zauważy, a skan przycisków co 200ms (wykonuje się tylko gdy flaga 200ms ustawiona jest juz przez licznik)co nie wstrzymuje programu a daje czas między kolejnym Incr albo Decr. Potrzebny Bajt do zliczania i Bit.
Przy zgłoszeniu przerwania skaczemy do jego obsługi "Przerwanie" i tam ładujemy wartość z kalkulatora czyli 132. Timer nie zacznie od zera tylko od 132 i szybciej dojdzie do 255 i znów zgłosi potrzebę obsługi, ale to nasze wyliczone 4ms. Dodajesz je kolejno i po 50 masz 200ms. Po osiągnięciu 50 zgłoszeń wystawiasz Bit który częściej jest sprawdzany w pętli głównej ale tylko co 200ms jest podnoszony do 1. Jesli program widzi 1 warunek jest spełniony, wykonuja sie polecenia po warunku a na koniec kasujesz Bit i następny raz będzie można wykonać instrukcje gdy Bit zostanie ustawiony przez licznik(a multipleksowanie sobie działa nieprzerwanie). Rozbudujesz jak będziesz chciał bo pod spodem to przykład tylko, ale nawiązuje do Twojego projektu żeby było wiadomo jak go użyć.

Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Przerwanie0
Enable Interrupts
 
Dim Licz as Byte, F4ms as Bit, F200ms as Bit
 
Do
 If F4ms = 1 Then
    F4ms = 0
   Gosub Odczyt_pcf
   Gosub Wyswietl_czas
 End If
 
 If F200ms = 1 Then
    If 'jakis guzik nacisniety
        zwieksz albo zmniejsz
    F200ms =0
    End If
 End If
Loop
 
Przerwanie:
Timer0  = 132
Set F4ms
Incr Licz
 If Licz = 50 Then
 Set F200ms
 Licz = 0
 End If
Return

Reakcja na guzik bedzie co odmierzony czas. Specjalnie tak najprościej to napisałem żeby zasada dzia była widoczna. Odczyt Pcfa tez możesz robić co jakiś czas.. W obsługach odczytów i zapisów jakichś urządzeń czasem trzeba na ich czas wyłaczyc przerwania, dokonac operacji i znów je włączyć.

Odczyt_pcf:
Disable Interrupts 
 
  I2cstart
  I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163
  I2crbyte S_b , Ack
  I2crbyte M_b , Ack
  I2crbyte G_b , Nack
  I2cstop
 
  S = Makedec(s_b)
  M = Makedec(m_b)
  G = Makedec(g_b)
 
Enable Interrupts 
 
Return

Nie wiem czy to akurat dobry przykład ale jak szwankuje obsługa jakiegoś peryferyjnego to warto sprawdzić. Wtedy konieczne może być skorygowanie opóźnień w multipleksowaniu i zmiana wartości ładowanej do Timera.

-

BARTek
Moja strona

Portret użytkownika Wieslaw.S

timer0

Dzięki za podpowiedź.
Co do timera0 to podejrzewam, że będzie mi potrzebny do obsługi
DCF77.
Idea jest taka :
Odbiór DCF77 --> wpisanie odebranych danych do zmiennych.
Zapis tych zmiennych do PCFa.
Wyświetlanie czasu.
Jako że odbiór nie zawsze jest dobry zegar ma pracować na PCF
a w nocy, gdy warunki propagacyjne rosną, a zakłócenia przemysłowe
słabną --> po odebraniu prawidłowej ramki DCF77 następuje
korekcja czasu w PCF8583.
Oczywiście tylko godzina i minuty mnie interesują.

Na razie mam tylko taką ideę, nie wiem jak to ugryźć programowo.

----------------------------------------------------------------------------

Ma razie tyle dopisałem, ale wiem, że to za mało.

$regfile = "m8def.dat"
$crystal = 8000000
 
 
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.3 = Output
 
Config Portd = Output
 
Config Pinc.3 = Input                                       ' guzik  minut
Config Pinc.2 = Input                                       ' guzik  godzin
 
Config Portc.1 = Output                                     ' dioda DCF77
Config Portc.0 = Input                                      ' wejście odbiornika DCF77
 
Config Scl = Portc.5
Config Sda = Portc.4
 
Led_dcf Alias Pinc.1
 
Config Dcf77 = Pinc.0 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
 
Config Date = Dmy , Separator = .
 
'Enable Interrupts
 
'------------------------------------Zmienne------------------------------------
 
Dim Wysw1 As Byte
Dim Wysw10 As Byte
Dim Wysw100 As Byte
Dim Wysw1k As Byte
 
 
Dim Mux As Byte
 
Dim G_b As Byte                                             ' godziny_bcd
Dim M_b As Byte                                             ' minuty_bcd
Dim S_b As Byte                                             ' sekundy_bcd
 
Dim G As Byte                                               'pomocnicza godziny
Dim M As Byte                                               'pomocnicza minuty
Dim S As Byte                                               'pomocnicza sekundy
 
Dim G_d As Byte                                             ' godziny_dec
Dim M_d As Byte                                             ' minuty_dec
Dim S_d As Byte                                             ' sekundy_dec
 
 
 
'------------------------------------Pętla_Główna-------------------------------
Do
 
 
 
 '  Led_dcf = Dcf_status.0
 
   Gosub Odczyt_pcf
 
   Gosub Guziki
 
   Gosub Wyswietl_czas
 
 
 
 
 
 
Loop
 
End
 
 
 
'-------------------   Odczyt guzików i zapis do zmiennych  -------------------
 
 
Guziki:
 
 
If Pinc.2 = 0 Or Pinc.3 = 0 Then
 
 
 
 If Pinc.2 = 0 Then Waitms 100
 If Pinc.2 = 0 Then Incr G
 If G > 23 Then G = 0
 
 
 
 If Pinc.3 = 0 Then Waitms 100
 If Pinc.3 = 0 Then Incr M
 If M > 59 Then M = 0
 
 
 
Gosub Zapis_pcf
 
End If
 
 
Return
 
 
'************************* koniec obsługi guzików ******************************
 
 
 
 
'------------------------------- Zapis RTC -------------------------------------
 
Zapis_pcf:
 
 
 
 
  G_b = Makebcd(g)
  M_b = Makebcd(m)
  S_b = Makebcd(s)
 
  I2cstart
  I2cwbyte 162
  I2cwbyte 0
  I2cwbyte 8
 
  I2cstop
  I2cstart
  I2cwbyte 162
  I2cwbyte 2
 
  I2cwbyte G_b
  I2cwbyte M_b
  I2cwbyte S_b
  I2cstop
 
Return
 
'**************************** Zapis RTC Koniec *********************************
 
 
 
 
 
 
'------------------------------- Odczyt RTC ------------------------------------
 
Odczyt_pcf:
 
  I2cstart
  I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163
  I2crbyte S_b , Ack
  I2crbyte M_b , Ack
  I2crbyte G_b , Nack
  I2cstop
 
  S = Makedec(s_b)
  M = Makedec(m_b)
  G = Makedec(g_b)
 
 
Return
 
'************************** Odczyt RTC Koniec **********************************
 
 
 
 
'---------------------------- Wyświetl czas ------------------------------------
 
'-------------------- wyświetlam tylko godzinę i minuty ------------------------
 
Wyswietl_czas:
 
 
 
 
 
 
   Wysw1 = M Mod 10
 
   Wysw10 = M / 10
 
   Wysw100 = G Mod 10
 
   Wysw1k = G / 10
 
 
 
 
   Wysw1 = Lookup(wysw1 , Tabela)
   Wysw10 = Lookup(wysw10 , Tabela)
   Wysw100 = Lookup(wysw100 , Tabela2)
   Wysw1k = Lookup(wysw1k , Tabela)
 
 
If Wysw1k = 192 Then Wysw1k = 255                           ' wygaszanie zera wiodącego
 
 
 
    Incr Mux
  If Mux = 4 Then Mux = 0
 
 
  Select Case Mux
 
    Case 0:
 
     Set Portb.0
      Portd = Wysw1k
     Reset Portb.3
 
    Case 1:
 
     Set Portb.3
      Portd = Wysw100
     Reset Portb.2
 
    Case 2:
 
     Set Portb.2
     Portd = Wysw10
     Reset Portb.1
 
       Case 3:
 
     Set Portb.1
      Portd = Wysw1
     Reset Portb.0
 
 
 
  End Select
 
Return
 
 
'*******************************************************************************
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
'*******************************************************************************
Sectic:

Portret użytkownika Wieslaw.S

zrobiłem

hej BARTek,
z ciekawości zrobiłem jak pisałeś z przerwaniem.
Zasadniczo działa jak w poprzedniej wersji, żadnych zmian dla oka nie ma.