roboforum.ru

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

Уроки программирования робота для чайников

Re: Уроки программирования робота для чайников

Qzen » 20 июн 2009, 20:39

Да потому что я в жизни её обратно не припаяю! :)) Понятно, значит, с вавками прийдётся повременить :)

Re: Уроки программирования робота для чайников

avr123.nm.ru » 20 июн 2009, 20:42

Ну дак можно и записать на карту через МК. Посмотрите примеры в интернете, на сайте про BASCOM - там точно есть проекты с картами памяти, в конце концов принцип записи на такие карты схож с работой с памятью AT45 - исходники для нее на Си есть на страничке http://avr123.nm.ru/z7.htm - если вы разберетесь с принципом то сделать это можно и на Бэйсике.

Re: Уроки программирования робота для чайников

Qzen » 20 июн 2009, 20:53

Ладно, про wav-ки пока забудем.
Написал программу управлением Минибота с пульта небольшую, чтобы показать возможность всех узлов.
Но проблема - не хочет он по нажатию кнопки играть MIDI из тестовой прошивки, почему?
Исходник:
Код: Выделить всёРазвернуть
$regfile = "m32def.dat"                                     ' файл спецификации Меги32
$crystal = 7372800                                          ' указываем на какой частоте будем работать
$baud = 115200                                              ' указываем частоту дла usart (теперь нужно только для отладки программы)
$include "LCD_Siemens_S65.cfg"
$include "sound.bas"
'----------------------------------------------------------------------------
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pinc.2 = Output : Drl Alias Portc.2                  'ногу сконфигурировали как выход и обозвали Drl
Config Pinc.3 = Output : Drr Alias Portc.3                  'ногу сконфигурировали как выход и обозвали Drr
Config Pind.4 = Output                                      'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output                                      'ногу ШИМа правого движка  сконфигурировали как выход

Config Pinc.4 = Output : Led_1red Alias Portc.4
Config Pinc.5 = Output : Led_1green Alias Portc.5
Config Pinc.6 = Output : Led_2red Alias Portc.6
Config Pinc.7 = Output : Led_2green Alias Portc.7

Config Rc5 = Pind.3

Config Adc = Single , Prescaler = Auto , Reference = Internal
'----------------------------------------------------------------------------

Dim Speed As Byte
Dim W As Word , J As Single


Enable Interrupts
Dim Address As Byte , Command As Byte

Cls
Box(0 , 0) ,(176 , 131) , White

Print "Start MiniBot"                                       ' выводим в терминал отладочное сообщение

Do

   Gosub Прием_rc5
   If Command = 255 Then
      Gosub Стоп
   Elseif Command = 32 Then
      Gosub Прямо
      Waitms 100
   Elseif Command = 33 Then
      Gosub Назад
      Waitms 100
   Elseif Command = 17 Then
      Gosub Влево
      Waitms 100
   Elseif Command = 16 Then
      Gosub Вправо
      Waitms 100

   Elseif Command = 1 Then
      Speed = 100
   Elseif Command = 2 Then
      Speed = 150
   Elseif Command = 3 Then
      Speed = 200
   Elseif Command = 4 Then
      Speed = 255

   Elseif Command = 55 Then
      Led_1red = 1 : Waitms 200 : Led_1red = 0 : Waitms 200
   Elseif Command = 54 Then
      Led_1green = 1 : Waitms 200 : Led_1green = 0 : Waitms 200
   Elseif Command = 50 Then
      Led_2red = 1 : Waitms 200 : Led_2red = 0 : Waitms 200
   Elseif Command = 52 Then
      Led_2green = 1 : Waitms 200 : Led_2green = 0 : Waitms 200

   Elseif Command = 59 Then
      Gosub Экран
   Elseif Command = 12 Then
      Gosub Sound_1

   End If
Loop

Прием_rc5:
   Getrc5(address , Command)
   If Address <> 255 And Command <> 255 Then
      Command = Command And &B01111111
      'Print Chr(12);       ' выводим в терминал символ
      'Print "Address - " ; Address;       ' выводим в терминал адрес
      'Print "Command - " ; Command;       ' выводим в терминал номер команды
   End If
Return

Влево:
   Gosub Стоп : Waitms 10
   Drl = 0 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return

Вправо:
   Gosub Стоп : Waitms 10
   Drl = 1 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return

Прямо:
   Gosub Стоп : Waitms 10
   Drl = 1 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return

Назад:
   Gosub Стоп : Waitms 10
   Drl = 0 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return

Стоп:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0:
Return

Экран:
Start Adc : W = Getadc(7) : Stop Adc : J = W / 475 : J = J * 2

   Lcdat 1 , 0 , "   Владелец:    " , Black , Red
   Lcdat 8 , 0 , " Михайлов Д.В.  " , Black , Red
   Lcdat 16 , 0 , "Модель выполнена " , Blue , White
   Lcdat 24 , 0 , "    в рамках    " , Blue , White
   Lcdat 32 , 0 , "  бакалаврской  " , Blue , White
   Lcdat 40 , 0 , "     работы:     " , Blue , White
   Lcdat 48 , 0 , "    на тему:    " , Blue , White
   Lcdat 56 , 0 , "Анализ тенденций" , Black , White
   Lcdat 64 , 0 , "    создания    " , Black , White
   Lcdat 72 , 0 , "   мехатронных  " , Black , White
   Lcdat 80 , 0 , "   развивающих  " , Black , White
   Lcdat 88 , 0 , "     игрушек    " , Black , White
   Lcdat 96 , 0 , "    для детей   " , Black , White
   Lcdat 104 , 0 , "Фон белый" , Blue , White
   Lcdat 112 , 0 , "Фон желтый" , Blue , Yellow
   Lcdat 120 , 0 , "Фон зелёный" , Blue , Green
   Lcdat 128 , 0 , "Фон светлозеленый" , Blue , Brightgreen
   Lcdat 136 , 0 , "Фон светлосиний" , Blue , Brightblue
   Lcdat 142 , 0 , "Фон оранжевый" , Blue , Orange
   Lcdat 150 , 0 , "Фон фиолетовый" , Blue , Violett
   Lcdat 158 , 0 , "Заряд АКБ(В):" , Blue , White
   Lcdat 166 , 0 , "Akb=" ; J , 0 , 255

   Wait 1

Return

Sound_1:
   Lang = C241(index)
   T1reload = C240(index)
   For I = Lang To 0 Step -1
     Waitms 20
   Next
   Incr Index
   If Index > C24_laenge Then Index = 1
   T1reload = Silence
   Waitms 5
Return

Tick:
   Timer0 = T1reload
   If T1reload = Silence Or Portd.7 = 1 Then
      Portd.7 = 0
   Else
      Portd.7 = 1
   End If
Return

Re: Уроки программирования робота для чайников

MiBBiM » 20 июн 2009, 21:32

остальные команды с пульта выполняет?

Re: Уроки программирования робота для чайников

Qzen » 20 июн 2009, 21:35

Да, на Ура =) Но вот именно с Динамиком фигня - молчит =(

Re: Уроки программирования робота для чайников

MiBBiM » 20 июн 2009, 21:51

ежели бы ты ещё и библиотеки выложил :)
можешь и сам исправить: вся проблема в том, что таймер0 занят на обработку rc5, таймер1 - на шим, значит на прерывания по звуку тебе остается только таймер2. иными словами, в коде во всех местах, связанных со звуком, надо номер таймера поставить 2

Добавлено спустя 5 минут 19 секунд:
или сделать ещё хитрее: повесить обработку rc5 на таймер2, а звук оставить на таймере0:
Код: Выделить всёРазвернуть
CONFIG RC5 = Pind.3, TIMER=2

Re: Уроки программирования робота для чайников

Qzen » 20 июн 2009, 22:00

Всмысле вместо Timer0 поставить Timer2? (и в Sound.bas и в подпрограмме Tick?)

Re: Уроки программирования робота для чайников

MiBBiM » 20 июн 2009, 22:04

вот это заработает:
Код: Выделить всёРазвернуть
$regfile = "m32def.dat"                                     ' файл спецификации Меги32
$crystal = 7372800                                          ' указываем на какой частоте будем работать
$baud = 115200                                              ' указываем частоту дла usart (теперь нужно только для отладки программы)
$include "LCD_Siemens_S65.cfg"
$include "sound.bas"
'----------------------------------------------------------------------------
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Config Pinc.2 = Output : Drl Alias Portc.2                  'ногу сконфигурировали как выход и обозвали Drl
Config Pinc.3 = Output : Drr Alias Portc.3                  'ногу сконфигурировали как выход и обозвали Drr
Config Pind.4 = Output                                      'ногу ШИМа левого движка сконфигурировали как выход
Config Pind.5 = Output                                      'ногу ШИМа правого движка  сконфигурировали как выход

Config Pinc.4 = Output : Led_1red Alias Portc.4
Config Pinc.5 = Output : Led_1green Alias Portc.5
Config Pinc.6 = Output : Led_2red Alias Portc.6
Config Pinc.7 = Output : Led_2green Alias Portc.7

Config Rc5 = Pind.3, TIMER=2

Config Adc = Single , Prescaler = Auto , Reference = Internal
'----------------------------------------------------------------------------

Dim Speed As Byte
Dim W As Word , J As Single


Enable Interrupts
Dim Address As Byte , Command As Byte

Cls
Box(0 , 0) ,(176 , 131) , White

Print "Start MiniBot"                                       ' выводим в терминал отладочное сообщение

Do

   Gosub Прием_rc5
   If Command = 255 Then
      Gosub Стоп
   Elseif Command = 32 Then
      Gosub Прямо
      Waitms 100
   Elseif Command = 33 Then
      Gosub Назад
      Waitms 100
   Elseif Command = 17 Then
      Gosub Влево
      Waitms 100
   Elseif Command = 16 Then
      Gosub Вправо
      Waitms 100

   Elseif Command = 1 Then
      Speed = 100
   Elseif Command = 2 Then
      Speed = 150
   Elseif Command = 3 Then
      Speed = 200
   Elseif Command = 4 Then
      Speed = 255

   Elseif Command = 55 Then
      Led_1red = 1 : Waitms 200 : Led_1red = 0 : Waitms 200
   Elseif Command = 54 Then
      Led_1green = 1 : Waitms 200 : Led_1green = 0 : Waitms 200
   Elseif Command = 50 Then
      Led_2red = 1 : Waitms 200 : Led_2red = 0 : Waitms 200
   Elseif Command = 52 Then
      Led_2green = 1 : Waitms 200 : Led_2green = 0 : Waitms 200

   Elseif Command = 59 Then
      Gosub Экран
   Elseif Command = 12 Then
      Gosub Sound_1

   End If
Loop

Прием_rc5:
   Getrc5(address , Command)
   If Address <> 255 And Command <> 255 Then
      Command = Command And &B01111111
      'Print Chr(12);       ' выводим в терминал символ
      'Print "Address - " ; Address;       ' выводим в терминал адрес
      'Print "Command - " ; Command;       ' выводим в терминал номер команды
   End If
Return

Влево:
   Gosub Стоп : Waitms 10
   Drl = 0 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return

Вправо:
   Gosub Стоп : Waitms 10
   Drl = 1 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return

Прямо:
   Gosub Стоп : Waitms 10
   Drl = 1 : Drr = 1 : Pwm1b = Speed : Pwm1a = Speed:
Return

Назад:
   Gosub Стоп : Waitms 10
   Drl = 0 : Drr = 0 : Pwm1b = Speed : Pwm1a = Speed:
Return

Стоп:
   Drl = 0 : Drr = 0 : Pwm1b = 0 : Pwm1a = 0:
Return

Экран:
Start Adc : W = Getadc(7) : Stop Adc : J = W / 475 : J = J * 2

   Lcdat 1 , 0 , "   Владелец:    " , Black , Red
   Lcdat 8 , 0 , " Михайлов Д.В.  " , Black , Red
   Lcdat 16 , 0 , "Модель выполнена " , Blue , White
   Lcdat 24 , 0 , "    в рамках    " , Blue , White
   Lcdat 32 , 0 , "  бакалаврской  " , Blue , White
   Lcdat 40 , 0 , "     работы:     " , Blue , White
   Lcdat 48 , 0 , "    на тему:    " , Blue , White
   Lcdat 56 , 0 , "Анализ тенденций" , Black , White
   Lcdat 64 , 0 , "    создания    " , Black , White
   Lcdat 72 , 0 , "   мехатронных  " , Black , White
   Lcdat 80 , 0 , "   развивающих  " , Black , White
   Lcdat 88 , 0 , "     игрушек    " , Black , White
   Lcdat 96 , 0 , "    для детей   " , Black , White
   Lcdat 104 , 0 , "Фон белый" , Blue , White
   Lcdat 112 , 0 , "Фон желтый" , Blue , Yellow
   Lcdat 120 , 0 , "Фон зелёный" , Blue , Green
   Lcdat 128 , 0 , "Фон светлозеленый" , Blue , Brightgreen
   Lcdat 136 , 0 , "Фон светлосиний" , Blue , Brightblue
   Lcdat 142 , 0 , "Фон оранжевый" , Blue , Orange
   Lcdat 150 , 0 , "Фон фиолетовый" , Blue , Violett
   Lcdat 158 , 0 , "Заряд АКБ(В):" , Blue , White
   Lcdat 166 , 0 , "Akb=" ; J , 0 , 255

   Wait 1

Return

Sound_1:
   Lang = C241(index)
   T1reload = C240(index)
   For I = Lang To 0 Step -1
     Waitms 20
   Next
   Incr Index
   If Index > C24_laenge Then Index = 1
   T1reload = Silence
   Waitms 5
Return

Tick:
   Timer0 = T1reload
   If T1reload = Silence Or Portd.7 = 1 Then
      Portd.7 = 0
   Else
      Portd.7 = 1
   End If
Return

Re: Уроки программирования робота для чайников

Qzen » 20 июн 2009, 22:15

То, чо хитрее - вышло, но это жесть :))) Он играет отдельные звуки :)))

Добавлено спустя 1 минуту 1 секунду:
А как-нибудь вообще реально, чтобы он начинал проигрывать эту песенку целиком при нажатии определённой кнопки?

Добавлено спустя 7 минут 45 секунд:
Короче, при прошивке это выглядит так, пока я жму кнопку, он воспроизводит эту мелодию позвучно, сколько раз кнопку нажал, столько он звуков и воспроизвёл =) А мне нужно так: нажал кнопку и он воспроизводит все звуки сразу, не по отдельности =)
З.Ы: Позвучно - это поэлементно из массива С240.

Re: Уроки программирования робота для чайников

MiBBiM » 20 июн 2009, 22:16

понял что такое. ты не в цикле воспроизведение запустил. замени процедуру sound_1 нижеследующей:
Код: Выделить всёРазвернуть
Sound_1:
   Do
    Lang = C241(index)
    T1reload = C240(index)
    For I = Lang To 0 Step -1
      Waitms 20
    Next
    Incr Index
   Loop Until Index > C24_laenge
   Index = 1
   T1reload = Silence
   Waitms 5
Return

Re: Уроки программирования робота для чайников

Qzen » 20 июн 2009, 22:19

Спасибо гигантское!! :good:

Re: Уроки программирования робота для чайников

MiBBiM » 20 июн 2009, 22:29

без проблем, обращайся :wink:

Re: Уроки программирования робота для чайников

Qzen » 21 июн 2009, 11:02

Решил одну проблему - появилась новая =)
Теперь косячит LCD Дисплейчик. Без звука все шикарно, как только вставляем звук, сразу же на экране размазня, какие-то символы, в общем, хаос. Может быть, как то связано с таймером? :)

Добавлено спустя 3 минуты 37 секунд:
Не, таймер по ходу не при чем, убираю Taimer=2, ситуация несколько улучшается( то есть текст читается , но все незаполненные места становятся черными ), видимо, ксояк в другом.. 8)

Re: Уроки программирования робота для чайников

MiBBiM » 21 июн 2009, 11:13

выложи проект с конфигами и библами

Добавлено спустя 6 минут 9 секунд:
и что значит вставить звук? запустить процедуру или сделать конфиг таймера?

Re: Уроки программирования робота для чайников

Qzen » 21 июн 2009, 11:40

Залил архивчег сюда: [отмодерировано]

Модератор "Digit":Правилами запрещено выкладывание материалов на сторонних сайтах. Перезалейте в форум. Подробности в личке.


Rambler\'s Top100 Mail.ru counter