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.

Attiny2313 i UART - komunikacja

vain 11 Lis 2006 21:10 3008 17
  • #1 11 Lis 2006 21:10
    vain
    Poziom 13  

    Witam,

    Ma problem z komunikacja dwóch m.procesorów typu ATTINY2313 przez UART.
    Ma ktos moze jakis kod odbiornika i nadajnika pod ten procesor?

    PS. szukalem na forum.

    PS2 ...kodu w BASICU (BASCOMIE)

    0 17
  • #2 12 Lis 2006 09:50
    mirekk36
    Poziom 42  

    ... mam pieknie dzialajacy kod, wykorzystujacy 2 przerwania i obslugujący cykliczny bufor we i wy. Dzięki temu trzeba się tylko zajmować wpisywaniem do bufora przy nadawaniu i ew odczytywaniem przy odbiorze. Dzięki przerwaniom uC wogóle nie jest obciążony operacjami na UART ;) .... ale niestety tylko w asemblerze ;)

    0
  • #3 12 Lis 2006 09:56
    vain
    Poziom 13  

    Problem w tym, ze musze napisac ten kod w basicu. W zasadzie mam ten kod napisany, ale chyba nie dziala jak powinien. Nie wiem czy to nie ma zwiazku z ustawieniami fusebitow, bo sekunda trwa ekstremalnie dlugo.

    Czy ktos wie jak zapisac cos do buforu odczytac lub sprawdzic czy jest cos w buforze? (bascom i attiny2313)

    0
  • #4 12 Lis 2006 10:29
    mirekk36
    Poziom 42  

    ... no właśnie a jakiego oscylatora używasz? tego fabrycznie ustawionego wewnętrznego??? bo wtedy masz tylko 1MHz - może to twój problem z tą sekundą co piszesz? jeśli chcesz zewn kwarc to oczywiście trzeba dobrze fusebity przestawić

    0
  • #5 12 Lis 2006 10:37
    vain
    Poziom 13  

    No wlasnie uzywam zewnetrznego. Dobrze tzn. jak?

    I Jeszcze jedno, napisalem prosty program, ktory:
    1) nadajnik nadaje zmienna A (string, A="A") )
    2) odbiornik ma za zadanie odebrac znak i jezeli znak(string) = "A" zapalic diode.

    Program nie dziala jak powinien. Cos zostaje wyslane i odebrane ale dioda sie nie zapala. Nie jestem pewien co wysylam i co odbieram.

    Wszystko mam ustawione zgodnie z helapmi itp, kanaly pootwierane przerwania wlaczone.

    Ktos ma jakis pomysl albo wskazowke?

    0
  • #6 12 Lis 2006 10:42
    august_a
    Poziom 21  

    Podłącz swojego jednego procka pod komputer PC i uruchom jakiś terminal. Wszystko się dowiesz - co wysłałeś, będziesz mógł wysłać itd....
    Pozdrawiam

    0
  • #7 12 Lis 2006 10:44
    mirekk36
    Poziom 42  

    jeśli chodzi o fusebity to niedawno tak jak ty "zjadłem na tym zęby" - ale udało mi się doprowadzić procka do porządku - własnie ATTiny2313. A też zaczynałem wtedy z UARTem tylko w asemblerze i dziwne rzeczy mi się działy bo pomimo kwarca zewnętrznego i (tak mi się wydawało!!!) dobrze zaprogramowanych fusebitków - nic nie działało jak trzeba - przeczytaj sobie ten temat - to może coś ci się wyjaśni

    https://www.elektroda.pl/rtvforum/topic560687-0.html

    bo skoro masz ustawioną złą częstotliwość niż tą która ci się wydaje to najbardziej na to właśnie będzie czuła transmisja UART ;)

    0
  • #8 12 Lis 2006 14:01
    szymtro
    Poziom 30  

    Poszukaj moich postów z dopiskiem uart w srodku. Na forumpodawałem przykłądy zarówno dla avr jak i '51 w bascomie - to były sprawdzone fragmenty moich programów.
    Do tego temat był już poruszany parę razy - ale o tym nie musisz wiedzieć jak nie przeglądasz forum codziennie - a polecam bo to nauka jak na wykładach.

    0
  • #9 13 Lis 2006 00:32
    szakamason
    Poziom 13  

    Jeżeli ktoś by chciał obsługę USART do attiny 2313 bądź atmega32 w *.C, to mam przerobiony pod siebie kod. W C czasami brak poprawnego działania RS'a może być spowodowany tym że wpisze się wektor przerwania od uart'u a nie od uasart'u, rózni sie w nazwie dokładnie tymi wyrazami.

    0
  • #10 13 Lis 2006 06:30
    vain
    Poziom 13  

    Ok, dzieki panowie. Ma ktos moze jakiegos PDFa typu praktyczne programowanie w Bascomie albo w C (bardziej w bascomie)?

    Pozdrawiam

    0
  • #11 13 Lis 2006 10:40
    mirekk36
    Poziom 42  

    PDFa nie widziałem ale polecam ci - kup sobie książkę "Programowanie mikrokontrolerów AVR w języku BASCOM" jest dobra

    0
  • #13 13 Lis 2006 17:57
    august_a
    Poziom 21  

    W nadajniku użyj polecenia Print "jakiś znak"
    A w odbiorniku użyj : Jakas_zmienna = Inkey()
    I już.
    Albo zobacz do helpa Bascomowego, chyba go masz :D

    0
  • #14 13 Lis 2006 19:57
    vain
    Poziom 13  

    bez otwierania kanalow "open..." ?

    Dodano po 1 [godziny] 40 [minuty]:

    Napisalem program, nadajnik:

    $crystal 8000000
    Baud #1 9600



    open "comd.1:9600,8,e,1" for output as #1

    do

    Printbin #1, 2

    loop

    end



    Odbiornik

    $crystal 8000000
    Baud #1 9600


    dim b as byte


    open "comd.0:9600,8,e,1" for input as #2

    do

    b=waitkey(#2)
    if B=2 then
    Portb.1=1
    end if

    loop

    end



    do portu b 1 podlaczona jest dioda i sie nie zapala, a jezeli dam warunek: if B>0 then.... to sie zapala.... czyli dostaje jakis sygnal ale nie jest to "2"
    Potrzebuje taki program, ktory pozwoli na odbior i identyfikacje znaku przez odbiornik.


    PS.
    Umie tu ktos odpowiedziec rzeczowo? Bardzo potrzebuje pomocy, wiec darujcie sobie odpowiedzi typu: masz helpa do Bascoma albo umnie dziala wiec cos robisz zle. Helpa mam i , tak, robie cos zle. PROSZE O POMOC.

    0
  • Pomocny post
    #15 14 Lis 2006 22:28
    szymtro
    Poziom 30  

    Code:
    On Urxc Rs_rx_ok
    
    On Utxc Rs_tx_ok
    '-------------------------------------------------------------------------------
    Dim Rs_tx_bufor(7) As Byte
    Dim Rs_tx_licznik As Byte
    Dim Rs_tx_ograniczenie As Byte

    Code:
    Ddrd = &B00000010                                           'TXD = wyjscie, reszta wejscia
    
    Portd = &B00000010                                          'TXD = stan wysoki, reszta HI-Z

    Ddrb = &B00001000                                           'PB3 = wyjscie, reszta wejscie
    Portb = &B00001000                                          'PB3 = stan wysoki, reszta HI-Z

    'Ubrr = 287                                                  '2400 dla kwarcu 11059200
    Ubrr = 143                                                  '4800 dla kwarcu 11059200
    'Ubrr = 71                                                   '9600 dla kwarcu 11059200
    Ucr = &B10010000                                            'zalaczenie rxcie i rxen

    Mcucr = &B00001010                                          'konfiguracja przerwan na zbocze opadajace
    Gimsk = &B01000000                                          'zalaczenie INT0

    Rs_tx_licznik = 1
    Rs_tx_bufor(1) = "#"
    Rs_tx_bufor(2) = "0"
    Rs_tx_bufor(3) = "3"
    Rs_tx_bufor(4) = ","
    Rs_tx_bufor(5) = "0"
    Rs_tx_bufor(6) = "0"
    Rs_tx_bufor(7) = &H0D

    sei

    i sam odbiór:
    Code:
    Rs_rx_ok:
    
       If Udr = &H0D Then
          Rs_tx_licznik = 2 : Rs_tx_ograniczenie = 7            'ustaw poczatek w stringu do wyslania
          Ucr = &B01001000                                      'zalaczenie txcie i txen
          Udr = Rs_tx_bufor(1)                                  'poczatek pierwszej wiadomosci
    '   Else
    '      If Rs_rx_licznik < Rs_rx_ograniczenie Then
    '         Rs_rx_bufor(rs_rx_licznik) = Udr
    '         Incr Rs_rx_licznik
    '      End If
       End If
    Return

    A coś takiego było już pokazywane kilka razy.
    Poszukaj czegoś takiego jak mikroprocesorowa ośla łaczka - to ciąg artykułów z edw - można gdzieś ściągnąć. Autor tam własnie pokazywał jak skutecznie użyć 2313 w bascom avr.

    0
  • #16 15 Lis 2006 09:02
    vain
    Poziom 13  

    Dzieki, koniec tematu.

    0
  • #17 26 Lut 2007 15:20
    tzok
    Moderator Samochody

    Ja sie podepnę, bo też się zacząłem bawić w bascomie AVR i "wyskrobałem" takie coś:

    Code:
    $regfile = "attiny2313.dat"
    
    $crystal = 8000000
    $baud = 19200

    Const Maxlen = 40                                           'Deklaracje stalych

    Dim Akey As Byte                                            'Deklaracje zminnych
    Dim I As Byte
    Dim Buffer As String * Maxlen
    Dim E As Eram String * Maxlen
    I = 0

    Declare Sub Store                                           'Deklaracje funkcji
    Declare Sub Recall

    Print
    Print "Simple ATTiny2313 terminal program by TzOk (c) 2007"
    'Wait 1
    Print ">";
    Do
       Akey = Waitkey()                                         'Waitkey czeka na odebranie znaku z UART
       If Akey = 13 Then Gosub Enter                            'Czy został naciśnięty Enter?
       If I < Maxlen Then                                       'Sprawdzanie długości wprowadzonego stringa
          Buffer = Buffer + Chr(akey)                           'Budowanie stringa
          Print Chr(akey);                                      'Echo
          I = I + 1                                             'licznik znaków w wierszu
       End If
    Loop

    Sub Store
       Buffer = ""
       I = 0
       Print
       Print "Type a string of max " ; Maxlen ; " charters and press <CR>"
       Do
       Akey = Waitkey()                                         'Waitkey czeka na odebranie znaku z UART
       If Akey = 13 Then                                        'Jeśli naciśnięto Enter




          E = Buffer                                            'Zapisz zawartość bufora do EEPROMa
          Exit Sub                                              '...i opuść procedurę
       End If
       If I < Maxlen Then                                       'Jeśli nie przekroczono pojemności bufora
          Buffer = Buffer + Chr(akey)                           '...twórz stringa
          Print Chr(akey);                                      '...wyświwtlaj echo
          I = I + 1                                             '...inkrementuj licznik znaków
       End If
    Loop
    End Sub

    Sub Recall
       Buffer = E                                               'Odczytanie zawartości EEPROMu do bufora
       Print
       Print "You have stored: " ; Buffer                       'Wyświetlenie zawartości bufora
    End Sub

    Enter:
    Select Case Buffer                                          'Wyszukanie słów kluczowych w buforze
       Case "help" : Gosub Help
       Case "exit" : Goto Bye
       Case "stor" : Call Store
       Case "recl" : Call Recall
       Case Else : Gosub Error
    End Select
    Print
    Print ">";                                                  'Wyświetlenie znaku zachęty
    Akey = 0                                                    'Zerownie zmiennych
    Buffer = ""
    I = 0
    Return

    Help:
    Print
    Print "Type:"
    Print "      help - for available commands"
    Print "      exit - to exit a terminal program"
    Print "      stor - to store a string"
    Print "      recl - to recall a stored string";
    Return

    Error:
    Print
    Print "Unrecognized command!"
    Return

    Bye:
    Print
    Print "Bye!"

    End


    Program nie jest wzorowo napisany (zmienne globalne) ale za to demonstruje dwa sposoby pisania funkcji - metodę proceduralną z Sub i Call oraz czysto BASICową z Gosub i etykietą linii.

    Żeby program działał prawidłowo trzeba wyłączyć (1) fusebit CKDIV8.

    0
  • #18 26 Lut 2007 16:15
    zumek
    Poziom 39  

    Ja natomiast hołduje takim zasadom:
    a)Call Sub - jeśli przekazuję parametr(y) do procedury
    b)Gosub etykieta - bez parametrów.
    Jakoś łatwiej mi sie później połapać :)

    Piotrek

    0
  Szukaj w 5mln produktów