-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: Anfängerin braucht Hilfe für ein kleines Programm

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    29
    Beiträge
    45

    Anfängerin braucht Hilfe für ein kleines Programm

    Anzeige

    Hallo!
    Seit September bin ich BA-Student für Elektrotechnik und habe nun das Projekt Asuro bekommen. Anfänglich lief alles ganz gut bis ich versucht habe kleine eigene Programme zu schreiben.
    Nun brauche ich eure Hilfe!
    Das Programm soll alle LEDs nacheinander einschalten und wieder ausschalten. Ich habe 2 Variablen deklariert, eine int und eine char, da sich die BackLEDs irgendwie nur getrennt anschalten lasse wenn ich char benutze.
    Code:
    #include "asuro.h"
            int main(void) {
    	int i;
    	char k;
    	Init();
    	StatusLED(GREEN);
    	while(1);{
    	for(i=1;i<=1000;i++);{
    	Sleep(72);}
    	StatusLED(OFF);
    	FrontLED(ON);
    	for(i=1;i<=1000;i++);{
    	Sleep(72);}
    	FrontLED(OFF);
    	StatusLED(YELLOW);
    	for(i=1;i<=1000;i++);{
    	Sleep(72);}
    	StatusLED(OFF);
    	BackLED(ON,OFF);
    	for(k=1;k<=200;k++);{
    	Sleep(72);}
    	BackLED(OFF,ON);
    	for(k=1;k<=200;k++);{
    	Sleep(72);}
    	BackLED(OFF,OFF);
    	StatusLED(RED);
    	for(i=1;i<=1000;i++);{
    	Sleep(72);}
    	StatusLED(OFF);
    	StatusLED(GREEN);
    	}
    	while (1);
    	return 0;
    	}
    Hoffe ihr könnt mir helfen!

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    Ein Mädchen im Forum! *freu*

    Das Problem ist, dass dein char nicht "unsigned" ist. ein unsigned char kann werte von 0-255 aufnehmen, ein normaler char kann nur werte von -218 bis 217 annehmen. die endlosschleife wird also nie beendet, da 200 nie erreicht werden. ändere das mal in "unsigned char k".
    kleinschreibung ist cool!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    29
    Beiträge
    45
    Ja Mädchen sind bei Technik nicht so sehr vertreten, schade eigntl!
    Ich habe das mit dem "unsigned" ausprobiert, war mir auch soweit logisch warum... jedoch ändert es nichts an der Tatsache, dass meine Lämpchen immer noch nicht in der Reihenfolge wie sie es tun sollten.
    Die Statuslampe ist gelb, die Backlights sind an, danach leuchtet die Statuslampe grün.
    Bei mir sollte aber eigntl die StatusLED von Anfang an grün sein und danach sollte sich die FrontLED anschalten usw...

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Hinter "while" und "for" Befehle kommen keine Semikoli!
    Hoffe, das ist die Mehrzahl von Semikolon
    Bei dem untersten while hast Du die geschweiften Klammern vergessen.
    Es würde außerdem helfen, wenn Du denjenigen Code einrückst, der Teil eines Befehle oder einer Funktion ist. Dann wird es übersichtlicher.
    Gruß

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    02.02.2004
    Alter
    50
    Beiträge
    13

    Re: Anfängerin braucht Hilfe für ein kleines Programm

    Zitat Zitat von Becci
    Hallo!
    Das Programm soll alle LEDs nacheinander einschalten und wieder ausschalten. Ich habe 2 Variablen deklariert, eine int und eine char, da sich die BackLEDs irgendwie nur getrennt anschalten lasse wenn ich char benutze.
    Warum verpackst du das ganze in eine while-Schleife? Ein einfache Abfolge der Befehle reicht doch, um den gewünschten Effekt zu erreichen.
    Dann müßte es auch mit dem int für Back-LED's klappen. Hab den Code mal aus dem Kopf angepasst. Im Moment hab ich keine Testmöglichkeit.


    Code:
    #include "asuro.h"
    int main(void) {
    	int i;
       
    	Init();
    	StatusLED(GREEN);
    
    	for(i=1;i<=1000;i++){
    		Sleep(72);
    	}
    
       	StatusLED(OFF);
    	FrontLED(ON);
    	
    	for(i=1;i<=1000;i++){
    		Sleep(72);
    	}
    
    	FrontLED(OFF);
    	StatusLED(YELLOW);
    
    	for(i=1;i<=1000;i++){
    		Sleep(72);
    	}
    
    	StatusLED(OFF);
    	BackLED(ON,OFF);
    
    	for(i=1;i<=1000;i++){
    		Sleep(72);
    	}
    
    	BackLED(OFF,ON);
    
    	for(i=1;i<=200;i++){
    		Sleep(72);
    	}
    
    	BackLED(OFF,OFF);
    	StatusLED(RED);
    	
    	for(i=1;i<=1000;i++){
    		Sleep(72);
    	}
    
    	StatusLED(OFF);
    	StatusLED(GREEN);
    	while (1);
    	return 0;
    }

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    24
    Beiträge
    69
    hi

    kann man(und frau) die erste while while schleife nicht weglassen?
    am ende steht doch schon eine, wodurch dann das gganze programm wiederholt wird


    und damaltor ist ein (signed) char nicht -128 - + 127 statt -218 - +217??

    MfG Jan

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    29
    Beiträge
    45
    Jipppiii es funktioniert endlich...
    DANKE!!!!
    Dass mit dem einrücken muss ich erst noch lernen... aber übersichtlicher ist es auf alle Fälle!

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    29
    Beiträge
    45
    Geht auch ohne die erste While-Schleife, allerdings durchläuft es das Programm nur einmal...
    Hab auch nochmal nachgeschaut wegen damaltor:
    signed char -128 bis +127
    unsigned char 0 bis 255

  9. #9
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    Zitat Zitat von asuroer
    und damaltor ist ein (signed) char nicht -128 - + 127 statt -218 - +217??
    Das ist selbstverständlich richtig. versucht nie, wissenschaftlich korrekte Beiträge zu verfassen, während ihr mit einem pda im internet seid und auf dieser viel zu kleinen soft-tastatur tippt.

    btw: ein semikolon -> zwei semikola bzw auch Semikolons (neue rechtschreibung...)

    Zitat Zitat von http://de.wikipedia.org/wiki/Semikolon
    Der Strichpunkt oder das Semikolon (griech. „Halbpunkt“) „;“ (Plural: Semikola oder Semikolons) ist ein Satzzeichen zur Verbindung zweier gleichrangiger Sätze oder Wortgruppen. Es bewirkt eine stärkere Trennung als das Komma, aber eine schwächere als der Punkt. Nach einem Strichpunkt wird nach der deutschen Orthographie klein weiter geschrieben.
    kleinschreibung ist cool!

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    08.11.2007
    Ort
    Flehingen
    Alter
    29
    Beiträge
    45
    Könntest mir vlt nochmals behilflich sein??
    Ich mach gerade dieses Lehrbuch Mehr Spaß mit Asuro1 durch und stell immer mehr fest wie viele Lösungen von diesen Beispielen falsch sind. Inzwischen bin ich bei der Steuerung per PC angelangt und sogar die Demoversion geht nicht auf meinem Laptop. Leider finde ich den Fehler nicht!

    Code:
     #include "asuro.h"
    #include <stdlib.h>
    
    #define OFFSET	0x3F
    #define STEP	5
    
    #define RWD_KEY   '2'
    #define FWD_KEY   '8'
    #define LEFT_KEY  '4'
    #define RIGHT_KEY '6'
    #define STOP_KEY  '5'
    
    volatile unsigned char switchPressed;
    int speedLeft,speedRight;
    
    SIGNAL (SIG_INTERRUPT1)
    {
    	unsigned int i;
    
    	DDRD |= SWITCHES;				// Switches as Output
    	SWITCH_ON;						// Output HIGH for measurement
    	ADMUX = (1 << REFS0) | SWITCH;	// AVCC reference with external capacitor
    	for (i = 0; i < 0xFE; i++);
    
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));	// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	i = ADCL + (ADCH << 8);
    
    	// und ab gehts --- fahr zurück
    	MotorDir(RWD,RWD);
    	MotorSpeed(200,200);
    	FrontLED(ON);
    	BackLED(ON,ON);
    	for (i = 0; i < 0xFFFD; i++);   // Sleep does not work here
    
    	switchPressed = TRUE;
    	SWITCH_OFF;
    	DDRD &= ~SWITCHES;					// Switches as Input => ext. Int 1 
    }
    
    void PCFwd(void)
    {
    	speedRight += STEP;
    	speedLeft  += STEP; 
    	if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1; 
    	if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1; 
    	FrontLED(ON);
    	BackLED(OFF,OFF);
    }
    
    void PCRwd(void)
    {
    	speedRight -= STEP;
    	speedLeft  -= STEP;
    	if (speedRight > 0 && speedRight <= OFFSET)  speedRight = -1; 
    	if (speedLeft > 0 && speedLeft <= OFFSET)  speedLeft = -1; 
    	FrontLED(OFF);
    	BackLED(ON,ON);
    }
    
    void PCLeft (void)
    {
    	speedLeft  -= STEP;
    	if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
    	speedRight += STEP;
    	if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
    	FrontLED(OFF);
    	BackLED(ON,OFF);
    }
    
    void PCRight (void)
    {
    	speedLeft  += STEP;
    	if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1; 
    	speedRight -= STEP;
    	if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1; 
    	FrontLED(OFF);
    	BackLED(OFF,ON);
    }
    
    
    void PCStop(void)
    {
    	speedRight = speedLeft = 0;
    	FrontLED(OFF);
    	BackLED(OFF,OFF);
    }
    
    
    void PCDemo(void)
    {
    	unsigned char cmd;
    	unsigned char leftDir = FWD, rightDir = FWD;
    
    	Init();
    	StartSwitch();
    	sei();
    	for(;;) {
    		cmd = 0;	
    		SerRead(&cmd,1,0xFFFE);
    		switch (cmd) {
    			case RWD_KEY :	PCRwd(); break;
    			case FWD_KEY :	PCFwd(); break;
    			case LEFT_KEY :	PCLeft(); break;
    			case RIGHT_KEY : PCRight(); break;
    			case STOP_KEY :	PCStop(); break;
    		}
    		if (speedLeft > 0 && speedLeft <  OFFSET) speedLeft += OFFSET;
    		if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;
    		if (speedRight > 0 && speedRight <  OFFSET) speedRight += OFFSET;
    		if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;
    	
    		if (switchPressed) {
    			speedLeft  = 0;
    			speedRight = 0;
    			switchPressed = FALSE;
    		}
    
    		leftDir = rightDir = FWD;
    		if (speedLeft < 0)  leftDir = RWD; 
    		if (speedRight < 0) rightDir = RWD; 
    			
    		if (speedLeft >   255) speedLeft  =  255; 
    		if (speedLeft <  -255) speedLeft  = -255;
    		if (speedRight >  255) speedRight =  255;
    		if (speedRight < -255) speedRight = -255;
    
    		MotorDir(leftDir,rightDir);
    		MotorSpeed(abs(speedLeft),abs(speedRight));
    	} 	
    }

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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