Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[BASCOM] Kwarc jak ustawić?

davu 24 Lis 2008 17:43 1947 11
  • #1 24 Lis 2008 17:43
    davu
    Poziom 10  

    Witam, napisałem program zegarka, ale nie jestem jeszcze pewien kilku rzeczy. Mianowicie mam zamiar użyć kwarcu zegarkowego 32,768kHz. Daje schemat:
    [BASCOM] Kwarc jak ustawić?

    Zdaje mi się, że jest on dobrze podłączony, ale jestem początkujący więc mogę się mylić. I nie wiem jak w bascomie zrobić żeby co sekundę mi zwiększało stan licznika. Może tak?:

    Code:
     Config Timer2 = Timer , Async = On , Prescale = 128


    W takim przypadku mi się kompiluje, ale wątpię czy to jest dobrze

    A może tak?:

    Code:
    Config Int0 = Timer , Prescale = 128


    W tym przypadku mi się nie kompiluje.
    A potem żeby ustalić nazwę daje
    On Int0 1s .

    2 Jak w przypadku gdy na schemacie nie ma jakiegoś kwarca dla procka ustawić jego częstotliwość? Może na początku dać?:
    Code:
    $crystal = 8000000


    Pozdrawiam davu (mam nadzieje że dobry dział).

    Przeniosłem do właściwego działu.
    [zumek]

    0 11
  • #2 24 Lis 2008 21:05
    zumek
    Poziom 39  

    Jeszcze jeden post o oscylatorze czy generatorze, a posypią się ostrzeżenia.

    davu napisał:
    Witam, napisałem program zegarka, ale nie jestem jeszcze pewien kilku rzeczy.

    No to pokaż wreszcie ten program, bo niby jak Ci mamy pomóc :?:

    0
  • #3 24 Lis 2008 21:52
    wader_669
    Poziom 28  

    robisz tak

    Code:

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

    Config Timer2 = Timer , Prescale = 256 , Async = On
    On Timer2 Odmierz_1s

    Enable Interrupts
    Enable Timer2

    Counter1 = 128

    Do
    Loop
    End

    Sub Wysw

    End Sub
    Wart_bcd = Makebcd(godziny)
    Wartosc = Bcd(wart_bcd)

    Wart_bcd = Makebcd(minuty)
    Wartosc = Bcd(wart_bcd)

    Wart_bcd = Makebcd(sekundy)
    Wartosc = Bcd(wart_bcd)

    Odmierz_1s:

    Counter1 = Counter1 + 128

    Incr Sekundy

    If Sekundy = 60 Then
       Sekundy = 0
       Incr Minuty

       If Minuty = 60 Then
          Minuty = 0
          Incr Godziny

          If Godziny = 23 Then
          Godziny = 0
          End If

       End If

    End If
    Return


    fusebity ustawiasz na wewnetrzny 8mhz

    kod sprawdzany u mnie dziala, jedynie czego nie wiem czy idealnie ustawilem timer ale wydaje mi sie ze tak bo:
    32768/256= 128 a timer2 jest 8bitowy czyli 256 (decymarnie razem z 0) i do tego wpisujemy wartosc poczatkowa do timera 128 czyli przepelnienie bedzie co sekunde, zgadza sie?

    0
  • #4 25 Lis 2008 20:50
    davu
    Poziom 10  

    Code:
    ' Zegar, termometr, budzik (przynajmniej takie mam założenie)
    
    $regfile = "m8def.dat"
    $crystal = 8000000


    Dim Sekjed As Byte : Dim Sekdzies As Byte : Dim Minjed As Byte
    Dim Mindzies As Byte : Dim Godzjed As Byte : Dim Godzdzies As Byte
    Dim Multi As Byte : Dim Miganie As Bit : Dim Wlaczeniebudzika As Bit
    Dim Ustawianie As Byte : Dim Trybustawianiabudzika As Bit : Dim Trybustawianiaczasu As Bit
    Dim Uniwers As Byte : Dim Maxi As Byte : Dim Minjedb As Byte
    Dim Mindziesb As Byte : Dim Godzjedb As Byte : Dim Godzdziesb As Byte
    Dim Alarm As Bit


    Dim Odczyttemp As Bit : Dim Ulamek As Byte : Dim Jednosci As Byte
    Dim Dziesiatki As Byte : Dim Tmp As Single : Dim Temp As Byte
    Dim Odczyt(2) As Byte : Dim T As Integer : Dim Liczba As Byte


    Config Portb = &B00111111
    Config Portc = &B0111110
    Config Portd = &B11111111

    Config 1wire = Pinc.0
      Config Timer2 = Timer , Async = On , Prescale = 128       'Config Int0 = Timer , Prescale = 128
    Config Timer0 = Timer , Prescale = 8
    Enable Interrupts
    Enable Int0
    Enable Timer0
    On Timer0 2ms
    On Int0 1s

    Sekjed = 0 : Sekdzies = 0 : Minjed = 0 : Mindzies = 0 : Godzjed = 0 : Godzdzies = 0
    Uniwers = 4 : Alarm = 0 : Wlaczeniebudzika = 0 : Trybustawianiabudzika = 0
    Trybustawianiaczasu = 0


    Do

    If Odczyttemp = 1 Then
    Disable Interrupts                                'odczytaj temperaturę

       1wreset                                        'reset
      1wwrite &HCC                                    'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                    'dokonaj konwersji
      Waitms 750                                      'przeczekaj czas konwersji
      1wreset                                         'reset
      1wwrite &HCC                                    'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                    'rozkaz funkcyjny - polecenie odczytu DS18x20





       Odczyt(1) = 1wread(2)
       T = Odczyt(2)
       Shift T , Left , 8
       T = T + Odczyt(1)
       Tmp = T / 16
       Liczba = Int(tmp)
       'oblicz ułamek
      Tmp = Frac(tmp)
      Tmp = Tmp * 10
      Ulamek = Int(tmp)

      Temp = Makebcd(liczba)
      Jednosci = Temp And &B00001111
      Shift Temp , Right , 4
      Dziesiatki = Temp

    Enable Interrupts
    End If

     Loop : End
    1s:
    Incr Sekjed

    Toggle Miganie
    Return

    If Pinb.2 = 0 Then
    Incr Ustawianie
    Else
    Ustawianie = 0
    End If

    If Wlaczeniebudzika = 1 Then
        If Godzdzies = Godzdziesb And Godzjed = Godzjedb And Mindzies = Mindziesb And Minjed = Minjedb Then
          Alarm = 1
    End If
        End If

     If Alarm = 1 Then                                'alarm gra 1 sek i nie gra 1 sek
       Toggle Portb.5
       Else
              Portb.5 = 1
    End If : Return

    2ms:

    If Pinb.4 = 0 Then
      Odczyttemp = 1
      Else
      Odczyttemp = 0
      End If

     If Pinb.0 = 1 And Pinb.1 = 1 Then
     Maxi = 100 : Uniwers = 4
     End If

         If Ustawianie = 0 Then
    Toggle Trybustawianiabudzika                      '  Wybieranie trybu ustawiania budzika po przytrzymaniu <1s
    End If

    If Ustawianie = 5 Then                            'Wybieranie ustawiania czasu po przytrzymaniu ok 5s
    Toggle Trybustawianiaczasu
    End If

    If Pinb.3 = 0 Then
       Toggle Wlaczeniebudzika
    End If



    If Trybustawianiabudzika = 1 Then
        If Pinb.0 = 0 Then
            Decr Uniwers
            End If
           If Uniwers = 0 Then
               Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
               End If                                 'coraz szybciej
            Incr Minjedb
             If Minjedb = 10 Then
                Minjedb = 0 : Incr Mindziesb
             End If
             If Mindziesb = 6 Then
                Mindziesb = 0 : Incr Godzjedb
             End If
             If Godzjedb = 10 Then
                Godzjedb = 0 : Incr Godzdziesb
             End If
             If Godzdziesb = 2 And Godzjedb = 4 Then
                Godzdziesb = 0 : Godzjedb = 0
             End If
         If Pinb.1 = 0 Then
            Decr Uniwers
            End If
           If Uniwers = 0 Then
               Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
               End If                                 'coraz szybciej
               Incr Godzjedb
               If Godzjedb = 10 Then
                Godzjedb = 0 : Incr Godzdziesb
                End If
              If Godzdziesb = 2 And Godzjedb = 4 Then
                Godzdziesb = 0 : Godzjedb = 0
              End If


    If Trybustawianiaczasu = 1 Then
     Miganie = 1

      If Pinb.0 = 0 Then
            Decr Uniwers
            End If
           If Uniwers = 0 Then
               Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
               End If                                 'coraz szybciej
            Incr Minjed : Sekjed = 0 : Sekdzies = 0
           End If
      If Pinb.1 = 0 Then
            Decr Uniwers
            End If
           If Uniwers = 0 Then
               Uniwers = Maxi : Maxi = Maxi - 8 : If Maxi < 8 Then Maxi = 8
               End If                                 'coraz szybciej
               Incr Godzjed

    End If


    If Miganie = 1 Then                               'Część o świeceniu diody
    Portc.5 = 0
    Else
    Portc.5 = 1
    End If

    If Sekjed = 10 Then                               'Procedury liczenia czasu
       Sekjed = 0 : Incr Sekdzies
    End If

    If Sekdzies = 6 Then
       Sekdzies = 0 : Incr Minjed
    End If

    If Minjed = 10 Then
       Minjed = 0 : Incr Mindzies
    End If

    If Mindzies = 6 Then
       Mindzies = 0 : Incr Godzjed
    End If

    If Godzjed = 10 Then
       Godzjed = 0 : Incr Godzdzies
    End If

    If Godzdzies = 2 And Godzjed = 4 Then
       Godzdzies = 0 : Godzjed = 0
    End If


    Incr Multi
    If Multi = 4 Then
       Multi = 0
    End If

    If Trybustawianiabudzika = 0 Then

    Portd = &B11111111

    Select Case Multi
    Case 0:
           Portd = Lookup(godzdzies , Tabela) : Portc.1 = 0
    Case 1:
           Portd = Lookup(godzjed , Tabela) : Portc.2 = 0
    Case 2:
           Portd = Lookup(mindzies , Tabela) : Portc.3 = 0
    Case 3:
           Portd = Lookup(minjed , Tabela) : If Wlaczeniebudzika = 1 Then Portd.4 = 0 : Portc.4 = 0
    End Select
    Else
     If Miganie = 1 Then
     Select Case Multi
    Case 0:
           Portd = Lookup(godzdziesb , Tabela) : Portc.1 = 0
    Case 1:
           Portd = Lookup(godzjedb , Tabela) : Portc.2 = 0
    Case 2:
           Portd = Lookup(mindziesb , Tabela) : Portc.3 = 0
    Case 3:
           Portd = Lookup(minjedb , Tabela) : If Wlaczeniebudzika = 1 Then Portd.4 = 0 : Portc.4 = 0
    End Select
    End If
    End If

    If Odczyttemp = 1 Then

      Select Case Multi
    Case 0:
           Portd = Lookup(godzdziesb , Tabela) : Portc.1 = 1
    Case 1:
           Portd = Lookup(dziesiatki , Tabela) : Portc.2 = 0
    Case 2:
           Portd = Lookup(jednosci , Tabela) : Portd.4 = 0 : Portc.3 = 0
    Case 3:
           Portd = Lookup(ulamek , Tabela) : Portc.4 = 0
    End Select
    End If : Return

    Tabela:
    Data &B00110000 , &B11111001 , &B01010010 , &B11010000 , &B10011001 , &B10010100 , &B00010100 , &B11110001 , &B00010000 , &B10010000


    Jeszcze zamieściłem w nim odczyt temperatury, ale nie wiem czy dobrze.


    A czy do programatora stk200 takiego jaki jest na allegro po 13zł to wystarczy podpiąć samą atmege czy trzeba robić jeszcze jakiś układ z oddzielnym zasilaniem i kwarcem? Bo jedni piszą że tak inni inaczej.

    0
  • #5 25 Lis 2008 21:13
    dawid512
    Poziom 32  

    Cytat:
    A czy do programatora stk200 takiego jaki jest na allegro po 13zł to wystarczy podpiąć samą atmege czy trzeba robić jeszcze jakiś układ z oddzielnym zasilaniem i kwarcem? Bo jedni piszą że tak inni inaczej.


    Oczywiście że musisz mieć układ z zasilaniem bo przecież programator też trzeba zasilić! Możesz skorzystać np. z zasilania z USB.

    0
  • #6 25 Lis 2008 23:05
    zumek
    Poziom 39  

    Poruszę tylko 2 sprawy:
    1)Jeżeli do odmierzania 1 s użyłeś Timer2 "napędzany" kwarcem 32768Hz , to po kiego grzyba procedurę odliczania sekund podkładasz pod przerwanie INT0 :?:

    Code:
    On Int0 1s

    Zamiast włączać przerwania INT0 , włącz przerwania Timer2.
    Code:

    On Timer2 1s
    Config Timer2 = Timer , Async = On , Prescale = 128
    Enable Time2
    '...


    2)Myślałem, że już widziałem wszystkie możliwe sposoby, na obliczanie temperatury DS18B20 - byłem w błędzie ... :|

    davu w kodzie napisał:

    '...
    1wwrite &HBE 'rozkaz funkcyjny - polecenie odczytu DS18x20

    Odczyt(1) = 1wread(2)
    T = Odczyt(2)
    Shift T , Left , 8
    T = T + Odczyt(1)
    Tmp = T / 16
    Liczba = Int(tmp)
    'oblicz ułamek
    Tmp = Frac(tmp)
    '...

    Frakcji jeszcze nie widziałem :-P

    0
  • #7 26 Lis 2008 00:32
    wader_669
    Poziom 28  

    zapodam kodem ktory znalazlem na forum!!!!! (nastpenym razem pierw uzyj opcji szukaj), tylko minimalnie przerobilem.

    Code:


    Config 1wire = Portd.6
    Dim Odczyt(2) As Byte , T As Integer At Odczyt(1) Overlay , T1 As Single , Napis As String * 5, Sprawdz As String * 5

    Do
    Sprawdz = Napis
      1wreset
      1wwrite &HCC
      1wwrite &H44
      Waitms 750
      1wreset
      1wwrite &HCC
      1wwrite &HBE
      Odczyt(1) = 1wread(2)

      T1 = T * 0.0625
      Napis = Fusing(t1 , "#.#")
    If Sprawdz <> Napis Then
      Cls
      Locate 1 , 1 : Lcd "temperatura"
      Locate 1 , 2 : Lcd Napis

    End If

    Loop

    0
  • #8 26 Lis 2008 16:40
    davu
    Poziom 10  

    Wader mi tu raczej chodzi o wyświetlacze led a to co dałeś to jest do lcd: Coś takiego:

    [BASCOM] Kwarc jak ustawić?

    zumek:

    1. Kurcze zapomniałem i to zmienić, dzięki.

    2. I tu jest problem, bo sam ten odczyt zdarłem z projektu innego użytkownika forum. Ale takie coś ma prawo działać?

    dawid512:

    A ten sprzedawca pisze że nie jest potrzebne żadne dodatkowe zasilanie:

    Code:
    Nie wymaga dodatkowego zasilania - pobiera je z układu docelowego!

    0
  • #9 26 Lis 2008 16:42
    dawid512
    Poziom 32  

    Bo o to zasilanie mi chodziło :P

    0
  • #10 26 Lis 2008 16:50
    davu
    Poziom 10  

    Aha, czyli nie trzeba specjalnie kombinować, wystarczy podłączyć atmegę co nie?

    0
  • Pomocny post
    #11 26 Lis 2008 17:36
    dawid512
    Poziom 32  

    Musisz zbudować sobie układ w którym atmege zasilasz napięciem stałym 5V. W tym układzie umieść złącze ISP 10 pinowe i podłącz do niego linie MISO, MOSI, RST, SCK oraz masę i zasilanie. Do wspomnianych wcześniej pinów podłączasz programator, dzięki czemu jest on stąd zasilany.

    0
  • #12 26 Lis 2008 18:03
    wader_669
    Poziom 28  

    davu napisał:
    Wader mi tu raczej chodzi o wyświetlacze led a to co dałeś to jest do lcd: Coś takiego:


    ja ci podalem jak poprawnie wyglada dziala odczyt tego czujnika. A jak ci nie pasuje ze jest na lcd, to sobie zmien.

    0