Subject:
|
Re: NQC 2.2 a1 available for public test
|
Newsgroups:
|
lugnet.robotics.rcx.nqc
|
Date:
|
Mon, 8 May 2000 17:26:27 GMT
|
Viewed:
|
1945 times
|
| |
| |
Working code using a counter.
/*
* lstop8.nqc - Line and Wall avoider
*
* Copyright (C) 2000 James Pritchard
*
* Date: 08-May 2000
*
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Thanks to Dave Baum for creating such an excelent compiler and language.
*
* All Rights Reserved.
*/
/*
* This program avoides dark lines and walls. Everytime the program
* encounters a line or wall the counter is increased. I can then setup an
* event to monitor the counter, so that it doesn't go on for ever.
*/
void Sleep(const int m) { asm { 0xB1, m }; } // Inactive time out after m
minutes 0=never
#define sens 10
#define nsens -10
#define speed 7
#define reversetime 150
#define turntime 200
#define COUNTER_1 0
int count; // We must initate the first global varible as the counter or
else nqc will use the counter as a varible. We only need int one counter
because we only use the first count 0.
int rl1;
int rl2;
int rlavg;
int orlavg;
int statlight;
int stattouch;
int whr;
task main()
{
Sleep(0); // Never turn off
ClearCounter(COUNTER_1);
SetUserDisplay(Counter(COUNTER_1), 0);
SelectDisplay(DISPLAY_USER);
SetSensorType(SENSOR_1, SENSOR_TYPE_TOUCH);
SetSensorMode(SENSOR_1, SENSOR_MODE_BOOL);
SetSensorType(SENSOR_2, SENSOR_TYPE_TOUCH);
SetSensorMode(SENSOR_2, SENSOR_MODE_BOOL);
SetSensorType(SENSOR_3, SENSOR_TYPE_LIGHT);
SetSensorMode(SENSOR_3, SENSOR_MODE_RAW);
SetDirection(OUT_A + OUT_C, OUT_FWD);
SetPower(OUT_A + OUT_C, speed);
SetOutput(OUT_A + OUT_C, OUT_ON);
start actionlight;
start actiontouch;
start mlight;
start monitorleft;
start monitorright;
until (Counter(COUNTER_1) > 10);
int freq;
freq = 4000;
while (freq > 300) {
freq -= 200;
PlayTone(freq, 5);
}
stop actionlight;
stop actiontouch;
stop mlight;
stop monitorleft;
stop monitorright;
StopRCX();
}
task mlight()
{
SetPriority(10);
int temp;
temp = 1;
while (true)
{
rl2 = rl1;
rl1 = SENSOR_3;
rlavg = rl2;
rlavg + rl1;
rlavg / 2;
if (temp == 1) {
temp = 0;
} else {
if (rlavg - orlavg > sens) { PlayTone(1100,5);
statlight = 0; } // On Dark
if (rlavg - orlavg < nsens) { PlayTone(990,5);
statlight = 1; } // On Light
}
orlavg = rlavg;
}
}
task actionlight()
{
SetPriority(40);
while(true)
{
until (statlight == 0); // Wait until on dark
IncCounter(COUNTER_1);
Rev(OUT_A + OUT_C);
until (statlight == 1); // Wait until on light
Wait(reversetime/2);
if (Random(10) > 5) {
Fwd(OUT_A);} else {
Fwd(OUT_C);}
Wait(turntime);
Fwd(OUT_A + OUT_C);
}
}
task monitorleft()
{
SetPriority(20);
while(true)
{
until (SENSOR_1 == 1); // Wait until Sensor1 Pushed LEFT
stattouch |= 1;
IncCounter(COUNTER_1);
until (SENSOR_1 == 0); // Wait until unpressed on LEFT
stattouch &= 2;
}
}
task monitorright()
{
SetPriority(20);
while(true)
{
until (SENSOR_2 == 1); // Wait until Sensor1 Pushed RIGHT
stattouch |= 2;
IncCounter(COUNTER_1);
until (SENSOR_2 == 0); // Wait until unpressed on RIGHT
stattouch &= 1;
}
}
task actiontouch()
{
SetPriority(30);
while(true)
{
if (stattouch == 3) {
// Both pressed
PlayTone(880,5);
whr = 2;
backup();
}
if (stattouch == 1) {
// Left only pressed
PlayTone(440,5);
whr = 0;
backup();
}
if (stattouch == 2) {
// Right only pressed
PlayTone(660,5);
whr = 1;
backup();
}
}
}
sub backup()
{
Rev(OUT_A + OUT_C);
Wait(reversetime);
if (whr == 0)
{
Fwd(OUT_A);
Wait(turntime);
}
if (whr == 1)
{
Fwd(OUT_C);
Wait(turntime);
}
if (whr == 2)
{
if (Random(10) > 5)
{
Fwd(OUT_A);
Wait(Random(200));
} else {
Fwd(OUT_C);
Wait(Random(200));
}
}
Fwd(OUT_A + OUT_C);
}
sub StopRCX()
{
Off(OUT_A + OUT_C);
Fwd(OUT_A + OUT_C);
Float(OUT_A + OUT_C);
}
James Pritchard <dungeon@madasafish.com> wrote in message
news:Fu8y2L.I1t@lugnet.com...
> There is still a problem when nqc uses the first three global variables if
> you also want to use a counter.
> The current solution is to make the first int lines reflect the fact that
> they will be used as counters.
>
> #Define COUNTER_1 0
> int count1
> int count2
> int count3
> int varible1
>
> varible1 = Counter(COUNTER_1)
>
>
>
> Sorry if this sounds a bit strange I'll post some code when I find it.
>
> Dave Baum <dbaum@spambgoneenteract.com> wrote in message
> news:dbaum-5971D6.01155106052000@lugnet.com...
> > Preliminary NQC support for RCX 2.0 is now available in NQC version
> > 2.2a1. Its in the beta test area of the NQC site:
> > http://www.enteract.com/~dbaum/nqc
> >
> > There have been a lot of changes internal to the compiler itself, and
> > RCX 2.0 support is only partially complete at the moment, but I figured
> > an early release would be better than nothing.
> >
> > Dave Baum
> >
> > --
> > reply to: dbaum at enteract dot com
>
>
|
|
Message is in Reply To:
| | Re: NQC 2.2 a1 available for public test
|
| There is still a problem when nqc uses the first three global variables if you also want to use a counter. The current solution is to make the first int lines reflect the fact that they will be used as counters. #Define COUNTER_1 0 int count1 int (...) (25 years ago, 8-May-00, to lugnet.robotics.rcx.nqc)
|
22 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|