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

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

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

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



Помогите подружить bascom и uart

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

1

пробую вот так

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

$framesize = 16
$hwstack = 24
$swstack = 16


Dim Comchar As Byte                                         'ïðèíèìàåìûé ñèìâîë
Dim Buff As String * 16                                     'ïåðåìåííàÿ áóôåð
Dim Bcount As Byte                                          'ñ÷åò÷èê ïðèíÿòûõ áàéòîâ
Dim Flagbuf As Bit
Dim Aws As Byte
Config Portb = Output                                       'ïåðåìåííàÿ Ôëàã êîíöà ïðèåìà ñîîáùåíèÿ
'Declare Sub Tobin(byval Incom As String * 16)

On Urxc Getchar                                             'ïåðåîïðåäåëÿåì ïðåðûâàíèå íà ïåðåäà÷ó ïî usart
Enable Urxc                                                 'âêëþ÷àåì ïðåðûâàíèå uart
Enable Interrupts

Reset Flagbuf

'Îñíîâíîé öèêë
Do

If Flagbuf = 1 Then
 Disable Serial
 Print Buff                                                 'îòïðàâëÿåì ïðèíÿòîå ñîîáùåíèå
 Print Bcount
 Aws = Val(buff) + 1
Shiftout Portb.2 , Portb.3 , Aws , 1                        'îòïðàâëÿåì äàííûå â ðåãèñòð
Pulseout Portb , 0 , 5
Waitms 500
 Buff = ""                                                  'ñáðàñûâàåì áóôåð
 Reset Flagbuf                                              'ñáðàñûâàåì ôëàã ïðèåìà ñîîáùåíèÿ
 Enable Serial
 End If
Loop

                                                        'end program
Getchar:
   Comchar = Inkey()                                        'ïðèíèìàåì 1 ñèìâîë

   If Comchar <> 13 Then                                    'ïðîâåðÿåì ÿâëÿåòñÿ ëè ýòîò ñèìâîë Enter'îì
   Buff = Buff + Chr(comchar)                               'åñëè íåò, òî äîáàâëÿåì åãî â áóôåð
   Incr Bcount                                              'óâåëè÷èâàåì íà 1 ñ÷åò÷èê áàéòîâ
   Else
      Flagbuf = 1                                           'åñëè ñèìâîë îêàçàëñÿ "Enter", òîãäà ôëàã óñòàíàâëèâàåì â 1. "Enter"- êîíåö ñîîáùåíèÿ
   End If

   Return

Задача - получить число по уарт и отправить его в сдвиговый регистр. Однако ничего не получается. Подскажите где ошибки. Может быть у кого-то есть работающий код.

Отредактировано inionis (2011-11-28 08:53:28)

0

2

В папке SAMPLES Bascoma есть примеры для UART. Там все подробно.

0

3

Прием работает отлично. Почему-то не работает shiftout. Побовал inputhex и преобразововать принятое значение функцией VAL. эффект нулевой.
Т.е. отправляешь 193
после Aws = Val(buff) + 1 ставишь print aws получаешь ответ 194. Но при этом в сдвиговый регистр ничего не пошло.
При этоv если до DO поставить
Aws = 10
Shiftout Portb.2 , Portb.3 , Aws , 1                        'îòïðàâëÿåì äàííûå â ðåãèñòð
Pulseout Portb , 0 , 5
do.....

То 10 в сдвиговый регистр при включении контролера попадает.
Но то что вводишь через UART никак.

0

4

Такая-же хрень , приём прекрасно а передача не пойми что . Походу всё заточенно для работы с компьютерным терминалом , или таким-же девайсом . А надо прикрутить к уже существующему девайсу .  inionis получилось у вас , железяку довести до ума или нет?

0

5

бррр
не понял
а что общего между uart и shiftout?

0

6

назначь используемые порты на вывод!

0

7

Здравствуйте! Подскажите, может кто-то уже сталкивался с таким нюансом. Суть проблемы в следующем. Пишу на Бейсике приложение для работы с навигационным приемником - что-то типа GPS-трекера. Данные от приемника получаю по UART. Скорость - 9600. Пытаюсь сохранять принятые данные в файл на SD-флеш. Вроде все нормально работает, от приемника все поступает, но вот при записи на карту иногда происходит пропуск символов в сообщениях. Вот код

$regfile = "m32DEF.dat"
$crystal = 7372800
'$external Waitms
$baud = 9600

$hwstack = 128
$swstack = 64
$framesize = 64

On Urxc Getchar

Enable Interrupts
Enable Urxc

$include "Config_MMC.bas"
$include "Config_AVR-DOS.BAS"

Print "Lib version : " ; Ver()

Print "Setup Port and Reset Card ... "

If Drivereset() = 0 Then
   Print "Reset OK"
   End If

If Drivecheck() = 0 Then                                    ' we have a card detected
   Print "Check OK"
   End If

If Driveinit() = 0 Then                                     ' init the drive
   Print "Init OK"
Else
    Print "Card not inserted, check Card!"
    End                                                     'end program
End If

Print "Init File System ...  ";

Dim Gbtemp1 As Byte                                         ' scratch byte
Gbtemp1 = Initfilesystem(0)                                 ' we must init the filesystem once
If Gbtemp1 > 0 Then
   Print "Error " ; Gbtemp1
Else
   Print " OK"
End If

Dim Ff As Byte , S As String * 80 , W As String * 2
Dim Inchar As String * 1 , A As Byte , D As Integer

S = ""
Ff = Freefile()                                             ' get file handle

Open "text.txt" For Output As #ff
Print #ff , ""
Close #ff

Open "text.txt" For Append As #ff
Do
  If D = 1000 Then Goto 1
Loop                                                        ' read a line

1:
Close #ff

Print "Ready"

End

Getchar:
  A = Udr
  Inchar = Chr(a)
  Print #ff , Inchar;
  D = D + 1
Return

Что может быть не так? Два дня убил, а толку нет - пишет, но с ошибками. Т.е. с пропусками.

0

8

Пишите данные от UART в массив.
А в главном цикле программы переписывайте этот массив на карточку после того, как D станет равно 1000.

0

9

Спасибо, что откликнулись. Беда в том, что данные нужно снимать непрерывно. Это здесь я поставил условие - 1000 символов. А в общем процесс будет более длительным. Поэтому массив вряд ли подойдет. Вот еще заметил такую вещь - если в программе запустить цикл до 1000 и писать строку на карточку - пропусков нет. Неужели карта не успевает записывать данные до прихода следующего символа в UDR?

0

10

Судя по техническим описаниям скорость записи на SD - от 3 МБит/с. А у меня данные поступают всего 9600 Бит/с. Всю голову сломал. Пробовал даже немного изменять Config_AVR-DOS.BAS

' Handling of FAT-Buffer in SRAM:
' 0 = FAT- and DIR-Buffer is handled in one SRAM buffer with 561 bytes
' 1 = FAT- and DIR-Buffer is handled in separate SRAM buffers with 1078 bytes
' Parameter 1 increased speed of file-handling
Const Csepfathandle = 1                                     ' [default = 1]

но пропуски все равно есть.

Отредактировано kara1126 (2012-04-03 17:34:56)

0

11

Дело возможно не в успевании записать данные на SD-карту, а в прерывании, которое приходит в момент записи на карту. Попробуйте записывать данные на карту только когда нет прерывания, а лучше вообще сделать без них и посмотреть на эффект.
На счет скорости записи карты, там вроде не такие уж и большие скорости записи, зависит от многих факторов...

0

12

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

Дело возможно не в успевании записать данные на SD-карту, а в прерывании, которое приходит в момент записи на карту. Попробуйте записывать данные на карту только когда нет прерывания, а лучше вообще сделать без них и посмотреть на эффект.
На счет скорости записи карты, там вроде не такие уж и большие скорости записи, зависит от многих факторов...

Да, была мысль по поводу прерываний. Но пробовал даже так

***************************************
Open "text.txt" For Output As #ff
Print #ff , ""
Close #ff

Open "text.txt" For Append As #ff
Do
Input S
Print #ff , S
Loop  Until D = 1000

Close #ff
**************************************

и пропуски все равно есть. Интересно, что такой эффект с несколькими разными карточками.

0

13

Значит надо проверять успел ли блок записаться на карту. Я честно говоря с СД ещё не работал (только хотел), но судя по простому такому примеру (выше), других вариантов не вижу.

0

14

Тему решили? А то очень вкусные вкусности по UART и UDR ), может кристалл на 16мГц перевести, тогда больше шансу, что программы выполнит всё до прерывания, по любому библиотеки с флешкой и дос достаточно циклов убивают, отсюда и потери данных. Это так, как чайник посоветовал   :blush:

Отредактировано Ev3658 (2013-07-26 11:00:30)

0