Автор Тема: помощ за програма за управление на принтерския порт.  (Прочетена 5930 пъти)

kennedy

  • Напреднали
  • *****
  • Публикации: 2151
  • Николай Колев
    • Профил
Здравейте,
от известно време се занимавам с направата на една машина за изработка на тръбички (свързана с моето хоби - ракетомоделизъм) и стигнах до момента с програмирането.
машината се управлява по помоща на контролер закачен на принтерския порт. нуждая се от програма която да изпраще определен брой "еденици" на даден пин или за сетване на пин да стои 0/1.
приемам всякакви предложения.
Активен

"за всичко иде час" Еклесиаст 3:1
всеки пост - отговор на въпрос
-----------------
24.12.2003 "MS Free"

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
Навремето в ДОС имаше една програма, наречена debug. Та в нея, като напишеш
Цитат
о 378,ff
(o - ouput, i - input, т.е.  запис или четене в/от адрес от периферията), на паралелния порт получаваш само единици, а записа на 00 сваля всички битове на 0. Ако запишеш 01, на 2-ри пин на паралелния порт ще получиш 1, а на останалите (3-9) - 0. Ако запишеш 05, ще имаш единици на 2 и на 4. От този адрес можеш и да четеш. Напр. ако машината ти се управлява с 4 бита, можеш с останалите 4 да следиш някакви датчици.
« Последна редакция: Nov 19, 2008, 10:24 от laskov »
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

vstoykov

  • Напреднали
  • *****
  • Публикации: 1286
  • Distribution: Ubuntu
  • Window Manager: Fluxbox
    • Профил
    • WWW
Виж как съм го направил тук:
http://club-linux.hit.bg/

Части от кода:
Код
GeSHi (C++):
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <sys/io.h>
  4. #include <ctime>
  5. #include <cmath>
  6.  
  7. /* Обикновено адресът е 0x378 */
  8. #define portaddress 0x378
  9.  
  10. using namespace std;
  11.  
  12. /* Тази подпрограма праща данни на паралелния порт */
  13. void lptout(unsigned char value) {
  14.  
  15.  if (ioperm(portaddress,1,1)) {
  16.   cout << "error: Няма достъп до паралелния порт" << endl;
  17.   exit(1);
  18.  }
  19.  
  20.  outb(value,portaddress);
  21.  
  22. }
  23.  


Тук има готова програма, която приема десетично число (0-255) като параметър:
http://www.epanorama.net/circuits/lptout.c

Разположение на изводите: http://en.wikipedia.org/wiki/LPT
« Последна редакция: Nov 19, 2008, 10:50 от vstoykov »
Активен

kennedy

  • Напреднали
  • *****
  • Публикации: 2151
  • Николай Колев
    • Профил
при мен пиновете имат следното значение
пин 2-посока на шиндела
пин 3-завъртане 1 стъпка.
пин 4- посока по хоризонтала
пин 5-стъпка по хоризонтала.

трябва да сетвам и 4-те едно временно .... т.е. 01111 за да се завъртят 2-та двигателя в една посока. правилно ли съм разбрал?

довечера ще пробвам да видя как ще реагират двигателите като си поиграя с това което си ми изпратил
Активен

"за всичко иде час" Еклесиаст 3:1
всеки пост - отговор на въпрос
-----------------
24.12.2003 "MS Free"

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
Сега малко трябва да гадаем... Според това, което пишеш, това трябва да е нещо като струг.  4 и 5 вероятно имат следното действие: Да приемем че ако 4 е с ниво 1, това за струга е движение на ножа надясно, а когато 4 е 0 - движение на ножа наляво. Броят импулси на пин 5 определя броят на стъпките на ножа. И така ако 4 е 1 и подадеш на 5 10 импулса, това ще премести ножа надясно с 10 стъпки, т.е. ти трябва да пишеш на порт 378 последователно 04 и 0С (пинове 2 и 3 за сега ги пренебрегваме). Трябва обаче да се съобразиш с това, колко широки трябва да са импулсите на пин 5, така че машината да успее да реагира, т.е. като запишеш 04 колко време да изчакаш преди да запишеш 0С и пак колко време да изчакаш преди да запишеш отново 04. Когато сменяш посоката (нивото на пин 4) пак ще трябва да изчакаш преди да подадеш  импулсите на пин 5.
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

kennedy

  • Напреднали
  • *****
  • Публикации: 2151
  • Николай Колев
    • Профил
не е струг (в началото писах че е машина за навиване на тръби).
но на същия принцип е. 2 двигателя - единия върти шпиндела, другия мота наляво-надясно нишката.
ще видя какво пише за самите мотори като закъснение което трябва да има и продължителност на импулсите.
 
Активен

"за всичко иде час" Еклесиаст 3:1
всеки пост - отговор на въпрос
-----------------
24.12.2003 "MS Free"

nikoni

  • Напреднали
  • *****
  • Публикации: 40
  • Distribution: Slackware
  • Window Manager: Gnome
    • Профил
Тъй като винаги сетваш целия регистър, направи му една променлива,
На тази променлива сетваш нужните битове и тогава я записваш на порта.

Тайминга няма да е много добър (тимешеринг:().
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Аз се съмнявам тези тръбички да трябва да се правят с хирургическа точност - там за времето преди да ти се schedule-ира процеса надали ще се случи фатално отклонение от желаната дължина на тръбичката. Предполагам де. Освен ако тези двигатели не се въртят наистина много бързо :)
Активен

"Knowledge is power" - France is Bacon

kennedy

  • Напреднали
  • *****
  • Публикации: 2151
  • Николай Колев
    • Профил
двигателите са стъпкови т.е. на всяка 1-ца подадена на пин 3 или 5 един от двата двигателя се завърта на 1,8 градуса т.е. трябва да се подадат 200 импулса за един оборот на двигателя. промеждутъка между импулсите определя скороста ...
и така последно какво трябва да подам за да има 1-ца на 2 порт? 0100 0000 ?
Активен

"за всичко иде час" Еклесиаст 3:1
всеки пост - отговор на въпрос
-----------------
24.12.2003 "MS Free"

MillWheel

  • Новаци
  • *
  • Публикации: 2
    • Профил
Преди време попаднах на една програмка, която експлоатира паралелния порт. Правена е за програматор на чипове, но може и да ви е от полза, като модел.

http://fbradasc.altervista.org/index.php?fbhpsessionid=ca966d2b160d65e5ff1b29b7a3682f1c&area=Projects/MicroControllers/FlP5
Активен

MillWheel

  • Новаци
  • *
  • Публикации: 2
    • Профил
и така последно какво трябва да подам за да има 1-ца на 2 порт? 0100 0000 ?
Измери с мултицет.
Този линк също може да е от полза: http://jaspreetscodezone.blogspot.com/2008/02/uln-2803-pinout-working.html
Активен

nikoni

  • Напреднали
  • *****
  • Публикации: 40
  • Distribution: Slackware
  • Window Manager: Gnome
    • Профил
PP
X ---|R|------[Motor]
Y ---|R|------

R - 1k

X  ___+--+____    За 1 стъпка колко време трябва да е 1.

Ако ползваш дата-порта той е директен, т.е. като запишеш 1 излизат 5v.
За контрол порта наякой са инвертирани.

 Я дай една почти инстинска схема.
Активен

kennedy

  • Напреднали
  • *****
  • Публикации: 2151
  • Николай Колев
    • Профил
ползвам този контролер
http://www.sirius-pcb.com/index.php?mod=catalog&show=14
с ето този драйвер
http://www.sirius-pcb.com/index.php?mod=catalog&show=23

ако ти говори нещо.
Активен

"за всичко иде час" Еклесиаст 3:1
всеки пост - отговор на въпрос
-----------------
24.12.2003 "MS Free"

nikoni

  • Напреднали
  • *****
  • Публикации: 40
  • Distribution: Slackware
  • Window Manager: Gnome
    • Профил
PP
2  ---[R]------ [Motor 1 left]
3  ---[R]------ [Motor 1 right]
4  ---[R]------ [Motor 2 left]
5  ---[R]------ [Motor 2 right]


#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/io.h>

#define BASE 0x378

#define PORT_DATA BASE
#define PORT CTRL BASE + 2

#define M1_MASK 3
#define M2_MASK 12

#define STEP_DELAY usleep(20000)   /* 2 miliseconds */

static int reg_data = 0;

void m1_step_left() {
   reg_data |= 1;
   outb(reg_data, PORT_DATA);
   STEP_DELAY;
   reg_data &= M2_MASK;
   outb(reg_data, PORT_DATA);
}

void m1_step_right() {
   reg_data |= 2;
   outb(reg_data, PORT_DATA);
   STEP_DELAY;
   reg_data &= M2_MASK;
   outb(reg_data, PORT_DATA);
}

void m2_step_left() {
   reg_data |= 4;
   outb(reg_data, PORT_DATA);
   STEP_DELAY;
   reg_data &= M1_MASK;
   outb(reg_data, PORT_DATA);
}

void m2_step_right() {
   reg_data |= 8;
   outb(reg_data, PORT_DATA);
   STEP_DELAY;
   reg_data &= M1_MASK;
   outb(reg_data, PORT_DATA);
}

int para_setup() {
   reg_data = 0;
   if(ioperm(BASE, 3, 7) != 0) {
                perror("ioperm");
                exit(1);
        }
   outb(reg_data, PORT_DATA);
   return 0;
}

main() {
   if(para_setup()) exit (1);

   m1_step_left();
   sleep(1);
   m1_step_right();
   sleep(1);
   
   m2_step_left();
   sleep(1);
   m2_step_right();
   sleep(1);
}

M1 стъпка в ляво
ПОНЕ(може да е и по-вече) 1 сек пауза.
М1 стъпка в дясно
ПОНЕ 1 сек пауза.
M2 стъпка в ляво
ПОНЕ 1 сек пауза.
М2 стъпка в дясно
ПОНЕ 1 сек пауза.
Активен

eniac111

  • Напреднали
  • *****
  • Публикации: 263
  • Distribution: Debian / Ubuntu
  • Window Manager: Enlightenment DR16 / KDE4
    • Профил
    • WWW
Виж как съм го направил тук:
http://club-linux.hit.bg/

Сам ли си правил монетника?

//За стъпкови мотори използвам тази схема: http://blogs.msdn.com/coding4fun/archive/2007/11/02/5848155.aspx . Моторите са на 24V - от една пишеща машина. Все още не съм тествал схемата, предполагам че ще работи :)

Промяна: Отговора Ти е в коментара на драйвера :)))
« Последна редакция: Nov 19, 2008, 22:46 от eniac111 »
Активен