Gehört dieser Ausdruck : PORTD=0b000000010;
nicht auch in die Zählschleife :
for(i=1;i<=8;i++)
{ ...
mit rein ?
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
Gehört dieser Ausdruck : PORTD=0b000000010;
nicht auch in die Zählschleife :
for(i=1;i<=8;i++)
{ ...
mit rein ?
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^^
Genau da liegt das Problem...Zitat von Flash2over
Sobald button() den Wert 0 zurückliefert, landet das Programm im return und das wars dann.
So viele Treppen und so wenig Zeit!
Danke für die Tips, hab jetzt einfach mit ner if gemacht:
Das soll es machen:Code:#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; }
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
Was meinst du mit "dem Quelltext übergeben"?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.
Zum Bleistift könntest du die If's zu ner Switch-Case machen.Oder wie ich meinen Code etwas schlanker gestalten kann?
Und du kannst natürlich versuchen doppelten Code zu vermeiden:
Inwiefern der ursprüngliche Code Sinn macht hab ich mir nicht angesehen!Code:#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; }
Bei Fragen - fragen, Grüße
Lesezeichen