Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  6 6603
I koden som følger er meningen at jeg skal sette "digitalchannel" aktiv slik som dette:
den skal aktivere 1,2,3,4,5,6,7, og 7,6,5,4,3,2 og 1 i loop.
Den skal også slå av den foregående den slo på.
Så outputtet på vellemann brettet blinker 1 etter en opp og ned.

Kode

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace testmedformsapp
{
    public partial class Form1 : Form
    {
        Thread workerThread = null;
        ManualResetEvent threadInterrupt = new ManualResetEvent(false);

        public Form1()
        {
            InitializeComponent();

        
        }

       







        [DllImport("k8055d.dll")]
        public static extern int OpenDevice(int CardAddress);

        [DllImport("k8055d.dll")]
        public static extern void CloseDevice();

        [DllImport("k8055d.dll")]
        public static extern int ReadAnalogChannel(int Channel);

        [DllImport("k8055d.dll")]
        public static extern void ReadAllAnalog(ref int Data1, ref int Data2);

        [DllImport("k8055d.dll")]
        public static extern void OutputAnalogChannel(int Channel, int Data);

        [DllImport("k8055d.dll")]
        public static extern void OutputAllAnalog(int Data1, int Data2);

        [DllImport("k8055d.dll")]
        public static extern void ClearAnalogChannel(int Channel);

        [DllImport("k8055d.dll")]
        public static extern void SetAllAnalog();

        [DllImport("k8055d.dll")]
        public static extern void ClearAllAnalog();

        [DllImport("k8055d.dll")]
        public static extern void SetAnalogChannel(int Channel);

        [DllImport("k8055d.dll")]
        public static extern void WriteAllDigital(int Data);

        [DllImport("k8055d.dll")]
        public static extern void ClearDigitalChannel(int Channel);

        [DllImport("k8055d.dll")]
        public static extern void ClearAllDigital();

        [DllImport("k8055d.dll")]
        public static extern void SetDigitalChannel(int Channel);

        [DllImport("k8055d.dll")]
        public static extern void SetAllDigital();

        [DllImport("k8055d.dll")]
        public static extern bool ReadDigitalChannel(int Channel);

        [DllImport("k8055d.dll")]
        public static extern int ReadAllDigital();

        [DllImport("k8055d.dll")]
        public static extern int ReadCounter(int CounterNr);

        [DllImport("k8055d.dll")]
        public static extern void ResetCounter(int CounterNr);

        [DllImport("k8055d.dll")]
        public static extern void SetCounterDebounceTime(int CounterNr, int DebounceTime);

        [DllImport("k8055d.dll")]
        public static extern int Version();

        [DllImport("k8055d.dll")]
        public static extern int SearchDevices();

        [DllImport("k8055d.dll")]
        public static extern int SetCurrentDevice(int lngCardAddress);

        [DllImport("k8055d.dll")]
        public static extern int ReadBackDigitalOut();

        [DllImport("k8055d.dll")]
        public static extern void ReadBackAnalogOut(int[] Buffer);



        private void button1_Click(object sender, EventArgs e)
        {
            OpenDevice(0);
        }


        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            CloseDevice();
        }
    

       


        private void timer2_Tick(object sender, EventArgs e)
        {
         
            
            
            
         
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (this.workerThread == null)
            {
                this.threadInterrupt.Reset();
                this.workerThread = new Thread(() =>
                {
                    int i = 0;
                    while (!this.threadInterrupt.WaitOne(0))
                    {
                        SetDigitalChannel(i);
                        ClearDigitalChannel(i - 1);
                        Thread.Sleep(100);
                        if (i==8)
                        { i = 0; }
                        else
                        { i = i++; }
                    }
                    this.workerThread = null;
                    // worker thread finished in here..
                });
                this.workerThread.IsBackground = true;
                // start worker thread in here
                this.workerThread.Start();
            }
            else
            {
                // stop worker thread in here
                threadInterrupt.Set();
            }
        }

    }
}

Kode

int n = 6;
int i = n * -1;
while (i <= n)
{
    var val = n - Math.Abs(i++) + 1;
    Console.WriteLine(val);
}

Kode

1
2
3
4
5
6
7
6
5
4
3
2
1
Sist endret av m0b; 4. desember 2020 kl. 15:17.
for å vise, kanskje dette var feil av meg?
for det fungerer ikke.

[...]

Kode

<code>
  private void button3_Click(object sender, EventArgs e)
        {
            int n = 6;
            int i = n * -1;
            if (this.workerThread == null)
            {
                this.threadInterrupt.Reset();
                this.workerThread = new Thread(() =>
                {
                   
                    while (!this.threadInterrupt.WaitOne(0))
                    {
                        
                        while (i <= n)
                        {
                            var val = n - Math.Abs(i++) + 1;
                          //  Console.WriteLine(val);
                        }
                        Thread.Sleep(100);
                        SetDigitalChannel(i);
                        
                        
                    }
                    this.workerThread = null;
                    // worker thread finished in here..
</code>
Sist endret av Myoxocephalus; 4. desember 2020 kl. 16:19. Grunn: fix av code tags
Trigonoceps occipita
vidarlo's Avatar
Donor
Du kaller SetDigitalChannel(i) utanfor while-løkka. Det vil neppe fungere.
Ja, der sier du noe.

Jeg endret til dette:

Kode

int n = 8;
int i = n * -1;
while (i <= n)
{
    var val = n - Math.Abs(i++) + 1;
    Console.WriteLine(val);
    SetDigitalChannel(i);
    ClearDigitalChannel(i - 1);
}
Den går opp og ned nå - så takk for hjelp.
Det er dog et "delay" så den går ikke rett opp og ned igjen, men det er kanskje grunnet at den tester premissene?
Sist endret av Myoxocephalus; 4. desember 2020 kl. 16:21. Grunn: code tags og indentering
Så det var en Thread.Sleep inne i bildet tidligere i koden. Har du den fortsatt med? I så fall er det sannsynlig at det er den som er årsaken. Hvis det er et delay mellom hvert lysbytte så er det enten SetDigitalChannel eller ClearDigitalChannel som har blokkerende kall og som er treige.
Jeg satt thred.sleep med // i front så den ikke er aktivert, så det er eventuelt dette at den er treg i forhold til set eller clear - det er dog ikke så viktig så lar det stå til.