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

Czy to będzie działać??2x 1-wire plus at89C2051

10 Lip 2006 16:48 4036 32
  • Poziom 23  
    Witam związku że jest to mój pierwszys projekt na mikrokontrolerach(AT89C2051) związku z tym prosze o sprawdzenie poprawności i czy to wogóle będzie działać??Chodzi mi o prawidowe podłaczenie zwłąsza transmisji 1-wire do termometru oraz pastylki dallas a w szeczególności poprawności połączenia wyprowadzeń do wyświetlacza LCD 2x16 Sterownik zgodny z HD44780.za wszelkie techniczne sugestie i wychwycenie błedów będe wdzieczny...
    [3.12.2020, webinar] Zagadnienia pomiarowe w nowoczesnej inżynierii materiałowej. Zarejestruj się
  • Computer ControlsComputer Controls
  • Poziom 25  
    Brakuje ukladu resetu przy zalaczeniu zasilania - chocby najprostszego - RC.

    BF
  • Computer ControlsComputer Controls
  • Poziom 23  
    Dobra załadowałem nową wersje załącznika...NIe wiem czy o taki układ RC chodziło... kondensator 100nf a rezystor 10KΩ...Czy reszta płytki jest ok?? moge wytrawiać??
  • Poziom 23  
    OK dzięki...A tak po za tym reszta układu jest poprawna?? chodzi mi zwłaszcza o 1-wire
    I pytanie czy Buzzer mam wysterować bezpośrednio z portu mikrokontrolera czy lepiej przez tranzystor??
  • Pomocny post
    Poziom 16  
    Po pierwsze P1.0 (oraz P1.1)to wyjście typu OC i powinieneś podczepić tą nóżkę przez rezystor 4.7k do Vcc. Nie wiem co to za "pastylka" ale skoro czujnik temperatury 1-wire to pewnie coś z DS18... A w DS... zalecany jest właśnie rezystor 4.7k między Vcc a linią danych.

    Po drugie Buzzer chyba lepiej by było zasilić przez tranzystor jak wspomniałeś ale niech ktoś inny to potwierdzi bo ja nigdy nie miałem potrzeby jego stosowania :)

    No i po trzecie popraw ten układ resetu według rysunku Bigfoot'a

    Nie wiem co to za servo ale może dać tam do sterowania jakiś rezystor ograniczający.

    Pozdrawiam
  • Poziom 25  
    Tranzystor nie bedzie potrzebny dla buzzera piezo gdyz: The Port 3 output buffers can sink 20 mA

    Fakt, P1.0 i P1.1 potrzebuja pull-upow.

    Co do rezystora dla serwo to zalezy to juz od tego co dokladnie tam bedzie podlaczane - daj znac co to sie okresli cos wiecej.

    BF

    Dodano po 45 [sekundy]:

    No i ten reset oczywiscie.
  • Poziom 23  
    Witam ponownie i dziękuje za wszelkie rady poniżej zamieszczam poprawiony schemat tak jak radziliście dałem układ resetu a między linie 1-wire a VCC podpiołem rezystorem 4.7K...dodałem również układ PCF8582 ponieważ zapomniałem że mikrokontroler AT89C2051 nie posiada wew nieulotnej pamięcie eeprom i za każdym razem po zaniku napięcia trzeba było by odnowa wprowadzać pastyliki...bede wdzięczny jeżeli wychwycicie jakiś błąd...
  • Poziom 39  
    panmechanik napisał:
    ...bede wdzięczny jeżeli wychwycicie jakiś błąd...

    Brak zewnętrznych rezystorów podciągających do +VCC , obie linie magistrali I2C np. 4k7.

    Piotrek
  • Poziom 23  
    zumek napisał:
    panmechanik napisał:
    ...bede wdzięczny jeżeli wychwycicie jakiś błąd...

    Brak zewnętrznych rezystorów podciągających do +VCC , obie linie magistrali I2C np. 4k7.

    Piotrek

    Pytanie z czystej ciekawości...Po co sie podciaga linie I2C do VCC?? Nigdy sie z tym nie spotkałem...Z tego co widziałem na innych schematach linie I2C są bezpośrednio połączone...Czy to wpływa "jakoś" na prace układu??
  • Poziom 16  
    końcówka P1.0 też powinna być podciągnięta przez rezystor 4,7k do zasilania jeśli ją teraz użyłeś

    Pozdro.
  • Poziom 23  
    końcówka P 1.0 czyli wyprowadzenie 12 jest to sterowanie diodą LED z Adaptora Ibutton...
    I jeszcze jedno pytanie czy zamiast tradycyjnego resetu któy zaproponował użytkownik"bigfoot" można zastosować układ DS1813?? bo też spotkałem sie z takim rozwiązaniem...
  • Pomocny post
    Poziom 25  
    Oczywiscie, ze mozna - jest to rozwiazanie bardziej profesjonalene ale jednoczensnie drozsze.

    BF

    Dodano po 2 [minuty]:

    Acha - odpowiadajac na pytanie wczesniejsze - podciaga sie rezystorami linie wtedy gdy sa typu open collector (open drain) aby moc z nich wydobyc 5V lub by zwiekszyc ich wydajnosc pradowa.

    BF
  • Poziom 23  
    Dziękuje wszystkim za wszelkie rady poniżej zamieszczam ostateczny schemat poprawiony wg waszych porad...Gdybyście mieli jakieś rady lub wykryli błąd piszcie...Ja tymczasem zaczynam projektować płytke...
  • Poziom 16  
    Jeśli z P1.0 (końcówka 12) chcesz sterowac diodą to zrób inaczej - diode podepnij do plusa zasilania i do tej końcówki szeregowo przez rezystor ograniczający prąd (680Ω chyba starczy) -diodę będziesz włączał stanem niskim na P1.0.
    Natomiast P1.1, którym sterujesz 1-wire (końcówka 13) "podciągnij" do +5V przez rezystor 4,7k.

    Pomyliłeś sie i dałeś rezystor przy P3.7 zamiast przy P1.1 ale wcale on nie zaszkodzi chyba bo z tego co pamiętam przy czujnikach 1-wire typu DS... jest to zalecane
  • Poziom 17  
    Rzuca się w oczy kiepskie rozwiązanie sterowania przekaźnikiem
    W procku AT89C2015 nie da się wymusić zbyt dużego prądu
    z linii portu w stanie wysokim. Szeregowe połączenie rezystora
    w obwodzie bazy tranzystora Q2 z "rezystorem podciągającym" portu
    może wynieść ponad 13 kilomów. To może nie wystarczyć do
    pewnego nasycenia tranzystora, a tym samym załączenia przekaźnika.
    Rozwiązanie to jest kulawe jeszcze z jednego powodu:
    zawsze przy załączaniu zasilania, kiedy procesor jest w fazie resetu
    wszystkie linie portów są w stanie wysokim, więc będzie w tym czasie załączany przekaźnik
    Bardziej eleganckie jest wysterowywanie peryferiów stanem niskim
    na linii portu
  • Poziom 15  
    Kilka podpowiedzi z doświadczenia (zaprojektowałem kilka układów z AT89C2051, AT89C4051).
    Używać stanów niskich do sterowania urządzeń zewnętrznych (po włączeniu zasilania na wyjściach portów pojawia się stan wysoki i zanim ruszy ich programowa obsługa mogą wystąpić niepożądane efekty, chwilowe zadziałanie układów sterowanych przez procesor). Są to przedziały czasowe bardzo krótkie (lub dłuższe, zależą od składni i budowy programu).Bywa to denerwujące, a nawet potrafi uniemożliwić poprawne sterowanie urządzeń zewnętrznych. Jeżeli sterujemy stanem niskim najprościej użyć tranzystor PNP podłączony do portu przez opornik.
    Dobrym zwyczajem jest (jak radzą Koledzy w postach wyżej) podciąganie wyjść portów, także nieużywanych, opornikiem 4,7k do plusa. Wyjątkiem są urządzenia 1-wire. Podłączając cztery DS18B20 musiałem dać 1,5 k. Po prostu zasilanie magistrali 1-wire ma swoje wymagania, prąd zasilający urządzenia na niej umieszczone musi mieć odpowiednią wartość.
    Jeżeli "dallasy" nie będą w tym układzie zmieniane, ich kody dostępu najlepiej umieścić liniach programu DATA i program po jakimkolwiek restarcie systemu (zamierzonym lub nie-zanik zasilania) ma do nich bezproblemowy dostęp. Odpada dokładanie dodatkowej pamięci i jej obsługa w programie co wiąże się z jego długością.
    żYCZę POWODZENIA PRZY URUCHAMIANIU WSZYSTKIEGO, COKOLWIEK BY TO NIE BYłO.
  • Poziom 23  
    Dziękuje wszystkim za rady płytka już sie trawi jednak będzie to stara wersja czyli sterowanie tranzystora stanem wysokim... ale nie będzie to za bardzo przeszkadzać w pracy urządzenia...Może opowiem wszystkim o jego zastosowaniu...urządzenie będzie zamontowane w małej skrzynce w której będą znajdować sie bateria akumulatorowa router oraz modem...Wszystko zamknięte ryglami które będzie otwierał serwomechanizm...A autoryzacja dostępu będzie poprzez adapter Ibutton(pastylki)...pewnie zastanawiacie sie po co mi termometr oraz przekaźnik??skrzynka będzie zamontowana w kiosku(typowy blaszak) w zimie jest tak zimno że zamarza woda w toalecie ...Aby utrzymać akumulator w dobrym stanie gdy temperatura spadnie poniżej określonej temeperatury ma włączyć sie przekaźnik który uruchomi moduł grzewczy lub żarówke która podniesie temperature w skrzynce a tym samym akumulator będzie dłużej "żył" do tego wszystko będzie wyświetlane na LCD 2x16...Jak układ będzie działał poprawnie umieszcze wzór płyki oraz kod źródłowy
  • Poziom 23  
    Czy ktoś mógłby mi powiedzieć co jest nie tak?? wyskakuje mi błąd Out of internal memory In file przy Dim Od(9) As Byte
    Cytat:

    Declare Sub Write_eeprom(adres As Byte , Value As Byte)
    Declare Sub Read_eeprom(adres As Byte , Value As Byte)
    Declare Sub Greenlong
    Declare Sub Greenshort
    Declare Sub Beep
    declare SUB beep_2
    Declare Sub Servo_on
    Declare Sub Servo_off
    Dim Addressw As Const 160
    Dim Addressr As Const 161
    Dim B1 As Byte , Adres As Byte , Value As Byte
    Dim Flag1 As Bit
    Dim Flag2 As Bit
    Dim Flag3 As Bit
    Dim Flag4 As Bit
    Dim X As Integer , Ss As String * 6
    Dim T As Byte
    Dim Q As Byte
    Dim Licznik As Byte
    Dim S As Single
    Dim Ver As Bit
    Config 1wire = P1.0 , P3.7
    Dim Ar(9) As Byte , A As Byte , I As Byte
    Dim Od(9) As Byte
    Dim R As Byte
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    Reset P1.1 : Reset P1.2 : Reset P3.0
    Set P1.6 : Set P3.4 : Set P1.7

    If P3.4 = 0 Then
    Gosub Rejestracja
    End If

    Main:
    Do
    1wreset
    If Err = 1 Then
    Call Greenshort
    Wait 1
    Else
    Gosub Weryfikacja
    End If
    cls
    do
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Waitms 800
    1wreset
    1wwrite &HCC
    1wwrite &HBE
    X = 1wread(2)
    X = X * 10
    X = X / 16
    Ss = Str(i)
    Ss = Format(ss , " 0.0")
    Locate 1 , 1
    Lcd "Temp:" ; Ss ; Chr(0) ; "C"

    Loop
  • Pomocny post
    Poziom 39  
    Przydzieliłeś kompilatorowi za mało RAM-u.Options->Compiler->Misc->Byte End ustaw na 7F i po kłopocie.

    Piotrek
  • Poziom 23  
    Super dzięki poszło...Ale teraz wyskakuje mi błąd przy
    Code:
    Ss = Format(ss , "  0.0")
    pisze"wrong type(bit,byte,integer..."Dlaczego?? Chciałbym zaznaczyć zę jest to mój pierwszy program...Wcześniej na mikrokontrolerach nie działałem...Teraz próbuje przenieść moją wiedze teoretyczną na praktyczną ale coś nie wychodzi...Wszystko sie kompilowało dopóki nie dołożyłem podprogramu mierzenia temperatury
  • Pomocny post
    Poziom 39  
    Bascom8051 , nie ma funkcji Format.

    Piotrek

    PS
    Włącz podświetlanie składni.
  • Poziom 23  
    Witam poniżej daje pełny kod źródłwy mam pytanie jak zrobić aby np poniżesz temperatury 10 stopni wywoływał usawiał wyjście P3.4 w stan wysoki dopóki temperatura nie wzrośnie do 20 stopni...
    Code:
    Declare Sub Write_eeprom(adres As Byte , Value As Byte)
    
    Declare Sub Read_eeprom(adres As Byte , Value As Byte)
    Declare Sub Greenlong
    Declare Sub Greenshort
    Declare Sub Beep
    declare SUB beep_2
    Declare Sub Servo_on
    Declare Sub Servo_off
    Dim Addressw As Const 160
    Dim Addressr As Const 161
    Dim B1 As Byte , Adres As Byte , Value As Byte
    Dim Flag1 As Bit
    Dim Flag2 As Bit
    Dim Flag3 As Bit
    Dim Flag4 As Bit

    Dim T As Byte
    Dim Q As Byte
    Dim Licznik As Byte
    Dim Ver As Bit
    Config 1wire = P1.0 , P3.7
    Dim Ar(9) As Byte , A As Byte , I As Byte
    Dim Od(9) As Byte
    Dim R As Byte
     Dim X As integer , Ss As String * 6
    Dim S As single
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32

    Cursor Off

    Reset P1.1 : Reset P1.2 : Reset P3.0
    Set P1.6 : Set P3.4 : Set P1.7

    If P3.4 = 0 Then
    Gosub Rejestracja
    End If

    Main:


    Do

          cls
            lcd "Zamek szyfrowy"
           lowerline
           lcd "czekam na klucz"
           wait 2
           cls


    1wreset
    If Err = 1 Then
    Call Greenshort
    Wait 1
    Else
    Gosub Weryfikacja
    End If
          1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 800
       1wreset
       1wwrite &HCC
       1wwrite &HBE
       X = 1wread(2)
       X = X * 10
       X = X / 16
                  If X > 200 Then Reset P3.4
       If X < 100 Then Set P3.4
       Ss = Str(i)

             Lcd "Temp:" ; Ss ; Chr(0) ; "C"
             wait 2


    Loop


    Rejestracja:
    Licznik = 1
    Do
    1wreset
    If Err = 1 Then
    Call beep_2
    Wait 1
    End If
    If Err = 0 Then
    Call Beep
    Gosub Odczyt

    Wait 1
    End If

    If Licznik > 79 Then
    Call Greenlong
    For Q = 1 To 5
    Call Beep
    Next Q
    Exit Do
    Return
    End If

    Loop

    Odczyt:
    Waitms 50
    1wreset
    If Err = 1 Then
    Return
    End If
    1wwrite &H33
    For I = 1 To 8
      Ar(i) = 1wread() :
        Next I
    I = 0
    For I = 1 To 8
    Call Write_eeprom(licznik , Ar(i) )
    Incr Licznik
    Next I
    Call Greenshort
    Call Beep
    Return

    Weryfikacja:
    Set P1.6
    If P1.6 = 0 Then
    Flag3 = 0
    Else
    Flag3 = 1
    End If
    Waitms 50
    1wreset
    If Err = 1 Then
    Return
    End If

    1wwrite &H33
    For I = 1 To 8
      Ar(i) = 1wread()
        Next I
    Call Beep
    Licznik = 1
    For R = 1 To 10
    For I = 1 To 8
    Call Read_eeprom(licznik , Value)
    If Value = Ar(i) Then
    Flag1 = 1
    Else
    Flag1 = 0
    End If
    Incr Licznik
    Next I
    If Flag1 = 1 Then
    If Flag3 = 1 Then
    Gosub Otw
    Return
    End If
    End If
    If Flag1 = 1 Then
    If Flag3 = 0 Then
    Gosub Flip
    Return
    End If
    End If

    Next R

    Call Beep
    Call Beep
    Call Beep
    Call Beep
    Call beep_2
    Return


    Sub Write_eeprom(adres As Byte , Value As Byte)
        I2cstart                                                  'start condition
        I2cwbyte Addressw                                         'slave address
        I2cwbyte Adres                                            'asdress of EEPROM
        I2cwbyte Value                                            'value to write
        I2cstop                                                   'stop condition
        For R = 1 To 10 : Waitms 1 : Next R                       'wait for 10 milliseconds
    End Sub



    Sub Read_eeprom(adres As Byte , Value As Byte)
       I2cstart                                                   'generate start
       I2cwbyte Addressw                                          'slave adsress
       I2cwbyte Adres                                             'address of EEPROM
       I2cstart                                                   'repeated start
       I2cwbyte Addressr                                          'slave address (read)
       I2crbyte Value , 9                                         'read byte
       I2cstop                                                    'generate stop
    End Sub

    Sub Greenlong
    Set P1.1
    Wait 2

    Reset P1.1
    End Sub

    sub beep_2
    set P3.3
    waitms 50
    reset P3.3
    set P3.3
    waitms 50
    reset P3.3
    end sub

    Sub Greenshort
    Set P1.1
    For R = 1 To 100
    Waitms 1
    Next R
    Reset P1.1
    End Sub

    Sub Beep
    Reset P1.7
    Waitms 200
    Set P1.7
    Waitms 200
    End Sub

    Sub Servo_on
    For R = 1 To 100
    Set P3.5
    Waitms 1
    Reset P3.5
    For T = 1 To 10
    Waitms 1
    Next T
    Next R
    End Sub

    Sub Servo_off
    For R = 1 To 100
    Set P3.5
    Waitms 3
    Reset P3.5
    For T = 1 To 10
    Waitms 1
    Next T
    Next R
    End Sub

    Otw:
    Call Beep
    Call Beep

    Call Servo_on
    Flag2 = 1
    For Q = 1 To 20
    Call beep_2
    wait 1
    Next Q
    Call Servo_off
    Return

    Flip:
    If Flag4 = 0 Then
    Flag4 = 1
    Goto Ot2
    End If
    If Flag4 = 1 Then
    Flag4 = 0
    Goto Zam2
    End If
    Return

    Ot2:
    Call Servo_off
    Goto Main
    Zam2:
    Call Servo_on
    Goto Main
  • Pomocny post
    Poziom 39  
    panmechanik napisał:
    ... mam pytanie jak zrobić aby np poniżesz temperatury 10 stopni wywoływał usawiał wyjście P3.4 w stan wysoki dopóki temperatura nie wzrośnie do 20 stopni...

    Code:

       X = 1wread(2)
       X = X * 10
       X = X / 16
       If X>200 Then Reset P3.4
       If X<100 Then Set P3.4
    ...

    Piotrek
  • Poziom 23  
    Witam i dziękuje...Ale chyba wpadłem jak śliwka w kompot...mam demo programu Bascom w którym plik nie może bieć wiecej niż 2kb...A ten właśnie ma wiecej...Będe musiał zastąpić układ At89C2051 układem At89C4051 lub zoptymalizować kod(raczej odpada z powodu małej znajomości Bascoma...)Czy ktoś ma pełną wersje Bascoma i wyprowadził by mi plik Hex do At89C4051??
  • Poziom 19  
    Z tym ograniczeniem bascoma to są numery. Jak pierwszy raz zainstalowałem bascoma to działało, a ostatnio kompilowałem kod który miał prawie 4kB i nic się nie odzywało :) (ograniczenie)

    Pozdrawiam
  • Pomocny post
    Poziom 39  
    To jest info o najnowszej wersji , więc panmechanik głowa do góry ;)
    BASCOM-8051 DEMO.
    This 2.0.12.0 DEMO can generate 4KB of code. Great for a 89C4051 micro !
    Last update 24 May 2006. Fixes some small problems and adds NOI support. (noice)


    Piotrek
  • Poziom 23  
    Witam już zainstalowałem nową wersje...jednak wyskakuje mi 2 błędy typu:
    -call outside 2048 use $large to compile this program
    -oraz label not found [.zam2] in file
    Czy ktoś wie jak rozwiąać ten problem
    może w niewłaściwym miejscu dałem
    Code:
    If X > 200 Then Reset P3.4
    
       If X < 100 Then Set P3.4
    ??
  • Pomocny post
    Poziom 11  
    panmechanik napisał:
    Witam już zainstalowałem nową wersje...jednak wyskakuje mi 2 błędy typu:
    -call outside 2048 use $large to compile this program


    Musisz na początku programu napisać linijkę

    $large

    Tak aby kompilator wiedział, że ma większy obszar adresowania pamięci.
  • Poziom 23  
    :) wreszcie program sie kompiluje wiec czas zacząc lutować płytke...Dziękuje wam wszystkim za pomoc..oczywiście podziele sie wynikami mojej pracy jak skończe...