Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

Povezava dveh AVR-je preko UART-a

 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
ipocek
Novinec


Pridružen/-a: Čet Maj 2013 8:57
Prispevkov: 7

PrispevekObjavljeno: Čet Maj 09, 2013 9:42 am    Naslov sporočila: Povezava dveh AVR-je preko UART-a Odgovori s citatom

Pozdravljeni,
zanima me kako vzpostaviti povezavo med dvema AVR-jema preko UART-a.
Z enim AVR-jem, bi pošiljal podatke, z drugim pa bral. Pošiljanjam z PRINT preko HW UART-a, le prebrati ne morem z drugim AVR-jem(uporabil sem INPUT). Poizkusil sem tudi z SW UART-om (OPEN...), pa nič. Ima kdo kodo napisano v BASCOM-u, ki dejansko deluje.
Koda v sprejemnem delu:
Config Portb = Output
Dim X As String * 10

Do

Input X

If X = "abc" Then
Portb.1 = Not Portb.1
End If

Waitms 300

Loop

LP Igor


Nazadnje urejal/a ipocek Čet Maj 09, 2013 10:18 am; skupaj popravljeno 1 krat
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Čet Maj 09, 2013 10:08 am    Naslov sporočila: Odgovori s citatom

Pripni svoje programe bomo lažje pomagali.
Kaj pošiljaš, kako pogosto, kako sprejemaš . . .?
Težavo ti verjetno delajo CRLF, v Helpu poglej ukaz Config Input.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
ipocek
Novinec


Pridružen/-a: Čet Maj 2013 8:57
Prispevkov: 7

PrispevekObjavljeno: Čet Maj 09, 2013 10:48 am    Naslov sporočila: Odgovori s citatom

Navezujem se na prejšnje vprašanje.
Uporabljena AVR-ja ne delujeta na isti frekvenci, imata pa oba nastavljen enak BAUD rate(9600). V oddajnem delu je mega16 v sprejemnem pa ATTiny2313.
LP,
Igor
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Čet Maj 09, 2013 11:36 am    Naslov sporočila: Odgovori s citatom

Kako pa zgleda koda oddajnega dela?


Citiram:
Uporabljena AVR-ja ne delujeta na isti frekvenci, imata pa oba nastavljen enak BAUD rate(9600)


Ali delaš z notranjim oscilatorjem ali z zunanjim kristalom?
Ko po serijski komunikaciji pošlješ "abc", tvoj AVR pošlje "abc"&H0D &H0A.
Tega se lahko znebiš na več načinov, prvo je z Config Input, ali pa da iz sprejetega stringa izločiš zadnja dva znaka.
Če boš v sprejemnem programu imel Waitms, ne bo dobro, za ta čas ne bo procesor sprejemal ničesar.
Raje uporabi sprejem v prekinitvi.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2132
Kraj: Ljubljana

PrispevekObjavljeno: Čet Maj 09, 2013 11:53 am    Naslov sporočila: Odgovori s citatom

ipocek je napisal/a:
Navezujem se na prejšnje vprašanje.
Uporabljena AVR-ja ne delujeta na isti frekvenci, imata pa oba nastavljen enak BAUD rate(9600). V oddajnem delu je mega16 v sprejemnem pa ATTiny2313.
LP,
Igor


Kot rečeno: pošlji program, ki ga trenutno imaš, da ga vidimo, na pamet je težko govorit, kaj je narobe...

Lp
Jure
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
ipocek
Novinec


Pridružen/-a: Čet Maj 2013 8:57
Prispevkov: 7

PrispevekObjavljeno: Čet Maj 09, 2013 1:51 pm    Naslov sporočila: Odgovori s citatom

Hvala.

Nazadnje urejal/a ipocek Čet Maj 09, 2013 1:54 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
ipocek
Novinec


Pridružen/-a: Čet Maj 2013 8:57
Prispevkov: 7

PrispevekObjavljeno: Čet Maj 09, 2013 1:53 pm    Naslov sporočila: Odgovori s citatom

Tako izgleda moja koda TX in RX:
TX:
Config Portd.5 = Input
$regfile = "m16adef.dat"
$crystal = 16000000
$baud = 4800
Dim X As String * 10
X = "abc"

Do

If Pind.5 = 0 Then
Print X
End If

Waitms 50

Loop


End 'end program

RX:

Config Portb = Output
$regfile = "attiny2313.dat"
$crystal = 12000000
$baud = 4800


Dim X As String * 10

Do

Input X

Portb.1 = Not Portb.1 'kontrola da se je opravil sprejem


If X = "abc" Then
Gosub Prizgi
End If

Waitms 200

Loop

End

Prizgi:

Portb.3 = 1
Waitms 500

Return

Če imate kodo, ki deluje, bi prosil zanjo.AVR-ja imata quartz.
LP,
Igor
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Čet Maj 09, 2013 3:36 pm    Naslov sporočila: Odgovori s citatom

Prav tako enostavno ne gre, gre pa lahko tako:


Koda:


Config Portb = Output
$regfile = "attiny2313.dat"
$crystal = 12000000
$baud = 4800
' vstavi deklaracije stekov

dim sprejem as strig * 10
dim st_rx as byte
dim Rs_rxbuffer(20) as byte
Dim X As String * 10 at Rs_rxbuffer() overlay


Enable Urxc                   'RxD interrupt flag
On Urxc Rec_isr               'define serial receive ISR
Reset Rsrx_sek_f
Enable Interrupts
'************************************************
do
        if Rsrx_sek_f=1 then
           reset Rsrx_sek_f
           print x
        endif

loop

'************************************************
end


Rec_isr:
     B = Inkey()

     If B > 0 Then
        Incr St_rx  ' kazalec kje naj piše
        Rs_rxbuffer(st_rx) = B
      End If

     If B = 10 Then
        Set Rsrx_sek_f ' zastavica
        st_rx=1
     endif

return



Oddajnik bi lahko delal:

Če imaš pretvornik iz serial v TTL poskusi prvo iz ploščice na PC in nazaj.

_________________
Lep pozdrav !
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
ipocek
Novinec


Pridružen/-a: Čet Maj 2013 8:57
Prispevkov: 7

PrispevekObjavljeno: Čet Maj 09, 2013 4:45 pm    Naslov sporočila: Odgovori s citatom

HVALA.
Ni mi najbolj jasno. Če se da opremit z več komentarja.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Čet Maj 09, 2013 7:47 pm    Naslov sporočila: Odgovori s citatom

ipocek je napisal/a:
HVALA.
Ni mi najbolj jasno. Če se da opremit z več komentarja.


Koda:

Config Portb = Output
$regfile = "attiny2313.dat"
$crystal = 12000000
$baud = 4800
' vstavi deklaracije stekov

Dim St_rx As Byte             'števec oz indeks kateri kaže na pozicijo za vpis prejetega  byta'
Dim Rs_rxbuffer(20) As Byte   'sprejemni buffer v katerega se vpisujejo prejeti bajti
Dim X As String * 20 At Rs_rxbuffer() Overlay       'isti sprejemni buffer vendar deklariran kot string
Dim B As Byte
'************************************************
Enable Urxc                   'RxD interrupt flag   vklop delovanja serijskega sprejema
On Urxc Rec_isr               'define serial receive ISR  Ko proc sprejme nekaj po serijskem kanalu skoči v  Rec_isr
Reset Rsrx_sek_f              'zbrišemo zastavico katera nam pove, da je sprejet string al
Enable Interrupts
'************************************************
do
        If Rsrx_sek_f = 1 Then       ' če je sprejet string je zastavica (bit) postavljena
           Reset Rsrx_sek_f   'zbrišemo zastavico
           Print X            'natisnemo kar smo sprejeli
        End If
Loop

'************************************************
end

'************************************************
Rec_isr:                      'prekinitvena rutina v katero skoči program ko na serijskem kanalu dobi neko informacijo
                          '
     B = Inkey()              ' to preslika v register b

     If B > 0 Then            ' če ima prejeti bajt vrednost večjo od 0
        Rs_rxbuffer(st_rx) = B
        Incr St_rx            ' kazalec na katero lokacijo  naj piše
      End If

     If B = 10 Then
        Set Rsrx_sek_f        ' zastavico postavimo zato, da vemo. da se je končal sprejem enega stringa
        St_rx = 1             'Pri Naslednjem Stringu Začni Pisati Spet Na Začetek
     End If

     If St_rx > 20 Then St_rx = 1       ' tu je varovalka katera ne pusti pisati  izven deklariranega sprejemnega bufferja
                                         '
return

'************************************************************************

_________________
Lep pozdrav !
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
ipocek
Novinec


Pridružen/-a: Čet Maj 2013 8:57
Prispevkov: 7

PrispevekObjavljeno: Pet Maj 10, 2013 8:22 am    Naslov sporočila: Odgovori s citatom

Hvala za vaš trud. Ali obstaja literatura, v kateri so opisane komunikacije UART, I2C, 1Wire, tako nazorno, kot je naredil RudiP.

LP,
Igor
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
ipocek
Novinec


Pridružen/-a: Čet Maj 2013 8:57
Prispevkov: 7

PrispevekObjavljeno: Sre Maj 15, 2013 11:07 am    Naslov sporočila: Odgovori s citatom

V kodi je potrebno je dimenzionirati Rsrx_sek_f kot bit.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group