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

Jak zwykle podstawowe problemy początkującego - atmega8

luke_dra 08 Gru 2008 22:07 1812 25
  • #1 5835385
    luke_dra
    Poziom 10  
    Witam

    Wiem że temat był już męczony ale już porostu nie mogę.
    Panowie nie rozumiem co zrobiłem nie tak próbuję na różne sposoby ale ciągle nic. Programuję atmege i chciałbym standardowo 2 przyciskami zapalać i gasić diodę ale nie wychodzi. Po odpaleniu dioda się świeci, jeśli nacisnę pierwszy przycisk gaśnie ale gdy puszę od razu się zapala ponownie przez co 2 też nie dział. poniżej załączyłem kod z książki lekko zmodyfikowany bo ten z książki to wcale nie dział (Programowanie mikro w BASCOM przykład 8_14). poniżej dodałem ustawienia fus bits może tam jest coś nie tak.
    
    $regfile = "m8def.dat"
    
    $crystal = 16000000
    
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    
    Led1 Alias Portb.5
    Led2 Alias Portb.4
    S1 Alias Pinb.2
    S2 Alias Pinb.1
    
    Set Portb.1
    Set Portb.2
    
    Do
    If S1 = 0 Then
    goto pr1
    waitms 30
    Bitwait S1 , Set
    endif
    
    If S2 = 0 Then
    goto pr2
    waitms 30
    Bitwait S2 , Set
    endif
    
    Loop
    
    End
    
    Pr1:
    Set Led2
    Wait 1
    Return
    
    Pr2:
    Reset Led2
    wait 1
    Return
    


    Załącznik usunąłem - zbędny.
    [zumek]
  • #2 5835413
    dawid512
    Poziom 32  
    Dla 16MHz CKOPT musi być zaprogramowany. Zapamiętaj na zawsze: nigdy nie korzystaj z goto... Jeżeli już to gosub. Po za tym skorzystaj z Debounce i od razu pozbędziesz się drgań styków i ponownego wykrycia wciśnięcia przycisku. Z bitwait możesz zrezygnować bo już nie będzie potrzebne.
  • #3 5835434
    luke_dra
    Poziom 10  
    No właśnie w książce było debounce ale wtedy nic się nie działo, doda się świeci i nic nie reaguje na przyciski.

    dokładnie było tak
    
    'Program obsługi przycisków S1, S2 za pomocą instrukcji Debounce
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
          'dyrektyw mikrokontrolera
    $crystal = 16000000                                         'informuje kompilator
          'o częstotliwości oscylatora
          'taktującego mikrokontroler
    Config Pinb.1 = Input                                       'linia PB1 jako wejściowa
    Config Pinb.2 = Input                                       'linia PB2 jako wejściowa
    Config Pinb.4 = Output                                      'linia PB4 jako wyjściowa
    Config Pinb.5 = Output                                      'linia PB5 jako wyjściowa
    
    Led1 Alias Portb.5                                          'przypisanie nazwie Portb.5
          'nazwy Led1
    Led2 Alias Portb.4                                          'przypisania nazwie Portb.4
          'nazwy Led2
    S1 Alias Pinb.2                                             'przypisanie nazwie Pinb.2
          'nazwy S1
    S2 Alias Pinb.1                                             'przypisanie nazwie Pinb.1
          'nazwy S2
    
    Set Portb.1                                                 'dołączenie do linii PB1
          'rezystora podciągającego
    Set Portb.2                                                 'dołączenie do linii PB2
          'rezystora podciągającego
    
    Do                                                          'nieskończona pętla Do...Loop
     Debounce S1 , 0 , Pr1 , Sub                                'jeśli naciśniety przycisk S1,
          'to skok do podprogramu Pr1
     Debounce S2 , 0 , Pr2 , Sub                                'jeśli naciśnięty przycisk S2,
          'to skok do podprogramu Pr2
    Loop
    
    End                                                         'koniec programu
    
    Pr1:                                                        'podprogram Pr1
     Toggle Led1                                                'zmiana na przeciwny stanu
          'wyjścia sterującego diodą D1
    Return                                                      'powrót z podprogramu
    
    Pr2:                                                        'podprogram Pr2
     Toggle Led2                                                'zmiana na przeciwny stanu
          'wyjścia sterującego diodą D2
    Return
    
  • #4 5835443
    dawid512
    Poziom 32  
    Wyrzuć goto i bitwait. Wykorzystaj debounce i w jednym podprogramie gaś a w drugim zapalaj diodę.
  • #5 5835504
    luke_dra
    Poziom 10  
    zmieniłem w ten sposób, ale nadal zerowa reakcja. Mam dziwne wrażenie że jeśli jest debounce to nic się nie dzieje. Jeśli jest If S1 = 0 to wtedy dział. co jest grane

    
    Do                                                          'nieskończona pętla Do...Loop
     Debounce S1 , 0 , Pr1 , Sub                                'jeśli naciśniety przycisk S1,
          'to skok do podprogramu Pr1
     Debounce S2 , 0 , Pr2 , Sub                                'jeśli naciśnięty przycisk S2,
          'to skok do podprogramu Pr2
    Loop
    
    End
    
    Pr1:
    Set Led2
    Wait 1
    Return
    
    Pr2:
    Reset Led2
    Wait 1
    Return
    
  • #6 5835538
    dawid512
    Poziom 32  
    Dziwna sprawa, swego czasu też miałem problemy z debounce ale po zmianie wersji Bascoma zniknęły. Spróbuj zrobić to samo co teraz tylko zastosuj warunek i wyrzuć opóźnienie z podprogramów.
  • #7 5835555
    luke_dra
    Poziom 10  
    A i jeszcze jedna kwestia. dlaczego po kliknięciu przycisku gdy korzystałem z IF nie jest pamiętany jego stan klikam zapala się a gdy puszczam gaśnie ??
  • #8 5835564
    dawid512
    Poziom 32  
    Pokaż soft.
  • #9 5835589
    luke_dra
    Poziom 10  
    BASCOMA mam w wersji 1.11.9.0


    
    $regfile = "m8def.dat"
    
    $crystal = 16000000
    
    Config Pinb.1 = Input
    Config Pinb.2 = Input
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    
    Led1 Alias Portb.5
    Led2 Alias Portb.4
    S1 Alias Pinb.2
    S2 Alias Pinb.1
    
    Set Portb.1
    Set Portb.2
    
    Do                                                          'nieskończona pętla Do...Loop
    If S1 = 0 Then
       Gosub Pr1
       Waitms 30
       Bitwait S1 , Set
    endif
    
    If S2 = 0 Then
       Gosub Pr2
       Waitms 30
       Bitwait S2 , Set
    End If
    
    Loop
    
    End
    
    Pr1:
       Set Led2
    Return
    
    Pr2:
       Reset Led2
    Return
    
  • #10 5835596
    dawid512
    Poziom 32  
    A po co ci bitwait?
  • #11 5835612
    luke_dra
    Poziom 10  
    Wykasowałem. Teraz S1 kliknięte gaśnie puszczam zapala się S2 nie dział
  • #12 5835674
    dawid512
    Poziom 32  
    Nie pasują mi te twoje opóźnienia, PCB poprawne;>
  • #13 5835718
    luke_dra
    Poziom 10  
    Tak wygląda PBC. Taka płytka testowa do LCD 2 x 16 ale oczywiście nie działała więc postaowiłem coś prostego sprawdzić czyli dioda + 2 przyciski

    1 to +5V dla diody przez rezystor
    2 to GND dla kabelka który udaje S1 po połączeniu z gold pinem 4
    3 to GND dla Diody

    Mniej więcej zgodnie z deklaracją zmiennych w programie
  • #14 5835744
    dawid512
    Poziom 32  
    Nie kombinuj z kabelkami tylko kup przycisk. Po za tym brak 100nF na VCC i GND atmegi. Z czego to zasilasz?Ten rezystor 3k3 do czego podłączony?
  • #15 5835765
    luke_dra
    Poziom 10  
    Wiem że nie tak to powinno wyglądać ale już nie mam siły trawić tych płytek wiercić i do kosza wywalać, tylko S1 to kabelek S2 jest normalne (mam sporo tych przycisków na stanie) płytkę wykorzystałem z tego LCD co nie działa i dlatego tylko. A tak wygląda zasilanie.

    A rezystor to do DS1820 zgodnie ze schematem z książki oczywiście.
  • Pomocny post
    #16 5835779
    dawid512
    Poziom 32  
    Daj większy kondensator elektrolityczny przed stabilizator. Mam nadzieje ze dioda nie jest podłączona przez rezystor 3k3.
  • #17 5835794
    luke_dra
    Poziom 10  
    dioda podłączona jest przez 1K

    Ręce mi już opadają. Na początku taki entuzjazm, czytając forum i książkę wszystko wydawało się takie oczywiste. a tu taka niespodzianka pierwsze ambitne próby z LCD porażka, teraz nawet z diodą sobie poradzić nie mogę - fatal. Wydałem kasę na programator zrobiłem podstawę kupiłem komponenty i tyle mi to wszystko działa. Nie mówiąc o czasie. :(
  • Pomocny post
    #18 5835801
    dawid512
    Poziom 32  
    Musisz mieć coś nie tak z czasem. Za pewne nie masz tych 16MHz. Przełącz się na standardowe ustawienie 1MHz i wtedy testuj dalej. To musi działać!
  • #19 5835893
    luke_dra
    Poziom 10  
    Masz racje zrobiłem standardowe ustawienia i działa na 1MHz wewnętrzny jest ok nawet te przykłady z książki z dioda działają porwanie :) Wielkie dzięki. Tylko teraz kolejny problem będzie co jest nie tak z tymi moimi ustawieniami 16MHz

    Najprawdopodobniej coś w Fus bit'ach mam nie tak. Ale to już zostawię na później. Bardzo dziękuję za pomoc.
  • #20 5836529
    luke_dra
    Poziom 10  
    Jeszcze po drążę temat chwilkę. Mam w domu dwa programatory, no i oczywiście obydwa oparte są o Atmegę8, więc postanowiłem jeden z nich wylutować i sprawdzić jak są ustawione Fusy (całość działa na kwarcu 12MHZ więc blisko mojego 16). Na załączonym obrazku po lewej to co odczytałem z programatora a po prawej moje ustawienia. Mocno zastanawia mnie ta różnica, szczególnie napięcie zasilania??. Fusy starałem się ustawić zgodnie z artykułu ze strony Elektroniki dla wszystkich Fuse Bits, czyli dramat AVR'ów w 3 aktach.... Ja używam tylko innego programatora bo zgodnego z STK500 a Fusy ustwaiam w AVR Studio

    Jak zwykle podstawowe problemy początkującego - atmega8
  • #21 5836544
    snow
    Poziom 31  
    Dla 16MHz możesz użyć:

    low: 0xff
    high: 0xd9
  • #22 5836559
    luke_dra
    Poziom 10  
    Aktualnie jestem w pracz wiec nie mogę sprawdzić więc zapytam czy low: 0xff
    high: 0xd9 modę zmieniać z ręki przy tych polach czy raczej muszę tak ustawić checkbox'y?
  • Pomocny post
    #23 5836577
    snow
    Poziom 31  
    Można z ręki.
  • #24 5836585
    luke_dra
    Poziom 10  
    Ok dzięki przetestuje w domu.
  • #26 5837333
    luke_dra
    Poziom 10  
    Tak wszystko było. były wcześniej schematy ale je skasowałem. PBC było ok. Wina lezy po stronie Fusów. Zgodnie z uwagami kolegi dawid512 zmieniłem na ustawienia fabryczne i wszystko zaczęło działać.
    Cytat:
    Musisz mieć coś nie tak z czasem. Za pewne nie masz tych 16MHz. Przełącz się na standardowe ustawienie 1MHz i wtedy testuj dalej. To musi działać!
REKLAMA