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

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

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

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



Джойстик

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

1

Добрый день. Всех с прошедшими и наступающими праздниками.
Прошу помощи. Спаял джойстик для управления моделькой танка на RF модуле.

Вопрос вот в чем. в терминале одни кракозябы. меняем немного код для arduina pro mini 168 и все работает как надо помогите.

код
Код:
$regfile = "m48def.dat"
$crystal = 8000000
$baud = 9600



'$sim
'=====[Настройка портов]========================================================

Config Pind.2 = Input : Set Pind.2                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pind.3 = Input : Set Pind.3                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pind.4 = Input : Set Pind.4                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pind.5 = Input : Set Pind.5                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pind.6 = Input : Set Pind.6                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pind.7 = Input : Set Pind.7                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания


Config Pinb.0 = Input : Set Pinb.0                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pinb.1 = Input : Set Pinb.1                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pinb.2 = Input : Set Pinb.2                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pinb.3 = Input : Set Pinb.3                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pinb.4 = Input : Set Pinb.4                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания
Config Pinb.5 = Input : Set Pinb.5                          ' Настройка вывода МК на вход с подтяжкой к плюсовой шине питания

'=====[UART]====================================================================

'Config Pind.0 = Input                                       ' Конфигурация вывода RxD, приёмник UART
'Config Portd.1 = Output                                     ' Конфигурация вывода TxD, передатчик UART
'Tx_pin Alias Portd.1
'Open "comd.1:19200,8,n,1" For Output As #1
'=====[Настройка АЦП]===========================================================

Config Adc = Single , Prescaler = Auto , Reference = Avcc

Start Adc

'=====[ Переменные ]============================================================
Dim Левый_х As Word                                         ' левый джойстик х
Dim Левый_у As Word                                         ' левый джойстик у
Dim Правый_х As Word                                        ' правый джойстик х
Dim Правый_у As Word                                        ' правый джойстик у
Dim Порт_1 As Byte
Dim Порт_2 As Byte

'=====[Разное]==================================================================

Declare Function Send(byval Temp As Byte) As Word

Const Deelay = 4

Dim _start As Byte : _start = &h11                           'Стартовый байт
Dim _synh As Byte : _synh = &h12                            'Синхро-байт
Dim Tempword As Word , Temp As Byte
Dim N As Byte
Dim Lx As Word
Dim Ly As Word
Dim Rx As Word
Dim Ry As Word

N = 0


'=====[Основная программа]======================================================


Do

 Gosub _adc
 Gosub Scan_ports
 Gosub Send_air

 Waitms 50

 Loop




_adc:

  Lx = 1023 - Getadc(7)
  Ly = 1023 - Getadc(6)
  Rx = 1023 - Getadc(5)
  Ry = 1023 - Getadc(4)

  Левый_х = Lx / 2
  Левый_у = Ly / 2
  Правый_х = Rx / 2
  Правый_у = Ry / 2

Return


Scan_ports:
 Порт_1.0 = Pind.2
 Порт_1.1 = Pind.3
 Порт_1.2 = Pind.4
 Порт_1.3 = Pind.5
 Порт_1.4 = Pind.6
 Порт_1.5 = Pind.7


 Порт_2.0 = Pinb.0
 Порт_2.1 = Pinb.1
 Порт_2.2 = Pinb.2
 Порт_2.3 = Pinb.3
 Порт_2.4 = Pinb.4
 Порт_2.5 = Pinb.5
Return

'=====[Отправка]================================================================
Send_air:


 Stop Adc


  Tempword = Send(_start)
  Print  Bin(tempword)
  Waitms Deelay

  Tempword = Send(_synh)
  Print Bin(tempword)
  Waitms Deelay

  Tempword = Send(порт_1)
  Print  Bin(tempword)
  Waitms Deelay

  Tempword = Send(порт_2)
  Print  Bin(tempword)
  Waitms Deelay

  Tempword = Send(левый_х)
  Print  Bin(tempword)
  Waitms Deelay

  Tempword = Send(левый_у)
  Print  Bin(tempword)
  Waitms Deelay

  Tempword = Send(правый_х)
  Print  Bin(tempword)
  Waitms Deelay

  Tempword = Send(правый_у)
  Print  Bin(tempword)
  Waitms Deelay


 Start Adc

Return

End


'=====[Манчестер кодирование]===================================================
'Функция кодирует Манчестер
'Автор Эверт Деккер (http://evertdekker.com)
'Байт 10000001 -> 1001010101010110 длинный интервал два нуля

Function Send(byval Temp As Byte) As Word
Local Manchester As Word
Local Bit_number As Byte
Bit_number = 8
Do
Shift Manchester , Left , 2
Decr Bit_number
If Temp.bit_number = 1 Then
Manchester = Manchester + 1                                 '01
Else
Manchester = Manchester + 2                                 '10
End If
Loop Until Bit_number = 0
Send = Manchester
End Function

Отредактировано TAlex (2017-01-04 06:35:39)

0

2

Скорее всего терминал не понимает кириллицу

0

3

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

Скорее всего терминал не понимает кириллицу

если использовать ардуину, то терминал понимает.

И еще на ноге PB0 мк выдает что-то непонятное, а нога используется для кнопки.

0

4

Ну так у вас выход, а по существу в схеме она должна быть входом...в общем проблема на лицо в железе, ищите сопли, перегрузы ноги МК и прочее...

0

5

а манчестер нормально работает? .. хотелось бы посмотреть код приемника.

0

6

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

Ну так у вас выход, а по существу в схеме она должна быть входом...в общем проблема на лицо в железе, ищите сопли, перегрузы ноги МК и прочее...

порт PB0 в fuse bits был неправильно выставлен. Теперь проблема решена.
А вот с УАРТОМ пока непонятно.

Пробовал програмный УАРТ, так тот вообще не пашет.

Yuriy.pv написал(а):

а манчестер нормально работает? .. хотелось бы посмотреть код приемника.

манчестер работает нормально. Код приемника выложу позже.

0

7

Подпрограммы кодирования и декодирования Манчестер
Код:
Declare Function Make_manchester(byval Temp As Byte) As Word

Declare Function Decode_manchester(byval Tempw As Word ) As Byte


'== Demo prog ==

Dim Lus As Byte

Do

For Lus = 0 To 255

   Tempword = Make_manchester(lus)

   Print Decode_manchester(tempword)

Next Lus

Loop

End




'Subroutines

Sub Make_manchester(byval Temp As Byte) As Word

Local Bit_number As Byte

Local Manchester As Word

Bit_number = 8

Do

Shift Manchester , Left , 2

Decr Bit_number

If Temp.bit_number = 1 Then

Manchester = Manchester + 1                                 '01

Else

Manchester = Manchester + 2                                 '10

End If

Loop Until Bit_number = 0

Make_manchester = Manchester

End Sub





Sub Decode_manchester(byval Tempw As Word ) As Byte

Local Bit_number As Byte

Local Manchester As Word

Bit_number = 8

Do

Shift Manchester , Left , 1

Decr Bit_number

Temp_1 = Tempw And &B1100_0000_0000_0000

If Temp_1 = &B0100_0000_0000_0000 Then Incr Manchester      '01

If Temp_1 = &B1100_0000_0000_0000 Or Temp_1 = 0 Then Set Data_error       '11 or 00

Shift Tempw , Left , 2

Loop Until Bit_number = 0

If Data_error = 0 Then

   Decode_manchester = Manchester

Else

   Decode_manchester = 0

End If

Reset Data_error

End Sub

Отредактировано TAlex (2017-01-08 17:55:04)

0

8

Из примера, вы кодируете и декодируете переменную, интересно как ловите и синхронизируете в железе?

0

9

Yuriy.pv написал(а):

Из примера, вы кодируете и декодируете переменную, интересно как ловите и синхронизируете в железе?

Примерно так

Код:
$regfile = "m8def.dat"                                      ' specify the used micro
$crystal = 8000000                                          ' used crystal frequency
$hwstack = 128                                              ' default use 32 for the hardware stack
$swstack = 64                                               ' default use 10 for the SW stack
$framesize = 64                                             ' default use 40 for the frame space
$timeout = 10000

Config PORTC = Output : PORTC = &B11111111                  'wyjscia tutaj dla diod
Config PORTB.1 = Output : Red_led Alias PORTB.1             'migajaca czerwona dioda

Lewo_led Alias PORTC.5
Prawo_led Alias PORTC.0
Przod_led Alias PORTC.4
Tyl_led Alias PORTC.2
Center_led Alias PORTC.3

Open "COMB.0:2400,8,N,1,inverted" For Input As #5           'otworz port software`owy
'jesli nie odbieramy nic to zabawka staje bo przyjmuje wartosci domyslne ,Timer odmierza czas
Config TIMER0 = Timer , Prescale = 1024
Enable TIMER0 : On TIMER0 Timer0_isr
Const Timer0_preload = 62                                   '25ms@ 8MHz
Dim Timer_flag As Byte , Divider As Byte , 1s As Byte , Timeout As Byte

Declare Sub Check_air()
Declare Function Decode_manchester(byval Tempw As Word ) As Byte
Dim Junk As Byte : Junk = 126
Dim Synch As Byte : Synch = 127
Dim Data_error As Bit , Odbierz As Word , Data_bytes(5) As Byte , Test As Byte , Stage As Byte
Dim Command_bytes(5) As Byte , N As Byte , Default_bytes(5) As Byte

Enable Interrupts

'*** START ***
Do


If Timer_flag = 1 Then
    Timer_flag = 0
 Incr Divider
   If Divider = 4 Then
       Divider = 0
        ' co 100ms
        If Timeout > 0 Then Decr Timeout                    'odejmujemy od ostatnio odebranej transmisji
         Incr 1s
          If 1s = 10 Then
              1s = 0
               Set Red_led                                  'migniecie czerwonej - procesor zyje i czeka
          End If
   End If
End If

Call Check_air()                                            'sprawdz czy cos jest nadawane
 'jesli nic nie odebrano zbyt dlugo to laduj wartosci domyslne
   If Timeout = 0 Then
     N = Memcopy(default_bytes(1) , Command_bytes(1) , 5)
   End If
  'tutaj gasimy wszystkie diody albo nimi sterujemy
 For N = 1 To 5

   If Command_bytes(n) = 255 Then PORTC.n = 0 Else PORTC.n = 1

 Next

Loop
End
'*** END ***

'### ODBIERANIE ###
Sub Check_air()
 Disable Interrupts

     Rx_start:

      Inputbin #5 , Odbierz
       Test = Decode_manchester(odbierz)
           'testowo - zostaje tu na jeszcze jeden bajt
      If Stage = 0 Then
       If Test <> Synch Then
        Stage = 1
         Goto Rx_start
       End If
      Else
       If Test <> Synch Then
        Stage = 0
         Goto Rx_exit                                       'jesli drugi bajt tez zły opuść
        End If
      End If
        Stage = 0

      Inputbin #5 , Odbierz
       Data_bytes(1) = Decode_manchester(odbierz)
      Inputbin #5 , Odbierz
       Data_bytes(2) = Decode_manchester(odbierz)
      Inputbin #5 , Odbierz
       Data_bytes(3) = Decode_manchester(odbierz)
      Inputbin #5 , Odbierz
       Data_bytes(4) = Decode_manchester(odbierz)
      Inputbin #5 , Odbierz
       Data_bytes(5) = Decode_manchester(odbierz)


       Timeout = 5                                          '500ms odswiez

         N = Memcopy(data_bytes(1) , Command_bytes(1) , 5)  'przepisz odebrane bajty do komend

      Rx_exit:

  Enable Interrupts
End Sub




Timer0_isr:
TIMER0 = TIMER0 + Timer0_preload
 Timer_flag = 1
 Reset Red_led                                              'wylacz czerwona diode
Return


' funkcja dekoduje Manchesterem
'Autor Evert Dekker ( http://evertdekker.com )
Function Decode_manchester(byval Tempw As Word ) As Byte
Local Bit_number As Byte
Local Manchester As Word
Local Temp_1 As Word
Bit_number = 8
Do
Shift Manchester , Left , 1
Decr Bit_number
Temp_1 = Tempw And &B1100_0000_0000_0000
If Temp_1 = &B0100_0000_0000_0000 Then Incr Manchester      '01
If Temp_1 = &B1100_0000_0000_0000 Or Temp_1 = 0 Then Set Data_error       '11 or 00
Shift Tempw , Left , 2
Loop Until Bit_number = 0
If Data_error = 0 Then
   Decode_manchester = Manchester
Else
   Decode_manchester = 0
End If
Reset Data_error
End Function

0