roboforum.ru

Технический форум по робототехнике.

Связь mega88 и mega32

Связь mega88 и mega32

MiBBiM » 11 дек 2009, 23:44

используя одну линию софварного uart. в баскоме делать так нельзя, поэтому пришлось писать софтварный уарт (использует таймер). примерный вид:
мега32, функция для приема (для передачи аналогично коду на меге88)
Код: Выделить всёРазвернуть
Const Timerload_after_start = 144                        'baudrate = 9600, prescaler = 8
Const Timerload_after_bit = 83
Const Bytes_amount = 3   
....
Sub Input_m88(byref S As String)
   Local Bit_count As Byte , Byte_count As Byte
   Local Buf As Byte

   Config Pinc.0 = Output
   Config Pinc.1 = Input

   Config Timer0 = Timer , Prescale = 8
   Stop Timer0

   Byte_count = 0
   While Byte_count < Bytes_amount
      Incr Byte_count
      Bitwait Pinc.1 , Reset
      Start Timer0
      Timer0 = 0
         While Timer0 < Timerload_after_start
         Wend
      Timer0 = 0
      Portc.0 = 1
      Portc.0 = 0
      Bit_count = 0
      Buf = 0
      While Bit_count < 8
         Portc.0 = 1
         Buf = Buf + Pinc.1
         Rotate Buf , Right , 1
         Incr Bit_count
         Timer0 = 0
         Portc.0 = 0
            While Timer0 < Timerload_after_bit
            Wend
      Wend
      Mid(s , Byte_count , 1) = Buf
      Stop Timer0
   Wend
   Incr Byte_count
   Mid(s , Byte_count , 1) = Chr(0)
End Sub

мега88, функции для приема, передачи
Код: Выделить всёРазвернуть
Const Timerload_after_start = 144                     'baudrate = 9600, prescaler = 8
Const Timerload_after_bit = 83
Const Bytes_amount = 3
...
Sub Input_m32(byref S As String)
   Local Bit_count As Byte , Byte_count As Byte
   Local Buf As Byte

   Config Pinc.0 = Output
   Config Pinc.4 = Input

   Config Timer2 = Timer , Prescale = 8
   Stop Timer2

   Byte_count = 0
   While Byte_count < Bytes_amount
      Incr Byte_count
      Bitwait Pinc.4 , Reset
      Start Timer2
      Timer2 = 0
         While Timer2 < Timerload_after_start
         Wend
      Timer0 = 0
      Portc.0 = 1
      Portc.0 = 0
      Bit_count = 0
      Buf = 0
      While Bit_count < 8
         Portc.0 = 1
         Buf = Buf + Pinc.4
         Rotate Buf , Right , 1
         Incr Bit_count
         Timer2 = 0
         Portc.0 = 0
            While Timer2 < Timerload_after_bit
            Wend
      Wend
      Mid(s , Byte_count , 1) = Buf
      Stop Timer2
   Wend
   Incr Byte_count
   Mid(s , Byte_count , 1) = Chr(0)
End Sub

Sub Print_m32(byref S As String)
   Open "comc.4:9600,8,n,1" For Output As #10
      Disable Timer0
         Print #10 , S ;
      Enable Timer0
   Close #10
End Sub

функции настроены для обмена 3хбайтными пакетами, при этом ни один байт не должен быть равен 0x00 (ф-я отправки, встроенная в баском, работает с нуль-терминированными строками). любой обмен должен быть двунаправленным (т.е. вначале приняли пакет, потом отослали) для проверки безошибочной передачи.
также стоит внимательно отнестись к процессу прошивания: вначале стереть оба чипа, потом залить прошивку в мк, который вначале ожидает входные данные(мега88) и только в последнюю очередь - мегу32. такие предосторожности нужны для избежания конфликта уровней на ножках мк.
Вложения
between mc_display_1soft-uart.rar
тестировалась в железе, нужен подключенный дисплей
(56.98 КиБ) Скачиваний: 6
servo_sharp_uart1wire-software_test.rar
файлы симуляции, не тестировались в железе
(71.91 КиБ) Скачиваний: 6
Последний раз редактировалось MiBBiM 12 дек 2009, 00:03, всего редактировалось 2 раз(а).

Re: Связь mega88 и mega32

avr123.nm.ru » 11 дек 2009, 23:46

Это хорошо, но я уверен что и в BASCOM можно писать и читать регистры и менять биты - а значит можно и аппаратный UART с одной линией задействовать.

Re: Связь mega88 и mega32

MiBBiM » 11 дек 2009, 23:51

к сожалению в миниботе задействованные ножки не поддерживают функциональность хардварного уарта

Re: Связь mega88 и mega32

avr123.nm.ru » 11 дек 2009, 23:53

Аааа ... вы то про Баском написали , а не про особенность схемы :)
MiBBiM писал(а):используя одну линию uart. в баскоме делать так нельзя

Re: Связь mega88 и mega32

MiBBiM » 12 дек 2009, 00:07

прошу прощения за неоднозначность, исправил.
вот как нельзя делать в баскоме:
Код: Выделить всёРазвернуть
Open "comc.0:2400,8,n,1" For Input As #11
Input #11, S
Close #11
..
Open "comc.0:2400,8,n,1" For output As #12
Print #12, S
Close #12

т.е. менять характер направления (вход/выход) одной и той же ножки софт-уарта

Re: Связь mega88 и mega32

EdGull » 12 дек 2009, 01:51

а зачем тебе это?
в миниботе м32 и м88 связаны аппаратными уартами

Re: Связь mega88 и mega32

avr123.nm.ru » 12 дек 2009, 01:53

Вот и я это видел.

Re: Связь mega88 и mega32

galex1981 » 13 дек 2009, 01:57

Тоже не пойму, вроде бы достаточно аппаратного УАРТА, зачем софтовый?

Re: Связь mega88 и mega32

MiBBiM » 13 дек 2009, 19:54

потому что сторонний наблюдатель, подключенный через ft232 (и cc2500, если не написать фильтр на мегу88), будет видеть мусор обмена.


Rambler\'s Top100 Mail.ru counter