Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
ipocek Novinec
Pridružen/-a: Čet Maj 2013 8:57 Prispevkov: 7
|
Objavljeno: Čet Maj 09, 2013 9:42 am Naslov sporočila: Povezava dveh AVR-je preko UART-a |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Čet Maj 09, 2013 10:08 am Naslov sporočila: |
|
|
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 |
|
|
ipocek Novinec
Pridružen/-a: Čet Maj 2013 8:57 Prispevkov: 7
|
Objavljeno: Čet Maj 09, 2013 10:48 am Naslov sporočila: |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Čet Maj 09, 2013 11:36 am Naslov sporočila: |
|
|
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 |
|
|
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
Objavljeno: Čet Maj 09, 2013 11:53 am Naslov sporočila: |
|
|
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 |
|
|
ipocek Novinec
Pridružen/-a: Čet Maj 2013 8:57 Prispevkov: 7
|
Objavljeno: Čet Maj 09, 2013 1:51 pm Naslov sporočila: |
|
|
Hvala.
Nazadnje urejal/a ipocek Čet Maj 09, 2013 1:54 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
|
ipocek Novinec
Pridružen/-a: Čet Maj 2013 8:57 Prispevkov: 7
|
Objavljeno: Čet Maj 09, 2013 1:53 pm Naslov sporočila: |
|
|
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 |
|
|
RudiP Profesionalec
Pridružen/-a: Sre Jul 2008 8:39 Prispevkov: 128 Kraj: KOPER
|
Objavljeno: Čet Maj 09, 2013 3:36 pm Naslov sporočila: |
|
|
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 |
|
|
ipocek Novinec
Pridružen/-a: Čet Maj 2013 8:57 Prispevkov: 7
|
Objavljeno: Čet Maj 09, 2013 4:45 pm Naslov sporočila: |
|
|
HVALA.
Ni mi najbolj jasno. Če se da opremit z več komentarja. |
|
Nazaj na vrh |
|
|
RudiP Profesionalec
Pridružen/-a: Sre Jul 2008 8:39 Prispevkov: 128 Kraj: KOPER
|
Objavljeno: Čet Maj 09, 2013 7:47 pm Naslov sporočila: |
|
|
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 |
|
|
ipocek Novinec
Pridružen/-a: Čet Maj 2013 8:57 Prispevkov: 7
|
Objavljeno: Pet Maj 10, 2013 8:22 am Naslov sporočila: |
|
|
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 |
|
|
ipocek Novinec
Pridružen/-a: Čet Maj 2013 8:57 Prispevkov: 7
|
Objavljeno: Sre Maj 15, 2013 11:07 am Naslov sporočila: |
|
|
V kodi je potrebno je dimenzionirati Rsrx_sek_f kot bit. |
|
Nazaj na vrh |
|
|
|