-         

Ergebnis 1 bis 6 von 6

Thema: Verbesserungsvorschläge?

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.08.2009
    Ort
    Hamm (NRW)
    Alter
    35
    Beiträge
    52

    Verbesserungsvorschläge?

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Gehört dieser Ausdruck : PORTD=0b000000010;
    nicht auch in die Zählschleife :
    for(i=1;i<=8;i++)
    { ...
    mit rein ?

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.01.2009
    Ort
    Kaiserslautern, Germany, Germany
    Alter
    28
    Beiträge
    77
    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^^

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Zitat Zitat von Flash2over
    musste nicht alles in ne while(1) schleife packen, denn sonst durchläuft er ja nur einma das Programm O.o
    Genau da liegt das Problem...

    Sobald button() den Wert 0 zurückliefert, landet das Programm im return und das wars dann.
    So viele Treppen und so wenig Zeit!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    29.08.2009
    Ort
    Hamm (NRW)
    Alter
    35
    Beiträge
    52
    Danke für die Tips, hab jetzt einfach mit ner if gemacht:

    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;
    }
    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

  6. #6
    Neuer Benutzer
    Registriert seit
    29.11.2010
    Alter
    29
    Beiträge
    4
    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:

    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; 
    }
    Inwiefern der ursprüngliche Code Sinn macht hab ich mir nicht angesehen!


    Bei Fragen - fragen, Grüße

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •