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

"Knight Rider" na at89c2051 potrzebuje pomocy...

senso 18 Sty 2007 19:50 1799 13
REKLAMA
  • #1 3458947
    senso
    Poziom 20  
    Posty: 471
    Pomógł: 17
    Ocena: 21
    Witam wszystkich.Powiem tak,studia o profilu mechanicznym...na magisterke robie robota i musze sie oswoic z programowaniem tego procka.Zaczynam od podstaw zeby zakumac proces z uwagi na to ze programowaniem zajmowalem sie w podstawowce na Quick basicu :D. To o co prosze czyli pomoc przy programie na plywajace swiatelko....max 10 led...to tylko tak w celu zakumania...pozniej zaczne szukac i przerabiac dostepne softy aby w koncu napisac swoj wlasny od podstaw.Wiem ze sa lektury itp ale obecnie sesja i nie mysle szczerze mowiac o tym...jak mam czas to sie chwytam za to.Wiec czy ktos napisze mi tutaj na forum gotowca na plywajace swiatelko? :D pozdrawiam wszystkich wyrozumialych:D
  • REKLAMA
  • #2 3461067
    senso
    Poziom 20  
    Posty: 471
    Pomógł: 17
    Ocena: 21
    Sluchajcie ja wiem ze to moge zrobic na piechote tzn napisac softa ktory bedzie gasil i zapalal pokolei porty w zadanych odstepach czasu i puscic to w petli,ale napewno sa jakies skrotowe komendy typu zapalaj porty od 1-10 w odstepach czasu x i na czas y i o takie cos mi chodzi.Bede wdzieczny za pomoc....
  • REKLAMA
  • #3 3461108
    markosik20
    Poziom 33  
    Posty: 2261
    Pomógł: 208
    Ocena: 147
    Cytat:
    moge zrobić na piechote tzn napisac softa ktory bedzie gasil i zapalal pokolei porty w zadanych odstepach czasu i puscic to w petl

    To nie jest na piechotę. Tak się programuje uP. Używanie komend "zrób to" a potem "zrób tamto" są w języku Bascom, ale nie do wszystkiego są standardowe komendy i jak będziesz chciał coś zmienić w tej "standardowej" komendzie to możesz się już nie połapać.
  • #4 3461885
    senso
    Poziom 20  
    Posty: 471
    Pomógł: 17
    Ocena: 21
    Napisalem maly soft dla 4 led bo tyle mialem wolnych.Jak mowilem jest to na piechote....mam problem bo jak wlaaczam zasilanie i proce sie resetuje przez konda 100uF to przez ok 2 sec wszystkie wyjscia sa na 1 - jak to obejsc?

    $crystal = 4000000

    Do
    P3.2 = 1
    If P3.2 = 0 Then
    Set P1.5
    Waitms 70
    Reset P1.5
    Waitms 30
    Set P1.4
    Waitms 70
    Reset P1.4
    Waitms 30
    Set P1.3
    Waitms 70
    Reset P1.3
    Waitms 30
    Set P1.2
    Waitms 70
    Reset P1.2
    Waitms 30
    Set P1.3
    Waitms 70
    Reset P1.3
    Waitms 30
    Set P1.4
    Waitms 70
    Reset P1.4
    Waitms 30
    Else
    P1.5 = 0
    P1.4 = 0
    P1.3 = 0
    P1.2 = 0
    End If

    Loop

    Bede wdzieczny za słowa krytyki, ktore mi pomoga w zakumaniu.
    pozdro
  • #5 3462487
    wojtek_lampka
    Poziom 11  
    Posty: 7
    Pomógł: 1
    Witam. Czy na pewno az tak duzy kondensator (duza stala czasowa) jest Ci potrzebna na resecie? Jakie opoznienie cie zadowoli? A napisac mozna to prosciej np. wpisujac wartosc 11111110 bin i wykorzystujac w petli komende rotacji (w assemblerze). Pozdrawiam
  • #6 3463265
    senso
    Poziom 20  
    Posty: 471
    Pomógł: 17
    Ocena: 21
    Zmienilem konda na 10uF i jest ok 0,5s na resecie i ok poki co.Ale mam pytanie,napisalem kilka tzn 4 programy dla 10 ledow ale chce sterowac tmi programami tzn wybierac ktory ma pracowac tylko za pomoca dwoch nozek 3.2 i 3.1 1-1,1-0,0-1,0-0 takie stany na tych nowzkach wzgledem siebie wlaczaja poszczegolne softy ale mam klopot.programy chodza po dwa tzn jeden sie konczy i zaczyna sie drugi i tak w petli,wiem ze blad tkwi w skladni komendy...pomozcie :D

    $crystal = 4000000



    Do
    P3.2 = 1
    P3.1 = 1
    P1.7 = 0
    P1.6 = 0
    P1.5 = 0
    P1.4 = 0
    P1.3 = 0
    P1.2 = 0
    P3.3 = 0
    P3.4 = 0
    P3.5 = 0
    P3.7 = 0

    If P3.2 = 1 Then
    If P3.1 = 1 Then
    Gosub Lp
    End If
    End If

    if P3.2 = 1 Then
    if P3.1 = 0 Then
    Gosub Dwa
    End if
    Endi if

    if P3.2 = 0 Then
    if P3.1 = 0 Then
    Gosub Trzy
    End if
    Endi if

    if P3.2 = 0 Then
    if P3.1 = 1 Then
    Gosub Cztery
    End If
    End if

    Loop

    Lp:

    ...
    return
    Dwa:
    ...
    return
    Trzy:
    ...
    return
    Cztery:
    ...
    return

    Co tu nie gra?

    Tzn dzialaja tylko dwa wsady Lp/przy stanach 1-1/ i Dwa/przy stanach 0-0/

    Juz wszystko dziala :D poprawilem wsad,ten tu jest juz poprawiony, trza bylo dawac podwojne End if ,przeoczylem to.
  • #7 3464829
    senso
    Poziom 20  
    Posty: 471
    Pomógł: 17
    Ocena: 21
    A jak zoribc wewnetrzny licznik? Tzn w taki sposob zeby wykorzystac Porty 3.1 i 3.2 jak zwiększający i zmniejszający?Chodzi o to ze po właczeniu procka nic sie nie dzieje tzn oczekuje na nas.Kazde zwarcie 3.1 do (-) powoduje wzrost licznika o 1 a 3.2 do (-) zmalenie licznika.A stan licznika =0 to oczekuje,licznik=1 program LP,licznik = 2 to program Dwa,licznk = 3 to porogram Trzy,licznik =4 to program Cztery,Wartosc 5 na liczniku powduje jego wyzerowanie.....Jak to napisac...?czytalem ze musze zastosowac nozke 3.4 jako wejscie licznika itp. Jak to rozwiazac?
    dzieki z gory
  • #8 3465521
    wojtek_lampka
    Poziom 11  
    Posty: 7
    Pomógł: 1
    Witam. Mozesz wybrac dwie dowolne nozki. jako rejestr licznika wybrac jedna lokacje w wewnetrzym ram'ie. a algorytm zalezy od Ciebie. jesli ma to tylko zliczac (jenda nozka w gore druga w dol) to najprosciej sprawdzac w petli stan nozek i inc lub dec ten rejestr. jesli ma liczy pomiedzy 0-5 to po kazdej operacji sprawdzaj czy wartosc w rejestrze jest w tym zakresie. pamietaj o drganiach klawiszy. Pozdrawiam
  • REKLAMA
  • #9 3465652
    senso
    Poziom 20  
    Posty: 471
    Pomógł: 17
    Ocena: 21
    Wojtek chyba Cie rozumiem ale moze mogłbyś napisac cos na przyklad? bo ja pisalem z tym incr i decr i tylko jeden soft smiagal ,zliczal w gore ale tylko jeden program jako pierwszy odpalal :( potrzebowalbym przykladu...sam to przerobie.

    PS ja dopiero startuje z tym wiec nie wiem dokladnie o co Ci chodzi :D
  • REKLAMA
  • #10 3466000
    wojtek_lampka
    Poziom 11  
    Posty: 7
    Pomógł: 1
    Czyli Chcesz cos takiego: naciskasz jeden klawisz i zwiekszasz licznik. odczytujesz jego wartosc i na tej podstawie wykonujesz procedure o tym numerze poczym znowu wracasz do sprawdzania klawiszy. z klawiszem od zmniejszania analogicznie . czy tak?
  • #11 3466288
    senso
    Poziom 20  
    Posty: 471
    Pomógł: 17
    Ocena: 21
    Nom,czyli po wlaczeniu procka wszystko spi tzn zaden program sie nei odpala bo licznik=0,ale jak na jednej nozce podniose wartosc licznika od 1-4 np. to wykana sie program z listy 1-4.Druga nozka zbijam licznik w dol...czyli jak ustale np licznik=2 to w kolko bedzie chodizl program drugi jak zmienia licznik to inny program,tylko licznik=0 zatrzymuje procka.

    $crystal = 4000000

    Dim Licznik As Byte

    Do

    P3.2 = 1
    P3.1 = 1
    P1.7 = 0
    P1.6 = 0
    P1.5 = 0
    P1.4 = 0
    P1.3 = 0
    P1.2 = 0
    P3.3 = 0
    P3.4 = 0
    P3.5 = 0
    P3.7 = 0


    If P3.2 = 0 Then
    If P3.1 = 1 Then
    Licznik = Licznik + 1
    End If
    End If
    If P3.1 = 0 Then
    If P3.2 = 1 Then
    Licznik = Licznik - 1
    End If
    End If


    If Licznik = 1 Then
    Gosub Lp
    If Licznik = 2 Then
    Gosub Dwa
    If Licznik = 3 Then
    Gosub Trzy
    If Licznik = 4 Then
    Gosub Cztery
    If Licznik = 5 Then
    Licznik = 0
    End If
    End If
    End If
    End If
    End If



    Loop

    Dalej sa juz poszczegolne procedury Lp,dwa,trzy i cztery....

    ale zle to pisze,moze naprowadzicie mnie jakos?komendami incr i decr nie potrafie sie wyraznie poslugiwac :D tu tez cos skopalem he he.Pomocy...

    Ps Przekaze punkty i pochwale tym ktorzy mi pomoga,zalezy mi na tym.

    If P3.2 = 0 Then
    If P3.1 = 1 Then
    Incr Licznik
    End If
    End If

    If P3.1 = 0 Then
    If P3.2 = 1 Then
    Decr Licznik
    End If
    End If


    If Licznik = 1 Then
    Gosub Lp
    End If
    If Licznik = 2 Then
    Gosub Dwa
    End If
    If Licznik = 3 Then
    Gosub Trzy
    End If
    If Licznik = 4 Then
    Gosub Cztery
    End If
    If Licznik = 5 Then
    Licznik = 0
    End If

    Dalem zamiast "licznik +1" i dziala :D qrna dlugo mi zeszlo he he ale jak przyczymam styk to pogramy przelatua jeden po drugim czyli zlicza dalej,jak zadac stala czasowa ze np 1s to dopiero zmiana? sprobuje dac kondy pomiedzy styki a nozki procka,moze skladowa stala nie bedzie robila tyle problemow...wtedy pozostana juz tylko impulsy....100nF na poczatek..
  • Pomocny post
    #12 3466575
    wojtek_lampka
    Poziom 11  
    Posty: 7
    Pomógł: 1
    Cos takiego na szybko napisalem:
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;definicje

    wgore equ p3.2
    wdol equ p3.3

    licznik equ 30h
    timerek0 equ 31h
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    org 00h
    jmp start ;przeskakuje obszar wektorow przerwan



    org 50h

    start:
    mov licznik,#0h ;na dziendobry zeruje licznik

    main_loop:
    ;w tej petli sprawdzam tylko czy ktorys z klawiszy nie zostal wcisniety

    jb wgore,main_loop_dol
    call d20ms
    jb wgore,main_loop_dol ;sprawdza stan klawisza od zlicznia w gore
    jmp main_loop1

    main_loop_dol:
    jb wdol,main_loop
    call d20ms
    jb wdol,main_loop ;;sprawdza stan klawisza od zlicznia w dol
    jmp main_loop2

    ;zaden nie wcisniety
    jmp main_loop

    main_loop1:
    mov a,licznik
    cjne a,#5,main_loop1_zwi ;porownuje stan licznika z gornym zakresem
    jnb wgore,$ ;gorny zakres osiagniety wiec tylko czekam na puszczenie klawisza
    jmp wybor_procedury

    main_loop1_zwi:
    ;tu wskakuje gdy gorny zakres jeszcze nie osiagniety
    inc licznik
    jnb wgore,$
    jmp wybor_procedury

    main_loop2:
    mov a,licznik
    cjne a,#0,main_loop2_zmn
    jnb wdol,$
    jmp wybor_procedury

    main_loop2_zmn:
    dec licznik
    jnb wdol,$
    jmp wybor_procedury

    wybor_procedury:
    ;tu na podstawie wartosci licznika wybieram program

    mov a,licznik

    cjne a,#0,wybor_procedury_spr1
    call procedura_zerowa
    jmp main_loop

    wybor_procedury_spr1:
    cjne a,#1,wybor_procedury_spr2
    call procedura_pierwsza
    jmp main_loop

    wybor_procedury_spr2:
    cjne a,#2,wybor_procedury_spr3
    call procedura_druga
    jmp main_loop

    wybor_procedury_spr3:
    cjne a,#3,wybor_procedury_spr4
    call procedura_trzecia
    jmp main_loop

    wybor_procedury_spr4:
    cjne a,#4,wybor_procedury_spr5
    call procedura_czwarta
    jmp main_loop

    wybor_procedury_spr5:
    call procedura_piata
    jmp main_loop

    ;;;tu procedury funkcji

    procedura_zerowa:
    ;instrukcje procedury 0
    ret

    procedura_pierwsza:
    ;instrukcje procedury 1
    ret

    procedura_druga:
    ;instrukcje procedury 2
    ret

    procedura_trzecia:
    ;instrukcje procedury 3
    ret

    procedura_czwarta:
    ;instrukcje procedury 4
    ret

    procedura_piata:
    ;instrukcje procedury 5
    ret

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;a tu male opoznienie dla sprawdzania klawiszy
    d20ms:
    mov timerek0,#0
    djnz timerek0,$
    ret

    end

    Pozdrawiam
  • #13 3466656
    senso
    Poziom 20  
    Posty: 471
    Pomógł: 17
    Ocena: 21
    To zes qrna polecial he he :D
    Wielkie dzieki i nagroda :D
    pozdro senso

    Ps pochwala i + 50 pkt .Wielkie dzieki
  • #14 3466673
    wojtek_lampka
    Poziom 11  
    Posty: 7
    Pomógł: 1
    sorki ale tylko w asemblerze pisze. program dziala. Pozdrawiam

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy programowania mikrokontrolera AT89C2051 w celu realizacji efektu "pływającego światełka" na maksymalnie 10 diodach LED. Autor, początkujący w programowaniu mikrokontrolerów, prosi o gotowy przykład programu lub wskazówki ułatwiające zrozumienie sterowania portami i implementacji sekwencji zapalania i gaszenia LED. Poruszono kwestie związane z opóźnieniami wynikającymi z kondensatora na linii resetu oraz problemem inicjalizacji portów po starcie układu. Wskazano, że programowanie mikrokontrolera wymaga pisania sekwencji w pętli, a standardowe komendy wysokopoziomowe (np. w Bascomie) mogą nie być wystarczające lub zbyt abstrakcyjne. Autor próbuje sterować różnymi programami (procedurami) za pomocą dwóch wejść portu P3.1 i P3.2, jednak napotyka problemy ze składnią i logiką warunków. W odpowiedzi zaproponowano implementację licznika wewnętrznego, który jest inkrementowany lub dekrementowany przez sygnały na tych wejściach, a jego wartość decyduje o wywołaniu odpowiedniej procedury. Przykład kodu w asemblerze pokazuje obsługę przycisków z eliminacją drgań styków i wybór procedur na podstawie wartości licznika. Dyskusja zawiera także fragmenty kodu w Bascomie oraz asemblerze, które ilustrują podejście do problemu. Podkreślono konieczność uwzględnienia debouncingu przycisków oraz ograniczenia zakresu licznika.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA