PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerin braucht Hilfe für ein kleines Programm



Becci
08.11.2007, 08:46
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.

#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!

damaltor
08.11.2007, 11:51
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".

Becci
08.11.2007, 12:25
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...

Gock
08.11.2007, 13:15
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ß

samson2
08.11.2007, 13:58
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.
O:) O:)


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

asuroer
08.11.2007, 14:01
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

Becci
08.11.2007, 14:05
Jipppiii es funktioniert endlich... :mrgreen: :mrgreen:
DANKE!!!!
Dass mit dem einrücken muss ich erst noch lernen... aber übersichtlicher ist es auf alle Fälle!

Becci
08.11.2007, 14:11
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

damaltor
09.11.2007, 09:15
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...)


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.

Becci
09.11.2007, 09:20
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!


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

Becci
09.11.2007, 09:23
Ah und noch was :mrgreen:
Bei der Infrarotübertragung... Ich soll 5 Zeichen (ASURO) schicken und 6 Zeichen zurückbekommen (HALLO!), allerdings funktioniert ebenfalls das Lösungsprogramm nur soweit, dass ich 4 Zeichen hinschicken kann und 2 zurückbekomme...

damaltor
09.11.2007, 09:29
zum ersten Programm: was bedeutet es geht nicht? er tut nicht was er soll, oder es lässt sich nicht kompilieren? ich vermute spontan mal letzteres, denn das programm hat keine main-funktion.

ändere mal den namen der funktion "PCDemo(void)" in "main(void)", das würde mir spontan einfallen. gehts jetz?

beim zweiten (klick auf den edit button das nächste mal wenn du noch was "nachschieben" willst - danke): ich habe das buch zwar, aber viele andere nicht. poste doch mal den code. danke!!

Becci
09.11.2007, 09:35
sry...


#include "asuro.h"
int main(void)
{
unsigned char data[ ]=“012345“;
Init();
while(1) {
SerRead(data,5,0);
if(data[0] == ‘A‘ && data[1] == ‘S‘ && data[2] == ‘U‘&& data[3] == ‘R‘ &&data[4]==‘O‘)
SerWrite("HALLO!“,26);
}
return 0;
}

Becci
09.11.2007, 09:42
hab das mit dem main versucht, allerding macht mein asuro nicht das was er soll.
also wenn ich das prog richtig verstanden habe, dann soll mein asuro nach vorne fahrn wenn ich 8 drücke, nach links mit 4, rechts mit 6, rückwärts mit 2 und anhalten mit 5. er macht jedoch garnix... naja immerhin schaltet er die frontLED an wenn ich auf 8 drücke... mehr aber auch nicht

damaltor
09.11.2007, 09:49
hm das fernsteuerungsprogramm finde ich im moment auf die schnelle keinen fehler (muss in 10 minuten los zur vorlesung), beim anderen programm fällt mir spontan nur auf, dass die funtion SerWrite nur 6 zeichen senden soll, aber die zählvariable auf 26 steht. das ist zu viel, sollte aber dem rest des programms keinen abbruch tun.

kommen denn wenigstens die richtigen zeichen zurück, also HA..?

Becci
09.11.2007, 10:24
wenn ich die vollen 5 zeichen sende kommt granichts zurück... sende ich aber nur 4 zeichen und will bloß 3 zurück bekommen, dann bekomm ich auch die richtigen zeichen zurück

Becci
09.11.2007, 10:25
des mit der 26 ist passiert als ichs hier reingepostet hab, habs programm aber nur als 6 stehn, an dem liegs also nicht

Sternthaler
10.11.2007, 01:58
Hallo Becci,
auch von mir ein Willkommen im Forum.


... , 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...
Das Verhalten ist so ganz ok.

Beim Einschalten vom Asuro wird die Status-LED erst einmal auf Gelb geschaltet. Die Back-LED's sind zwar schon 'gut' an, aber immer noch nicht so richtig. Sie 'glimmen' erst noch.
In der 'gelben' Einschalt-Phase wartet der Asuro noch auf einen eventuellen Update vom PC.
Sobald die Init()-Funktion dann endlich aufgerufen wird, wird in dieser Funktion die Status-LED auch schon auf Grün geschaltet. Hier solltest du noch vor der while-Loop auch schon die Back-LED's ausschalten. Dann bist du das 'glimmen' los.
Und nun erst kommt deine erste Anweisung die Status-LED auf Grün zu setzten.

Bei dem Programm aus dem ASURO-Band I zur Steuerung per PC, kann ich auch nichts weiteres finden. damaltor hat dir ja schon den Tip mit dem void main(void) gegeben.
Das Programm läuft im übrigen so auf meinem Asuro perfekt. Somit erst mal ein Lob an dich für das fehlerfreie abtippen.
Aber vielleicht musst du nur mehrfach auf die 8 drücken, bevor der Asuro sich auch nur rührt. Ich muss 10 bis 15 mal die 8 drücken, dann erst geht die Post ab.

Viel Erfolg und auch bei manchen Rückschlägen weiterhin viel Spaß mit dem Asuro-Projekt im Studium.

Gruß Sternthaler

damaltor
10.11.2007, 11:28
dann liegt die fehlerquelle vermutlich mal wieder an der schlechten ir-verbindung...

bei mir hat es wunder geholfen, den usb-transceiver zu kaufen. dieser ist jedoch relativ teuer (~20 €) und deshalb sollte man sich das 2x überlegen.

Becci
12.11.2007, 07:00
Nochmals vielen Dank an alle...
Meine Programme laufen endlich alle.
Bei der Steuerung am PC liegt es wohl echt daran, dass man mehrmals die Zahlen drücken muss, damit sich der ASURO bewegt.