roboforum.ru

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

BASCOM AVR вопросы и ответы

Re: BASCOM AVR вопросы и ответы

EdGull » 25 мар 2009, 09:52

пока ты не включешь программно альтернативные функции ноги, они работать не будут.
или ты нам не весь код предоставил?

Re: BASCOM AVR вопросы и ответы

flyroman » 09 апр 2009, 23:43

Забыл ответить, извините.
Вопрос решён, но вот дело в том что непонятно как он решился. Просто сегмент стал работать нормально и всё.

Думаю мож де замыкало.

Всем спасибо.

Re: BASCOM AVR вопросы и ответы

flyroman » 15 апр 2009, 02:03

Вопрос про RND ...

хотя RND функция, которая возвращает произвольное значение.., но при каждом включении программы она все же возвращает те же произвольные упорядоченные значения... :o
Какая функция в Bascom AVR делает так, чтобы при каждом включении программы RND возвращала разные значения?...
Например как в Visual Basic или просто Basic- Randomize Timer, Randomize(Timer).

А то робот, зараза, делает все тоже самое((

Re: BASCOM AVR вопросы и ответы

blindman » 15 апр 2009, 04:38

Там генератор псевдослучайных чисел. МК после старта всегда выполняет одну и ту же последовательность команд, соответственно и последовательность выдаваемая генератором одна и та же. Для получения новой последовательности можно при каждом перезапуске МК инициализировать генератор случайным значением полученным извне. Подойдут например показания часов или температура воздуха. Как инициализировать генератор - должно быть написано в документации

Re: BASCOM AVR вопросы и ответы

EdGull » 15 апр 2009, 09:26

самый лучший рандомайз это последние цифры уровня заряда акб :wink:

Re: BASCOM AVR вопросы и ответы

flyroman » 18 апр 2009, 15:20

да пронятно что можно использовать внешние значения...
а так по себе в МК Bascome нет такой функции?

Re: BASCOM AVR вопросы и ответы

galex1981 » 18 апр 2009, 15:33

Как в Хелпе Bascom написано:
Код: Выделить всёРазвернуть
You can use a different SEED value by dimensioning and assigning ___RSEED yourself:
Dim ___rseed as word : ___rseed = 10234
Dim I as word : I = rnd(10)

When your application uses a timer you can assign ___RSEED with the timer value. This will give a better random number.

В общем задаешь ___rseed или через таймер или по показаниям датчиков и будет тебе почти полный рандомайз

Re: BASCOM AVR вопросы и ответы

blindman » 18 апр 2009, 15:54

galex1981 писал(а):В общем задаешь ___rseed или через таймер или по показаниям датчиков

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

Re: BASCOM AVR вопросы и ответы

galex1981 » 12 май 2009, 02:03

Ниже выкладываю код таймера на 3 минуты для Меги 32/88. При желании можете сделать на любое другое время
Код: Выделить всёРазвернуть
'фусибиты
$prog &HFF , &HE4 , &HD9 , &H00

'камень
$regfile = "m32DEF.dat"
$crystal = 7372800
$baud = 115200
Config Serialin = Buffered , Size = 20

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

Dim Tick As Word
Dim I As Byte
Dim T As Word
Dim Cnt As Byte

Declare Sub Swait(byval Secs As Word)

On Ovf0 Timr0
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Timer0

' Ниже следует отладочное сообщение в RS-232 порт
Ucsrb.rxen = 0
Print "start tmr"
Ucsrb.rxen = 1

Start Timer0

Cnt = 0
Call Swait(180)                                              ' wait 3 munutes
Ucsrb.rxen = 0
Print "Ok"
Ucsrb.rxen = 1

Do

Loop

Timr0:
  ' timer 0 overflow occurred
   Incr Cnt
   If Cnt = 32 Then
   Incr Tick
   Cnt = 0
   End If
Return

Sub Swait(secs As Word)
  ' do an stand-by wait for the specified number of seconds
  Tick = 0
  While Secs >= Tick
    Gosub Sbymode
  Wend
End Sub

Sbymode:
  ' put the processor into an stand-by mode sleep state for approximately
  ' one milli second based on 1 MHz clock and 1024 timer 0 prescale
  $asm
    push r18                                                ' save current r18
    push r19                                                ' save current r19
    in   r19,SREG                                           ' get current status reg
    in   r18,MCUCR                                          ' get current MCU cntl reg
'    ori  r18,$E0                                            ' set stand by mode (SE + SM2 + SM1)   Мега 88
    ori  r18,$0B                                            ' set stand by mode (SE + SM2 + SM1)    Мега 32

    !out MCUCR,r18                                          ' set MCU cntl reg
    sleep                                                   ' put MCU into idle mode sleep
    '--------waiting to return after timer0 overflow and MCU awake
    !out  SREG,r19                                          ' restore status reg
    pop r19                                                 ' restore old r19
    pop r18                                                 ' restore old r18
  $end Asm
Return

Re: BASCOM AVR вопросы и ответы

vadik » 18 дек 2009, 23:28

Всем привет. Заранее прошу прощения если не туда пишу. Пишу программу для вывода на семисегментный четырехразрядный индикатор. Возникла такая проблема. Не могу решить уже несколько дней. Надо разделить число на отдельные цифры. Т.е. на входе имеем число D=1234, а на выходи должно получиться четыре числа D1=1, D2=2, D3=3, D4=4. Спасибо

Re: BASCOM AVR вопросы и ответы

yak-40 » 18 дек 2009, 23:37

1234 делишь на 1000, получаешь D1.
Остаток от деления делишь на 100, получаем D2.
Ну т т. д. :)

Re: BASCOM AVR вопросы и ответы

vadik » 19 дек 2009, 00:41

Так просто!!! А я наооборот сначала на 10 делил, потом еще на 10...И ничего не получилось. Спасибо за ответ!!!

Re: BASCOM AVR вопросы и ответы

blindman » 19 дек 2009, 05:57

Правильнее взять остаток от деления на 10, вывести в младший разряд (правый) индикатора. Потом поделить на 10. Повторить, выведя остаток на второй справа индикатор. Повторить столько раз, сколько разрядов.


Rambler\'s Top100 Mail.ru counter