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

[Atmega16][bascom] Łącze szeregowe.

apis14 24 Lip 2008 05:34 1816 13
REKLAMA
  • #1 5372414
    apis14
    Poziom 12  
    program ma wysyłać bity. I wysyła, tylko nie takie jak bym chciał. w tym przypadku na linii wyjściowej dostaje coś takiego: 1, około 3ms przerwy, 1010101010101011, przerwa 6ms, 101. czas trwania stanu wysokiego się zgadza, tylko czemu dostaje taką sieczkę?? sygnał zegarowy ma okres około 400us.
    $regfile = "m16def.dat"
    $crystal = 16000000
    
    
    Dim Wartosc(1) As Byte                        
    Dim Databyte As Byte                      ' bajt wysylany
    Dim Dana As Byte                            ' licznik
    Dim Bitpointer As Byte                     ' wskaznik aktualnie wysylanego bitu
    
    
    Config Pind.3 = Input                                       ' pin zewnetrznego zegara
    Config Pind.1 = Output                                      ' Pind.1 liniaTxD
    Iowy Alias Portd.1
    
    On Int1 Seriout                                             'przerwanie
    Config Int1 = Rising                                        ' jak je wyzwalamy
    
    '########## tabela z wysylanymi bajtami ##################
    Wartosc(1) = &B10101010
    
    
    '#####\ustawiamy wartosci startowe ################
    Dana = 1
    Bitpointer = 0
    Databyte = Wartosc(1)
    
    nop
    nop
    nop
    nop
    
    Enable Interrupts                         ' uruchamiamy przerwania
    Enable Int1
    
    Do                                                          'Forever loop
    Loop
    End
    
    Seriout:                                                    ' przerwanie
    Disable Interrupts
            Iowy = Databyte.bitpointer                           'Send bit out
            Incr Bitpointer
            If Bitpointer = 8 Then                                'wyzeruj go i zacznij zliczac od poczatku
              Bitpointer = 0                                         'Reset po
              Incr Dana                                       ' przesun sie w bajtach wyjsciowych o 1 w gore
             Databyte = Wartosc(dana)                           ' przypisz dane z do bajta wsylanego
        End If
    Enable Interrupts
    Return


    sprawdziłem jeszcze co sie dzieje dla takich wartosci:

    Wartosc(1) = &B00000000 dostaje 2 impulsy o czasie trwania 400us w odleglosci 10ms
    Wartosc(1) = &B11111111 dostaje 2 impulsy, pierwszy jak w poprzednim przypadku a drugi dlugi i konczy sie po m10ms. czyli jest jakas zaleznosc...tylko nie wiem czemu nie dostaje takich bitow jak w Wartosc(1) = &B10101010...


    Poprawiłem tytuł:
    https://www.elektroda.pl/rtvforum/topic1015361.html
    [c_p]
  • REKLAMA
  • #2 5375146
    dawid512
    Poziom 32  
    1.Masz przynajmniej fusy na 16MHz?
    2.Baude rate juz nie chcialo ci sie wpisac...
    3.W kompie taki sam baud jak w procku?
    4.Max232 oczywiście jest?
  • REKLAMA
  • #3 5376675
    apis14
    Poziom 12  
    1. fusy ustawione sa ok
    2. po co baude rate?
    3.jw
    4. oczywiscie

    Wynik odczytuje na oscyloskopie.
    Z tego co zauwazylem trace sygnal zegarowy zewnatrzny na okolo 600ms cyklicznie. i tj dla mnie absurd.

    może ktoś ma lepszy pomysł na wysyłanie bitów szeregowo na koncowke portu za pomoca zewnetrznego zegara. uzywalem juz shiftout-bez skutku.
  • REKLAMA
  • #4 5377862
    ZbeeGin
    Poziom 39  
    Jak ma wyglądać przebieg i jaki jest jego stosunek do przebiegu zegara. Najlepiej narysuj, potem będzie wiadomo o co dokładnie Ci chodzi.
  • #5 5378283
    apis14
    Poziom 12  
    zasadniczo zadaniem podstawowym na ten moment jest zapis 24 bitów do rejestru sterującego układu ST7540.
    nie ważne jaki to jest ciąg-najważniejsze żeby uskutecznić sprawną procedurę programową. a z tym mam problem...
    przebiegi są podane na str 22 i 23:
    http://eu.st.com/stonline/products/literature/ds/12176.pdf
  • REKLAMA
  • #7 5378814
    apis14
    Poziom 12  
    z tego co mi wiadomo transmisja zapisu bitów do rejestru jest zawsze synchroniczna... wiec jak mam go wykorzystac?
  • #8 5379215
    mirekk36
    Poziom 42  
    przecież w tej nocie aplikacyjnej, którą sam przedstawiłeś masz jak byk opisaną prostą transmisję za pomocą najzwykleszego UART'a.

    Wystarczy ci więc wykorzystanie go w typowy sposób zamiast robienia jakichś karkołomnych w tym przypadku twoich procedur w Bascomie do transmisji bit po bicie

    [Atmega16][bascom] Łącze szeregowe.

    jedyne co potrzebujesz dodatkowo to przeznaczyć jeden pin procka na utworzenie linii RxTx. Masz tablę jak ją przełączać gdy nadajesz i odbierasz coś do i z niego:

    [Atmega16][bascom] Łącze szeregowe.

    więc w czym problem????

    "bierzesz w ręce" zwykłe polecenia do nadawania jak PRINT , lub do odbierania jak: INPUT czy INKEY i lecisz :)

    w nocie masz napisane jakie prędkości RS232 można mu ustawić - z tego co widziałem maksymalnie do 4800 czyli

    $baud = 4800

    i naprawdę, nie ma żadnego problemu


    pozdrówka
  • #9 5379273
    ZbeeGin
    Poziom 39  
    mirekk36 napisał:
    "bierzesz w ręce" zwykłe polecenia do nadawania jak PRINT , lub do odbierania jak: INPUT czy INKEY i lecisz :)

    Od razu trzeba napisać, że należy użyć PRINTBIN i INPUTBIN bo kolega będzie przez 10 postów znów pytał jak wysłać tym ciąg bitów i że znów nie działa.
  • #10 5379678
    apis14
    Poziom 12  
    do dwóch powyższych postów: transmisja jest synchroniczna-chodzi o zapis do rejestru! A on zawsze.-powtarzam zawsze odbywa się synchroniccznie.I to jest wlasnie zapisane w tym datasheet. uffff...
    ta tabelka to tylko ustawienie 2 linii w zaleznosci od trybu..
  • #11 5379929
    ZbeeGin
    Poziom 39  
    Zatem widzę to tak (w skrócie): Najpierw wystawiasz bit MSB na linii danych (szary obszar), potem aktywacja REG_DATA i RxTx oraz włączenie przerwań ze zboczem narastającym. Układ zaczyna generować sygnał zegarowy (zielony obszar). Na linii danych w dalszym ciągu bit MSB. Narastające zbocze generuje przerwanie, układ czyta stan linii danych (niebieski obszar). W przerwaniu czekasz aż stan na linii zegarowej się zmieni na niski i wystawiasz kolejny bit (żółty obszar). Koniec przerwania.
    Teraz wszystko dzieje się już automatycznie. Kolejne zgłoszenie przerwania wyłapuje następny bit.

    [Atmega16][bascom] Łącze szeregowe.
  • #12 5380815
    apis14
    Poziom 12  
    Kolego a mógłbym prosić chociaż o zarys jakby to wyglądało w Bascom? albo jakie przeróbki dokonać na kodzie który na samej górze zamieściełm?
  • Pomocny post
    #13 5381239
    ZbeeGin
    Poziom 39  
    Skoro kolega napisał już taką wersję jak przedstawił w tym temacie, to poradzi sobie i z tą wersją. Trzeba tylko ruszyć głową - zwłaszcza, że powyżej opisałem całą ideę działania...
  • #14 5381462
    apis14
    Poziom 12  
    jakoś mi nie wychodzi oczekiwany efekt..
    Panowie- mogę dostać jakieś wskazówki co do tego jak to zapisać w Bascom? cały czas dostaje sieczkę bitów..
    za skuteczna pomoc oddam punkty.
REKLAMA