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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помогите пожалуйста сделать из двух программ одну


Помогите пожалуйста сделать из двух программ одну

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

1

Всем доброго времени суток!  Уважаемые программисты и просто любители электроники, помогите пожалуйста совместить две программы, написанные на бейсике, в одну. Я увлекся электроникой  с нуля два года назад. Все знания исключительно из интернета. Две самые любимые вещи, которые собрал сам- 1.Фрезерный станок с ЧПУ и 2.Гексакоптер с видео.
В свободное время учусь программировать на бейсике. Друг подогнал  самодельные rgb- матрицы 8*8  и я решил попробовать сделать светодиодную строку с блютузом.

Все спаял, нашел в одном английском учебнике программу на бейсике, которая выводит слово на матрицу 5*8. Чуть переделал под свои микросхемы и чудом это все заработало. Потом  отдельнонаписал програмку для приема букв с андроида на LCD. Созатель прграммы Mintoris basic помог написать програмку на андроид для отправки слов и предложений, так как у меня никак не получалось. Но когда я попытался из двух программ сделать одну, я понял что в программировании я совсем не шарю  :((  Помогите пожалуйста в преодолении для меня неприодолимой  цели! Заранее благодарен за любую помощь! Коды программ ниже:
Выводится " abc" на матрицу:

Код:
$crystal = 8000000
$regfile = "m16def.dat"
$swstack = 40                                               '
$hwstack = 32
$framesize = 32
' 4. Hardware Setups
' setup direction of all ports
Config Portb.2 = Output
Config Portb.1 = Output
Config Portb.0 = Output
Config Porta = Output
'configure the timer for the LED scanning
Config Timer1 = Counter , Prescale = 1
On Ovf1 Timer1_isr
Const Preload_value = 56500
Timer1 = Preload_value                                      'reload timer1
Enable Timer1                                               'enable timer 1 interrupt
Enable Interrupts                                           'allow global interrupts to occur
' 5. Hardware Aliases
Dim B As Byte
Ds Alias Portb.2
Sh_cp Alias Portb.0
 Const St_cp = 1
 Col_diga Alias Porta                                       'A.0 to A.4
Dim Col As Byte                                             'c.0 to c.7
' 6. initialise ports so hardware starts correctly
Col = 4                                                     'second column on as first time around
' 8. Declare Variables
Dim Message As String * 50                                  'max 50 characters
Dim Matrix(308) As Byte                                     '6 times nmbr of chars + 8
Dim Count As Byte
Dim Singlechar As String * 1
Dim Char As Byte
Dim Mesg_char As Byte
Dim Temp As Byte
Dim M As Byte

Dim Col_count As Byte
Dim Matrix_ptr As Byte
Dim Table_ptr As Integer
Dim Speed As Byte
Dim Column(8) As Byte                                       ' the 8 cols on the display
Dim Messagelength As Word
Dim Matrixlength As Word
Message = "abc"                                             'USE @ FOR A SPACE
Messagelength = Len(message)
Matrixlength = Messagelength * 6
Matrixlength = Matrixlength + 8
Speed = 9
' 10. Program starts here
'fill array with 1's - all leds off
Count = 1
For Count = 1 To 8
   Column(count) = &B11111111
Next

'get each character from the message
'and create a larger array of 5 bytes of font data for each character
Matrix_ptr = 1
For Count = 1 To 8
   Matrix(matrix_ptr) = &B11111111                          'insert 8 spaces at
   Incr Matrix_ptr                                          ' beginning of message
Next
For Mesg_char = 1 To Messagelength
   'for each character in the message
   Singlechar = Mid(message , Mesg_char , 1)                ' get a char
   Table_ptr = Asc(singlechar)                              ' get ascii value for character
   Table_ptr = Table_ptr - 48                               ' not using ascii codes below "0-zero"
   Table_ptr = Table_ptr * 5                                ' get pointer to font data in the table
   'copy 5 consecutive bytes from the table into the matrix array
      For Count = 0 To 4                                    'for 5 bytes of the font
      Temp = Lookup(table_ptr , Table)                      'get the  font data
      Matrix(matrix_ptr) = Temp                             'put it into the matrix table
      Incr Table_ptr
      Incr Matrix_ptr
   Next
   If Singlechar = ":" Then
      Matrix_ptr = Matrix_ptr - 4
      Matrixlength = Matrixlength - 4
   End If
   Matrix(matrix_ptr) = &B11111111                          'insert a space between
   Incr Matrix_ptr                                          ' each character
Next
For Count = 1 To 8
   Matrix(matrix_ptr) = &B11111111                          'insert 8 spaces at
   Incr Matrix_ptr                                          ' end of message
Next
'get 8 pieces of font at a time
Matrix_ptr = 1
Do
   'put the font into the display
   For Count = 1 To 10
      M = Matrix_ptr + Count
      Temp = Matrix(m)
      Column(count) = Temp
   Next
   Waitms Speed
                                          'scroll delay
   Matrix_ptr = Matrix_ptr + 1                              'increase by 1 to scroll 1 column at a time
   If Matrix_ptr > Matrixlength Then Matrix_ptr = 0
Loop
End
'timer process
Timer1_isr:
 'puts the data in the column array out the port and onto the display
   '1 column at a time
   Timer1 = Preload_value                                   'reload timer1
           'put data onto column
   Rotate Col , Right
    Shiftout Portb.2 , Portb.0 , B , 1
 Shiftout Portb.2 , Portb.0 , B , 1
Shiftout Portb.2 , Portb.0 , Col , 1
Pulseout Portb , St_cp , 5

 Col_diga = Column(col_count)
    Waitms 1
 Porta = &B11111111                                         'turn on next column
   Incr Col_count                                           'increase to next column
   If Col_count = 9 Then Col_count = 1                      'only have 8 columns
Return
End
Table:

Отправка с андроида на блютус матрицы:

Код:
 $regfile = "m16def.dat"
$crystal = 8000000
 $baud = 19200

Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2


   Const False = 0
Const True = 1

  Dim Char As Byte
  Dim I As Byte
   Dim Message As String * 100
Dim Buffer As String * 100
Dim Received As Bit
Message = ""
Received = False

Cls
Cursor Off
Lcd "Privet"

  Do

   Char = Inkey()                                           'see if there is a character
   While Char > 0                                           'if there is
      If Char = 13 Then                                     'if its a Carriage return
         Nop                                                'ignore it
      Elseif Char = 10 Then                                 'if Linefeed (signals end of message)
         Message = Buffer                                   'copy to output
         Buffer = ""                                        'release the buffer
         Received = True                                    'signal we have the complete string
      Else
         Buffer = Buffer + Chr(char)
         Incr I                                             'add new char to buffer
      End If

     If Received = True Then


         Cls
      Locate 1 , 1
      Lcd Message
      Locate 2 , 1
      Lcd I
      Received = False
  End If

  Char = Inkey()

     Wend

    Loop
    End

Спасибо !

0

2

Ну пихайте прием с UART-а в прерывание, остальное у вас уже есть, хотя в первой программе ещё должен идти "DATA", который резанули и для очевидности его не хватает.)

0

3

Спасибо большое, но я пробовал и в прерывание вставлять, и в начале и в основной цикл...   или ничего не происходит, или перемннная message не изменяется, и заново выводит "abcd"... приду с работы - выложу коды,  как я пробовал. Может кто тыкнуть носом в код может, что куда всунуть.

0

4

А какой результат на выходе нужен? Как должно реагировать?

+1

5

Доброй ночи! Задумывалось так: включаем програмку отправки букв на телефоне. Включаем матрицу, она выводит в виде бегущей строки приветствие ( у меня это "abcd").  Потом, если отправить чтото по юарту,  приветствие удаляется и  матрица начнет выводить это слово.  Хотел начать с этого, а потом пробовать добавлять чтото типа жирный текст, но помоему я погорячился!  Вобщем, буду рад любой помощи. Сегодня не получилось выложить коды своих неудачных попыток, завтра выложу. RDW, спасибо что не равнодушно отнеслись к  моей проблеме.

0

6

Денис Вам абсолютно правильно подсказал:

1)  реализуйте приём по USART в прерывании, что-бы процесс был полностью управляемый  -  здесь есть всё, что Вам нужно
2)  по окончании приёма сообщения, подымайте флаг
3)  забирайте принятый буфер в буфер вывода на матрицу
4)  поднимайте флаг, что буфер матрицы обновился
5)  выводите всё на индикацию.

Как работать с USART в Bascom  -  лучше статьи по этому вопросу не встречал.

Нескромный вопрос, Вы русскоязычный? Если ДА, тогда чего комментарии на ангийском языке, Вам так удобнее?

Отредактировано sasha_1973 (2014-11-07 09:31:13)

0

7

В принципе можно вообще всё упростить и не марочиться с забивкой буфера по байтно, если не нужно чтобы было всё идеально плавно.
Достаточно в МК использовать INT0 на приём с UART.

Это пример для встроенного тактирования в 8МГц (attiny84).

Инициализация:

Код:
$timeout = 1000                                             ' чтобы INPUT не висел
Const Buff_input = 13                                       ' размер буфера принятых данных
Dim In_buff As Bit                                          ' бит наличия данных в буфере приёма
Dim C As String * Buff_input                                ' принимаемые данные (RX) - буфер
Dim K As String * Buff_input                                ' после полного принятия данных они попадают: C > K (защелка)

Далее настраиваем прерывание:

Код:
Config Int0 = Falling                                       ' Срабатывает при спаде
On Int0 P_rx
Enable Int0
Enable Interrupts

Дальше используем простецкий код в прерывании:

Код:
P_rx:
   Disable Int0
   Input #1 , C Noecho
   Set In_buff
   K = C
   C = ""
   ' INT0 = 64 INT1 = 128 регистр событий прерываний, выставляются даже если запрещены прерывания (Gifr.intf0 = 1 - Clear Int0 flag)
   Gifr = 64
   Enable Int0
Return

Основное тело программы может спокойно крутиться по кругу:

Код:
Do
L01:
      ' поверка буфера приёма с БТ, приход команд
      If In_buff = 1 Then
         Reset In_buff
         If K = "" Then Goto L01
         ' K - хранит данные принятых данных
         ...
      End If
...
...

Loop
End

1. В этом примере нужно подобрать значение "$timeout", если частота МК отличная от 8МГц.
2. Переменная "In_buff" может быть не битовая, а лучше назначить байт! Т.к. как показала практика, работа одиночными битами приводит к избыточности кода и медленной работе из-за особенности RISC-архитектуры.
3. Возможно стоит уточнить в датащите регистр "Gifr" для "ATmega16", как его настраивать/использовать (возможно он там другой).

Общий принцип работы алгоритма прост:

- основное тело программы занято своим процессом;
- когда начинают приходить данные по порту, основное тело программы прерывается и МК переключается чисто на приём данных (кстати скорость передачи желательно иметь 9600):
    - если данные пришли некорректные, то срабатывает выход по "$timeout";
    - если корректные, то они принимаются, защелкиваются и продолжается выполнение основного тела программы.
- основное тело программы занимается своими делами, но кратковременно проверяет "бит" состояния прихода данных (появления их в буфере):
    - если бит не установлен - игнорирует действие;
    - если бит установлен - производит действия на использование данных (в данном случае из "К").

Если возникают проблемы с установкой данных в матрицу (не успевает), то можно добавить дополнительную проверку, чтобы например, буфер не менялся прерываниями до тех пор, пока основное тело программы от туда данные не заберёт (но тут тоже есть своя опасность в актуальности данных (новые могут уже приходить, а тут старые ещё не забраны). Вообще всё это актуально, если ну очень всё медленно работает. ;)

+1

8

Добрый день, sasha_1973.  Спасибо  за информацию! буду изучать. к моей матрице подключен LCD,Ии у меня получается отправить символы на дисплей отдельной программой. но когда я пытаюсь совместить прием символов и вывод на матрицу, ничего не получается ...  я из Киева, а комментарии на английском так как  пример программы был из англ учебника. я только учусь Бейсику, и пока только повторять ваши девайсы или пробовать переделывать учебные программы под себя, а написать серьезную (как для меня) программу не хватает знаний. не знаю как другие, но я больше понимаю когда сидит ктото рядом показывает и обьясняет. кстати, всегда пользуюсь вашим сайтом. повторял некоторые девайсы radan. Вобщем, не просто прошу за меня сделать, стараюсь разобраться сам, поэтому редко задаю вопросы на форумах. а если честно, программирование и электроника уже два года для меня как отдых, но дается очень трудно. Может у меня не программисткого мышления, и поэтому ничего не получается.... Еще раз спасибо за статьи, буду читать. И вот код пробы совместить две программы в одну

Код:
$crystal = 8000000
$regfile = "m16def.dat"
$swstack = 40                                               '
$hwstack = 32
$framesize = 32
  Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2
Config Portb.2 = Output
Config Portb.1 = Output
Config Portb.0 = Output
Config Porta = Output

'configure the timer for the LED scanning
Config Timer1 = Counter , Prescale = 1
On Ovf1 Timer1_isr
Const Preload_value = 56500
Timer1 = Preload_value                                      'reload timer1
Enable Timer1                                               'enable timer 1 interrupt
Enable Interrupts                                           'allow global interrupts to occur

' 5. Hardware Aliases
Dim B As Byte
Ds Alias Portb.2
Sh_cp Alias Portb.0
 Const St_cp = 1
  Const False = 0
Const True = 1
 Col_diga Alias Porta                                       'A.0 to A.4
Dim Col As Byte                                             'c.0 to c.7
' 6. initialise ports so hardware starts correctly
Col = 4                                                     'second column on as first time around
Dim Message As String * 50                                  'max 50 characters
Dim Matrix(308) As Byte                                     '6 times nmbr of chars + 8
Dim Count As Byte
Dim Singlechar As String * 1
Dim Char As Byte
Dim Mesg_char As Byte
Dim Temp As Byte
Dim M As Byte

Dim Col_count As Byte
Dim Matrix_ptr As Byte
Dim Table_ptr As Integer
Dim Speed As Byte
Dim Column(8) As Byte                                       ' the 8 cols on the display
Dim Messagelength As Word
Dim Matrixlength As Word

Dim Btchar As Byte
  Dim I As Byte
  Dim A As Byte
   Dim Btmessage As String * 100
Dim Buffer As String * 100
Dim Received As Bit
Btmessage = "acdb"
 Buffer = ""

  Cls
Cursor Off
Lcd "Privet"

 Start1:
 Received = False
  Btchar = Inkey()                                          'see if there is a character
   While Btchar > 0                                         'if there is
      If Btchar = 13 Then                                   'if its a Carriage return
         Nop
                                                        'ignore it
      Elseif Btchar = 10 Then                               'if Linefeed (signals end of message)
         Btmessage = Buffer                                 'copy to output
                                               'release the buffer
         Received = True                                    'signal we have the complete string
      Else
         Buffer = Buffer + Chr(btchar)
         Incr I                                             'add new char to buffer
      End If

     If Received = True Then
         Cls
      Locate 1 , 1
      Lcd Btmessage
      Locate 2 , 1
      Lcd I
      Received = False
  End If

  Btchar = Inkey()

     Wend
       Message = Btmessage
                                         'USE @ FOR A SPACE
Messagelength = Len(message)
Matrixlength = Messagelength * 6
Matrixlength = Matrixlength + 8
Speed = 9
' 10. Program starts here
'fill array with 1's - all leds off
Count = 1
For Count = 1 To 8
   Column(count) = &B11111111
Matrix_ptr = 1
For Count = 1 To 8
   Matrix(matrix_ptr) = &B11111111                          'insert 8 spaces at
   Incr Matrix_ptr                                          ' beginning of message
Next
For Mesg_char = 1 To Messagelength
   'for each character in the message
   Singlechar = Mid(message , Mesg_char , 1)                ' get a char
   Table_ptr = Asc(singlechar)                              ' get ascii value for character
   Table_ptr = Table_ptr - 48                               ' not using ascii codes below "0-zero"
   Table_ptr = Table_ptr * 5                                ' get pointer to font data in the table
   'copy 5 consecutive bytes from the table into the matrix array
      For Count = 0 To 4                                    'for 5 bytes of the font
      Temp = Lookup(table_ptr , Table)                      'get the  font data
      Matrix(matrix_ptr) = Temp                             'put it into the matrix table
      Incr Table_ptr
      Incr Matrix_ptr
   Next
   If Singlechar = ":" Then
      Matrix_ptr = Matrix_ptr - 4
      Matrixlength = Matrixlength - 4
   End If
   Matrix(matrix_ptr) = &B11111111                          'insert a space between
   Incr Matrix_ptr                                          ' each character
Next
For Count = 1 To 8
   Matrix(matrix_ptr) = &B11111111                          'insert 8 spaces at
   Incr Matrix_ptr                                          ' end of message
Next
'get 8 pieces of font at a time
Matrix_ptr = 1
Do

A = Ischarwaiting()

  If A = True Then
    Goto Start1

    End If
   'put the font into the display
   For Count = 1 To 10
      M = Matrix_ptr + Count
      Temp = Matrix(m)
      Column(count) = Temp
   Next
   Waitms Speed
   Matrix_ptr = Matrix_ptr + 1                              'increase by 1 to scroll 1 column at a time
   If Matrix_ptr > Matrixlength Then Matrix_ptr = 0
Loop
End
'timer process
Timer1_isr:
   Timer1 = Preload_value                                   'reload timer1
           'put data onto column
   Rotate Col , Right
    Shiftout Portb.2 , Portb.0 , B , 1
 Shiftout Portb.2 , Portb.0 , B , 1
Shiftout Portb.2 , Portb.0 , Col , 1
Pulseout Portb , St_cp , 5

 Col_diga = Column(col_count)
    Waitms 1
 Porta = &B11111111                                         'turn on next column
   Incr Col_count                                           'increase to next column
   If Col_count = 9 Then Col_count = 1                      'only have 8 columns
Return

End
Table:

других проб  не сохранилось.    результат этой программы самый близкий к цели! Выводится приветствие на матрицу. когда отправляю с телефона символы по юарту, приветсвие прерывается, стирается и ВЫВОДИТСЯ ЗАНОВО вместо новых символов

0

9

RDW, пока писал уже новое собщение написали. читаю.. Спасибо вам огромное за помощь! Всем!

0

10

sasha_1973
Извиняюсь! Прочитал и ответил.

0

11

Ещё забыл указать в инициализацию открытие порта:

Код:
Open "comb.2:9600,8,n,1" For Input As #1                    ' RX

И инпут можно конфигурировать (если надо) через "CONFIG INPUT", об этом можно почитать в хелпе баскома.

Данные должны завершаться "CRLF - Carriage Return followed by a Line Feed (default)", т.е. #0D, #0A.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Помогите пожалуйста сделать из двух программ одну