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

Jak napisać program termometru dwu punktowego w Bascom dla ATmega8?

_Karek_ 07 Maj 2008 20:38 4826 32
REKLAMA
  • #1 5116487
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    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?
  • REKLAMA
  • #2 5117521
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    _Karek_ napisał:

    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_ napisał:

    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
  • #3 5117528
    Balu
    Poziom 38  
    Posty: 4397
    Pomógł: 323
    Ocena: 48
    Kolego Mirek36 nic dodać nic ująć ja z mojej strony polecam książkę Marcina Wiązani programowanie uC AVR w języku bascom:)
    W/g mnie najlepsze kompedium wiedzy zaraz za helpem bascoma:)
  • REKLAMA
  • #4 5117743
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    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 5118905
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    _Karek_ opisz dokładniej co ma robić twoje urządzenie a najlepiej pokaż schemat
  • #6 5118954
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    JmL(TM) napisał:
    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 5119015
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    Cytat:
    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ł
    Cytat:

    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 5119172
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Tak podpina się do masy i wtedy się resetuje

    pokaż mi jeszcze schemat układziku
  • #10 5119274
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    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
  • REKLAMA
  • #11 5119350
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    D których pinów procesora masz podpięte czujniki??
  • #12 5119368
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    27 i 26 a 28 to dioda tzn będe miał bo to na razie tylko mój schemat w głowie.
  • #13 5119414
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    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 5119488
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    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 .
    Cytat:
    .. 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 5120007
    JmL(TM)
    Poziom 24  
    Posty: 804
    Pomógł: 44
    Ocena: 12
    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.
  • REKLAMA
  • #16 5120043
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    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 5120109
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    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 5120146
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    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 5120231
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    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 5120287
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    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 5120330
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    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 5120499
    Freddy
    Poziom 43  
    Posty: 19997
    Pomógł: 1394
    Ocena: 2810
    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 5121541
    JmL(TM)
    Poziom 24  
    Posty: 804
    Pomógł: 44
    Ocena: 12
    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 5121651
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    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 5123823
    JmL(TM)
    Poziom 24  
    Posty: 804
    Pomógł: 44
    Ocena: 12
    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 5123839
    _Karek_
    Poziom 15  
    Posty: 206
    Pomógł: 5
    Ocena: 2
    dioda ma mrugac możesz wstawic poprawny fragment moich procedur d kodu?
  • #30 5123940
    Freddy
    Poziom 43  
    Posty: 19997
    Pomógł: 1394
    Ocena: 2810
    _Karek_ :arrow: nie przeginasz trochę ?
    Nie dość, że dostałeś, a właściwie wyżebrałeś gotowy kod, to jeszcze masz wymagania

Podsumowanie tematu

✨ Dyskusja dotyczy pisania programu termometru dwu punktowego w języku Bascom dla mikrokontrolera ATmega8, wykorzystującego czujniki temperatury DS1820 firmy Dallas podłączone do magistrali 1-Wire. Autor początkowo prezentuje niekompletny i błędny kod, w którym występują m.in. błędy składniowe, niepoprawne użycie instrukcji oraz brak deklaracji zmiennych i bibliotek. Uczestnicy forum wskazują na konieczność poprawnego skonfigurowania portów, właściwego przypisania pinów do magistrali 1-Wire, deklaracji zmiennych Temp i Temp1 oraz poprawnego sterowania diodą LED na pinie PortC.5. Zalecane jest unikanie wielokrotnej konfiguracji magistrali 1-Wire w pętli oraz stosowanie instrukcji Toggle do migania diodą. Podkreślono znaczenie korzystania z dokumentacji Bascom i przykładów z książki "Programowanie mikrokontrolerów AVR w BASCOM" Marcina Wiązani. Ostatecznie zaproponowano poprawny szkielet programu z konfiguracją LCD, magistrali 1-Wire na porcie PortB.0, obsługą dwóch czujników DS1820 na tej samej magistrali oraz migającą diodą LED sterowaną przez PortC.5. Dyskusja kończy się sugestią zamknięcia tematu po udostępnieniu kompletnego i działającego kodu.
Wygenerowane przez model językowy.
REKLAMA