v obsluhe prerusenia od Rx uz nemusis volat ziadnu dalsiu funkciu, ktora caka na prijatie. mam na mysli toto:
while ( !(UCSRA & (1<<RXC)) )
Ked ti nastane to prerusenie od Rx, data su uz prijate.
takze ti staci spravit:
}[/code]
Na tie nastavenia UART sa este idem pozriet, lebo takto ako mas nastavene bity sa v tom nevyznam.
EDIT: nemas nastaveny RXEN. musis ho mat nastaveny, aby si mohol prijimat. Mas nastaveny TXB8. neviem presne co to je, nepouzivam to. Na zaciatok to vynechaj. Zapis ako pouzivas je neprehladny a tazko sa v nom hlada chyba. Nauc sa to pisat takto (len odporucam, nenutim ta):
UCSRB |= (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
Nastavujes si tak kazdy bit zvlast, a je to prehladne.
Chlapi, ak chcete aby sa nikto cudzi vyznal vo vasich programoch a vyznali sa aj vy sami, piste nastavovanie bitov zrozumitelne. Nevraviac o tom, ze ked pouzitjete iny mcu ktory moze mat poprehadzovane bity, program vam nebude fungovat a vy budete dlho luskat ze preco a ci nahodou nie je na vine
vadny mcu.
Tie bity maju pre zrozumitelnost aj svoje oznacenie, ktoremu je priradena bitova hodnota v prislusnom *.h subore od vyrobcu. Tento *.h subor sa includuje automaticky v ramci projektu (napr. v AVRstudiu) a tak sa netreba o nic starat. Samozrejme, ak bity nie su v trochu inych registroch. Ako napriklad pre ATega324, ktora ma dva UARTY, nie je register UDR oznazeny ako UDR ale ako UDR0 a UDR1.
priklad pre atmega8:
v tomto subore je vsetko potrebne z hw zadefinovane:
Už to funguje, ale vracej se mi nějak divně data.
Přijatý data ; Odeslaný data
224 ; 1
128 ; 2
224 ; 3
134 ; 4
248 ; 5
134 ; 6
248 ; 7
128 ; 8
224 ; 9
128 ; 0
Ale nevím jestli je to programem v počítači nebo na čipu.
Ještě by ses mohl podělit s tím, kam to posíláš a odkud se ti to vrací?Tedy co máš v tom počítači za program s kterým komunikuješ?
Pravděpodobně nemáš nastavené stejně přenosové rychlosti.
Jinak všem , kdo začínají experimentovat s USARTem doporučuju nainstalovat nějaký terminál - Hyperterminal je na prd, takový nešikovný - já používám Docklight a k tomu pro kontrolu monitorování portu za pomoci Com Spy.
Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click
SP1.PortName = ComboBox1.SelectedItem.ToString
SP1.BaudRate = 4800
SP1.BaudRate = 8
SP1.Parity = Ports.Parity.None
SP1.StopBits = Ports.StopBits.One
SP1.Handshake = Ports.Handshake.None
SP1.Encoding = System.Text.Encoding.UTF8
Try
SP1.Open()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Timer1.Enabled = True
Button4.Enabled = False
Label3.Visible = True
End Sub
Private Sub SP1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SP1.DataReceived
If Me.InvokeRequired() Then
Dim dr As New DataRecievedDelegate(AddressOf DataRecieved)
Me.Invoke(dr, e, SP1.ReadByte)
Else
DataRecieved(e, SP1.ReadByte)
End If
End Sub
Delegate Sub DataRecievedDelegate(ByVal e As System.IO.Ports.SerialDataReceivedEventArgs, ByVal linka As Integer)
Sub DataRecieved(ByVal e As System.IO.Ports.SerialDataReceivedEventArgs, ByVal linka As Integer)
Dim buffer As Integer
buffer = linka
TextBox2.Text += buffer & " ; " & odeslany Mod 10 & vbNewLine
End Sub
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
odeslany += 1
Dim znak(0) As Byte
znak(0) = odeslany Mod 10
SP1.Write(znak, 0, 1)
If odeslany >= 10 Then
Timer1.Enabled = False
End If
End Sub
End Class