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

[ATmega8][Bascom] - Sprawdzenie programu - nie działa poprawnie

piotrek_nn 25 Maj 2013 07:51 4641 18
REKLAMA
  • #1 12342871
    piotrek_nn
    Poziom 11  
    Posty: 43
    Ocena: 2
    Witam ,

    Zaczynam przygodę z programowaniem. Powiem tak samo wgranie programu robię tak samo i działa na 100, wgrywałem avrdude plus nakładka AVR O burn mat.

    Problem leży chyba w kodzie poniżej podaję kod ściągnięty żywcem z kursu basom z strony http://www.forbot.pl/forum/topics20/kurs-bascom-lekcja3-zaczynamy-programowac-vt1091.htm#6436

    objaw jest taki iż zaprogramuję program to dioda świeci , przyciski nie odpowiadają , jedynie co zmieniłem to rodzaj procesora na atmega.

    wg mnie program jest logiczny i tak prosty że aż wstyd się pytać o pomoc ale walczę już dwa dni i nic nie wychodzi, także proszę o pomoc.

    Kod: text
    Zaloguj się, aby zobaczyć kod

    Poprawiłem tytuł na zgodny z regulaminem p. 3.1.15.
    LordBlick
  • REKLAMA
  • Pomocny post
    #2 12342938
    alien_audio
    Poziom 21  
    Posty: 223
    Pomógł: 57
    Ocena: 18
    Witam.
    1./ Jeżeli definiujemy piny jako wejście najlepiej używać instrukcji

    config pinb.0=input ' przycisk pierwszy
    config pinb.1=input ' przycisk drugi

    config portd.0=input ' pin sterujący diodą LED


    2./ Podłączenie przycisków do plusa zasilanie tak jak w tym kursie jest złe.
    przyciski powinny być podłączone do masy.
    Po prostu przycisk po wcisnięciu zwiera pin do masy a nie do plusa.
    Zwykle dla pewności stosuję się tak zwane podciągnięcie do plusa.
    Po prostu należy dołożyć rezystor 10K od pinb.0 do plusa zasilania
    i tak samo drugi rezystor od pinb.1 do plusa.

    Wtedy jak przycisk jest nie wciśnięty to PINB.0 i PINB1. na pewno
    ma poziom wyskoki a po wciśnięcie łączy pin do masy.
    Wtedy zadziała na 100%
  • REKLAMA
  • #3 12343024
    piotrek_nn
    Poziom 11  
    Posty: 43
    Ocena: 2
    dzięki ,

    tylko czy nie powinno być "config portd.0=output ' pin sterujący diodą LED'' ?
    i wg tego co napisałeś pwenie muszę zmienić warunki tak jak poniżej :
    if pinb.0=0 then 'jeżeli przycisk 1 wciśnięty
    portd.0=1 'zapal diode
    elseif pinb.1=0 then 'jeżeli przycisk 2 wciśnięty
    portd.0=0 'zgaś diodę
    endif 'koniec bloku warunkowego

    Teraz by mi pasowało , tak jak pisałem dopiero się uczę także proszę o sprawdzenie.
  • Pomocny post
    #4 12343077
    alien_audio
    Poziom 21  
    Posty: 223
    Pomógł: 57
    Ocena: 18
    Witam.
    Tak, masz racje powinno być tak jak opisałeś
    "config portd.0=output ' pin sterujący diodą LED''
    Tak samo jak zapis warunków o których piszesz i jest prawidłowy.
    Przetestuj te zmiany i zobaczymy.
  • #5 12343316
    piotrek_nn
    Poziom 11  
    Posty: 43
    Ocena: 2
    Jeszcze jedno mnie martwi , czy potrzebne jest ustalanie portów tzn stanów początkowych tak jak jest to opisane na przykładzie portd=&B0000000 i czy muszę zmienić stan spoczynkowy portów wejściowych na logiczne 1 portb=&B11111111 ?
  • Pomocny post
    #6 12343497
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    1) Nie potrzebne jest ustawianie stanów spoczynkowych. Jeśli tego nie zrobisz będą miały domyślną wartość czyli chyba 0. Tak samo domyślnie wszystkie piny są ustawione jako wyjścia czyli w (DDRX.Y = 1 <- nazwa rejestru kierunkowego w BASCOMIE nie musisz się tym martwić).

    2)Co do drugiej części pytania powiem tak: najbardziej naturalnym rozwiązaniem jest ustawienie stanów spoczynkowych wejść na 1 (w ten sposób uruchamiasz wewnętrzne rezystory odciągające do plusa -tzw pull-up'y) i jednocześnie dawanie sygnału przez przyciski od masy. Poza tym nie wdze sensu używania elseif. ja bym napisał prosto:
    
    if pinb.0 = 0 then portd.0 = 1
    if pinb.1 = 0 then portd.0 = 0
    


    Jeśli byś się uparł to mógłbyś dać stan spoczynkowy 0 ale po co? Wtedy musiał byś na zewnątrz poprowadzić rezystory podciągające bo inaczej kiedy przycisk byłby otwarty miał byś na wejściu tzw. trzeci stan logiczny.

    Teraz zastanówmy się nad drugim nieszczęśliwym scenariuszem, który jest teoretycznie możliwy. Mógłbyś chcieć inicjować zdarzenie zwieraniem przycisku do plusa. Wtedy musisz pwyłączyć wewnętrzne pull-upy do plusa czyli wpisać stan spoczynkowy 0 . Producenci AVR nie przewidzieli wewnętrznego podciągnięcia do masy więc musisz każde wejście podciągać do masy przez rezystor na zewnątrz.

    Generalnie zapamiętaj że w AVR i w ogóle w elektronice cyfrowej z reguły stosuje się sterowanie od masy. Tyczy się to zarówno wejść jak i wyjść tzn inicjacja jakiegoś zdarzenia powinna być wywoływana masą ale także gdy np. chcesz strować jakimś obciążeniem (np. diodą) to też powinieneś uruchamiać ją masą. Nie będę wgłębiał się w techniczne zagadnienia ale powiem ogólnie: AVRy dają możliwość wybrania funkcji danego pinu(wejscie/wyjście) i okupione jest to tym że właśnie stan 0 ma większą wydajność prądową.
    Dlatego zmień program na:
    
    if pinb.0 = 0 then portd.0 = 0 'zapal
    if pinb.1 = 0 then portd.0 = 1 'zgaś
    

    i odwróć diodę.
  • Pomocny post
    #7 12345119
    slx
    Poziom 19  
    Posty: 146
    Pomógł: 41
    Ocena: 16
    Cytat:
    Tak samo domyślnie wszystkie piny są ustawione jako wyjścia czyli w (DDRX.Y = 1

    Nie prawda - po resecie, domyślnie piny ustawione są jako wejścia - rejestry DDR = 0

    Cytat:
    AVRy dają możliwość wybrania funkcji danego pinu(wejscie/wyjście) i okupione jest to tym że właśnie stan 0 ma większą wydajność prądową
    Znowu, nie prawda. Wyjścia w AVR są całkowicie symetryczne i mają taką samą wydajność prądową dla 0 jaki dla 1.
  • REKLAMA
  • Pomocny post
    #8 12345385
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    slx napisał:
    Cytat:
    Tak samo domyślnie wszystkie piny są ustawione jako wyjścia czyli w (DDRX.Y = 1

    Nie prawda - po resecie, domyślnie piny ustawione są jako wejścia - rejestry DDR = 0

    Cytat:
    AVRy dają możliwość wybrania funkcji danego pinu(wejscie/wyjście) i okupione jest to tym że właśnie stan 0 ma większą wydajność prądową
    Znowu, nie prawda. Wyjścia w AVR są całkowicie symetryczne i mają taką samą wydajność prądową dla 0 jaki dla 1.


    Co do domyślnych ustawień to tak jak napisałem na początku postu - nie byłem pewny. W każdym razie dziwnym jest że producent ustawia piny domyślnie jako wejścia żeby działały niepotrzebnie jako anteny - pewnie miał taki kaprys.

    Co do asymetryczności wyjść moje stanowisko jest nieugięte. Kolega chcąc podważyć moje zdanie powinien zapoznać się z odpowiednimi informacja a nie wytykać "nieprawde" nie zadawszy sobie nawet trudu aby zajrzeć do noty. Pan ma chyba jakieś przestarzałe informacje rodem z rodziny '51...
    ...bo w AVR w odróżnieniu od '51 jest możliwość zmiany funkcji pinu! Zagadnienie jest trochę bardziej skomplikowane i nie wytłumaczę w kilku słowach bez rysunków (tak jak już mówiłem - odsyłam do noty).
  • Pomocny post
    #9 12345544
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    Wojtek001 napisał:
    W każdym razie dziwnym jest że producent ustawia piny domyślnie jako wejścia żeby działały niepotrzebnie jako anteny - pewnie miał taki kaprys.

    No akurat kaprys to nie jest.
    Pomyśl sobie co by było w sytuacji, gdyby piny były skonfigurowane jako jakiekolwiek wyjścia, a podczas startu procesora pod te WYJŚCIA podpięte były inne układy wymuszające jakiś stan (nie wiem, np. impulsatory, przyciski, kontaktrony, jakieś urządzenia będące masterami dla danego procesora) - podczas każdego startu aplikacji byłaby szansa na zwarcie (co prawda na ułamek sekundy, ale i tak to zwarcie) i w konsekwencji na uszkodzenie procesora lub innych układów.
    Na prawdę inżynierowie Atmela są nieco bardziej wykształceni niż my, a ustawienie wszystkich pinów w tryb wyjścia ze stanem niskim to w najgorszym przypadku AVR'a 13 instrukcji asemblera czyli 13 taktów procesora (mówię o ATMega2560, który ma 12 portów).
  • Pomocny post
    #10 12345672
    slx
    Poziom 19  
    Posty: 146
    Pomógł: 41
    Ocena: 16
    Wojtek001 napisał:
    W każdym razie dziwnym jest że producent ustawia piny domyślnie jako wejścia żeby działały niepotrzebnie jako anteny - pewnie miał taki kaprys.
    Co w tym dziwnego. Chyba w większości współczesnych mikrokontrolerów tak jest.

    Wojtek001 napisał:
    Co do asymetryczności wyjść moje stanowisko jest nieugięte. Kolega chcąc podważyć moje zdanie powinien zapoznać się z odpowiednimi informacja a nie wytykać "nieprawde" nie zadawszy sobie nawet trudu aby zajrzeć do noty.
    Może samemu warto do noty...
    Źródło: http://www.atmel.com/Images/Atmel-2486-8-bit-AVR-microcontroller-ATmega8_L_datasheet.pdf
    Rozdział I/O Ports Introduction strona 51
    Cytat:
    Each output buffer has symmetrical drive characteristics with both high sink and source capability.

    Mało - no to jeszcze do obejrzenia wykresy - rozdział ATmega8 Typical Characteristics podpunkt Pin Driver Strength, strony 259,260 z podanego datasheeta.

    Wojtek001 napisał:
    Pan ma chyba jakieś przestarzałe informacje rodem z rodziny '51...
    To właściwie było by podsumowanie wcześniejszych informacji, na temat asymetryczności wyjść. Bo to właśnie w 51 były wyjscia typu otwarty dren, zwierające do masy.
  • Pomocny post
    #11 12345760
    Wojtek001
    Poziom 15  
    Posty: 217
    Pomógł: 5
    Ocena: 74
    Racja. Przepraszam jeśli kogoś uraziłem powyższymi informacjami, ale radził bym nie wiązać się z możliwościami wysysania gigantycznych prądów jakie dają nam AVRy. Powinniśmy pozostawać wierni tradycyjnej konwencji która mówi że sterujemy od strony masy - daje nam to zresztą możliwość wykorzystania starszych układów takich jak AT89C2051 w przypadku którego na pierwszej stronie noty można przeczytać że jest kompatybilny pod względem budowy z '51 i ma asymetryczne wyjścia.
  • Pomocny post
    #12 12346135
    piotrva
    VIP Zasłużony dla elektroda
    Posty: 6409
    Pomógł: 625
    Ocena: 735
    Sterujemy od strony masy? Co to za dziwna filozofia. Wiadomo, że żarówki za pomocą AVR'a nie zasilimy, ale tu stan wysoki to stan wysoki, a nie jak w starodawnych 89C* zapewniany przez iluśtam omowy wewnętrzny pull-up...
  • REKLAMA
  • #13 12357104
    piotrek_nn
    Poziom 11  
    Posty: 43
    Ocena: 2
    Witam ,

    Dziękuje za odpowiedzi i dyskusję udało się wykonać układ i kilka innych na bazie tego programu. Teraz znowu proszę was o pomoc zacząłem bawić się z ADC czytałem help i nic mi z tego nie wychodzi chcę zmierzyć napięcie i wysłać je na wyświetlacz na symulacji pokazuje mi liczbę która się zmienia ale ma dużo cyfr po przecinku , jak zaprogramuję atmegę to już cuda mi na wyświetlaczu latają i od dwóch dni nie mam pomysłu jak to ogarnąć.

    wklejam kod jaki udało mi się wypocić. Miało być tak pięknie a wyszło jak zawsze :-(

    Kod: text
    Zaloguj się, aby zobaczyć kod

    {code}=>{syntax} LordBlick
  • Pomocny post
    #14 12359675
    alien_audio
    Poziom 21  
    Posty: 223
    Pomógł: 57
    Ocena: 18
    Witam.
    Wybrałeś dość trudny temat na początek nauki
    1./ przed wysłaniem danej na wyświetlacz skasuj go instrukcją CLS.
    2./ pomiary z przetwornika różnią się, należałoby wykonać np. 10 pomiarów
    co 25ms i wyciągnąć średnią.
    3./ wynik aby był czytelny należy zaokrąglić do np. dwóch miejsc po przecinku
    można zastosować funkcję Fusing
  • Pomocny post
    #15 12360135
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    alien_audio napisał:
    1./ przed wysłaniem danej na wyświetlacz skasuj go instrukcją CLS.
    Błąd. Spowoduje to migotanie wyświetlacza. Należy użyć raczej "Locate".
  • #16 12360394
    piotrek_nn
    Poziom 11  
    Posty: 43
    Ocena: 2
    ok dzięki odpowiedziom udało się ruszyć pomiar ADC, działa poprawnie i wymyśliłem sobie zrobić monitor stanu akumulatora .

    Nie mam pojęcia jak zrobić cos takiego aby wykonał warunek :

    If 13< nap < 14 then
    portb.1=1
    if nap<12,5 then `samo to działa
    portb.2=1

    jak dać przedział jako warunek próbowałem z or , and. Ręce opadają .

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #17 12360530
    landy13
    Poziom 31  
    Posty: 1418
    Pomógł: 195
    Ocena: 260
    piotrek_nn w listingu napisał:
    If 20 < We Or We < 23 Then

    Przecież We jest zawsze większe od 20 albo mniejsze od 23. Warunek więc zawsze jest spełniony. Gdy chcesz sprawdzić trafienie w okienko napisz:
    If 20 < We And We < 23
    czyli We jest większe od 20 i jednocześnie mniejsze od 23.

    Na przyszłość zajrzyj do słownika co znaczy "or" a co "and".
  • Pomocny post
    #18 12360978
    Konto nie istnieje
    Poziom 1  
  • #19 12375516
    piotrek_nn
    Poziom 11  
    Posty: 43
    Ocena: 2
    Witam ,

    Temat rozwiązany dzięki uwagom poskładałem wszystko i działa jak należy, dodam iż część błędów i zmarnowanego czasu były symulacje i dodanie $sim, na symulacji wszystko titało a na procku już nie .

Podsumowanie tematu

✨ Użytkownik rozpoczął naukę programowania na mikrokontrolerze ATmega8 z użyciem języka Bascom, napotykając problemy z działaniem programu, który miał kontrolować diodę LED i przyciski. Otrzymał porady dotyczące poprawnej konfiguracji pinów oraz podłączenia przycisków do masy z użyciem rezystorów podciągających. Po wprowadzeniu sugerowanych zmian, użytkownik z powodzeniem uruchomił układ. Następnie zajął się pomiarem napięcia za pomocą przetwornika ADC, gdzie również uzyskał pomoc w zakresie zaokrąglania wyników oraz poprawnego obliczania napięcia. Ostatecznie, po wprowadzeniu poprawek, użytkownik zrealizował projekt monitorowania stanu akumulatora.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA