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

szeregowo (3Wire) z ATmega 8

08 Gru 2006 07:12 2984 15
  • Poziom 19  
    Potrzebuje pomocy , narazie chcialbym wiedziec -a literatura do jakiej udalo mi sie dotrzec tego nie wyjasnia -mianowicie jak wyslac wiecej niz 16 ,a dokladniej to 24 zdefiniowanych bitow szeregowo poprzez port PD5
    PD6 -bylo by wyjsciem "CLOCK"
    PD7 -wyjsciem "CHIP ENABLE"

    JAKICH INSTRUKCJI ASEMBLERA UZYC DO WYSLANIA ?

    DZIEKI ZAEWENTUALNA POMOC! i prosze sie nie smiac , jestem poczatkujacy z asemblerem
  • Poziom 42  
    ... ale chodzi ci o stworzenie własnego interfejsu szeregowego? nie chcesz skorzystać z gotowych dobrodziejstw jak: RS232, SPI - I2C, które ten procesor obsługuje sprzętowo? Wtedy nie musiałbyś sam pisać obsługi transmisji. Chyba, że jest ci to potrzebne do jakichś nietypowych zastosowań to rozumiem - wtedy musisz najpierw sobie dokładnie określić warunki transmisji, parametry czasowe itp. Następnie w procedurce asm w pętli pobierasz po kolei bajty które chcesz przesłać a w kolejnej pętli pobierasz z nich poszczególne bity. Wtedy w zależności czy bit=0 czy 1 wystawiasz na swoje PD5 odpowiedni stan plus odpowiednie dla ciebie sygnały na PD6 i PD7. Za mało napisałeś do czego to ma być więc ciężko coś więcej podpowiedzieć ;) .... zastanów się jednak (poczytaj notę PDF) czy nie warto skorzystać z jakiegoś wbudowanego interfejsu dzięki, któremu to wysyłanie i odbieranie mogłoby być o wiele prostsze ;)

    pozdrówka
  • Poziom 19  
    dzieki za szybką reakcje

    wyglada to mniej wiecej tak, z taka roznica ze ponizszy fragment kodu jest tylko przykladem, bity w projektowanym przeze mnie urzadzeniu maja inna kolejnosć
    czy instrukcja"for lauf = 1 to 24" spowoduje szeregowe przesuwanie 24 bitow
    jaką instrukcja, i czy da sie wpisac do rejestrow w ATmega8 24 bity naraz, a pozniej jedna instrukcja je szeregowo wyslac przez port PD5 ?,czy nalezy to zrobic w kilku cyklach ?- jesli tylko tak to czy mozna wpisac do rejestru jako bit 12 -0, a nastepnie wyslac go kolejno w 12 taktach zegara?
    -----------------------------------------------------------------------

    Sub to :
    local seriellword as Word
    local lauf as Byte
    seriellword = frequ
    seriellword.11 = stereo.0
    seriellword.14 = driver.0
    'locate 2 , 1
    'lcd bin(seriellword )
    chipena = 1 'Chip selektieren
    for lauf = 1 to 16
    datas = seriellword.0 'Datenbit 0 anlegen
    clock = 1 'und übergeben
    waitus 250
    clock = 0
    shift seriellword , RIGHT 'nächstes Bit in Position 0 schieben
    next lauf 'Chip deselektieren
    chipena = 0
    end SUB
    -----------------------------------------------------------------------

    w powyzszym przypadku szeregowo jest wysylanych 16 bitow, natomiast zalezy mi na zmodyfikowaniu kodu

    czyli narazie tak jak ponizej: z gory ustalony stan bitow poprzez asembler , a w dalszej kolejnosci menu z regulacja glosnosci poprzez zmiane stanu bitow 13...16 , czyli 16 poziomow glosnosci

    bity

    13-0
    14-o
    15-o
    16-0

    17-0

    18-0
    19-0

    20-0 lub 1

    21-1
    22-0

    23-0
    24-0
    ------------------------------------------------------
    szeregowo (3Wire) z ATmega 8
    szeregowo (3Wire) z ATmega 8
    szeregowo (3Wire) z ATmega 8
    szeregowo (3Wire) z ATmega 8
  • Poziom 42  
    przykładowa procedura mogłaby wyglądać tak:

    .EQU DATA = 5
    .EQU CLOCK = 6
    .EQU CHIP_ENABLE = 7

    ;parametry wejściowe
    ;
    ; 3 bajty danych do wysłania umieszczone w SRAM
    ; pod adresem dane:

    send:
    ldi XL, Low(dane)
    ldi XH, High(dane)
    ldi R17, 3
    cbi PORTD, CLOCK
    cbi PORTD, DATA
    cbi PORTD, CHIP_ENABLE

    sbi PORTD, CHIP_ENABLE

    racall wait_ms ;

    Petla_0:
    ldi R18, 8
    ld R16, X
    Petla_1:
    cbi PORTD, CLOCK
    ror R16
    brcc Send_0
    sbi PORTD, DATA
    rjmp next1
    Send_0:
    cbi PORTD, DATA
    Next1:

    rcall wait_ms

    sbi PORTD, CLOCK

    rcall wait_ms

    dec R18
    brne Petla_1

    inc XL
    dec R17
    brne Petla_0

    cbi PORTD, CHIP_ENABLE

    ret

    to tak na szybko napisane ;) ... UWAGA! nie napisałem procedurki która tam występuje "wait_ms" - nie znam zależności czasowych i czy są one bardzo rygorystyczne. Jeśli są takie to dobrze byłoby uzyć do odmierzania czasu jakiegoś Timera(przerwania) ... ale ogólnie tak to powinno mniej więcej wyglądać w asemblerze...

    ... przed wywołaniem tej procedury ładujesz swoje dane do pamięci RAM (3 bajty - razem 24bity) po adres dane i wywołujesz procedurę send.

    ldi R16, dana1
    sts dane, R16
    ldi R16, dana2
    sts dane+1, R16
    ldi, R16, dana3
    sts dane+2, R16
    rcall send

    ;)

    pozdrówka - może ktoś jeszcze dostrzeże jakiś błąd w tym co napisałem to ew poprawi mnie ;)
  • Poziom 30  
    Musi być inaczej.

    Trzeba rozdielić sterowanie linią cs i oddzielnie wysyłanie. Chodzi o to żeby dane wyszły przy tym samym ściągnieciu cs do masy - inaczej każde opadajace zbocze zresetuje ci wewnętrzny licznik.
    Tak działaja wsyzstkie mi znane ukłądy na spi i i2c (bo bardzo podobne).

    I tak tutaj trzeba zrobić. W avr jest od tego odpowiedni status więc łatwo bedzie to zrobić.

    I jeszcze jedno. W takich magistralach (spi, i2c) jest ogólnie przyjete zewnętrzne (czasami wewnętrzne) podciaganie do plusa i silne zwieranie do masy. Dlatego proponuje sterować portem jako wejście hi-z, wyjście stan zero.
    Po drugie: mniej można uszkodzić bawiąc się w ten sposób.
  • Poziom 19  
    postanowilem zamowic książke http://www.btc.pl/?id_prod=6832 , skakanie do linkow zawierajacych spisy instrukcji procesorow AVR jest zbyt rozpraszajace i niewygodne , lepiej miec wszystko pod ręka

    czysto teoretyczne sprawdzanie poprawnosci programu na niewiele sie zda , wiec chcialbym zabrac sie do sprawdzania w praktyce przytoczonych przez kolegow propozycji , ale natknolem sie na pierwsze problemy z AVRstudio 4.12, wybaczcie lamerskie pytanie- ale jak otworzyc jakis przykladowy kod asm. za pomoca AVR studio,cos widocznie robie nie tak , ale progra mi tego nie widzi

    ktos byc moze zada mi pytanie dlaczego nie np bascom , tylko asembler , po pierwsze chcialbym poznac komendy asemblera , a po drugie zalezy mi tez na przerobieniu kilku istniejacych projektow do ktorych mam kod asm.
  • Poziom 42  
    ... najpierw do kolegi szymtro - z całym szacunkiem ale - co masz na myśli pisząc o sygnale cs, jego ściąganiu do masy i resetowaniu wewn licznika??? ... co to ma wspólnego z przedstawionym opisem algorytmu(tego po niemiecku) i wykresem czasowym przedstawionym przez autora tematu???? ;) przecież z tego wykresu widać iż jest to jakiś "specyficzny" rodzaj transmisji szeregowej. Więc jeśli pisząc cs - miałeś na myśli ChipEnable to po co tu jakieś oddzielne sterowanie tą linią? ;) ... przykład w asm który napisałem dokładnie wyśle po kolei 24bity zgodnie ze specyfikacją podaną przez autora tematu (zakładam, iż autor ma informacje, iż układ o którym mówi spokojnie przyjmie(odbierze) 24 bity zamiast 16. No i autor musi już sam sobie napisać tylko procedurki wprowadzające opóźnienia 250us. Z wykresu zależności czasowych widać, że dane wejściowe wczytywane są przy narastającym zboczu sygnału CK (clock). Zakładam też, że wszystkie 3 sygnały generowane są w kierunku do tego scalaka.

    do autora
    Jak najbardziej popieram zabranie się za asemblera ;) warto się go nauczyć a później ew jakiegoś języka wyższego rzędu. Polecam też gorąco książkę z asemblerem - dla mnie to zawsze podstawa.

    napisałeś:
    Cytat:
    ale progra mi tego nie widzi


    ale co to dokładniej znaczy? Normalnie AvrStudio pozwala tworzyć tzw "projekty" a w ramach nich można tworzyć kilka plików asm. które można ze sobą linkować. Pierwsze co zrób to skorzystaj np z kreatora który się pojawia i utwórz tak jak on proponuje nowy projekt w asemblerze (bo można też w C ale po doinstalowaniu dodatku). Gdy już będziesz miał otwarty projekt - możesz pisać kod w asem lub otworzyć plik ze swoim przykładem. Warto, żeby plik z kodem w asemblerze miał rozszerzenie asm bo wtedy widoczne jest na kolorowo podświetlenie składni tego języka. Dodatkowa uwaga! sprawdź czy nie próbujesz odczytywać lub zapisywać plików w folderach które gdzieś w swojej nazwie zawierają polskie literki typu ąśżź... itp bo tobędzie stwarzać ci problemy. Kolejna sprawa to zainstaluj sobie do tego AvrStudio - ServicePack3 również do pobrania ze strony ATMELA.

    jeśli te wskazówki ci nie pomogą to opisz dokładniej co robisz? ;)

    pozdrówka
  • Poziom 30  
    Masz racje ale jak pisałem posta to jestem pewien że w poście adresata napewno nie było tego obrazka.
    Zwracam honor

    A co do avrstudio to faktycznie nie można otworzyć jednego pliku asm - trzeba stworzyc nowy projekt, zapisać go i dopiero potem można dodać dowolny plik asm (chyba musi mieć rozszerzenie .s). I to jest najwiekszy problem z tym środowiskiem - jak sie tworzy małe programy to jest to niewygodne. Polecam pspad z podłaczeniem do niego avr asm2 - zadziała tak jak autor sobie tego życzy.

    ------------------------------------------------------------------
    Bawiłem sie na poccątku avrstudio. Wcześniej tylko bascom i tam przyzwyczaiłem się ze zapisujemy plik z kolejnym numerkiem jako kolejna wersja (co jest chyba spsosobem najlepszym). Żeby zrobić to samo w avrstudio to trzeba dać zapisz plik (asm) pod inną nazwą, podłączyć kolejny plik asm z nazwą do projektu a potem wykasować stary. Kilka zbędnych ruchów.
    A symulatory w sieci są w dostatecznej ilosci - trzeba wybrać tylko taki który potrafi przeczytać plik wejściowy z linii komend, tak samo programatory i inne.
  • Poziom 42  
    ... pliki projektów mają rozszerzenia .aps a pliki z kodem w asemblerze .asm

    ... mi jednak jakoś w miarę wygodnie pracuje się z tym AvrStudio - zapewne kwestia przyzwyczajenia.

    ... spojrzałem sobie na Pspad'a ;) naprawdę fajnie wygląda ten edytorek ... tylko mi brakowałoby własnie czasem tego, że w AvrStudio można odrazu włączyć prosty symulator i podejrzeć co się dzieje, to czasem bywa ważne. Druga rzecz to często jak mam fusebity jakieś ustawiać to na szybko najlepiej mi sprawdzić właśnie w AvrStudio (wybieram opcję ProgramAVR w trybie disconnected, wybieram odpowiedniego procka i mam dokładnie ze źródła opisy co i jak poustawiać sobie) .... czyli conajmniej 3 w jednym

    pozdrówka
  • Poziom 19  
    -------------serdecznie dziekuje za pomoc,podpowiedzi! i prosze o wyrozumialosć -----------

    wklejam caly kod (napisany w Bascomie)
    i bylbym wdzieczny za pomoc w przeanalizowaniu jego dzialania, czesc kodu odpowiedzialna za dzialanie przetwornikow AC i sterowanie wyswietlaczem LCD nie istotna dla mnie w tym momencie
    -----------------------------------------------------------------

    -Po pierwsze bylbym wdzieczny za pomoc w stworzeniu dodatkowej opcji w menu -regulacja glosnosci z mozliwoscia zapamietania w wewnetznym EEprom:
    -6db,-5-,4,-3,-2,-1,0db,+1,+2,+3,+4,+5,+6db
    , po twardym resecie glosnosc powinna sie ustawic na 0db- czyli bity 13,14,15,16 - 0
    ,z mozliwoscia recznego przestawienia (i zapamietania) impulsatorem ktory obsluguje menu

    -po drugie czy są inne mozliwosci ,czy nalezy powtarzac 3krotnie po 8 bitow wpis do rejestru i wysylanie - aby wyslac cale 24 bity ?

    -bity od 16.......24 poczatkowo wystarczylo by mi gdyby byly przepisywane z pamieci flash do rejestru i wysylane, lecz jaki bylby njbardziej odpowiedni i przejrzysty sposob sposob ich wpisania w ponizszy kod (do ewentualnej ich modyfikacji!)

    -jaki wiec wybrac najbardziej odpowiedni do pozostalej czesci kodu sposob na wpisanie w tenże kod stanu kolejnych bitow

    17 -0
    18 -0
    19 -0
    20 -0
    21 -0
    22 -0
    23 -0
    24 -0

    i wersja 2 z bitami ustawoinymi tak:
    17 -0
    18 -0
    19 -0
    20 -1
    21 -1
    22 -0
    23 -0
    24 -0
    przepraszam ze prosze o wytlumaczenie takich szczegolow , ale jeszcze nie posiadam odpowiedniej literatury, a na obecna chwile urzadzenie jescze nie zmontowane do przeprowadzenia ekperymentow w praktyce

    w ponizszym bity nr:
    12- bedzie (po modyfikacji) bitem 17 mono-stereo
    13- bedzie (po modyfikacji) bitem 21 PD1 (phase detector)
    14- bedzie (po modyfikacji) bitem 22 PD2 (phase detector)
    15- bedzie (po modyfikacji) bitem 23 T0 (test 0)
    16- bedzie (po modyfikacji) bitem 24 T1 (test 1)

    dziekujei za pomoc ! pozdrawiam! i wklejam caly kod ktory podlegal bedzie zmodyfikowaniu
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    $Regfile = "m8def.dat" 'M8-Deklarationen
    $Crystal = 1000000 'interner RC-Oszillator reicht

    CONFIG LCDPIN = PIN , DB4 = PORTC.2 , DB5 = PORTC.3 , DB6 = PORTC.4 , DB7 = PORTC.5 , E = PORTB.1 , RS = PORTB.2
    Config LCD = 16 * 2

    dim retvalue as byte
    dim zahlstr as string * 5

    dim frequ as Word : frequ = 961 'Programm-Default-Werte
    dim stereo as Byte : stereo = 1 'alles Ein
    dim driver as Byte : driver = 1
    dim licht as Byte : licht = 1

    dim dummy_ee as ERAM Long 'Werte fürs EEPROM
    dim frequ_ee as ERAM Word
    dim stereo_ee as ERAM Byte
    dim driver_ee as ERAM Byte
    dim licht_ee as ERAM Byte

    dim menu1(8) as string * 8 'Menüwerte
    menu1(1) = "Frequenz"
    menu1(2) = "Stereo "
    menu1(3) = "Treiber "
    menu1(4) = "Licht "
    menu1(5) = "Sichern "
    menu1(6) = "AbstimmU"
    menu1(7) = "AntenneU"
    menu1(8) = "zurueck "

    dim menu2(2) as string * 3
    menu2(1) = "Ein"
    menu2(2) = "Aus"


    ddrd.2 = 0 'drehimpuls 1 = INT0
    portd.2 = 1 'Pullup
    ddrb.0 = 0 'drehimpuls 2
    portb.0 = 1 'Pullup
    ddrd.3 = 0 'Set-Button = INT1
    portd.3 = 1 'Pull-Up
    setbutton alias pind.3 'Menübestätigungs-Knopf

    dim drehgeber as word 'wird von ISR (INT0) verändert
    on INT0 OnInt0
    mcucr.isc00 = 1 'INT0 bei FALLING + RISING
    mcucr.isc01 = 0
    gicr.INT0 = 1


    config INT1 = LOW LEVEL 'nur zum Aufwachen aus Sleep-Modus
    on INT1 OnInt1


    mcucr.sm1 = 1
    mcucr.se = 1 'Sleep-Modus=Power-Down


    ddrd.4 = 1 'PD4= "Licht"

    ddrd.5 = 1 'PD5= Ausgang zum IC-PLL (Data)
    datas alias portd.5
    ddrd.6 = 1 'PD6= Clock
    clock alias portd.6
    ddrd.7 = 1 'PD7= Chip Enable
    chipena alias portd.7


    admux.refs0 = 1 'ADC-Config:
    admux.refs1 = 1 'interne Referenz
    adcsr.adps0 = 1
    adcsr.adps1 = 1
    adcsr.adps2 = 1 'Prescaler=128
    adcsr.aden = 1 'ADC einschalten
    ddrc.0 = 0 'als Eingänge schalten (ADC0-1)
    ddrc.1 = 0


    sreg.7 = 1 'alle Interrupts freigeben


    declare Function menu(menuitems() as string , byval maxentry as byte , byval default as Byte ) as Byte
    declare Function frequenz(byval default as Word) as Word
    declare Sub to IC-PLL
    declare Sub showADC(byval anz_mod as Byte)


    if frequ_ee <> &HFFFF then 'abgespeicherte Default-Werte
    frequ = frequ_ee
    stereo = stereo_ee
    driver = driver_ee
    licht = licht_ee
    end IF

    portd.4 = not licht.0 'Display-Licht; LOW-Aktiv
    to IC-PLL ' schiebt frequ, stereo u. driver i.d. Chip

    cls
    locate 2 , 1
    lcd "PLL SENDER"

    do
    cursor off
    locate 1 , 1 : lcd menu1(1)
    locate 1 , 10 : zahlstr = str(frequ) : zahlstr = format(zahlstr , " 00.0") : lcd zahlstr ; spc(2)

    enable INT1
    !sleep 'nur Druck (LOW LEVEL-Int) weckt auf
    disable INT1

    waitms 500

    locate 1 , 10 : lcd spc(6)
    cursor on blink

    do
    locate 1 , 1
    retvalue = menu(menu1(1) , 8 , 1)
    locate 1 , 10
    select case retvalue
    case 1 : frequ = frequenz(frequ)
    exit DO

    case 2 : stereo = menu(menu2(1) , 2 , stereo)
    exit DO

    case 3 : driver = menu(menu2(1) , 2 , driver)
    exit DO

    case 4 : licht = menu(menu2(1) , 2 , licht)
    portd.4 = not licht.0 'Low-Aktiv
    goto loopend

    case 5 : sreg.7 = 0 'zum Abspeichern INTs abschalten
    frequ_ee = frequ
    stereo_ee = stereo
    driver_ee = driver
    licht_ee = licht
    sreg.7 = 1
    goto loopend

    case 6 : admux.0 = 0 'ADC-Kanal 0
    call showADC(0)
    goto loopend2

    case 7 : admux.0 = 1 'ADC-Kanal 1
    call showADC(1)
    goto loopend2

    case 8 : goto loopend2
    end select
    loop

    call to IC-PLL
    loopend:
    locate 1 , 10 : lcd "ok" ; spc(3)
    wait 1
    loopend2:
    loop


    end



    Function menu(menuitems() as string , byval maxentry as byte , byval default as Byte ) as Byte
    local curent as byte
    local mlen as byte
    local drehgeber_alt as word
    local lauf as Byte

    drehgeber = &H8000
    drehgeber_alt = &H8000
    mlen = len(menuitems(1))
    lcd menuitems(default);
    curent = default

    do
    if setbutton = 0 then
    menu = curent
    waitms 500
    exit FUNCTION
    end IF

    if drehgeber <> drehgeber_alt then
    if drehgeber > drehgeber_alt then
    incr curent
    if curent > maxentry then
    curent = 1
    end IF
    end if

    if drehgeber < drehgeber_alt then
    decr curent
    if curent = 0 then
    curent = maxentry
    end IF
    end if

    for lauf = 1 to mlen
    shiftcursor left
    next lauf
    lcd menuitems(curent);
    drehgeber_alt = drehgeber
    end IF
    loop
    end FUNCTION



    Function frequenz(byval default as word) as Word
    local s as String * 5
    local drehgeber_alt as word
    local lauf as Byte

    drehgeber = default
    drehgeber_alt = drehgeber
    s = str(drehgeber)
    s = format(s , " 00.0" )
    lcd s
    do
    if drehgeber <> drehgeber_alt then

    if drehgeber > 1080 then
    drehgeber = 875
    end IF

    if drehgeber < 875 then
    drehgeber = 1080
    end IF

    drehgeber_alt = drehgeber

    for lauf = 1 to 5
    shiftcursor left
    next lauf
    s = str(drehgeber_alt)
    s = format(s , " 00.0" )
    lcd s

    end IF

    if setbutton = 0 then
    frequenz = drehgeber_alt
    waitms 500
    exit FUNCTION
    end IF
    loop
    end FUNCTION



    Sub to IC-PLL
    local seriellword as Word
    local lauf as Byte
    seriellword = frequ
    seriellword.11 = stereo.0
    seriellword.14 = driver.0
    'locate 2 , 1
    'lcd bin(seriellword )
    chipena = 1 'Chip selektieren
    for lauf = 1 to 16
    datas = seriellword.0 'Datenbit 0 anlegen
    clock = 1 'und übergeben
    waitus 250
    clock = 0
    shift seriellword , RIGHT 'nächstes Bit in Position 0 schieben
    next lauf 'Chip deselektieren
    chipena = 0
    end SUB



    Sub showADC(byval anz_mod as Byte)
    local adc_h as word
    local adc_val as word '10 bit
    adcsr.adfr = 1 'free running
    adcsr.adsc = 1 'starten
    cursor noblink
    cursor off
    do
    adc_val = ADCL
    adc_h = ADCH
    shift adc_h , LEFT , 8
    adc_val = adc_val OR adc_h

    locate 1 , 10
    select case anz_mod
    case 0 : zahlstr = str(adc_val) 'Abstimmspannung (V)
    zahlstr = format(zahlstr , " 0.00")
    lcd zahlstr ; " V"
    case 1 : zahlstr = str(adc_val) 'Antennenspannung (mV)
    zahlstr = format(zahlstr , " 0")
    lcd zahlstr ; " "
    end select

    waitms 100
    loop until setbutton = 0
    adcsr.adsc = 0
    adcsr.adfr = 0 'free running aus
    locate 1 , 10
    waitms 500
    end SUB



    drehimpuls1 alias pind.2
    drehimpuls2 alias pinb.0
    OnINT0:
    if drehimpuls1 = 1 then 'steigende Flanke
    if drehimpuls2 = 1 then
    decr drehgeber
    else
    incr drehgeber
    end IF
    else 'fallende Flanke
    if drehimpuls2 = 0 then
    decr drehgeber
    else
    incr drehgeber
    end IF
    end IF
    return

    OnINT1: 'nur zum Aufwachen!
    return
  • Poziom 19  
    tego sie obawialem :cry:-ze zbyt duzo szczegolowych pytan jak na jeden raz
    czy ktos moglby choć pomóż w przeanalizowaniu tego ponizszego fragmentu kodu
    --------------------------------------------------------------------------
    Sub to IC-PLL
    local seriellword as Word
    local lauf as Byte
    seriellword = frequ
    seriellword.11 = stereo.0
    seriellword.14 = driver.0
    'locate 2 , 1
    'lcd bin(seriellword )
    chipena = 1 'Chip selektieren
    for lauf = 1 to 16
    datas = seriellword.0 'Datenbit 0 anlegen
    clock = 1 'und übergeben
    waitus 250
    clock = 0
    shift seriellword , RIGHT 'nächstes Bit in Position 0 schieben
    next lauf 'Chip deselektieren
    chipena = 0
    end SUB
    --------------------------------------------------
    dziekuje za ewentualną pomoc
  • Poziom 42  
    ależ kolego - gdzie ty widzisz w swoim poście dużo szczegółowych pytań? ... sorry ale wrzuciłeś parę kilogramów kodu a twoje pytania to w zasadzie prośba o napisanie na nowo całego programu (i to bez schematu! czyli w ciemno) ;) ... poza tym z twoich wcześniejszych wypowiedzi wynikało, że znasz dobrze specyfikację układów które chcesz programować inaczej niż w programie który posiadasz. A tu się okazuje, że chyba sam nie jesteś pewien czy wogóle tak można zrobić? .... ciężko więc jest przynajmniej mi dalej ci pomóc w tym temacie... :( (przejrzyj sobie zresztą elektrodę i zobacz jak kończą tematy gdzie autor zadaje pytanie typu: "przedstawiam wam listing programu .... tu następuje wiele linii kodu ... i powiedzcie mi proszę jak zrobić żeby to działało bo u mnie nie działa" itp .... przeważnie jest 0 odpowiedzi do takich postów. Lepiej samemu coś dokładnie starać się analizować i zadawać konkretne pytania ;)

    pozdrawiam
  • Poziom 19  
    dorzucam wspomniany schemat
    szeregowo (3Wire) z ATmega 8
    kolego mirekk36 miabym prośbe - mianowicie czy mogl bys dodac komentarze do przykladowej procedurki ktorą napisałes ?

    i jescze - czy dane o stanie poszczegolnych bitow nie mogą byc przepisywane z flasha do rejestrow, czy wpierw nalezy je umiescic w pamieci SRAM ?


    czy wszystkie rejestry w ATmega8 sa 8bitowe?, i czy jest jakaś instrukcja konfigurujaca -spinajaca je w dłuzsze np16,24,32bitowe (to pytanie w zwiazku z tym czy istnieje inna mozliwosć niż 3 razy powtarzajaca sie procedura odczytu z flash, ładowania SRAM,przepisywania do rejestru i wysylania ?
  • Poziom 42  
    komentarze ;)

    .EQU DATA = 5 ; zdefiniowanie pinu w uC na którym będzie sygnał DATA
    .EQU CLOCK = 6 ; -------------- || ---------------------------------- CLOCK
    .EQU CHIP_ENABLE = 7 ; ------------------|| ------------ CHIP_ENABLE

    ;parametry wejściowe
    ;
    ; 3 bajty danych do wysłania umieszczone w SRAM
    ; pod adresem dane:

    send:
    ldi XL, Low(dane) ; ładujemy do rejestru indeksowego X adres danych
    ldi XH, High(dane) ; w pamięci SRAM
    ldi R17, 3 ; licznik pętli dla wysłania bitów z 3 bajtów
    cbi PORTD, CLOCK ; wyzerowanie linii CLOCK
    cbi PORTD, DATA ; wyzerowanie linii DATA
    cbi PORTD, CHIP_ENABLE ; wyzerowanie linii CHIP_ENABLE

    sbi PORTD, CHIP_ENABLE ; ustawienie stanu wysokiego na linii CHIP_ENABLE (zgodnie z przedstawionym wykresem czasowym)

    racall wait_ms ; wywołanie procedury opóźniającej o 250us

    Petla_0: ; początek pętli w której będą pobierane kolejne bajty danych
    ldi R18, 8 ;ustawienie licznika dla wysłania 8 bitów z jednej danej
    ld R16, X ; pobranie do R16 pierwszej danej do wysłania
    Petla_1: ; początek pętli wysyłajacej 8 bitów
    cbi PORTD, CLOCK ; wyzerowanie linii CLOCK
    ror R16 ; przesunięcie w prawo bitów R16 z użyciem CarryFlag
    brcc Send_0 ;jeśli w Carry jest 0 to przejdź do wystawienia 0 na DATA
    sbi PORTD, DATA ; jeśli w C jest 1 to ustaw stan wysoki na DATA
    rjmp next1 ; przeskocz dalej do Nesxt1
    Send_0:
    cbi PORTD, DATA ; ustaw stan niski na DATA
    Next1:

    rcall wait_ms ; odczekaj 250us (zgodnie z wykresem czasowym)

    sbi PORTD, CLOCK ; ustaw ponownie stan wysoki na linii CLOCK

    rcall wait_ms ; odczekaj 250us

    dec R18 ; zmniejsz licznik wysłanych już bitów na linię DATA
    brne Petla_1 ; jeśli licznik większy od 0 to powtórz pętlę "Petla_1"

    inc XL ; zwiększ zawartość adresu komórki z danymi w SRAM
    dec R17 ; zmniejsz licznik bajtów do wysłania
    brne Petla_0 ; jeśli licznik większy od 0 to powtórz pętlę "Petla_0" czyli przejdź do wysyłania bitów z kolejnego bajtu danych

    cbi PORTD, CHIP_ENABLE ; na koniec ustaw stan niski na CHIP_ENABLE

    ret ; powrót do programu



    ... przed wywołaniem tej procedury ładujesz swoje dane do pamięci RAM (3 bajty - razem 24bity) po adres dane i wywołujesz procedurę send.

    ldi R16, dana1 ; załaduj do R16 pierwszy bajt do wysłania
    sts dane, R16 ; umieść ten bajt w pamięci SRAM
    ldi R16, dana2 ; załaduj do R16 drugi bajt
    sts dane+1, R16 ; umieść go w kolejnym adresie w SRAM
    ldi, R16, dana3 ; 3bajt
    sts dane+2, R16 ; do kolejnego adresu w SRAM
    rcall send ; wywołanie procedury send


    skoro chcesz wysłać jakieś bity to musisz ustalić na bierząco ich wartości w oparciu o jakieś zdarzenie. Używanie do tego pamięci EEPROM wydaje się bezcelowe chyba, że chcesz zapamiętać ostatnie nastawienia przed wyłączeniem i po włączeniu zasilania. Wtedy należałoby mocno zmodyfikować to co napisałem o dodatkowe procedury zapisu i odczytu z i do pamięci EEPROM

    ... w AVRach zwykłe rejestry są 8bitowe, poza indeksowymi takimi własnie jak X, Y, Z (16 bitowe) które służą głównie do adresowania pamięci. Więc ich w prosty sposób nie wykorzystasz ;)

    ... nie musisz się martwić o to, że te pętle są wykonywane tyle razy - to jest napisane w asemblerze więc zostanie wykonane baaardzo szybko i baaardzo sprawnie. Tak naprawdę to co byś napisał (czy masz napisane w języku Bascom) po przekompilowaniu też wygląda podobnie tylko czasem działa to mniej efektywnie i zrzera o wiele więcej pamięci ;) .... tylko programiście w Bascomie jeśli nie jest bardzie świadomy wydaje się, że o wiele łatwiej i efektywniej programuje się pisząc jedno polecenie np PRINT LCD , które wyświetla coś np na wyświetlaczu LCD. W asemblerze to jedno polecenie PRINT trzeba rozpisać na wiele linii kodu i czasem pętli - a pomimo to zajmie często mniej miejsca cały program w uC i szybciej będzie wykonywany - teraz rozumiesz? ;)

    .... oczywiście rozumiem twój problem - ty nie piszesz w asemblerze a jeszcze w Bascomie też nie jesteś najmocniejszy więc to wydaje się na początku czarną magią.... możesz więc albo porobić sobie narazie prostsze projekty i poprostu pobawić się prockami aby je dobrze poznać i ich możliwości .... a wtedy po jakimś czasie napewno się dobrze nauczysz - zapewniam, albo druga możliwość jesli z jakichś powodów bardzo ci się z tym śpieszy to zleć to komuś - ale wtedy będziesz musiał zapłacić za to zapewne no i nie będziesz miał satysfakcji że sam to zrobiłeś. Co więcej w tym drugim przypadku, ktoś wykona zlecenie a ty uznasz po miesiącu, że fajnie by było jeszcze coś zmienić, dodać i wtedy co znowu problem ;) .... polecam więc naukę, naukę naukę - to jest zresztą bardzo przyjemna nauka ;)

    pozdrówka
  • Poziom 30  
    Code:

    dim pll_czestotliwosc as word
    dim pll_konfiguracja as word
    dim pll_pomoc as byte
    ...
    funkcja_IC_PLL:
    pll_pin_ce = 1 'stan wysoki lini CE
    '-----
    for pll_pomoc = 0 to 11 'pierwsze 12 bitow od LSB
     pll_pin_da = pll_czestotliwosc.pll_pomoc 'wyslanie bitow kolejno od LSB
     waitus 255
     pll_pin_ck = 1 'zbocze narastajace zegara = wpis danych
     waitus 255
     pll_pin_ck = 0 'zbocze opadajace zegara = mozna zmieniac dane
    next pll_pomoc
    '-----
    for pll_pomoc=0 to 11 'drugie 12 bitow od LSB
     pll_pin_da = pll_konfiguracja.pll_pomoc 'wyslanie bitow kolejno od LSB
     waitus 255
     pll_pin_ck = 1 'zbocze narastajace zegara = wpis danych
     waitus 255
     pll_pin_ck = 0 'zbocze opadajace zegara = mozna zmieniac dane
    next pll_pomoc
    '-----
    pll_pin_ce = 0
    return

    Nie testowałem czy w avr zadziała - trzeba spojrzeć na ustawienia odpowiednich pinów/portów. Jak już robisz takie funkcje to wywalaj obsługę lcd na zewnątrz. Tak samo do określania tych zmiennych - w M8 nie zabrakinie ci przestrzeni wiec definiuj je na początku.

    Do mirek26 - a co to za różnica czy to asm czy bascom czy c? Liczy sie sam algorytm a to już jest tylko sposób zapisywania - zresztą nie jest skomplikowany (jak c i można doś drogą dedukcji - błędy pokaze i podpowie rozwiązanie kompilator)
  • Poziom 42  
    do kolegi szymtro ;)

    ... masz rację może niepotrzebnie zacząłem tę dyskusję, która zaraz mogłaby się przerodzić w "kłótnię" na temat wyższości jednego języka nad drugim - a nie o to mi chodziło ;) ... sam pomimo to, że programuję tylko w asemblerze brakuje czasem, żeby gdy jest coś bardzo prostego to zrobić to albo w Bascomie albo w C. Wkrótce tak będę robił - czyli łączył programowanie w różnych językach w zależności od potrzeb. Chodziło mi tylko o to aby zwrócić uwagę na pewne niuanse programowania ale fakt tego w 2 słowach się nie da zrobić .... więc Bascom do tego celu też będzie dobry - tylko że ja też pisałem że autorowi w tym nie pomogę bo go nie znam na tyle żeby coś radzić ;) ... a nikt inny się nie zgłaszał z pomocą koledze autorowi ;) ...

    pozdrowionka