f
Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 548

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 549

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/page_header.php on line 343
And-Tech :: Zobacz temat - Zegarek na 7-segment

Strona korzysta z plików cookie w celu realizacji usług zgodnie z Politykš prywatnoœci.

Możesz okreœlić warunki przechowywania lub dostępu do cookie w Twojej przeglšdarce lub konfiguracji usługi.

And-Tech Strona Główna And-Tech
Forum firmy And-Tech

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  AlbumAlbum  DownloadDownload

Poprzedni temat «» Następny temat
Zegarek na 7-segment
Autor Wiadomość
tomek 

Wiek: 30
Dołączył: 13 Mar 2010
Posty: 4
  Wysłany: Sob Mar 13, 2010 2:13 pm   Zegarek na 7-segment

Witam jest początkujący w tej dziedzinie - zabawy z płytką (EvB 4.3)...
Programuje w C ... Zasadę sterowania wyświetlaczem 7 segmentowym znam i algorytm dalszego przeliczania na min i godz to nie problem... Ale problem polega na tym że nie wiem jak dokładnie odmierzać czas 1 sek.
Proszę o pomoc
 
 
     
morock 

Wiek: 33
Dołączył: 19 Sie 2009
Posty: 71
Skąd: Działdowo
Wysłany: Sob Mar 13, 2010 6:52 pm   

http://www.avrprojects.ne...jects&Itemid=57

http://plmiscelektronika..../2006_06122.htm

zobacz te linki, programuje w bascomie więc nie pomogę zbytnio, ale na Twoim miejscu wykorzystałbym układ PCF8583P wbudowany w płytkę.
_________________
Pozdrawiam :)
 
 
     
leon1313
Homo Erektus

Dołączył: 04 Sty 2010
Posty: 41
Wysłany: Sob Mar 13, 2010 9:41 pm   

Najlepiej za pomocą przerwania i timera. Ale nie 1 sek, tylko lepiej 1 lub 10 ms..
_________________
Chroniczny brak orgazmu.
 
     
tomek 

Wiek: 30
Dołączył: 13 Mar 2010
Posty: 4
Wysłany: Wto Mar 16, 2010 5:37 pm   

No właśnie powiem szczerze że mam zagwochę jak układ PCF8583P wbudowany w płytkę tak do końca uruchomić:

Dołączę tu część programu przeliczającą impulsy na minuty i godziny (zakladajac ze 1 impuls co 10ms)
i tutaj jest zoonk bo nie wiem jak zainicjować to zliczanie żeby "i" mi zaczelo tykac

void licz(void)
{
int i=0,j=0,k=0,l=0,m=0;

i++;
if(i==6000)
{
i=0;
j++;
}

if(j==10)
{
j=0;
k++;
}

if(k==6)
{
k=0;
l++;
}

if(l==10)
{
l=0;
}

if(m==2&&l==4)
{
m=0;
l=0;
k=0;
j=0;
i=0;
}
}

Sorry ale dopiero zaczynam się w to bawić więc poziom mojego programowania jest słaby:/
Sorry ze tak pozno ale nie bylem dostepny na kompie :/
 
 
     
morock 

Wiek: 33
Dołączył: 19 Sie 2009
Posty: 71
Skąd: Działdowo
Wysłany: Czw Mar 18, 2010 8:53 am   

wydaje mi się że zacząć powinieneś od BASCOM-a jes o wiele przyjaźniejszy od C dla początkujących. ja znam podstawy c ale i tak wole programować w bascomie, jak chcesz to dam Ci program który obsługuję em timer ale w bascomie.
_________________
Pozdrawiam :)
 
 
     
tomek 

Wiek: 30
Dołączył: 13 Mar 2010
Posty: 4
  Wysłany: Czw Mar 18, 2010 11:36 pm   

morock napisał/a:
wydaje mi się że zacząć powinieneś od BASCOM-a jes o wiele przyjaźniejszy od C dla początkujących. ja znam podstawy c ale i tak wole programować w bascomie, jak chcesz to dam Ci program który obsługuję em timer ale w bascomie.

To jak mozesz to wez sie podziel :) a jezeli masz jakis kurs bascom czy cos takiego to tez mozesz przy okazji :D
 
 
     
morock 

Wiek: 33
Dołączył: 19 Sie 2009
Posty: 71
Skąd: Działdowo
Wysłany: Pią Mar 19, 2010 7:35 am   

wysłałem Ci na maila linki do programu i książki do nauki... postaram się przesłać Ci także przykładowy program, ale to trochę później.
_________________
Pozdrawiam :)
 
 
     
TatOR

Dołączył: 09 Mar 2010
Posty: 4
Wysłany: Pią Mar 19, 2010 12:35 pm   

Jakbyś był taki miły to mi także mógłbyś podesłać...
 
     
morock 

Wiek: 33
Dołączył: 19 Sie 2009
Posty: 71
Skąd: Działdowo
Wysłany: Sob Mar 20, 2010 12:13 am   

prosty zegarek obsługujący wyświetlacz lcd i wbudowany timer (nie potrzebuje tego układu PCF)

Kod:
$regfile = "m16def.dat"
$crystal = 16000000

Config Pinb.1 = Input
Config Pinb.2 = Input

Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7       'standard
Config Lcd = 16 * 2
Cls


Config Timer1 = Timer , Prescale = 256

Declare Sub Wysw_czas
On Timer1 Odmierz_1s

Dim Sekundy As Byte
Dim Minuty As Byte
Dim Godziny As Byte
Dim Nowa_w As Byte
Dim Wart_bcd As Byte
Cursor Off
S1 Alias Pinb.2
S2 Alias Pinb.1

Enable Interrupts

Enable Timer1

Counter1 = 68572

Set Nowa_w
Set Portb.1
Set Portb.2

Do
Call Wysw_czas

If S1 = 0 Then
Waitms 25
If S1 = 0 Then

Incr Minuty
Sekundy = 0
If Minuty = 60 Then
Minuty = 0
End If
Set Nowa_w

Call Wysw_czas

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 Wysw_czas

Waitms 200
End If
End If

Lowerline

Lowerline

Lcd "time"


Loop
End

Sub Wysw_czas
If Nowa_w = 1 Then
Cls
Wart_bcd = Makebcd(godziny)
Lcd Bcd(wart_bcd) ; ":"
Wart_bcd = Makebcd(minuty)
Lcd Bcd(wart_bcd) ; ":"
Wart_bcd = Makebcd(sekundy)
Lcd Bcd(wart_bcd);
Reset Nowa_w
End If
End Sub

Odmierz_1s:

Counter1 = Counter1 + 68572

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 If
Return


A teraz taki z obsługą tego zegarka zewnętrznego, działa po I2C <- to jest moja wetsja rozbudowana, obsługuje 3 termometry, woltomierz i klawiaturę na 4 przyciski aby ustawić godzinę.

Kod:
' Zegar, termometr 2 x 18B20 i woltomierz
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 32                                     'default use 32 for the hardware stack
$swstack = 10                                     'default use 10 for the SW stack
$framesize = 40                                   'default use 40 for the frame space

Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7       'standard
Config Lcd = 16 * 2

Config Pinb.0 = Input : Set Portb.0               ' set
Config Pinb.1 = Input : Set Portb.1               ' +
Config Pinb.2 = Input : Set Portb.2               ' -
Config Pinb.2 = Input : Set Portb.3               ' c

Config 1wire = Portd.7
Config Adc = Single , Prescaler = Auto , Reference = Avcc       ' przetwornik A/C

Dim Wart_ac As Word
Dim V As Single
Dim Wart_nap As String * 3


Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Dim Dsid3(8) As Byte
Dim Dsid4(8) As Byte
Dim T1 As Integer , Ss As String * 6
Dim T2 As Integer
Dim T3 As Integer
Dim T4 As Integer
Dim Mark As Integer

Dim M As Byte                                     'deklaracja zmiennej określającej minuty
Dim S As Byte                                     'deklaracja zmiennej określającej sekundy
Dim H As Byte                                     'deklaracja zmiennej określającej godziny
Dim Day As Byte                                   'deklaracja zmiennej określającej dzień miesiąca
Dim Month As Byte

Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32  ' st
Deflcdchar 2 , 32 , 32 , 14 , 21 , 23 , 17 , 14 , 32       ' clock
Deflcdchar 3 , 4 , 10 , 17 , 27 , 10 , 10 , 14 , 32       ' arrow up
Deflcdchar 4 , 14 , 10 , 10 , 27 , 17 , 10 , 4 , 32       ' arrow down
Deflcdchar 5 , 32 , 4 , 2 , 31 , 31 , 2 , 4 , 32  ' arrow right

Dsid1(1) = 1wsearchfirst()                        'musi być wywołana w celu zainicjowania
Dsid2(1) = 1wsearchnext()                         'procedury przeszukiwania magistrali.
Dsid3(1) = 1wsearchnext()                         'Potem, aby odczytać następne numery
Dsid4(1) = 1wsearchnext()                         'ID należy użyć funkcji 1WSEARCHNEXT()


Display On
Cursor Off
Cls
Petla:
Do
   Gosub Wysw_czas
   Gosub Volt
   Gosub Temp
   If Pinb.0 = 0 Then Gosub Wczytaj

Loop
End
Return

Wysw_czas:

I2cstart                                          'inicjalizacja magistrali I2C
I2cwbyte 162                                      'podanie adresu PCF8583 dla zapisu
I2cwbyte 2                                        'wybranie drugiego rejestru (sekund)
I2cstart                                          'powtórna inicjalizacja magistrali I2C
I2cwbyte 163                                      'podanie adresu PCF8583 dla odczytu danych
I2crbyte S , Ack                                  'odczyt sekund z potwierdzeniem transmisji
I2crbyte M , Ack                                  'odczyt minut z potwierdzeniem transmisji
I2crbyte H , Ack                                  'odczyt godzin bez potwierdzania transmisji
I2crbyte Day , Ack                                'odczyt dni
I2crbyte Month , Nack                             'odczyt miesięcy
I2cstop                                           'koniec transmisji I2C'wyślij na ekran terminala:

   H = Makedec(h) : M = Makedec(m) : S = Makedec(s) : Day = Makedec(day) : Month = Makedec(month)
   Locate 1 , 9
   Lcd Chr(2)
   Locate 1 , 10
   If H < 10 Then Lcd " "
   Lcd H ; ":"
   If M < 10 Then Lcd "0"
   Lcd M ; ":"
   If S < 10 Then Lcd "0"
   Lcd S
Return



Temp:
   1wreset
   1wwrite &H55
   1wverify Dsid1(1)
   1wwrite &HBE
   T1 = 1wread(2)

   1wreset
   1wwrite &H55
   1wverify Dsid2(1)
   1wwrite &HBE
   T2 = 1wread(2)

   1wreset
   1wwrite &H55
   1wverify Dsid3(1)
   1wwrite &HBE
   T3 = 1wread(2)
   1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 300

   T1 = T1 * 10
   T1 = T1 / 16
   Ss = Str(t1)
   Ss = Format(ss , "0.0")
   Locate 2 , 1
   Lcd Chr(3)
   If T1 < 100 Then Lcd " "
   Lcd Ss ; Chr(0) ; "C"
   If T1 > -100 Then Lcd " "

   T2 = T2 * 10
   T2 = T2 / 16
   Ss = Str(t2)
   Ss = Format(ss , "0.0")
   Locate 2 , 9
   Lcd Chr(4)
   If T2 < 100 Then Lcd " "
   Lcd Ss ; Chr(0) ; "C"
   If T2 > -100 Then Lcd " "

   T3 = T3 * 10
   T3 = T3 / 16
   Ss = Str(t3)
   Ss = Format(ss , "0.0")
   Locate 1 , 1
   Lcd Chr(5)
   If T3 < 100 Then Lcd " "
   Lcd Ss ; Chr(0) ; "C"
   If T3 > -100 Then Lcd " "

Return



Volt:
   Start Adc
   Wart_ac = Getadc(0)
   V = Wart_ac * 0.0049
'   V = V * 3.6
   Wart_nap = Fusing(v , "##.&" )
   Locate 2 , 17
   Lcd ; Wart_nap ; "V"

Return



Wczytaj:
   Cls
   Locate 1 , 1
   If H < 10 Then Lcd " "
   Lcd H ; ":"
   If M < 10 Then Lcd "0"
   Lcd M
   Locate 2 , 1
   Lcd Chr(3)
   Lcd Chr(3)
   Waitms 150
   Do
   If Pinb.1 = 0 Then Incr H
   If Pinb.2 = 0 Then
      If H = 0 Then H = 23 Else Decr H
   End If
   If H > 23 Then H = 0
   If Pinb.3 = 0 Then Gosub Petla
   Locate 1 , 1
   If H < 10 Then Lcd " "
   Lcd H
   Waitms 150
   Loop Until Pinb.0 = 0

   Locate 2 , 1
   Lcd "   "

   Do
   Locate 2 , 4
   Lcd Chr(3)
   Lcd Chr(3)
   If Pinb.1 = 0 Then Incr M
   If Pinb.2 = 0 Then
       If M = 0 Then M = 59 Else Decr M
   End If
   If M > 59 Then M = 0
   If Pinb.3 = 0 Then Gosub Wczytaj
   Locate 1 , 4
   If M < 10 Then Lcd "0"
   Lcd M
   Waitms 150
   Loop Until Pinb.0 = 0
   Cls
   Waitms 150
   Gosub Zapisz

Return



Zapisz:

H = Makebcd(h)                                    'konwersja godziny do formatu BCD
M = Makebcd(m)                                    'konwersja minut do formatu BCD
S = 0                                             'wyzerowanie sekund
I2cstart                                          'inicjalizacja magistrali I2C
I2cwbyte 162                                      'podanie adresu PCF8583 do zapisu
I2cwbyte 0                                        'wybranie pierwszego (kontrolnego) rejestru
I2cwbyte 8                                        'ustawienie zapisu rejestru daty
I2cstop                                           'koniec transmisji
I2cstart                                          'inicjalizacja magistrali I2C
I2cwbyte 162                                      'ustawianie trybu zapisu
I2cwbyte 2                                        'wybranie drugiego rejestru (sekund)
I2cwbyte S                                        'zapis sekund
I2cwbyte M                                        'zapis minut
I2cwbyte H                                        'zapis godzin
I2cwbyte Day                                      'zapis dnia
I2cwbyte Month                                    'zapis miesiąca
I2cstop
Gosub Petla
Return


'Podłączenie pinów LCD do mikroprocesora

' BL = do +5V
' Rs = PortC.2
' E = PortC.3
'Db4 = PortC.4
'Db5 = PortC.5
'Db6 = PortC.6
'Db7 = PortC.7

'Portd.7 tu podpiety jedyny czujnik ds18b20 jaki mam docelowo 3szt
'Porta.0 tu jest woltomierz
'portb.0-3 a tu klawiaturkę sterowaną masą.

jak czegoś nie rozumiesz to pisz. proponuje przestudiować drugi program, sporo się nauczysz, niedługo będę robił program właśnie pod układ zegarka i termometru z 4-roma wyświetlaczami LED, także udostępnię i Tobie, ale to dopiero ok wtorku.
_________________
Pozdrawiam :)
 
 
     
tomek 

Wiek: 30
Dołączył: 13 Mar 2010
Posty: 4
Wysłany: Pią Mar 26, 2010 11:18 pm   

dziekowac ;)
 
 
     
kaczakat

Dołączył: 03 Gru 2010
Posty: 4
Wysłany: Pią Gru 03, 2010 7:38 pm   

Witam wszystkich - właśnie zacząłem przygodę z AVR, programowaniem i automatyką domową.
Dzięki termu forum przebiłem się przez instalację zestawu testowego z atmegą 64. Jakoś nie wpadłem sam na to żeby połączyć procek z różnymi elementami na płytce kabelkami i sie wkurzałem przez parę godzin, że wgrywam rożne programy testowe a wyświetlacz tylko się podświetla.
Po przetestowaniu kilku programów dotarłem tu i spróbowałem z zegarem. Pierwszy luzik, drugi z czujnikami temperatury mi nie chodzi. Jak połączyć zewnętrzny zegar z prockiem - tzn gdzie?
A na razie zrobiłem sobie mixa z programu przykładowego dla DS18B20 i prostego zegara wrzuconego tu przez MOROCK:

Kod:
' Termometr DS18B20
$regfile = "m644pdef.dat"
$crystal = 16000000


Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7       'standard
Config Lcd = 16 * 2

Config 1wire = Portd.7
Config Pinb.1 = Input
Config Pinb.2 = Input
Config Timer1 = Timer , Prescale = 256

Declare Sub Wysw_czas
On Timer1 Odmierz_1s

Dim Sekundy As Byte
Dim Minuty As Byte
Dim Godziny As Byte
Dim Nowa_w As Byte
Dim Wart_bcd As Byte
Cursor Off
S1 Alias Pinb.2
S2 Alias Pinb.1

Enable Interrupts

Enable Timer1

Counter1 = 68572

Set Nowa_w
Set Portb.1
Set Portb.2


Dim Id(8) As Byte

Dim T As Word
Dim S As String * 4
Dim Minus As Bit




Display Off
Deflcdchar 0 , 12 , 18 , 18 , 12 , 32 , 32 , 32 , 32        ' definicja symbolu stopnia


Id(1) = 1wsearchfirst()                                     'znajdź czujnik

   1wreset
   1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
   1wwrite &H44                                             'Konwersja temperatury
   Waitms 750




Display On
Cursor Off
Cls




Do
Call Wysw_czas

If S1 = 0 Then
Waitms 25
If S1 = 0 Then

Incr Minuty
Sekundy = 0
If Minuty = 60 Then
Minuty = 0
End If
Set Nowa_w

Call Wysw_czas

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 Wysw_czas

Waitms 200
End If
End If


Loop
End

Sub Wysw_czas
If Nowa_w = 1 Then

Lowerline

Lowerline
Wart_bcd = Makebcd(godziny)
Lcd Bcd(wart_bcd) ; ":"
Wart_bcd = Makebcd(minuty)
Lcd Bcd(wart_bcd) ; ":"
Wart_bcd = Makebcd(sekundy)
Lcd Bcd(wart_bcd);
Reset Nowa_w


   1wreset
   1wwrite &H55                                             'porównaj numer czujnika
   1wverify Id(1)
   1wwrite &HBE                                             'komenda odczytania z czujnika
   T = 1wread(2)

   1wreset
   1wwrite &HCC                                             'opóść sprawdzanie numeru czujnika
   1wwrite &H44                                             'Konwersja temperatury





   If T > &HFC00 Then                                       'sprawdza, czy temperatura ujemna
   T = 65536 - T                                            'wartość ujemna zapisana w kodzie U2
   Minus = 1
   Else
   Minus = 0
   End If

   T = T * 10
   T = T / 16
   S = Str(t)
   S = Format(s , "0.0")

   Locate 1 , 1

   If Minus = 1 Then
   Lcd "-"
   End If

   Lcd S ; Chr(0) ; "C "




End If
End Sub

Odmierz_1s:

Counter1 = Counter1 + 68572

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 If
Return

Mix u mnie działa, więc się dziele jak by ktoś potrzebował, a że na razie o programach wiem tyle że to jakieś działania logiczne w pętli to wygląda jak wygląda. Mam nadzieję że bardzo nie zepsułem orginałów.
 
     
piotr94 
Site Admin

Dołączył: 02 Lut 2010
Posty: 606
Skąd: Kraków
Wysłany: Sob Gru 04, 2010 11:32 am   

zewnętrzny zegar podpinany jest do magistrali I2C - z tego co wiem takowa jest na stałe podłączona do uP
_________________
http://www.piotr94.net21.pl/
 
     
kaczakat

Dołączył: 03 Gru 2010
Posty: 4
Wysłany: Sob Gru 04, 2010 8:37 pm   

Tak dokładnie było opisane w poście MOROCK, ale nie wiem które to piny procka. Myślałem, że są wyprowadzone jak porty A, B, C i D bo do tej magistrali da się podłączać ponoć wiele urządzeń - jak RS485. Jeśli jest podłączony na stałe i ten rozbudowany zegar powinien dzialac to coś u mnie nie chce - nic się nie dzieje na ekranie. Dobra, powoli będę to rozgryzał, chyba że w między czasie ktoś przetestuje jeszcze ten program.
A, bawię się oczywiście zestawem testowym z aukcji allegro And-Tech.
Pozdrawiam.
 
     
piotr94 
Site Admin

Dołączył: 02 Lut 2010
Posty: 606
Skąd: Kraków
Wysłany: Pon Gru 06, 2010 7:06 pm   

dokumentacja płytki (schemat) powinien rozwiać wątpliwości:
PC0 - SCL
PC1 - SDA
_________________
http://www.piotr94.net21.pl/
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group