Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Termometr Dwu punktowy piszemy program.

_Karek_ 07 May 2008 20:38 4595 32
  • #1
    _Karek_
    Level 15  
    Witam,
    piszę program termometru dwu punktowego i proszę o małą pomoc.
    W Bascom jestem słaby na razie mam to:
    $regfile = "m8def.dat"                                      
    $crystal = 4000000                                         
    Config Lcd = 16 * 2                                        
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0    'piny lcd-atmega
    Config Timer0 = Timer , Prescale = 1024     
                                          
    Cursor Off                                                  
    Cls                                                         
    Lcd " Witaj " ;                                
    Lowerline
    Wait 2
    Lcd "Sterownik by Kark"
    Wait 5
    Cls
    
    Mig:                                                        
    Incr Przep                                                 
    If Przep = 25 Then                  ' tu ma migac dioda podpięta do 28 nózki procka                                     
    Przep = 0                                                  
    Portc.5 = 0                                              
    Waitms 100                                               
    Portc.5 = 1                                              
    End If                                                     
    
    Return  
    
    If PC.3 Then                    'tu ma byc czunik numer jeden i przed wynikiem temperatury napis Przed    (czujniki fimry Dalas   DS1820)             
    Locate 1 , 1
    Lcd Odczyt czunika
    End If
    Wait 2
    
    If PC.4  Then                   ' tu ma byc czunik numer dwa i przed wynikiem temperatury napis Za              
    Locate 1 , 1
    Lcd Odczyt czunika
    End If
    Wait 2   
    
                 'i jeszce mam reset podłączony do pinu 1 reset    ale jaka procedurka?     

    Jeszce cieszył bym się gdybyście napisali co mam źle i Zasilanie one ( czujniki DS)mają bezpośrednie 5volt? i szyna danych 4,7k do vcc?
  • #2
    mirekk36
    Level 42  
    _Karek_ wrote:

    Jeszce cieszył bym się gdybyście napisali co mam źle i Zasilanie one ( czujniki DS)mają bezpośrednie 5volt? i szyna danych 4,7k do vcc?


    ... ja tak się zastanawiam, w jakim języku ty piszesz, bo to co widać powyżej to ani po niemiecku, ani po rosyjsku, ani to w Delphi ani w HTML, ani po śląsku ..... najszybciej przypomina mi to skrzyżowanie czeskiego z narzeczem suachili z płd. Afryki (a po tym jak piszesz, też widać ile masz szacunku do ludzi, którym zadajesz pytania)

    .... gdybym nie widział kilku twoich poprzednich postów (dotyczących wbrew pozorom wciąż tego samego), które z hukiem wylądowały w koszu to byłbym bardzo zdezorientowany tym nowym postem. A mówiłem, że będzie jak w filmie "Dzień świstaka"

    ale do rzeczy, bo nie chcę się czepiać .... jednak to co nazywasz swoim "kodem" (chociaż to obraza dla kodu) - to poprostu zlepek tak na szybkiego jakichś bzdur.... gdybym więc miał krótko odpowiedzieć na pierwszą część twojego chińskiego pytania, bo jeszcze może ją jakoś rozumiem:

    _Karek_ wrote:

    Jeszce cieszył bym się gdybyście napisali co mam źle


    to odpowiedziałbym, że masz WSZYSTKO ŹLE - czy ta odpowiedź ciebie satysfakcjonuje? to co odstawiłeś w tym swoim kodzie to groch z kapustą, widać, że nadal z uporem maniaka - nie chce ci się za grosz chociaż spróbować nauczyć się tego za co chcesz się tak dumnie zabrać - zgroza

    ... jeśli jednak to naprawdę, próba nauki to:

    $regfile = "m8def.dat"                                      
    $crystal = 4000000                                          
    Config Lcd = 16 * 2                                        
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0    'piny lcd-atmega 
    Config Timer0 = Timer , Prescale = 1024      
                                          
    Cursor Off                                                  
    Cls                                                          
    Lcd " Witaj " ;                                
    Lowerline 
    Wait 2 
    Lcd "Sterownik by Kark" 
    Wait 5 
    Cls 


    do tego momentu, twój jak się domyślam przepisany kod - wygląda poprawnie o tyle, że na wyświetlaczu LCD wyświetli się to co zamierzasz, jednak dalej to - już twoja radosna twórczość świadcząca, że liczysz na drapane....

    weź chłopie się za jakąś książkę o Bascomie, albo zassaj kurs Bascoma z edw.pl .... i poćwicz najpierw proste rzeczy - wtedy popytaj a nie zachowujesz się jak 5-cio letnie dziecko, któremu dano do zabawy karabin maszynowy.

    .... poczytaj i dowiedz się co to jest pętla główna programu, co to są funkcje i procedury, jak się je deklaruje. Zacznij ćwiczenia od prostego zapalania i gaszenia diody LED lub czegoś podobnego. Zapewniam cię, że to wcale nie jest takie trudne. Ty za to masz ogromny upór więc tym bardziej byś się tego nauczył a narazie to wykorzystujesz go nie w tę stronę co potrzeba.

    ..... sorry ale przy tak postawionym problemie, i tak zadanym pytaniu - stawiam konia z rzędem temu kto w jednym poście nawet jeśli by bardzo chciał to mógłby rozwiązać cały twój problem, którego tak naprawdę nie ujawniłeś i nie powiedziałeś co chciałbyś uzyskać i o co ci dokładnie chodzi

    nie mniej jednak widzę, że próbujesz jakieś postępy robić - to miłe

    pozdr
  • #4
    _Karek_
    Level 15  
    Tan kod pierwszy napisałem sam bo ten początek umiem sam zrobic a to dalej nie, nie możecie mi poporawic i dopisac tych czterech funkcji.
    Mig:                                                       
    Incr Przep                                                 
    If Przep = 25 Then                  ' tu ma migac dioda podpięta do 28 nózki procka                                     
    Przep = 0                                                 
    Portc.5 = 0                                             
    Waitms 100                                               
    Portc.5 = 1                                             
    End If                                                     
    
    Return 
    
    If PC.3 Then                    'tu ma byc czunik numer jeden i przed wynikiem temperatury napis Przed    (czujniki fimry Dalas   DS1820)             
    Locate 1 , 1
    Lcd Odczyt czunika
    End If
    Wait 2
    
    If PC.4  Then                   ' tu ma byc czunik numer dwa i przed       
    Locate 1 , 1
    Lcd Odczyt czunika
    End If
    Wait 2   
    
                 'i jeszce mam reset podłączony do pinu 1 reset    ale jaka procedurka?    
  • #5
    grysek
    Level 19  
    _Karek_ opisz dokładniej co ma robić twoje urządzenie a najlepiej pokaż schemat
  • #6
    redart
    Level 23  
    JmL(TM) wrote:
    Czy kolega redart podzieli sie z innymi wspomnianym plikiem pdf? ;)


    JmL(TM):
    Tak.
    Wrzuciłem na prv.

    Ze względu na rozmiar pliku i jeszcze jedną okoliczność (o której nie napiszę :wink: ) - nie zamieszczę tego dokumentu jako pliku do pobrania.
    Pzdr.
    redart
  • #7
    _Karek_
    Level 15  
    Quote:
    ciężko tu polemizować nawet z kolegą - bo ni jak nie idzie zrozumieć twojego czesko-chińskiego języka , przeplatanego wydaje się, językiem polskim, za to okraszonego rzęsiście ohydnymi błedziskami ortograficznymi
    Chyba masz braki w nauczaniu, chyba nie widziałeś chińskiego lub czeskiego.

    .... no szkoda, że cię wujek opuścił, ale skoro jednak tamten program przerobiłeś na swoje (czytaj wujka) potrzeby i się skompilował to nie powinieneś mieć problemu z tym co tu wypisujesz.
    Wujek mnie nie opuścił
    Quote:

    ale podejrzewam, że ten program dla wujka się prędzej SKO-MPLIK-OWAŁ niż skompilował
    Skompilował się ale inny.
    jak zwykle twój temat nadaje się już tylko do kosza - tzn takie jest moje subiektywne odczucie
    Dał mi Oślą Łączkę Mikroprocesorową
    Wydukałem kod za pomocą oślej łączki tylko jeszcze nie wiem jak dodac reset na pin1.
    Ok ale najpierw prosił bym o Sprawdzenie kodu i ewentualne poprawki.
    A co do działania Program ma mierzyc Temperatury z dwóch miejsc Różnych.
    Ekran startowy Witaj linia niżej Termometr by Karek a potem normalna praca programu (termometrów) + reset z pinu 1.
    $regfile = "m8def.dat"                                      
    $crystal = 4000000                                         
    Config Lcd = 16 * 2                                        
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0    'piny lcd-atmega
    Config Timer0 = Timer , Prescale = 1024     
                                          
    Cursor Off                                                  
    Cls                                                         
    Lcd " Witaj " ;                                
    Lowerline
    Wait 2
    Lcd "Termometr by Kark"
    Wait 5
    Cls
    
    config 1wire - Portc.4 : Dim Odczyt(2) As Byte , A As Byte ,
    Dim Licznik As Byte , T As Integer
    Do Inor Licznik
    1wreset : 1wwrite &HCC : 1wwrite $HBE
    Odczyt(1) = 2read(2)
    T = Odczyt(2)
    Shift t ,Left 8
    T = T + odczyt(1)
    Shift T, Right , 4
    Cls : Lcd "Wyjście-" : T : "oC"
    LowerLine : Lcd Licznik
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    Loop
    
    config 1wire - Portc.3 : Dim Odczyt(2) As Byte , A As Byte ,
    Dim Licznik As Byte , T As Integer
    Do Inor Licznik
    1wreset : 1wwrite &HCC : 1wwrite $HBE
    Odczyt(1) = 2read(2)
    T = Odczyt(2)
    Shift t ,Left 8
    T = T + odczyt(1)
    Shift T, Right , 4
    Cls : Lcd "Wejście-" : T : "oC"
    LowerLine : Lcd Licznik
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    Loop

    aa i jeszcze pin 28 migająca led.
    a co do resetu To jak pin 1 złączy się z masą to jest restart? nie mylę się?:D
  • #8
    grysek
    Level 19  
    Tak podpina się do masy i wtedy się resetuje

    pokaż mi jeszcze schemat układziku
  • #10
    _Karek_
    Level 15  
    Schemat hmm
    Normalnie nie mam go
    Lcd masz podłączone tak jak masz w programie czujniki sygnał do środkowej nóżki czujnika i normalnie zasilanie czujników i od sygnału podciągnięcie 4,7k do vcc
    Program się nie kompiluje
    A dioda led podłączona Minusem do Układu przez opornik 1k
    Wydaje mi się że
    If Portc.5 = 0 Then 
    To będzie cały czas świecic?
    Poprawiony Program to co podał Balu:
    $regfile = "m8def.dat"                                      
    $crystal = 4000000                                         
    Config Lcd = 16 * 2                                        
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0    'piny lcd-atmega
    Config Timer0 = Timer , Prescale = 1024     
                                          
    Cursor Off                                                  
    Cls                                                         
    Lcd " Witaj " ;                                
    Lowerline
    Wait 2
    Lcd "Sterownik by Kark"
    Wait 5
    Cls
    
    config 1wire - Portc.4 : Dim Odczyt(2) As Byte , A As Byte ,
    Dim Licznik As Byte , T As Integer
    Do Inor Licznik
    1wreset : 1wwrite &HCC : 1wwrite $HBE
    Odczyt(1) = 2read(2)
    T = Odczyt(2)
    Shift t ,Left 8
    T = T + odczyt(1)
    Shift T, Right , 4
    Cls : Lcd "Wyjście-" : T : "oC"
    LowerLine : Lcd Licznik
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    Loop
    
    config 1wire - Portc.3  : Dim Odczyt(2) As Byte , A As Byte ,
    Dim Licznik As Byte , T As Integer
    Do Inor Licznik
    1wreset : 1wwrite &HCC : 1wwrite $HBE
    Odczyt(1) = 2read(2)
    T = Odczyt(2)
    Shift t ,Left 8
    T = T + odczyt(1)
    Shift T, Right , 4
    Cls : Lcd "Wejście-" : T : "oC"
    LowerLine : Lcd Licznik
    1wreset
    1wwrite &HCC
    1wwrite &H44
    Wait 1
    Loop
  • #11
    grysek
    Level 19  
    D których pinów procesora masz podpięte czujniki??
  • #12
    _Karek_
    Level 15  
    27 i 26 a 28 to dioda tzn będe miał bo to na razie tylko mój schemat w głowie.
  • #13
    grysek
    Level 19  
    Według mnie to procedura odczytu powinna wyglądać tak
    Odczyt_1czujnik:
     Config 1wire = Portc.3
     1wreset
     Temp = 1wread
     Upperline
     Lcd Temp ; "'C"
    
    Odczyt_2czujnik:
     Config 1wire = Portc.4
     Iwreset
     Temp1 = 1wread
     Lowerline
     Lcd Temp1 ; "'C"


    lecz moge się mylić bo nigdy nie używałem 1wire
  • #14
    _Karek_
    Level 15  
    Czyli Poprawny Kod będzie wyglądac tak?
    I nie wiem czy Procedurę Diody dopisałem dobrze?
    $regfile = "m8def.dat"                                      
    $crystal = 4000000                                         
    Config Lcd = 16 * 2                                        
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0    'piny lcd-atmega
    Config Timer0 = Timer , Prescale = 1024     
                                          
    Cursor Off                                                  
    Cls                                                         
    Lcd " Witaj " ;                                
    Lowerline
    Wait 2
    Lcd "Sterownik by Kark"
    Wait 5
    Cls
    
    Odczyt_1czujnik:                               'Odczyt z czujnika Pierwszego
     Config 1wire = Portc.3
     1wreset
     Temp = 1wread
     Upperline
     Lcd Temp ; "'C"
    
    Odczyt_2czujnik:
     Config 1wire = Portc.4                           'Odczyt z czujnika drugiego
     Iwreset
     Temp1 = 1wread
     Lowerline
     Lcd Temp1 ; "'C"
    
    
    If Portc.5 - 1 Then                          'Miganie Diody Led 28pin Atmegi8
    Wait 1
    If Portc.5 - 0 Then
    Wait 1
    If Portc.5 - 1 Then
    
    Loop
    

    A może diodę można tak podłączyc
    Dioda_1 Alias Portc.5
    Go:
    Dioda_1 = 1
    Wait 1
    Dioda_1 = 0
    Wait 1
    Dioda_1 = 1
    Wait 1
    
    Loop

    Teraz czytałem wypowiedz mirka drug raz i wywnioskowałem z jego przekręcenia mojej wypowiedzi .
    Quote:
    .. no napiszcie mi - bo ja sam się nie będę uczył, nie mam czasu a nikomu nie zapłacę za to bo robię to dla dobrego wujka, który skasuje za to 50.000 zł

    Ja nie dostanę za to nic wujek tyle kasuje za maszynę jak sprzeda.
  • #15
    JmL(TM)
    Level 24  
    Powiedz mi czemu sluzy ten fragment kodu w twoim termometrze?

    Config Timer0 = Timer , Prescale = 1024


    Poza tym zastanow sie dlaczego w petli kazdorazowo konfigurujesz magistrale 1-wire?

    Odczyt_1czujnik:
    Config 1wire = Portc.3     <<<<TUTAJ!!!>>>>
     1wreset
     Temp = 1wread
     Upperline
     Lcd Temp ; "'C" 


    A tak na marginesie to jak pisalem... gdybys przeszukal forum znalazlbys "moj" gotowy kod obslugi 2 czujnikow DS1820.
  • #16
    _Karek_
    Level 15  
    Czyli prawidłowy kod to:
    $regfile = "m8def.dat"                                     
    $crystal = 4000000                                         
    Config Lcd = 16 * 2                                       
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0    'piny lcd-atmega
                                         
    Cursor Off                                                 
    Cls                                                         
    Lcd " Witaj " ;                               
    Lowerline
    Wait 2
    Lcd "Sterownik by Kark"
    Wait 5
    Cls
    
    Odczyt_1czujnik:
    Config 1wire = Portc.3   
     1wreset
     Temp = 1wread
     Upperline
     Lcd Temp ; "'C"
    
    
    Odczyt_2czujnik:
    Config 1wire = Portc.3     
     1wreset
     Temp = 1wread
     Upperline
     Lcd Temp ; "'C"
    
    
    If Portc.5 - 1 Then                          'Miganie Diody Led 28pin Atmegi8
    Wait 1
    If Portc.5 - 0 Then
    Wait 1
    If Portc.5 - 1 Then
    
    Loop 

    I czy miganie diody ruszy?

    Dodano po 1 [minuty]:

    I jak kompiluję to błąd
  • #18
    crazy_phisic
    VIP Meritorious for electroda.pl
    Powoli męczące robią się "utarczki" słowne, posty powędrowały do kosza. Kolejnej czystki nie będzie, dodatkowo nagrodzę (bez wyjątku) ostrzeżeniami.
  • #20
    grysek
    Level 19  
    Po pierwsze zamiast "-" wstaw "=" bo czegoś takiego niema jak napisałeś...

    Po drugie miganie diody wystarczy napisać

    
    Portc.5 = 0
    wait 1
    portc.5 = 1
    wait 1


    a skoro już chcesz na warunkach to:

    If portc.5 = 0 then
     Portc.5 = 1
     else
     Portc.5 = 0
    endif
    Wait 1


    Pamiętaj że na początku musiż ustawić portc.5 = output

    po trzecie czemu w podprogramie Odczyt_2czujnik masz ustawione takie same wartości co w Odczyt_1czujnik w poleceniu config 1wire

    a po czwarte zaglądnij do helpu tam jest wszystko dokładnie opisane :D
  • #21
    _Karek_
    Level 15  
    Czy teraz mam dobrze?
    $regfile = "m8def.dat"                                      
    $crystal = 4000000                                         
    Config Lcd = 16 * 2                                        
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0    'piny lcd-atmega
    Config Pinc.5 = output   
                                          
    Cursor Off                                                  
    Cls                                                         
    Lcd " Witaj " ;                                
    Lowerline
    Wait 2
    Lcd "Sterownik by Kark"
    Wait 5
    Cls
    
    Odczyt_1czujnik:                               'Odczyt z czujnika Pierwszego
     Config 1wire = Portc.3
     1wreset
     Temp = 1wread
     Upperline
     Lcd Temp ; "'C"
    
    Odczyt_2czujnik:
     Config 1wire = Portc.4                           'Odczyt z czujnika drugiego
     Iwreset
     Temp1 = 1wread
     Lowerline
     Lcd Temp1 ; "'C"
    
    
    If portc.5 = 0 then
     Portc.5 = 1
     else
     Portc.5 = 0
    endif
    Wait 1
    
  • #22
    grysek
    Level 19  
    tylko zamknij to jeszcze w pętle
    Przed odczytem z czujnika 1 postaw początek pętli "do"
    i na końcu programu koniec pętli "loop"
    możesz też dać "end ale to nie koniecznie...
    A tak to wg mnie to dobrze :D
  • #23
    _Karek_
    Level 15  
    Mam tak:
    $regfile = "m8def.dat"
    $crystal = 4000000
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0    'piny lcd-atmega
    Config Portc = &B1111111
    
    Cursor Off
    Cls
    Lcd " Witaj " ;
    Lowerline
    Wait 2
    Lcd "Sterownik by Kark"
    Wait 5
    Cls
    
    Do
    Odczyt_1czujnik:                               'Odczyt z czujnika Pierwszego
     Config 1wire = Portc.3
     1wreset
     Temp = 1wread
     Upperline
     Lcd Temp ; "'C"
    
    Odczyt_2czujnik:
     Config 1wire = Portc.4                           'Odczyt z czujnika drugiego
     Iwreset
     Temp1 = 1wread
     Lowerline
     Lcd Temp1 ; "'C"
    
    
    If portc.5 = 0 then
     Portc.5 = 1
     else
     Portc.5 = 0
    endif
    Wait 1
    Loop
    End
    

    Ale gdy kompiluje to wywala błąd.
  • #24
    Freddy
    Level 43  
    Dziwię się gdyby nie wywalał, ale jeden, ja znalazłem dużo więcej !
    - zła postać instrukcji 1WRead:
    - co to za instruckcja : Iwreset
    - gdzie biblioteka do 1wire
    - gdzie deklaracja zmiennej Temp
    - gdzie deklaracja zmiennej Temp1

    itd, itd
  • #25
    JmL(TM)
    Level 24  
    Ok tutaj masz kody zrodlowe z ksiazki "Programowanie mikrokontrolerow AVR w BASCOM". Proponowalbym na tym etapie zakonczyc temat!

    'Program  obsługi jednego układu DS1820 dołączonego
    'do magistrali 1-Wire
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Lcd = 16 * 2                                         'konfiguracja typu wyświetlacza
          'LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 ,   Db7 = Portc.0 , E = Portc.4 ,   Rs = Portc.5                                               'konfiguracja linii
          'mikrokontrolera‚ do których
          'dołączono wyświetlacz
          'LCD
    Config 1wire = Portb.0                                      'konfiguracja linii magistrali
          '1-Wire
    Declare Sub Odcz_temp                                       'procedura odczytu temperatury
          'z układu DS1820
    Dim Temperatura(2) As Byte                                  'tablica dwóch zmiennych typu
          'Byte do pamiętania wartości
          'temperatury
    'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Do                                                          'początek pętli programu
     Call Odcz_temp                                             'wywołanie procedury pomiaru
          'temperatury
     Cls                                                        'czyszczenie ekranu LCD
     If Temperatura(2) = 0 Then                                 'jeśli wartość Temperatura(2)=
          '=0, to temperatura dodatnia
          'wyświetla temperatury dodatnie
      Lcd "Temp: " ; Temperatura(1) ; Chr(0) ; "C"
     Else                                                       'w przeciwnym razie
          'wyświetla temperatury ujemne
      Lcd "Temp: -" ; Temperatura(1) ; Chr(0) ; "C"
     End If
    Loop                                                        'koniec pętli Do...Loop
    End                                                         'koniec programu
    
    Sub Odcz_temp                                               'definicja procedury pomiaru
          'temperatury
     1wreset                                                    'reset magistrali 1-Wire
     1wwrite &HCC                                               'opuszczenie zapisu numeru ID
     1wwrite &H44                                               'start pomiaru temperatury
     Waitms 750                                                 'opóźnienie na czas pomiaru
     1wreset                                                    'reset magistrali 1-Wire
     1wwrite &HCC                                               'opuszczenie zapisu numeru ID
     1wwrite &HBE                                               'komenda odczytu zmierzonej
          'temperatury
     Temperatura(1) = 1wread(2)                                 'odczyt zmierzonej temperatury
          'do tablicy Temperatura
     1wreset                                                    'reset magistrali 1-Wire
     If Err = 1 Then                                            'jeśli układ dołączony do
          'magistrali nie odpowiada, to
      Cls                                                       'czyszczenie LCD
      Lcd "Brak ukladu"                                         'wyświetlenie komunikatu o braku
          'dołączonego układu
      Do                                                        'nieskończona pętla w celu
          'wstrzymania działania programu
      Loop
     End If
     If Temperatura(2) > 0 Then                                 'jeśli zmienna Temperatura(2)
          '> 0, to temperatura ujemna
          'przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                                     'koniec warunku
     Temperatura(1) = Temperatura(1) / 2
          'dalsze przeliczenie odczytanej
          'temperatury dodatniej jak
          'i ujemnej
    End Sub                                                     'koniec procedury pomiaru
    


    'Program  sterowania dwoma układami DS1820 dołączonymi
    'do tej samej magistrali 1-Wire
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Pinb.1 = Input                                       'linia PB1 jako wejściowa
    Config Lcd = 16 * 2                                         'konfigurowanie typu
          'wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5       'konfigurowanie linii
          'mikrokontrolera, do których
          'jest dołączony wyświetlacz LCD
    Config 1wire = Portb.0                                      'konfigurowanie linii magistrali
          '1-Wire
    Declare Sub Odcz_temp(czujnik As Byte)                      'procedura odczytu temperatury
          'z układu DS1820 z parametrem,
          'który wskazuje numer czujnika
          'temperatury
    Declare Sub Zapisz_id                                       'procedura zapisu numeru ID do
          'układu DS1820
    Dim Temperatura(2) As Byte                                  'tablica dwóch zmiennych typu
          'Byte na zmierzoną temperaturę
    Dim Id(8) As Byte                                           '8-elementowa tablica na numer
          'ID
    Dim I As Byte                                               'zmienna licznikowa
    Dim J As Byte                                               'zmienna licznikowa
    Dim K As Byte                                               'zmienna licznikowa
    Dim Liczba_ukl As Byte                                      'zmienna, do której wpisywana
          'jest liczba układów dołączonych
          'do magistrali 1-Wire
    S1 Alias Pinb.1                                             'przypisanie nazwie Pinb.1
          'nazwy S1
    
          'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Set Portb.1                                                 'dołączenie do linii PB1
          'rezystora podciągającego
    Cls                                                         'czyszczenie LCD
    Liczba_ukl = 1wirecount()                                   'odczytanie liczby układów
          'dołączonych do magistrali
          '1-Wire
    If S1 = 0 Then                                              'jeśli przycisk S1 naciśniety,
          'to
     Lcd "Liczba ukladow: " ; Liczba_ukl
          'wyświetlenie na LCD liczby
          'układów dołączonych do
          'magistrali
     If Liczba_ukl > 0 Then                                     'jeśli liczba układów większa od
          '0‚ to
      Id(1) = 1wsearchfirst()                                   'odczytanie numeru seryjnego
          'pierwszego dołączonego do
          'magistrali układu
      For I = 1 To 8                                            'pętla wykonywana 8 razy
       Writeeeprom Id(i) , I                                    'zapisanie odczytanego ID do
          'pamięci EEPROM w słowach 1...8
      Next I                                                    'zwiększenie wartości I o jeden
     End If
     If Liczba_ukl > 1 Then                                     'jeśli liczba układów jest
          'większa od 1, to
      Id(1) = 1wsearchnext()                                    'odczytanie numeru seryjnego
          'kolejnego układu (drugiego
          'DS1820)
      J = 0                                                     'wartość początkowa zmiennej
          'J = 0
      For I = 9 To 16                                           'pętla wykonywana 8 razy od
          'I = 9 do I = 16
       Incr J                                                   'zwiększenie wartości J o jeden
       Writeeeprom Id(j) , I                                    'zapisanie numeru ID drugiego
          'układu do pamięci EEPROM
          'w słowach 9...16
      Next I                                                    'zwiększenie o jeden wartości I
     End If
     Lowerline                                                  'kursor do drugiej linii LCD
     Lcd "Prog ok"                                              'wyświetlenie komunikatu
          'o zakończeniu odczytu numerów
          'ID
     Do                                                         'pętla nieskończona Do...Loop
     Loop
    End If
    
    Do                                                          'początek pętli programu
          'głównego
     Home                                                       'kursor na początek pierwszej
          'linii
     For K = 1 To Liczba_ukl                                    'pętla wykonywana od K = 1 do
          'liczby układów dołączonych do
          '1-Wire
      Call Odcz_temp(k)                                         'wywołanie procedury pomiaru
          'temperatury z parametrem K
      If Temperatura(2) = 0 Then                                'jeśli wartość Temperatura(2)
          '= 0 to temperatura dodatnia
          'wyświetlenie temperatury
          'dodatniej
       Lcd "Temp" ; K ; ": " ; Temperatura(1) ; Chr(0) ; "C"
      Else                                                      'w przeciwnym razie wyświetlenie
          'temperatury ujemnej
       Lcd "Temp" ; K ; ": -" ; Temperatura(1) ; Chr(0) ; "C"
      End If
      Lowerline                                                 'kursor w drugiej linii LCD
     Next K                                                     'zwiększenie o 1 wartości K
    Loop                                                        'koniec pętli Do...Loop
    End                                                         'koniec programu
    
    Sub Odcz_temp(czujnik As Byte)                              'procedura pomiaru temperatury
          '- parametr Czujnik określa
          'numer czujnika
     If Czujnik = 1 Then                                        'jeśli Czujnik = 1 to
          'odczytywany jest z pamięci
          'EEPROM numer ID czujnika 1
      For I = 1 To 8                                            'pętla wykonywana od I = 1 do
          'I = 8
       Readeeprom Id(i) , I                                     'odczyt ID z pamięci EEPROM
          'czujnika pierwszego
      Next I                                                    'zwiększenie o 1 wartości I
     End If
     If Czujnik = 2 Then                                        'jeśli Czujnik = 2 to
          'odczytywany jest z pamięci
          'EEPROM numer ID czujnika 2
      J = 0                                                     'wartość początkowa zmiennej
          'J = 0
      For I = 9 To 16                                           'pętla wykonywana 8 razy od
          'I = 9 do I = 16
       Incr J                                                   'zwiększenie wartości J o jeden
       Readeeprom Id(j) , I                                     'odczyt numeru ID z pamięci
          'EEPROM z słów 9...16 dla
          'czujnika 2
      Next I                                                    'zwiększenie o 1 wartości I
     End If
    
     1wreset                                                    'reset magistrali 1-Wire
     Call Zapisz_id                                             'wybranie czujnika poprzez zapis
          'do niego numeru ID aktualnie
          'obsługiwanego układu DS1820
     1wwrite &H44                                               'start pomiaru przez układ
          'DS1820
     Waitms 750                                                 'opóźnienie na czas pomiaru
     1wreset                                                    'reset magistrali 1-Wire
     Call Zapisz_id                                             'wybranie czujnika poprzez zapis
          'do niego numeru ID aktualnie
          'obsługiwanego układu DS1820
     1wwrite &HBE                                               'komenda odczytu układu DS1820
          'zmierzonej temperatury
     Temperatura(1) = 1wread(2)                                 'odczyt zmierzonej temperatury
          'do tablicy Temperatura
     1wreset                                                    'reset magistrali 1-Wire
     If Err = 1 Then                                            'jeśli brak układu DS1820
          'dołączonego do 1-Wire, to
      Cls                                                       'czyszczenie LCD
      Lcd "Brak ukladu"                                         'wyświetlenie komunikatu o braku
          'układu
      Do                                                        'nieskończona pętla Do...Loop
          'w celu wstrzymania działania
          'programu
      Loop
     End If
     If Temperatura(2) > 0 Then                                 'jeśli zmienna Temperatura(2)
          '> 0, to temperatura ujemna
          'przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                                     'koniec warunku
     Temperatura(1) = Temperatura(1) / 2
          'dalsze przeliczenie odczytanej
          'temperatury dodatniej jak
          'i ujemnej
    End Sub                                                     'koniec procedury pomiaru
    
    Sub Zapisz_id                                               'definicja procedury zapisu
          'numeru ID do układów DS1820
     1wwrite &H55                                               'wysłanie komendy zapisu numeru
          'ID do układów
     For I = 1 To 8                                             'pętla wykonywana od I = 1 do
          'I = 8
      1wwrite Id(i)                                             'wysłanie do czujników numeru ID
          'z tablicy Id
     Next I                                                     'zwiększenie o 1 wartości I
    End Sub                                                     'koniec procedury
    


    Wszystko bogato "zdobione" komentarzami ;)
  • #26
    _Karek_
    Level 15  
    Ok dzięki Jml.
     'Program  sterowania dwoma układami DS1820 dołączonymi
    'do tej samej magistrali 1-Wire
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Pinb.1 = Input
    Config Pinc.5 = Output                                      'linia PB1 jako wejściowa
    Config Lcd = 16 * 2                                         'konfigurowanie typu
          'wyświetlacza LCD
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0       'piny lcd-atmega
    Config 1wire = Portb.0
    
    If portc.5 = 0 then
     Portc.5 = 1
     else
     Portc.5 = 0
    endif
    Wait 1
    
    Cursor Off
    Cls
    Lcd " Witaj " ;                                             ' ekran powitalny
    Lowerline
    Wait 2
    Lcd "Sterownik by Kark"
    Wait 5
    Cls
                                       'konfigurowanie linii magistrali
          '1-Wire
    Declare Sub Odcz_temp(czujnik As Byte)                      'procedura odczytu temperatury
          'z układu DS1820 z parametrem,
          'który wskazuje numer czujnika
          'temperatury
    Declare Sub Zapisz_id                                       'procedura zapisu numeru ID do
          'układu DS1820
    Dim Temperatura(2) As Byte                                  'tablica dwóch zmiennych typu
          'Byte na zmierzoną temperaturę
    Dim Id(8) As Byte                                           '8-elementowa tablica na numer
          'ID
    Dim I As Byte                                               'zmienna licznikowa
    Dim J As Byte                                               'zmienna licznikowa
    Dim K As Byte                                               'zmienna licznikowa
    Dim Liczba_ukl As Byte                                      'zmienna, do której wpisywana
          'jest liczba układów dołączonych
          'do magistrali 1-Wire
    S1 Alias Pinb.1                                             'przypisanie nazwie Pinb.1
          'nazwy S1
    
          'definicja znaku stopnia
    Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32
    
    Set Portb.1                                                 'dołączenie do linii PB1
          'rezystora podciągającego
    Cls                                                         'czyszczenie LCD
    Liczba_ukl = 1wirecount()                                   'odczytanie liczby układów
          'dołączonych do magistrali
          '1-Wire
    If S1 = 0 Then                                              'jeśli przycisk S1 naciśniety,
          'to
     Lcd "Liczba ukladow: " ; Liczba_ukl
          'wyświetlenie na LCD liczby
          'układów dołączonych do
          'magistrali
     If Liczba_ukl > 0 Then                                     'jeśli liczba układów większa od
          '0‚ to
      Id(1) = 1wsearchfirst()                                   'odczytanie numeru seryjnego
          'pierwszego dołączonego do
          'magistrali układu
      For I = 1 To 8                                            'pętla wykonywana 8 razy
       Writeeeprom Id(i) , I                                    'zapisanie odczytanego ID do
          'pamięci EEPROM w słowach 1...8
      Next I                                                    'zwiększenie wartości I o jeden
     End If
     If Liczba_ukl > 1 Then                                     'jeśli liczba układów jest
          'większa od 1, to
      Id(1) = 1wsearchnext()                                    'odczytanie numeru seryjnego
          'kolejnego układu (drugiego
          'DS1820)
      J = 0                                                     'wartość początkowa zmiennej
          'J = 0
      For I = 9 To 16                                           'pętla wykonywana 8 razy od
          'I = 9 do I = 16
       Incr J                                                   'zwiększenie wartości J o jeden
       Writeeeprom Id(j) , I                                    'zapisanie numeru ID drugiego
          'układu do pamięci EEPROM
          'w słowach 9...16
      Next I                                                    'zwiększenie o jeden wartości I
     End If
     Lowerline                                                  'kursor do drugiej linii LCD
     Lcd "Prog ok"                                              'wyświetlenie komunikatu
          'o zakończeniu odczytu numerów
          'ID
     Do                                                         'pętla nieskończona Do...Loop
     Loop
    End If
    
    Do                                                          'początek pętli programu
          'głównego
     Home                                                       'kursor na początek pierwszej
          'linii
     For K = 1 To Liczba_ukl                                    'pętla wykonywana od K = 1 do
          'liczby układów dołączonych do
          '1-Wire
      Call Odcz_temp(k)                                         'wywołanie procedury pomiaru
          'temperatury z parametrem K
      If Temperatura(2) = 0 Then                                'jeśli wartość Temperatura(2)
          '= 0 to temperatura dodatnia
          'wyświetlenie temperatury
          'dodatniej
       Lcd "Temp" ; K ; ": " ; Temperatura(1) ; Chr(0) ; "C"
      Else                                                      'w przeciwnym razie wyświetlenie
          'temperatury ujemnej
       Lcd "Temp" ; K ; ": -" ; Temperatura(1) ; Chr(0) ; "C"
      End If
      Lowerline                                                 'kursor w drugiej linii LCD
     Next K                                                     'zwiększenie o 1 wartości K
    Loop                                                        'koniec pętli Do...Loop
    End                                                         'koniec programu
    
    Sub Odcz_temp(czujnik As Byte)                              'procedura pomiaru temperatury
          '- parametr Czujnik określa
          'numer czujnika
     If Czujnik = 1 Then                                        'jeśli Czujnik = 1 to
          'odczytywany jest z pamięci
          'EEPROM numer ID czujnika 1
      For I = 1 To 8                                            'pętla wykonywana od I = 1 do
          'I = 8
       Readeeprom Id(i) , I                                     'odczyt ID z pamięci EEPROM
          'czujnika pierwszego
      Next I                                                    'zwiększenie o 1 wartości I
     End If
     If Czujnik = 2 Then                                        'jeśli Czujnik = 2 to
          'odczytywany jest z pamięci
          'EEPROM numer ID czujnika 2
      J = 0                                                     'wartość początkowa zmiennej
          'J = 0
      For I = 9 To 16                                           'pętla wykonywana 8 razy od
          'I = 9 do I = 16
       Incr J                                                   'zwiększenie wartości J o jeden
       Readeeprom Id(j) , I                                     'odczyt numeru ID z pamięci
          'EEPROM z słów 9...16 dla
          'czujnika 2
      Next I                                                    'zwiększenie o 1 wartości I
     End If
    
     1wreset                                                    'reset magistrali 1-Wire
     Call Zapisz_id                                             'wybranie czujnika poprzez zapis
          'do niego numeru ID aktualnie
          'obsługiwanego układu DS1820
     1wwrite &H44                                               'start pomiaru przez układ
          'DS1820
     Waitms 750                                                 'opóźnienie na czas pomiaru
     1wreset                                                    'reset magistrali 1-Wire
     Call Zapisz_id                                             'wybranie czujnika poprzez zapis
          'do niego numeru ID aktualnie
          'obsługiwanego układu DS1820
     1wwrite &HBE                                               'komenda odczytu układu DS1820
          'zmierzonej temperatury
     Temperatura(1) = 1wread(2)                                 'odczyt zmierzonej temperatury
          'do tablicy Temperatura
     1wreset                                                    'reset magistrali 1-Wire
     If Err = 1 Then                                            'jeśli brak układu DS1820
          'dołączonego do 1-Wire, to
      Cls                                                       'czyszczenie LCD
      Lcd "Brak ukladu"                                         'wyświetlenie komunikatu o braku
          'układu
      Do                                                        'nieskończona pętla Do...Loop
          'w celu wstrzymania działania
          'programu
      Loop
     End If
     If Temperatura(2) > 0 Then                                 'jeśli zmienna Temperatura(2)
          '> 0, to temperatura ujemna
          'przeliczenie temperatury
          'ujemnej
      Temperatura(1) = 256 - Temperatura(1)
     End If                                                     'koniec warunku
     Temperatura(1) = Temperatura(1) / 2
          'dalsze przeliczenie odczytanej
          'temperatury dodatniej jak
          'i ujemnej
    End Sub                                                     'koniec procedury pomiaru
    
    Sub Zapisz_id                                               'definicja procedury zapisu
          'numeru ID do układów DS1820
     1wwrite &H55                                               'wysłanie komendy zapisu numeru
          'ID do układów
     For I = 1 To 8                                             'pętla wykonywana od I = 1 do
          'I = 8
      1wwrite Id(i)                                             'wysłanie do czujników numeru ID
          'z tablicy Id
     Next I                                                     'zwiększenie o 1 wartości I
    End Sub

    Do kodu dodałem procedurę migania diody i ekran powitalny i skonfigurowałem Pin 28 jako wyjściowy.
    a możecie mi tyłumaczyc co gdzie podłączyc?
    \
    \
    \
    \
    A odbiegając od Tematu mam do was pytanie czysto Teoretyczne.
    Jak mam konfiguracje
    Config Pinc.5 = Output                                      
    Config Pinc.4 = Output         
    Config Pinc.3 = Output                                      
    Config Pinc.2 = Output                                      
    Config Pinc.1 = Output  
    Config Pinc.0 = Output    

    aby to zastąpic jedną procedurą a Pc6 zostawic orginalnie.
  • #28
    JmL(TM)
    Level 24  
    Ta czesc:

    If portc.5 = 0 then
     Portc.5 = 1
     else
     Portc.5 = 0
    endif
    Wait 1
    
    Cursor Off
    Cls
    Lcd " Witaj " ;                                             ' ekran powitalny
    Lowerline
    Wait 2
    Lcd "Sterownik by Kark"
    Wait 5
    Cls 


    wstaw nizej pod deklaracjami zmiennych i funkcji.
    A tak w ogole to po co ci ta migajaca dioda? w kodzie jest to zrobione zle...
  • #29
    _Karek_
    Level 15  
    dioda ma mrugac możesz wstawic poprawny fragment moich procedur d kodu?
  • #30
    Freddy
    Level 43  
    _Karek_ :arrow: nie przeginasz trochę ?
    Nie dość, że dostałeś, a właściwie wyżebrałeś gotowy kod, to jeszcze masz wymagania