Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Передача данных между МК по USART

Сообщений 1 страница 7 из 7

1

Всем доброго дня! Изучаю передачу данных по USART между МК с помощью исходников sasha_1973(огромное спасибо!)Написал небольшие программы для передатчика и приемника  на Atmega8 . Симулирую на Proteus - никакого результата.  Направьте на правильный путь
Передатчик:

Код:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 24
$baud = 9600
Dim Info As Byte
Config Pind.1 = Output
Config Pind.2 = Input

Do
   Bitwait Pind.2 , Reset                                   ' ждем пока состояния пина будет 0
   Info = Pind.2                                            ' записываем в переменную Info
   Print Info                                               ' передаем по USART
   Bitwait Pind.2 , Set
   Info = Pind.2
   Print Info
Loop

Приемник:

Код:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 24
$baud = 9600
On Urxc Priem
On Utxc Peredacha
Enable Urxc                                                 'Прерывание после окончания приёма данных по USART
Enable Utxc                                                 'Прерывание после окончания приёма данных по USART
Enable Interrupts
Dim Var As Byte
Config Portb.0 = Output
Config Pind.0 = Input
Config Portb.4 = Output : Priem_okonchen Alias Portb.4
Do
   If Priem_okonchen = 1 Then
      Input Var
      Reset Priem_okonchen
      If Var = 1 Then Set Portb.0 : Print 55      '
      If Var = 0 Then Reset Portb.0 : Print 66
   End If

Loop
End

Priem:
   Disable Urxc
   Set Priem_okonchen
Return




Peredacha:
   Enable Urxc
Return

В терминале(в Протеусе) выводится одновременно 55 и 66, т.е выполняются вот эти строки кода:

Код:
      If Var = 1 Then Set Portb.0 : Print 55      '
      If Var = 0 Then Reset Portb.0 : Print 66

??
Файлы

Отредактировано Niya (2020-07-19 23:53:15)

0

2

Сделайте нормально if он обрабатывает только одно действие если в строку. Нет конца блока.

У вас так написано

If... Set port
Print
If... ResPort
Print

Вот и выводится.

Отредактировано Yuriy.pv (2020-07-20 06:52:24)

0

3

Сделайте нормально if он обрабатывает только одно действие если в строку. Нет конца блока.

У вас так написано

If... Set port
Print
If... ResPort
Print

Вот и выводится.

Ничего не изменяется от этого. В принципе эти команды (Print 55,Print 66) были дописаны после того как не выполнялось ничего, чтобы отслеживать

0

4

Выбор по ключу, по моему, красивше будет. И даже если немного больше места занимает чем IF.
select case Var
   case 1
      Set Portb.0
      Print 55 
   case 0
      Reset Portb.0
      Print 66
end select

0

5

pavel1969 написал(а):

Выбор по ключу, по моему, красивше будет. И даже если немного больше места занимает чем IF.
select case Var
   case 1
      Set Portb.0
      Print 55 
   case 0
      Reset Portb.0
      Print 66
end select

Пробовал по разному. Ничего не происходит в Протеусе. Такое чувство , что нет приема. Или Протеус у меня глючит.Вроде, по части приема в коде нет ошибок. Думаю, надо попробовать в железе

Отредактировано Niya (2020-07-20 21:17:55)

0

6

Код:
Do
   If Priem_okonchen = 1 Then
      Input Var
      If Var = 1 Then
         Set Portb.0
         Print 39
      End If
      If Var = 0 Then
         Reset Portb.0
         Print 49
      End If

      Reset Priem_okonchen
   End If

https://upforme.ru/uploads/0000/25/b8/1737/t743919.jpg

Как такое может быть?

Отредактировано Niya (2020-07-20 22:21:45)

0

7

Протеус тупит. В  терминале с приемника отображается данные и с приемника и с передатчика. Убрал с приемника передачу , а в терминале отображается данные с  передатчика.

Отредактировано Niya (2020-07-20 23:00:46)

0