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

[bascom] if end if co w tych komendach jest źle ?

mavi 02 Maj 2011 02:03 1344 14
  • #1 02 Maj 2011 02:03
    mavi
    Poziom 19  

    Jestem początkujący i zmagam się z poznaniem reguły if w programie bascom. Niby wszystko jasne ale przychodzi co do czego to nie działa prosta regułka włączania przyciskiem, diody. Dodam, że robie to na atmega 32. Wczesniej robiłem podobne reguły na atmega8 i takich problemów nie miałem.
    Co wiec w poniższej regule jest nie tak?

    $regfile = "m32def.dat"
    $crystal = 16000000

    Config Pinb.2 = Output
    Config Pinb.7 = Input
    Config Portb.2 = 0

    If Portb.7 = 0 Then
    Do
    Toggle Portb.2
    Loop
    End If
    End

    0 14
  • #2 02 Maj 2011 04:58
    Piotrek_P
    Poziom 18  

    Do sprawdzania stanu wejść używamy PinX.X a nie PortX.X

    Pozdrawiam
    Piotrek

    0
  • #3 02 Maj 2011 06:57
    emarcus
    Poziom 34  

    mavi napisał:
    Wczesniej robiłem podobne reguły na atmega8 i takich problemów nie miałem.
    Co wiec w poniższej regule jest nie tak?

    $regfile = "m32def.dat"
    $crystal = 16000000

    Config Pinb.2 = Output
    Config Pinb.7 = Input
    Config Portb.2 = 0

    If Portb.7 = 0 Then
    Do
    Toggle Portb.2
    Loop
    End If
    End


    Popatrz uważnie na swój code:

    Config Pinb.2 = Output ' tu konfigurujesz Pinb.2 jako Output;
    Bascom to zakceptuje bo w efekcie konfiguracja pinu lub portu sprowadza się do wyedytowania rejestru DDRb, chociaż powinieneś konfigurować portb.2 jako Output (1)
    Config Pinb.7 = Input '- tu jest OK, choć nie musi byc konfigurowany, by default jest Input.
    Config Portb.2 = 0 ' -a tu poprawiasz poprzednią konfiguracje tego samego portu na Input. Kombinacja taka jest dopuszczalna pod warunkiem że brana jest pod uwagę ostatnia konfiguracja.
    Dalej, znów;
    If Portb.7 = 0 Then ' - poniewaz ta linia jest przed "Do" będzie czytana tylko jeden raz (podczas startu lub reset), i processor nigdy tu nie powróci....
    ( Jezeli już testujesz wejście to w 'Do...Loop' oraz; If PINB.7 = ...)

    Do
    Toggle Portb.2 ' - Portb.2 w 'poprawce konfiguracji' dałes jako Input (0); jak więc chcesz realizować toggle dla wejścia?

    Ten program nie ma nawet szans na kompilację.

    e marcus

    0
  • #4 02 Maj 2011 15:43
    mavi
    Poziom 19  

    Przyznam szczerze, że to juz n-ta wersja tego samego programu i faktycznie wklilem tu już taka poprzerabiną bo mi już pomału ręce opadają.
    Przeróbki sa wynikiem rożnych przykładów z netu i pewnie stąd taki "Twór".
    Co do samego mojego "tworu" to program to kompilował bez problemu w takiej postaci.
    Teraz po uwzględnieniu porad jest tak. że niestety nadal nie działa, a dioda pali się ciągle nie reagując na przycisk. Jak dodaje linie; Config Portb.2 = 0, to dioda się w ogóle nie zapala...
    poniżej mój nie działający program:
    $regfile = "m32def.dat"
    $crystal = 16000000
    Config Portb.2 = Output
    Config Pinb.7 = Input
    Do
    If Pinb.7 = 0 Then
    Toggle Pinb.2
    Loop
    End If
    End

    0
  • #5 02 Maj 2011 15:57
    polprzewodnikowy
    Poziom 26  

    Zamień miejscami Loop i End If. Zmień Toggle Pinb.2 na Toggle Portb.2.

    0
  • #6 02 Maj 2011 16:19
    armo1
    Poziom 9  

    Mnie się wydaje że to powinno być tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #7 02 Maj 2011 16:54
    mavi
    Poziom 19  

    Wkleiłem żywcem wpis z ostatniego posta i nic. Tzn dioda się pali jak sie paliła.
    zmieniałem porty i na innych portach po zmianie programu ta sama reakcja.
    Jedyna inna reakcja to to, że jak się naciska przycisk to dioda zaczyna palić się mocniej. Jak puszczam to znów pali się jak przed nacisnięciem przycisku.
    Ogólnie czasami zamiga. Już myślałem, że atmega jest popsuta ale mam dwie identyczne płytki testowe z układami atmega32 i w obydwóch występuje ta sama sytuacja...

    Czy mogą to być zakłócenia? Układ zasilam z portu usb i jak dotykam do masy wtyczki USB to dioda miga. Czasami nawet zgaśnie ale zapala się po chwili.

    0
  • #8 02 Maj 2011 17:13
    Wojtek75
    Poziom 23  

    Kolego skompiluj sobie kod poniżej i poczytaj zawarte w nim komentarze. I jeszcze jedno masz spory problem z tak prostym kodem a jednocześnie wartość po $crystal wynosi u ciebie 16MHz rozumiem że poprawne konfigurowanie fuse w tym uC masz opanowane.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #9 02 Maj 2011 17:51
    mavi
    Poziom 19  

    Tak jak napisałem w pierwszym poście na atmega8 nie miałem z tym problemu a tu jakoś stanąłem mimo wszelkich prób rozwiązania problemu.

    Kod który kolega dodał różni sie prócz zmiany nazewnictwa tylko komendą "set", o której i z początku pamiętałem ale teraz uszła mi z pamięci :)

    Po wklejeniu żywcem kodu, tak jak wcześniej kodu armo1 jest różnica o tyle, że dotykając gniazda usb nie mam już migotania diody, a przycisk faktycznie ją włącza. Lecz nie zawsze wyłącza. Trzeba po kilka razy naciskać.

    Mój przycisk to mikrostyk i wiem że w powinno się dodawać dodatkowy czas na bezwłoczność (lub nazwa drganie styku)
    Co do poprawnie konfigurowanych fuse, to nie mam opanowanych bo jestem uczącym się dopiero. Wczesniej korzystałem z płytki testowej z atmega8, a teraz mając drugą z atmega32 postanowilem coś skonstruować. Płytka z atmega8 też jest podpinana pod usb i tam nie mialem takich problemów by mi coś nie chodziło.
    Obydwie płytki kupiłem w celu nauki i zakładam, że producenci je odpowiednio skonfigurowali przynajmniej do tego by tak prosta komenda jak if...then działała poprawnie.

    A tu z taką komendą, taki problem.

    0
  • #10 02 Maj 2011 18:15
    armo1
    Poziom 9  

    Code:
    $regfile = "m32def.dat"
    
    $crystal = 16000000
    Config Portb.2 = Output
    Config Pinb.7 = Input

    portb.2 = 0
    portb.7 = 1
    Do

    If Pinb.7 = 0 Then
    Toggle Portb.2
    wait 1
    End If
    loop
    End

    spróbuj ten lekko poprawiony kod zamiast pinb.7 = 1 daj Portb.7 = 1, sprawdziłem na atmedze8 ten poprzedni kod bez tej zmiany u mnie też nie poszło, a po tej zmianie Pin na port działa bez problemu no i dodaj wait 1 gdyż inaczej po naciśnięciu przycisku stan na przeciwny zmieni ci się wiele razy kiedy będziesz trzymał przycisk

    0
  • #12 02 Maj 2011 18:40
    polprzewodnikowy
    Poziom 26  

    A żeby nie cudować z waitami:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #13 02 Maj 2011 18:52
    Wojtek75
    Poziom 23  

    mavi napisał:
    Tak jak napisałem w pierwszym poście na atmega8 nie miałem z tym problemu a tu jakoś stanąłem mimo wszelkich prób rozwiązania problemu.

    Kod który kolega dodał różni sie prócz zmiany nazewnictwa tylko komendą "set", o której i z początku pamiętałem ale teraz uszła mi z pamięci :)

    Widzisz, tak drobny szczegół i od razu lepiej działa.

    mavi napisał:
    Po wklejeniu żywcem kodu, tak jak wcześniej kodu armo1 jest różnica o tyle, że dotykając gniazda usb nie mam już migotania diody, a przycisk faktycznie ją włącza. Lecz nie zawsze wyłącza. Trzeba po kilka razy naciskać.

    Mój przycisk to mikrostyk i wiem że w powinno się dodawać dodatkowy czas na bezwłoczność (lub nazwa drganie styku)

    W bascomie jest taka fajna funkcja jak Debounce poczytaj sobie o niej choćby w polskim helpie który bez problemu można ściągnąć ze strony mcs.
    #edit
    Kolega polprzewodnikowy dał ci nawet przykład jak jej użyć

    mavi napisał:
    Co do poprawnie konfigurowanych fuse, to nie mam opanowanych bo jestem uczącym się dopiero. Wczesniej korzystałem z płytki testowej z atmega8, a teraz mając drugą z atmega32 postanowilem coś skonstruować. Płytka z atmega8 też jest podpinana pod usb i tam nie mialem takich problemów by mi coś nie chodziło.
    Obydwie płytki kupiłem w celu nauki i zakładam, że producenci je odpowiednio skonfigurowali przynajmniej do tego by tak prosta komenda jak if...then działała poprawnie.

    A tu z taką komendą, taki problem.

    Fabryczna mega32 działa z włączonym wewnętrznym RC o wartości ~1MHz więc do momentu w którym nie zapoznasz się z tematem konfiguracji fuse raczej nie wpisuj po $crystal dowolnej liczby która przyjdzie ci na myśl. Chyba że w dokumentacji tego zestawu który sobie kupiłeś pisze że jest skonfigurowana inaczej.

    0
  • #14 03 Maj 2011 16:13
    mavi
    Poziom 19  

    Tak jak już wcześniej napisałem procesor atmega32 mam wmontowany w płytkę testową i wszelkie próbne programy producenta są z konfiguracją :
    $crystal = 16000000

    Wracając do mojego problemu to muszą to być zakłócenia bo mimo komend dioda potrafi migać mimo, że nie naciskam przycisku. Co ciekawe zapala się wtedy gdy zbliżam ręke do płytki i nawet jej nie dotykam. Dioda gaśnie po kilku sekundach od chwili gdy rękę oddalam.... Już myślałem, że to wadliwy mikrostyk ale odłączając przewód od tego przycisku efekt jest identyczny.
    Dopisałem komendy by w chwili gdy przyciskam przycisk prócz zapalającej się diody, na wyświeltaczu lcd zmianiał również tekst.
    I efekt jest taki jak wcześniej, czyli zbliżam rękę zapala się dioda i zmienia się tekst na wyświetlaczu.
    Jeśli pozostawie układ sam sobie z dala ode mnie to po dłuższym czasie dioda też sie sama zapala i gaśnie.

    Dodam, że zgodnie z radą przypomniałem sobie o komendzie
    set PORTB.0 i jest ona w moim programie.

    0
  • #15 03 Maj 2011 18:17
    Wojtek75
    Poziom 23  

    mavi napisał:
    Tak jak już wcześniej napisałem procesor atmega32 mam wmontowany w płytkę testową i wszelkie próbne programy producenta są z konfiguracją :
    $crystal = 16000000

    Ok. Ale to wcale nie oznacza, że twój uC pracuje z taką częstotliwością. W zasadzie to sam powinieneś wiedzieć, z jaką częstotliwością pracuje ustawiając to samodzielnie.

    mavi napisał:
    Wracając do mojego problemu to muszą to być zakłócenia bo mimo komend dioda potrafi migać mimo, że nie naciskam przycisku. Co ciekawe zapala się wtedy gdy zbliżam ręke do płytki i nawet jej nie dotykam. Dioda gaśnie po kilku sekundach od chwili gdy rękę oddalam.... Już myślałem, że to wadliwy mikrostyk ale odłączając przewód od tego przycisku efekt jest identyczny.
    Dopisałem komendy by w chwili gdy przyciskam przycisk prócz zapalającej się diody, na wyświeltaczu lcd zmianiał również tekst.
    I efekt jest taki jak wcześniej, czyli zbliżam rękę zapala się dioda i zmienia się tekst na wyświetlaczu.
    Jeśli pozostawie układ sam sobie z dala ode mnie to po dłuższym czasie dioda też sie sama zapala i gaśnie.

    W tym przykładowym programiku powyżej korzystasz tylko z dwóch pinów uC a pozostałe pozostają na fabrycznych ustawieniach, czyli jako pływające wejścia a to powoduje że twój uC to taka antenka, która podatna jest na wszelkiego rodzaju zewnętrzne zakłócenia. Dlatego najlepiej jest na nieużywanych pinach skonfigurować jakieś konkretne kierunki działania (wejście lub wyjście) i ustalić na nich jakieś określone stany. Nie znam twojego układu, dlatego nic konkretnego ci nie doradzę. Poza tym, co się dziej z pinem reset w twoim układzie? Ja tego nie wiem, bo nie widzę schematu. Stabilne zasilanie układu również jest bardzo istotne.

    mavi napisał:
    Dodam, że zgodnie z radą przypomniałem sobie o komendzie
    set PORTB.0 i jest ona w moim programie.

    Tu nie chodzi o instrukcje Set bo oznacza ona tyle, co wpisanie jedynki do odpowiedniego bitu odpowiedniego rejestru a można to zrobić na wiele innych sposobów choćby PORTB.0=1 a najlepiej wykorzystywać do tego operatory bitowe. Chodzi o to żebyś wiedział gdzie tą jedynkę masz wpisać żeby osiągnąć zamierzone działanie programu. A ty albo tego nie robiłeś wogóle albo ktoś inny próbował ją wpisać nie tam gdzie trzeba.
    Popatrz wyżej takie coś jest bez sensu:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    dlatego że rejestr PINx w m32 jest tylko do odczytu i nie można wpisać do niego żadnej wartości.

    A tak wogóle to przyjmij dobrą radę. Skoro dopiero zaczynasz z B_Basic to najlepiej o nim zapomnij i zacznij uczyć się C bez porównania większa kontrola nad wszystkim z poziomu składni samego języka. A optymalizacja to już zupełnie inna bajka.

    0