PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8-Programmierung zur Steuerung eines Autos - HILFE!!!



r2d2matze
24.10.2005, 15:24
Ich möchte mit Hilfe eines Sensors ein Auto auf Gegenstände reagieren lassen. Es soll, sobald etwas im Weg ist, rückwärts wenden und dann vorwärts weiterfahren..., bis zum nächsten Gegenstand usw...

Hierfür habe ich folgende Schleife mit C programmiert:

while (1)
{
i=0;

while (PIND.6==0) { //PIND.6 ist Ausgang des Sensors
PORTD.0=1; //vorwärts wenn PORTD.0 und .1 =1
PORTD.1=1;
delay_ms(5);
PORTD.0=0;
PORTD.1=0;
delay_ms(4); }

PORTD.4=1; //Lenkung geht nach rechts

while (i<=200) {
PORTD.2=1; //rückwärts wenn PORTD.2 und .3 =1
PORTD.3=1;
delay_ms(5);
PORTD.2=0;
PORTD.3=0;
delay_ms(4);
i++; }

PORTD=0b000000; //alle Ausgänge des Chips aus

};
}


Dies ist ein einfacher Code, aber ich finde den Fehler nicht. Der Wagen reagiert auf den Gegenstand und fährt rückwärts wie geplant. Dann fährt er vorwärts weiter. Soweit ist alles in Ordnung, bloß danach reagiert er auf keinen weiteren Gegenstand mehr, als ob er aus der "Vorwärts-Schleife" nicht mehr rauskäme und ich weiß nicht warum!
Wenn ich die Lenkung rausnehme und ihn also nur vorwärts oder rückwärts fahren lasse, funktioniert alles und er reagiert auch immer wieder auf einen Gegenstand.

Ich finde den Fehler also nicht, kann mir jemand helfen?

SprinterSB
24.10.2005, 15:57
Falls du an PORTD.6 einen Pullup aktiv kast, wird der mit PORTD=0b00000000 deaktiviert.

r2d2matze
24.10.2005, 17:07
Deswegen habe ich ja nur PORD=0b00000 gesetzt. Also nur 6 statt 8 Nullen.

Andun
24.10.2005, 19:24
also ich kenn mich damit nciht ganz genau, aber mit einem = wird eigentlcih immer das komplette Register überschrieben, oder?

Dann versuch es doch lieber mit der Schreibweise:

PORTD|=(1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6);

pebisoft
24.10.2005, 21:13
PORTD=0b000000; //alle Ausgänge des Chips aus

0b... gibt es in winavr-c nicht , nur hexa oder deci.
mfg pebisoft

Dino Dieter
24.10.2005, 21:20
Jo stimmt.

Kommt erst in der nächsten Version, die bald kommen soll

MFG
Dieter

Lötnix
25.10.2005, 07:39
mit dem neuen AVR-Studio mit C-editor und gcc Compiler geht PORTD=0b000000 ohne Probleme. Unter WINAVR müsste es somit eigentlich auch funktionieren. Meines Wissens ist diese Konstruktion nur unter Linux gcc nicht möglich. Ich werde das aber interessehalber nochmal prüfen.

r2d2matze
25.10.2005, 09:01
Ich benutze eh kein WinAVR. Mit einer anderen Schreibweise geht es auch nicht.
Wenn ich z.B. statt PORTD=0b000000 PORTD=0b11000000 oder PORTD.4=0 schreibe, dann bleibt er in der Rückwärts-Schleife und beginnt nicht mehr danach vorwärts zu fahren.
Was ist da los?

Lötnix
25.10.2005, 10:40
also while (PIND.6==0) geht auch nicht. Versuchs mal
mit while ( !(PIND & (1 << 6)) ) ;, das ist C-konform.

SprinterSB
25.10.2005, 14:04
PORTD=0b000000; //alle Ausgänge des Chips aus

0b... gibt es in winavr-c nicht , nur hexa oder deci.
mfg pebisoft

Doch, vor gcc 3.4 ging das. Falls man es haben will und nicht auf ne neue gcc Version warten will, oder nicht ständig neue Versionen aufspielen mag, dann geht's so: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=125217#125217

pebisoft
25.10.2005, 14:53
von einen rückschritt zu älteren winavr-c programm kann ich nur dringend abraten. wir hatten früher auch einen kaiser, jetzt geht es auch ohne.
lötnix hat ein beispiel gegeben. es kann doch nicht so schwer sein dieses anzuwenden oder er arbeitet mit dem sehr guten fastavr-basic oder dem mittelmässigen bascom, bei beiden kann man binär eingeben.
mfg pebisoft

Lötnix
25.10.2005, 15:41
Doch, vor gcc 3.4 ging das. Falls man es haben will und nicht auf ne neue gcc Version warten will, oder nicht ständig neue Versionen aufspielen mag, dann geht's so: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=125217#125217

bei mir geht PORTD=0b000000; mit WINAVR und gcc 3.4.3 einwandfrei. O:)

PicNick
25.10.2005, 15:52
PORTD.4=1; //Lenkung geht nach rechts

Du drehst da die Lenkung, aber sonst kommt portd.4 nirgends vor ?

Ausserdem mußt dun nach der while 200 Schleife "i" wieder auf Null setzen

r2d2matze
25.10.2005, 17:00
habe ich beides gemacht. Ich habe den Fehler jetzt gefunden. Die Spannungsversorgung scheint zusammenzubrechen, sobald ich die Lenkung benutze, so dass der Sensor nur noch manchmal die richtigen Werte bringt.
Ich werde der Lenkung also eine eigene Spannungsquelle verpassen müssen, dann sollte es gehen.