PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verbesserungsvorschläge?



Mnemonic82
03.05.2010, 19:53
Hallo zusammen...

Versuche gerade mit dem rncontrol nen Schrittmotor per Tastendruck laufen zu lassen. Hab mir gedacht ich machs am besten mit ner do-while-Schleife.
Aber aus irgendeinem Grund tuts der Quellcode nicht.

Hier isser:

#include <stdlib.h>
#include <avr/io.h>
#include "rncontrol.h"


int main()

{
DDRD=0xFF;

do
{


int i=0;

PORTD=0b000000010;

waitms(1);

for(i=1;i<=8;i++)
{
PORTD = 0b00000001;

waitms(1);

PORTD = 0b00000000;

waitms(1);
}

PORTD=0b000000010;
}
while(button()==1);

return 0;
}

Lasst mich mal raten, is bestimmt wieder nur ne Kleinigkeit...

Gruss Mnemonic

wkrug
03.05.2010, 23:38
Gehört dieser Ausdruck : PORTD=0b000000010;
nicht auch in die Zählschleife :
for(i=1;i<=8;i++)
{ ...
mit rein ?

Flash2over
04.05.2010, 01:57
musste nicht alles in ne while(1) schleife packen, denn sonst durchläuft er ja nur einma das Programm O.o

Bin leider nimmer so fit in C....zu viel Bascom^^

Felix G
04.05.2010, 08:07
musste nicht alles in ne while(1) schleife packen, denn sonst durchläuft er ja nur einma das Programm O.oGenau da liegt das Problem...

Sobald button() den Wert 0 zurückliefert, landet das Programm im return und das wars dann.

Mnemonic82
04.05.2010, 13:58
Danke für die Tips, hab jetzt einfach mit ner if gemacht:



#include <stdlib.h>
#include <avr/io.h>
#include "rncontrol.h"


int main()

{
DDRD=0xFF;
DDRB=0x00;
int i=0;



while(1)
{

PORTD=0b000000010;

waitms(1);

if(PINB & (1<<PINB0))
{
if (button()==1)
{
waitms(250); //Zeit zum loslassen geben

for(i=1;i<=8;i++)
{
PORTD = 0b00000001;

waitms(1);

PORTD = 0b00000000;

waitms(15);
}

}


if (button()==2)
{
waitms(250); //Zeit zum loslassen geben

for(i=1;i<=24;i++)
{
PORTD = 0b00000001;

waitms(1);

PORTD = 0b00000000;

waitms(2);
}
}


if (button()==3)
{
waitms(250); //Zeit zum loslassen geben

for(i=1;i<=48;i++)
{
PORTD = 0b00000001;

waitms(1);

PORTD = 0b00000000;

waitms(1);
}
}


if (button()==4)
{
waitms(250); //Zeit zum loslassen geben

for(i=1;i<=96;i++)
{
PORTD = 0b00000001;

waitms(1);

PORTD = 0b00000000;

waitms(1);
}
}


if (button()==5)
{
waitms(250); //Zeit zum loslassen geben

for(i=1;i<=192;i++)
{
PORTD = 0b00000001;

waitms(1);

PORTD = 0b00000000;

waitms(1);
}
}

}

PORTD=0b000000010;

waitms(1);
}

return 0;
}


Das soll es machen:

Hab an der rn control die smc11 von Nanotec hängen (Schrittmotortreiber) und da dran nen kleinen bipolaren Schrittmotor.

Wenn Taste 1 gedrückt ist macht der Motor 8 Schritte -> 15°
Taste 2 -> 24 Schritte -> 45°
Taste 3 -> 48 Schritte -> 90°
Taste 4 -> 96 Schritte -> 180°
Taste 5 -> 192 Schritte -> 360°

Wie gesagt es funktioniert so wie es soll. Würde jetzt gerne diesem Quelltext nen Wert übergeben und der Motor soll dann automatisch dem entsprechend viele Schritte machen.

Kann mir da vielleicht jemand nen Hinweiss geben, wie man sowas machen kann?

Oder wie ich meinen Code etwas schlanker gestalten kann?

Gruss Mnemonic

flood1k4
14.12.2010, 10:21
Wie gesagt es funktioniert so wie es soll. Würde jetzt gerne diesem Quelltext nen Wert übergeben und der Motor soll dann automatisch dem entsprechend viele Schritte machen.

Was meinst du mit "dem Quelltext übergeben"?



Oder wie ich meinen Code etwas schlanker gestalten kann?

Zum Bleistift könntest du die If's zu ner Switch-Case machen.
Und du kannst natürlich versuchen doppelten Code zu vermeiden:


#include <stdlib.h>
#include <avr/io.h>
#include "rncontrol.h"

typedef struct{
int iSteps;
int iWait1;
int iWait2
} grValues = {0, 1, 1};


int main()
{
// DataDirection: 1 = output, 0 = input
// ----
DDRD = 0xFF;
DDRB = 0x00;

// Ports
// DDR = 1: 1 = driven high, 0 = driven low
// DDR = 0: 1 = pullups, 0 = tristate
// ----
PORTD = 0b000000010; // ... driven high


grValues grValUse;


while(1)
{
if(PINB & (1<<PB0))
{
switch(button())
{
case 1:
grValUse.iSteps = 8;
grValUse.iWait2 = 15;
break;

case 2:
grValUse.iSteps = 24;
grValUse.iWait2 = 2;
break;

case 3:
grValUse.iSteps = 48;
break;

case 4:
grValUse.iSteps = 96;
break;

case 5:
grValUse.iSteps = 192;
break;
}

waitms(250); // Entprellen

for(int i=0; i<grValUse.iSteps; i++)
{
PORTD |= (1<<PD0);
waitms(grValUse.iWait1);
PORTD &= ~(1<<PD0);
waitms(grValUse.iWait2);
}
}
waitms(1);
}

return 0;
}

Inwiefern der ursprüngliche Code Sinn macht hab ich mir nicht angesehen!


Bei Fragen - fragen, Grüße ;)