Witam wszystkich.
Mam następujące pytanie:
Połączyłem dwa uP 89C2051 i 89C4051 następująco TxD jednego z RxD drugiego.
Właczam Bascoma 8051 2.0.11.0 jednego programuje żeby wysyłał drugiego odbierał.
Używałem różnych poleceń print , printbin, printhex; a do odbioru inkey, waitkey,inputbin.
Żadnych efektów.
Owszem kiedy wysyłam np.100 na LCD wyświelją się różne rzeczy począwszy od 48 ,56 ,108 a na 254 skończywszy. Czy ktoś miał podobne problemy, lub posiada jakieś rozwiązania w sprawie komunikacji pomiędzy takimi dwoma uP. Chodzi mi o przesłanie około 200 bajtów po 2, co 10 ms.
Kwarc to 11,0592 Mhz
Baud rate 4800
Nie mam pojęcia gdzie leży błąd. Jestem otwarty na wszelkie pomysłu i propozycje.
Zamieszczam jeszcze przykładowe programy które próbowałem.
Nadajnik:
1
Do
Printbin 100
Wait 2
Printbin 100;
Loop
2
do
print 100
wait 1
loop
odbiornik:
1
Config Lcdpin = Pin , Db4 = P1.2 , Db5 = P1.3 , Db6 = P1.4 , Db7 = P1.5 , E = P1.6 , Rs = P1.7
Config Lcd = 16 * 4
Cls
Cursor Off
Cls
Dim I As Byte
Do
I = Val(i)
Lcd I
Inputbin I
Cls
Loop
2
Config Lcdpin = Pin , Db4 = P1.2 , Db5 = P1.3 , Db6 = P1.4 , Db7 = P1.5 , E = P1.6 , Rs = P1.7
Config Lcd = 16 * 4
Cls
Cursor Off
Cls
dim I as byte
do
lcd I
I = waitkey()
cls
loop i wiele, wiele, wiele innych
Aktyw Forum
Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.
Sprawdź punkty Zarejestruj sięWielki Problem z komunikacją UART
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
Z tego co widzę wszystko masz źle. Ja też z tym się męczę. Rzuciłem temat, ale Wielcy tego Forum zachowują się jak łaskawcy. Poczytaj sobie
o przerwaniach i przeanalizuj poniższy przykład
'$regfile = XXXXX
'$crystal = XXXX
On Serial Isr_serial
Enable Serial
Enable Interrupts
Dim Serbuffull As Bit , Ser_string As String * 10 , Serbufcount As Byte ,
Ser_char As Byte
Serbufcount = 0
Serbuffull = 0
Ser_string = ""
Main:
If Serbuffull = 1 Then
Disable Serial 'Stop interrupts for printing.
Set Scon.1
Print Ser_string
Reset Serbuffull
Serbufcount = 0
Ser_string = ""
Enable Serial
End If
Goto Main
Isr_serial: 'RX or TX interrupt received.
If Scon.1 = 0 Then 'Scon.1 = TX interrupt.
Goto Chk_ri 'if TX int. flag is 0 goto Rxint.
End If
Reset Scon.1 'else reset TX int. flag.
Goto Ret_ser 'and exit routine.
Chk_ri:
If Scon.0 = 0 Then Goto Ret_ser 'if RX int. flag is 0 exit routine.
Reset Scon.0 'else reset RX int. flag.
Ser_char = Sbuf 'get character from serial buffer.
Ser_string = Ser_string + Chr(ser_char)
Incr Serbufcount 'Character counter.
If Serbufcount = 10 Then
Set Serbuffull 'Indicate Buffer Is Full.
Ser_string = Ser_string + Chr(0)
End If
Ret_ser:
Return
Powodzenia
o przerwaniach i przeanalizuj poniższy przykład
'$regfile = XXXXX
'$crystal = XXXX
On Serial Isr_serial
Enable Serial
Enable Interrupts
Dim Serbuffull As Bit , Ser_string As String * 10 , Serbufcount As Byte ,
Ser_char As Byte
Serbufcount = 0
Serbuffull = 0
Ser_string = ""
Main:
If Serbuffull = 1 Then
Disable Serial 'Stop interrupts for printing.
Set Scon.1
Print Ser_string
Reset Serbuffull
Serbufcount = 0
Ser_string = ""
Enable Serial
End If
Goto Main
Isr_serial: 'RX or TX interrupt received.
If Scon.1 = 0 Then 'Scon.1 = TX interrupt.
Goto Chk_ri 'if TX int. flag is 0 goto Rxint.
End If
Reset Scon.1 'else reset TX int. flag.
Goto Ret_ser 'and exit routine.
Chk_ri:
If Scon.0 = 0 Then Goto Ret_ser 'if RX int. flag is 0 exit routine.
Reset Scon.0 'else reset RX int. flag.
Ser_char = Sbuf 'get character from serial buffer.
Ser_string = Ser_string + Chr(ser_char)
Incr Serbufcount 'Character counter.
If Serbufcount = 10 Then
Set Serbuffull 'Indicate Buffer Is Full.
Ser_string = Ser_string + Chr(0)
End If
Ret_ser:
Return
Powodzenia
Komunikacja
Zobacz w avt.ep.bascom - komunikacja między atmelkami
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 32 gości