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

Kod w Bascom dla PCF8583 i AVR 90S2313 - impuls co 60 sekund na portach A1 i A2

zibi11 20 Sie 2006 11:01 4409 19
REKLAMA
  • #1 2933378
    zibi11
    Poziom 19  
    Posty: 537
    Pomógł: 1
    Ocena: 30
    Witajcie może koś pomoże w napisaniu kodu
    w bascomie na pcfa 8583 i procek avr 90s2313
    układ ma generować impusly co 60 sekund
    raz na jednym porcie (po 60m sekundach) np a1 po następnych 60 sekundach na drugim porcie np a2
    i tak w koło
    po 60 sekundach impuls jeden port a1( 2 sekundy impuls) następne po 60 sekundach impuls drugi port a2 (2 sekundyimpuls)
    i tak w koło
    pozdrawiam
  • REKLAMA
  • #2 2933489
    Press
    Poziom 24  
    Posty: 566
    Pomógł: 69
    Ocena: 40
    Wszystko fajnie, tylko po co do tego ten PCF?
  • #3 2933864
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    witam

    pcf8583 jest rzeczywiście nie potrzebny
    nie wiem w jakim języku ma być kod, ale podsyłam coś w bascomie, może się przyda ;)

    $regfile = "2313def.dat"
    $crystal = 4000000 'będzie dobrze liczył z kwarcem 4MHz
    Set Ddrb.0 'impulsy będą dostępne na nóżkach portb.0
    Set Ddrb.1 '... i portb.1
    Config Timer0 = Timer , Prescale = 256
    Timer0 = 131
    On Timer0 Tim
    Enable Interrupts
    Enable Timer0
    Start Timer0
    
    Dim A As Byte
    Dim Sekundy As Byte
    Dim Pin As Bit
    
    Do
    
    If Sekundy < 2 Then
    If Pin = 1 Then
    Set Portb.0
    Else
    Set Portb.1
    End If
    Else
    Reset Portb.0
    Reset Portb.1
    End If
    
    Loop
    End
    
    Tim:
    Timer0 = 131
    Incr A
    If A = 125 Then
    A = 0
    Incr Sekundy
    End If
    If Sekundy = 60 Then
    Sekundy = 0
    Pin = Not Pin
    End If
    Return
    


    :D
  • REKLAMA
  • #4 2933889
    zibi11
    Poziom 19  
    Posty: 537
    Pomógł: 1
    Ocena: 30
    chodzi o dokładnośc
    na licznikach robiłem i chodzą róznie
    a ja chce zroić zegar dokładny a nie bylejaki z tolerancją na dzień 5 minut
  • #5 2933990
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    ja robiłem wiele razy zegar na licznikach systemowych i jakoś nigdy nie miałem błędu 5 minut nawet na tydzień, co najwyżej pare sekund
    jeśli dobrze dobierzesz kwarc, prescaler i liczbę którą ładujesz do timera to będzie ok
    możesz dodatkowo podłączyć trymer do kwarcu i ustalić nim najlepszą prędkość taktowania :)

    a jak nadal upierasz się przy PCF8583 to proszę:

    $regfile = "2313def.dat"
    $crystal = 4000000                                          'dla 4MHz
    Set Ddrb.0                                                  'impulsy będą dostępne na nóżkach portb.0
    Set Ddrb.1                                                  '... i portb.1
    Config Scl = Portd.0
    Config Sda = Portd.1
    I2cinit
    On Int0 Pcf8583
    Enable Interrupts
    Enable Int0
    
    Dim Sekundy As Byte
    Dim Pin As Bit
    
    Do
    
    If Sekundy < 2 Then
    If Pin = 1 Then
    Set Portb.0
    Else
    Set Portb.1
    End If
    Else
    Reset Portb.0
    Reset Portb.1
    End If
    
    Loop
    End
    
    Pcf8583:
    I2cstart
    I2cwbyte 160                                                'zależy jak skonfigurowane piny adresowe
    I2cwbyte 2                                                  'komórka sekund
    I2cstart
    I2cwbyte 161                                                '^^^
    I2crbyte Sekundy , Nack
    I2cstop
    'Sekundy = Makedec(sekundy)                                  'tego nie musi być
    If Sekundy = 0 Then Pin = Not Pin
    Return
    


    nóżkę int0 pcf8583 (7) trzeba podłączyć do PD.2 w uC przez układ RC, ponieważ pcf8583 daje przebieg o częstotliwości 1Hz, wypełnienie 50%... a nie chcemy, żeby przerwanie było wywoływane co chwile przez te pół sekundy... :P
    można też sprawdzać co chwile czy są zmiany w rejestrach sekund pcf8583, ale to mało eleganckie
    można również zamiast układu RC odpowiednio napisać program... jednak chyba najlepszym wyjściem jest układ RC :)
    długość trwania stanu niskiego na nóżce PD.2 mikrokontrolera to około 5us (nawet mniej) przy kwarcu 12MHz wystarcza w zupełności, dla 4MHz też powinno iść, jeśli nie, trzeba będzie zwiększyć pojemność kondensatora lub wartośc opornika "4,7k"

    do pcf8583 też dobrze jest podłączyć trymer :D
    Załączniki:
    • Kod w Bascom dla PCF8583 i AVR 90S2313 - impuls co 60 sekund na portach A1 i A2 RC dla pcf8583.JPG (7.62 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 2934117
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Granat :) napisał:
    ...nóżkę int0 pcf8583 (7) trzeba podłączyć do PD.2 w uC przez układ RC, ponieważ pcf8583 daje przebieg o częstotliwości 1Hz, wypełnienie 50%... a nie chcemy, żeby przerwanie było wywoływane co chwile przez te pół sekundy... :P

    W takim przypadku , ustawiamy wyzwalanie zewnętrznego przerwania na jedno ze zboczy (opadające lub narastające) , a układem RC drapiemy sie po głowie :D

    Piotrek
  • #7 2934148
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    tak :D
    set ISC01 , procesor będzie reagował na zbocze opadające :)
    ale w 2051 trzeba rc zastosować...
  • REKLAMA
  • #8 2934237
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Granat :) napisał:
    tak :D
    set ISC01 , procesor będzie reagował na zbocze opadające :)
    ale w 2051 trzeba rc zastosować...

    Hmmmm .... nie ustąpię :D
    Do czego służą bity IT0 i IT1 , w rejestrze TCON :?:

    Piotrek
  • #9 2934331
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    czemu w nocie katalogowej atmela nic o tym rejestrze nie pisze (TCON) :(
    avr'y są lepiej opisane
    dokładnie nie wdawałem się w analizę rejestrów 2051 ale wydawało mi się, że nie ma on możliwości zaprogramowania na jakie zbocze ma reagować przerwanie :D
  • #10 2935639
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Granat :) napisał:
    czemu w nocie katalogowej atmela nic o tym rejestrze nie pisze (TCON) :(

    Bo 89cx051 , jest młodszym i mniejszym bratem 80(31)51 , więc w notach tych proców szukaj dokładnych opisów.W notach 89c1/2/4051 , opisano tylko różnice dzielące te proce od "protoplasty" :D
    Granat :) napisał:

    dokładnie nie wdawałem się w analizę rejestrów 2051 ale wydawało mi się, że nie ma on możliwości zaprogramowania na jakie zbocze ma reagować przerwanie :D

    I to było powodem tego , że niepotrzebnie "wykosztowałeś się" na RC ;)

    Piotrek
  • #11 2935747
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    ahaaa
    ale przynajmniej może ten układ się jeszcze przyda do innych rzeczy :D
  • #12 2937067
    zibi11
    Poziom 19  
    Posty: 537
    Pomógł: 1
    Ocena: 30
    podłączyć trymer do kwarcu
    przey kwarcu są dwa kondensatorki
    trymer zamiast jednego z nich???
    i oczywiście do masy mówimy o atmedze i o liczniku nie pcfie
    jaki jest wpływ tych kondensatorków na licznik???
  • REKLAMA
  • #13 2937125
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    jeden kondensator mniejszy i równolegle z nim trymer a drugi pozostaje bez zmian
    zmiana położenia trymera spowosuje lekką zmianę częstotliwości kwarcu i taktowania procesora. licznik w procesorze będzie pobierał impulsy właśnie z oscylatora kwarcowego
    mówimy o atmega...
    a może liczniki liczyły Ci źle bo korzystasz z wewnętrznego oscylatora RC, który nienadaje się do dokładnego odmierzania czasu i nie przestawiłeś fusebitów tak, żeby procesor działał na zewnętrznym kwarcu (w atmega nie wystarczy tylko podłączyć kwarc)? :)
  • #14 2937191
    zibi11
    Poziom 19  
    Posty: 537
    Pomógł: 1
    Ocena: 30
    dlaczego to nie działa a się nie zmienia???

    $regfile = "m8515.dat"

    $crystal = 8000000


    Config Pinb.0 = Output
    Config Pinb.4 = Output

    Config Sda = Portb.2 'konfiguracja sprzętowa I2C
    Config Scl = Portb.3 'konfiguracja sprzętowa I2C


    Dim Value1 As Byte
    Dim Valuehex As String * 2
    'deklaracja zmiennej określającej minuty
    Dim S As Byte 'deklaracja zmiennej określającej sekundy
    'Dim M As Byte 'deklaracja zmiennej określającej godziny
    Dim A As Byte
    Dim B As Byte
    Config Lcd = 24 * 2 'configure lcd screen

    Declare Sub Read_time()





    A = 0

    Do


    Call Read_time
    Home
    Lcd "Czas: " ; S ; " " ; A '; M
    Waitms 255
    Cls



    If A = 1 Then
    Portb.0 = 0
    Wait 2
    End If

    If A = 2 Then
    Portb.4 = 0
    Wait 2
    A = 0
    End If



    Loop
    End

    Sub Read_time()
    I2cstart
    I2cwbyte 160
    I2cwbyte 2
    I2cstart
    I2cwbyte 161
    I2crbyte S , Nack
    'I2crbyte M , Nack
    I2cstop
    Waitms 5
    S = Makedec(s)
    'M = Makedec(m)

    If S = 60 Then
    Incr A
    End If



    End Sub
  • #15 2937363
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    config scl = portb.3
    config sda = portb.2
    i2cinit
    ...
    ...
    ...
    i2cstart
    i2cwbyte 160 '162
    i2cwbyte 2
    i2cstart
    i2cwbyte 161 '163
    i2crbyte S , nack
    i2cstop
    '------------- opcja pierwsza
    s = makedec(s)
    cls
    lcd s 'wyświetlą się sekundy
    '------------- opcja druga
    cls
    lcd bcd(s) 'również poprawie wyświetlą się sekundy


    takie coś napewno działa
    nie zapominij, że linie scl i sda trzeba podciągnąć zewnętrznymi rezystorami do plusa (pullup).
  • #16 2938464
    zibi11
    Poziom 19  
    Posty: 537
    Pomógł: 1
    Ocena: 30
    ale incr A nie działa po 60 sekundach
    cały czas jest 0 ???
    a ma być po 60 1 120 2 ?????
    a jest 0
  • #17 2938483
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    incr nie działa bo nie spełniony jest warunek S = 60. pewnie dlatego, że czytasz co dwie sekundy zamiast częściej np. 750ms, układ robi odczyt i odczyta akurat 59s a potem odrazu odczyta 1 :P
  • #18 2938600
    zibi11
    Poziom 19  
    Posty: 537
    Pomógł: 1
    Ocena: 30
    nie czyta co 2 sekundy
    tylko jak spełni a=1 i a=2
    to tak czeka 2s ale zaraz wraca
  • #19 2938669
    Granat :)
    Poziom 34  
    Posty: 3043
    Pomógł: 202
    Ocena: 666
    a racja, nie zauważyłem :)
    sprawdź najpierw czy w ogóle komunikacja i2c działa i czy pcf8583 coś wysyła...
  • #20 2938824
    zibi11
    Poziom 19  
    Posty: 537
    Pomógł: 1
    Ocena: 30
    dziala widzi go pod adresami 160 i 161
    liczy na lcd widać 0-60 a A jest 0

Podsumowanie tematu

✨ Dyskusja dotyczy napisania kodu w Bascom dla mikrokontrolera AVR 90S2313 współpracującego z układem zegara czasu rzeczywistego PCF8583, który ma generować impuls co 60 sekund na przemian na portach A1 i A2 (portb.0 i portb.1). Autor wymaga dokładności pomiaru czasu, dlatego rozważa użycie PCF8583 zamiast samego licznika w mikrokontrolerze, który według niego ma zbyt dużą tolerancję. W odpowiedziach zaproponowano przykładowy kod Bascom wykorzystujący timer0 z prescalerem i przerwaniami do generowania impulsów o długości 2 sekund co 60 sekund na przemiennych portach. Podkreślono, że PCF8583 może być zbędny, jeśli dobrze skonfiguruje się kwarc i timer mikrokontrolera. Omówiono także konfigurację linii I2C (SCL, SDA) oraz konieczność stosowania rezystorów podciągających. Poruszono temat dokładności oscylatora kwarcowego, wpływu kondensatorów i trymera na stabilność częstotliwości oraz konieczności ustawienia fusebitów mikrokontrolera na zewnętrzny kwarc. Wskazano problemy z inkrementacją zmiennej w kodzie i możliwe błędy w odczycie sekund z PCF8583, sugerując częstsze odczyty niż co 2 sekundy, aby uniknąć pominięcia wartości 60. Dyskusja zawiera także uwagi dotyczące konfiguracji przerwań zewnętrznych i różnic w rejestrach mikrokontrolerów 8051 i AVR.
Wygenerowane przez model językowy.
REKLAMA