Komunikacja UART: atmega128 - atmega 32.


Zrobiłem płytkę do mówiącego sterownika domowego na której są at128 (procesor główny)i at32(procesor muzyczny z kartą sd). Potrzebuję zrobić przesył plików tekstowych z karty sd(at32) na wyświetlacz lcd(at128).
Napisałem taki program na at128(odbiornik):

'---PROCESOR--------------------------------------------------------------------
$regfile = "m128def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 64
$framesize = 64
$baud = 9600
 
Enable Interrupts
 
'---WYŚWIETLACZ--------------------------------------------------------------------
$lib "glcd.lib"
Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 7 , Cd = 2 , Wr = 4 , Rd = 3 , Reset = 6 , Fs = 1 , Mode = 8
Cursor Off
Cls
 
'---PORTY--------------------------------------------------------------------
Config Porta = Output
Set Porta
Config Portb = Output
Set Portb
Config Portc = Output
Set Portc
Config Portd = Output
Set Portd
Config Porte = Output
Set Porte
 
Config Porte.0 = Input
Set Porte.0
Config Porte.1 = Output
Set Porte.1
'uart
 
'---ZMIENNE--------------------------------------------------------------------
Dim Odebrany As Byte , Coss As Byte , C As Byte
C = 0
 
'---PĘTLA GŁÓWNA--------------------------------------------------------------------
Do
 
Inputbin Coss
'odbiera znaki liczbowe kodu ASCII
Incr C
'ustawia numer znaku na lcd
Locate 1 , C
Lcd Chr(coss)
'wyśwetla kolejno odebrane znaki liczbowe
'kodu ASCII zmieniając je na text
 
Loop Until C = 29
'dopuki nie odbierze 29 znaków
 
C = 0
Do
 
Inputbin Coss
Incr C
Locate 2 , C
Lcd Chr(coss)
 
Loop Until C = 29
'i podobnie w drugiej linii lcd
End

i at32(nadajnik):
'---PROCESOR--------------------------------------------------------------------
$regfile = "M32Def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 64
$framesize = 64
$baud = 9600
 
Enable Interrupts
 
'---PORTY--------------------------------------------------------------------
Config Porta = Output
Set Porta
Config Portb = Output
Set Portb
Config Portc = Output
Set Portc
Config Portd = Output
Set Portd
 
Config Portd.0 = Input
Set Portd.0
Config Portd.1 = Output
Set Portd.1
'uart
 
'---ZMIENNE--------------------------------------------------------------------
Dim S(5) As String * 29 , S1 As String * 29
Dim A As Byte , C As Byte , D(29) As Byte At S1 Overlay , E As Byte
S(1) = "1234567890QWERTYUIOPASDFGHJKL"
S(2) = "LKJHGFDSAPOIUYTREWQ0987654321"
C = 0
A = 0
 
Wait 2
 
'---PĘTLA GŁÓWNA----------------------------------------------------------------
Do
 
Incr A
'ustawia numer zmiennej s(a)
S1 = S(a)
'przypianie s1 do s(a)
C = 0
'początkowa wartość zmiennej d(29)
 
   Do
      Incr C
      'kolejna liczba kodu ASCII ze zmiennej s1 [czyli s(a)]
      Printbin D(c)
      'wysłaie liczby w kodzie ASCII
   Loop Until C = 29
   'dopuki wyśle 29 znaków w kodzie ASCII
 
Loop Until A = 2
'dopuki wyśle 2 całe zmienne po 29 znaków każda
 
End

Program działa ale nie do końca. Pierwszą linijkę tekstu wysyła i odbiera bezbłędnie. problem pojawia się gdy chcę wysyłać więcej linijek tekstu. Mianowicie program próbuje wyświetlać w każdej kolejnej linii to samo co w poprzedniej z tym że obcina coraz więcej pierwszych znaków tej linijki np. w piątej linii obetnie 4 pierwsze znaki a w dziewiątej obetnie 8 pierwszych znaków. W puste miejsca z przodu linijki wstawia jakieś dziwne symbole "krzaczki". W helpie bascoma pisze że jeśli uart pokazuje "krzaczki" to znaczy że źle ustawiona jest szybkość transmisji ale ja mam ustawione w kodzie programu i w kompilatorze bascoma tak samo. Dla lepszego zrozumienia pokażę jak to wygląda na lcd:

'Zamiast:
1234567890QWERTYUIOPASDFGHJKL
LKJHGFDSAPOIUYTREWQ0987654321

'Wyświetla
1234567890QWERTYUIOPASDFGHJKL
 234567890QWERTYUIOPASDFGHJKL

Proszę o pomoc w którym miejscu popełniłem błąd i jak to poprawić.




Portret użytkownika zan

Działa!!!!!!!!! Zastanawiałe

Działa!!!!!!!!!

Zastanawiałem się czemu procesor próbował wyświetlać ciągle tę samą wysłaną zmienną jedną pod drugą i po wielu próbach i błędach znalazłem przyczynę. Mianowicie wcześniej myślałem że zmienna zdefiniowana jako:

Dim d(29) as byte at s1 overlay
'Dim c as byte,s1 as string*29

w funkcji:
  Do
      Incr C
      Printbin D(c)
   Loop Until C = 29

wysyła po jednym znaku z s1 zmienionym na liczbę w kodzie ASCII i tak próbowałem wysłać całego stringa.
Okazało się że wystarczy instrukcja:
c=1
Printbin d(c)

i cały string zostaje wysłany bez żadnego dzielenia na znaki pojedyncze.