Archiv verlassen und diese Seite im Standarddesign anzeigen : Wiso funktioniert meine Software für den ATmega88 nicht ??
rob_88_20p
26.07.2008, 00:38
Hallo zusammen
Ich bin neu auf diesem Gebiet aber habe schon einmal versucht für meinen kleinen Roboter die Software mit der C Sprache zu programmieren. Aber der Roboter hat nicht so auf meine Software reagiert wie ich es gerne hätte.
Jetzt frage ich mich wo mein Fehler ist.
Ich habe hier einen Link für Euch mit meinem Programmierungsversuch,
kann mir bitte Jemand sagen was hier nicht stimmt ?
http://dennis4123.de.funpic.de/Robo_Schalter.zip
Ich programmiere meinen Roboter mit dem AVR Dude und kompilliere die .c Datei mit AVR Studio 4 zu einer .hex Datei und lade sie auf den Roboter.
Danke
radbruch
26.07.2008, 02:26
Hallo
Das sieht ja eigentlich gut aus, ich erhalte beim Kompilieren allerdings Warnungen weil das void als Parameter in den Definitionen fehlt:
void driveForward(void){
Aber das kann's eigentlich nicht sein. Hauptfehler beim Verwenden des AVR-Studios ist das Vergessen des Speicherns vor dem Kompilieren. Deshalb im Anhang die von mir erzeugte Hex-Datei.
Funktioniert das:
#define __AVR_ATmega88__
#include <avr/io.h>
//#include <iom88.h>
#define STATSLED0_ON (PORTC |= 1<<PC0)
#define STATSLED0_OFF (PORTC &= ~(1<<PC0))
#define STATSLED1_ON (PORTC |= 1<<PC1)
#define STATSLED1_OFF (PORTC &= ~(1<<PC1))
#define STATSLED2_ON (PORTC |= 1<<PC2)
#define STATSLED2_OFF (PORTC &= ~(1<<PC2))
#define STATSLED3_ON (PORTC |= 1<<PC3)
#define STATSLED3_OFF (PORTC &= ~(1<<PC3))
#define SWITCH_LEFT (PINC & 1<<PC4)
#define SWITCH_RIGHT (PINB & 1<<PB4)
#define SWITCH_BACK_LEFT (PINC & 1<<PC6)
#define SWITCH_BACK_RIGHT (PINB & 1<<PB0)
int main(void){
//DDRD = 1<<PD6 | 1<<PD7; // PD6 PD7 Output Motor1;
//DDRB = 1<<PB1 | 1<<PB2; // PB1 PB2 Output Motor2;
DDRC &= ~(1<<PC4 | 1<<PC6); // PC4 PC6 Input SWITCH_LEFT & SWITCH_BACK_LEFT;
DDRB &= ~(1<<PB4 | 1<<PB0); // PB4 PB0 Input SWITCH_RIGHT & SWITCH_BACK_RIGHT;
DDRC = 1<<PC0 | 1<<PC1; // PC0 PC1 Output StatusLED0 & 1;
DDRC |= 1<<PC2 | 1<<PC3; // PC2 PC3 Output StatusLED2 & 3;
while(1)
{
if(SWITCH_LEFT) STATSLED0_ON; else STATSLED0_OFF;
if(SWITCH_BACK_LEFT) STATSLED1_ON; else STATSLED1_OFF;
if(SWITCH_RIGHT) STATSLED2_ON; else STATSLED2_OFF;
if(SWITCH_BACK_RIGHT) STATSLED3_ON; else STATSLED3_OFF;
}
return(0);
}(Nicht getestet weil mir der passende Roboter fehlt)
Ich hoffe, es ist so richtig. Die Hex-Datei dazu ist auch im Anhang. Übrigens: Willkommen im RN-Forum.
Gruß
mic
Hubert.G
26.07.2008, 12:05
Wie sieht denn deine Hardware dazu aus?
rob_88_20p
26.07.2008, 12:12
Hi
Danke für die Antwort aber den code den du mir gezeigt hast bezieht sich ja eigentlich nur auf die LED's
ich brauche aber den code damit dieser kleine Roboter fährt oder meintest Du ich solll einen abschnitt meines Codes durch deinen erstetzten.
Wenn ja welchen abschnitt ?
den ganzen kanns ja nich sein dan funktionieren ja nur die LED's oder fersteh ich hier wetwas falsch ?
oberallgeier
26.07.2008, 12:16
Hallo mic,
... Hauptfehler beim Verwenden des AVR-Studios ist das Vergessen des Speicherns vor dem Kompilieren.
Also ich weiß nicht, wieviele hex-Files ich schon geflasht habe, bei denen ich "mittendrin" - mal so zur Probe, als Test oder um zu sehen, ob es so wirklich geht - mit AVRStudio kompiliert und mit PonyProg "mal eben" geflasht hatte. An Speichern hatte ich dabei nie gedacht und es hat trotzdem immer funktioniert.
Hubert.G
26.07.2008, 12:40
rob_88_20p:
Dein Code lässt sich im AVR-Studio einwandfrei kompilieren und auch simulieren. Was funktioniert denn deiner Meinung nach nicht?
rob_88_20p
26.07.2008, 12:45
hier sind noch ein Paar Bilder dan seht Ihr den Roboter
und der Bestückungsplan mit der Pinbelegung
ich hab schon eine Software die funktioniert abere diese ist mit den 2 IR Sensoren vorne am Robot
und es sind noch 2 Schalter vorne und 2 Hinten
ach und hier hab ich noch ein Vid jetzt ist er aber nicht mehr so langsam ich hab neuee motor rein gebaut
schauts euch einfach an
aber hier erst mal die Links:
http://www.festzeit.ch/viewpic.php?id=9417590&ctx=31527&n=6
http://dennis4123.de.funpic.de/Bilder_1.zip
http://dennis4123.de.funpic.de/Bilder_2.zip
radbruch
26.07.2008, 12:46
Hallo
@oberallgeier:
Ich verwende das avr-Studio nicht und blappere deshalb nur nach was ich hier so aufgeschnappt habe:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=364532#364532
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=296835#296835
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=287212#287212
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=264950#264950
...
@rob_88_20p:
Ja, mein "Programm" testet nur die Taster und die LEDs. Es soll dazu dienen zu prüfen, ob du überhaupt ein Programm auf deinen Roboter laden und ausführen kannst. Übrigens wäre nun der richtige Zeitpunkt uns mitzuteilen, welche Funktion in deinem Programm nicht so reagiert wie du es gerne hättest. Wie Hubert.G schon schreibt wären auch ein paar Infos zur Hardware (Schaltplan, verwendeter Roboter...) nötig um weitere Diagnosen zu erstellen.
Gruß
mic
ups, zu langsam. Der erste Link funzt nicht bei Gästen...
rob_88_20p
26.07.2008, 12:48
also ich habe die hex datei auf den IC gebrutzelt
dann hab ich den roboter getestet aber wen ich auf einen der 4 schalter klicke passiert überhaupt nichts
alle pinns sind richtig
warum funktiononiert das nicht ?
rob_88_20p
26.07.2008, 12:52
schade ihc schau mal was ich das machen kann es ist n video
und ich weis das ich software auf den roboter schreiben kan ihc habe eine einzige datei die funktioniert und das ist die mit den IR Sensoren die funktioniert einwandfrei ich habe schon dutzent mal versucht das mit den schaltern hinzubekommen aber ohne erfolg und ich habe es immer wider geschafft das mit den sonsoren wider drauf zu laden und hatt immer funktioniert
rob_88_20p
26.07.2008, 12:56
Ich hab das Vid in Youtube gestellt ich schik euch den Link wenns so weit ist
Hubert.G
26.07.2008, 13:00
Bist du sicher das du die Schalter richtig angeschlossen hast? Darum meine Frage nach der Schaltung.
radbruch
26.07.2008, 13:04
Hallo
Wenn der Schaltertest nicht funktioniert wird uns das Video auch nicht weiterhelfen. Wir brauchen jetzt unbedingt den Schaltplan des Roboters. Zeig uns doch mal das IR-Sensoren-Programm das funktioniert. Das kannst du hier im Beitrag in
-Tags posten.
Gruß
mic
rob_88_20p
26.07.2008, 13:07
hier ist noch der bestückungs plan ich musste ihn scannen hatte in nicht auf den computer
http://dennis4123.de.funpic.de/Bestückungsplan.zip
hier ist noch der text vom bestückungsplan den man unten nicht gut lesen kann
http://dennis4123.de.funpic.de/switch_led_bezeichnung.zip
rob_88_20p
26.07.2008, 13:08
hier der Link vom Vid
http://www.youtube.com/watch?v=6BvDNUBAPAQ
radbruch
26.07.2008, 13:36
Hallo
Hier nochmal der Link zum "Bestückungsplan":
http://dennis4123.de.funpic.de/Best%fcckunsplan.zip
(Du solltest Umlaute in Dateinamen vermeiden)
Wenn ich das richtig deute sind die BR/BL-Verbindungen die Taster. Warum sind zwei gegen GND (PB0+PB4) und zwei gegen Vcc(PC4+PC6) geschaltet? Wenn das so wäre müßten die Eingänge PC4 und PC6 immer gesetzt sein und die entsprechenden LEDs im Schaltertest immer leuchten.
Ich vermute, du hast die Platine irgendwo gekauft. Hast du dazu eine Bezeichnung oder einen Anbieter/Artikelnummer?
Ist übrigens ein hübscher kleiner Roboter :)
Gruß
mic
oberallgeier
26.07.2008, 13:50
Hallo rob_88_20p
ich glaube ja nicht, dass Dein Code richtig ist. Jedenfalls schreibe ICH statt:
#define STATSLED0_ON (PORTC |= 1<<PC0)
#define STATSLED0_ON (PORTC |= (1<<PC0))
und ich bin recht sicher, dass diese innere Klammer notwendig ist.
PS: ich hab mir mal Deinen codeauszug von Deinem Server "geklaut" - ein bisschen Hacker muss mann manchmal sein :).
Viel Erfolg
#define STATSLED0_ON (PORTC |= (1<<PC0))
und ich bin recht sicher, dass diese innere Klammer notwendig ist.
Nein, ist sie nicht. Der "<<"-Operator bindet stärker als der "|"-Operator.
Und selbst wenn es anders herum wäre (wie z.B. bei "+" und "<<"), sind die Klammern nicht nötig, weil bei den "X="-Operatoren der ganze rechte Teil implizit geklammert ist.
radbruch
26.07.2008, 14:00
Hallo
und ich bin recht sicher, dass diese innere Klammer notwendig ist.
Da war ich auch erst skeptisch, aber die Klammer sind nicht zwingend nötig. Das ergibt sich aus der Rangfolge der Operatoren, Bitschieben hat eine höhere Bindung als bitweises ODER:
http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/c_030Anhang_000.htm
Gruß
mic
oberallgeier
26.07.2008, 14:06
Hallo rob_88_20p, hallo sternst
sorry, hatte leider erst gemeckert und dann (Kernighan/Ritchie) gelesen. Tut mir leid.
radbruch
26.07.2008, 14:09
Ich mache die Klammern auch immer weil es einfach übersichtlicher ist. Der Kompiler erzeugt bei beiden Varianten den selben Code.
Trotz allem, ohne Schaltplan kommen wir hier wohl nicht mehr weiter...
rob_88_20p
26.07.2008, 15:58
also hier ist der IR Sensor code
#define __AVR_ATmega88__
#include <avr/io.h>
//#include <iom88.h>
long i;
#define STATSLED0_ON (PORTC |= 1<<PC0)
#define STATSLED0_OFF (PORTC &= ~(1<<PC0))
#define STATSLED1_ON (PORTC |= 1<<PC1)
#define STATSLED1_OFF (PORTC &= ~(1<<PC1))
#define GET_IRSEN_RIGHT (PIND & 1<<PD4)
#define GET_IRSEN_LEFT (PIND & 1<<PD3)
void turnLEFTforward(){
// Motor 1 stop
PORTD |= 1<<PD6;
PORTD |= 1<<PD7;
// Motor 2 Forward
PORTB |= 1<<PB2;
PORTB &= ~(1<<PB1);
}
void turnRIGHTforward(){
// Motor 1 Forward
PORTD |= 1<<PD6;
PORTD &= ~(1<<PD7);
// Motor 2 stop
PORTB |= 1<<PB2;
PORTB |= 1<<PB1;
}
int main(){
DDRD = 1<<PD6 | 1<<PD7; // PD6 PD7 Output Motor1;
DDRB = 1<<PB1 | 1<<PB2; // PB1 PB2 Output Motor2;
DDRD &= ~(1<<PD3 | 1<<PD4); // PD3 PD4 Input IR Sensors;
DDRC = 1<<PC0 | 1<<PC1; // PC0 PC1 Output STATSLED0 & 1;
//PORTD &= ~(1<<PD6);
//PORTD &= ~(1<<PD7);
// (!)= schwarz & () = weiss
// GET_IRSEN_RIGHT = STATSLED1
// GET_IRSEN_LEFT = STATSLED0
while(1){
if(! GET_IRSEN_LEFT && ! GET_IRSEN_RIGHT){
turnRIGHTforward();
STATSLED0_OFF;
STATSLED1_OFF;
}
else if( ! GET_IRSEN_LEFT && GET_IRSEN_RIGHT){
turnRIGHTforward();
STATSLED0_OFF;
STATSLED1_ON;
}
else if( GET_IRSEN_LEFT && ! GET_IRSEN_RIGHT){
turnLEFTforward();
STATSLED0_ON;
STATSLED1_OFF;
}
else if( GET_IRSEN_LEFT && GET_IRSEN_RIGHT){
turnLEFTforward();
STATSLED0_ON;
STATSLED1_ON;
}
//PORTC = 1<<PC5;
//PORTC = 0<<PC5;
}
}
rob_88_20p
26.07.2008, 15:58
hier ist der IR Sensor code
#define __AVR_ATmega88__
#include <avr/io.h>
//#include <iom88.h>
long i;
#define STATSLED0_ON (PORTC |= 1<<PC0)
#define STATSLED0_OFF (PORTC &= ~(1<<PC0))
#define STATSLED1_ON (PORTC |= 1<<PC1)
#define STATSLED1_OFF (PORTC &= ~(1<<PC1))
#define GET_IRSEN_RIGHT (PIND & 1<<PD4)
#define GET_IRSEN_LEFT (PIND & 1<<PD3)
void turnLEFTforward(){
// Motor 1 stop
PORTD |= 1<<PD6;
PORTD |= 1<<PD7;
// Motor 2 Forward
PORTB |= 1<<PB2;
PORTB &= ~(1<<PB1);
}
void turnRIGHTforward(){
// Motor 1 Forward
PORTD |= 1<<PD6;
PORTD &= ~(1<<PD7);
// Motor 2 stop
PORTB |= 1<<PB2;
PORTB |= 1<<PB1;
}
int main(){
DDRD = 1<<PD6 | 1<<PD7; // PD6 PD7 Output Motor1;
DDRB = 1<<PB1 | 1<<PB2; // PB1 PB2 Output Motor2;
DDRD &= ~(1<<PD3 | 1<<PD4); // PD3 PD4 Input IR Sensors;
DDRC = 1<<PC0 | 1<<PC1; // PC0 PC1 Output STATSLED0 & 1;
//PORTD &= ~(1<<PD6);
//PORTD &= ~(1<<PD7);
// (!)= schwarz & () = weiss
// GET_IRSEN_RIGHT = STATSLED1
// GET_IRSEN_LEFT = STATSLED0
while(1){
if(! GET_IRSEN_LEFT && ! GET_IRSEN_RIGHT){
turnRIGHTforward();
STATSLED0_OFF;
STATSLED1_OFF;
}
else if( ! GET_IRSEN_LEFT && GET_IRSEN_RIGHT){
turnRIGHTforward();
STATSLED0_OFF;
STATSLED1_ON;
}
else if( GET_IRSEN_LEFT && ! GET_IRSEN_RIGHT){
turnLEFTforward();
STATSLED0_ON;
STATSLED1_OFF;
}
else if( GET_IRSEN_LEFT && GET_IRSEN_RIGHT){
turnLEFTforward();
STATSLED0_ON;
STATSLED1_ON;
}
//PORTC = 1<<PC5;
//PORTC = 0<<PC5;
}
}
rob_88_20p
26.07.2008, 16:00
mic du glaubst also ich sollte die anderen 2 schalter auch über GND anschliessen
also gut ich versuchs mal
rob_88_20p
26.07.2008, 16:02
also ich habs jetzt so gemacht
#define SWITCH_LEFT (PINB & 1<<PB6)
#define SWITCH_RIGHT (PINB & 1<<PB4)
#define SWITCH_BACK_LEFT (PIND & 1<<PD0)
#define SWITCH_BACK_RIGHT (PINB & 1<<PB0)
rob_88_20p
26.07.2008, 16:06
ups mein kabel ist nich so lang klene änderung
#define SWITCH_LEFT (PINC & 1<<PC6)
#define SWITCH_RIGHT (PINB & 1<<PB4)
#define SWITCH_BACK_LEFT (PINB & 1<<PB6)
#define SWITCH_BACK_RIGHT (PINB & 1<<PB0)
rob_88_20p
26.07.2008, 16:08
ich glaube ihr habt sogar recht mit dem ))
rob_88_20p
26.07.2008, 16:12
das mit den )) funktionier überhaupt nicht
und das mit der neuen pin belegung hat auch nichts gebracht
rob_88_20p
26.07.2008, 16:20
was heisst das eigentlich
../Robo_Schalter.c:2:1: warning: "__AVR_ATmega88__" redefined
und wiso ist das hier nicht richtig
#define __AVR_ATmega88__
es meldet immer
Build succeeded with 2 Warnings...
dann steht das oben
rob_88_20p
26.07.2008, 16:39
Hallo
Hier nochmal der Link zum "Bestückungsplan":
http://dennis4123.de.funpic.de/Best%fcckunsplan.zip
(Du solltest Umlaute in Dateinamen vermeiden)
Wenn ich das richtig deute sind die BR/BL-Verbindungen die Taster. Warum sind zwei gegen GND (PB0+PB4) und zwei gegen Vcc(PC4+PC6) geschaltet? Wenn das so wäre müßten die Eingänge PC4 und PC6 immer gesetzt sein und die entsprechenden LEDs im Schaltertest immer leuchten.
Ich vermute, du hast die Platine irgendwo gekauft. Hast du dazu eine Bezeichnung oder einen Anbieter/Artikelnummer?
Ist übrigens ein hübscher kleiner Roboter :)
Gruß
mic
zu deiner Frage ich habe die Platine nicht gekauft, ich war in einem Elektronikerkurs und wir haben alle zusammen einen Roboter gebaut natürlich hat jeder seinen eigenen bekommen, und einer Kursleiter hat die Platinen selbst geätzt.
Den Kursleiter den wir hatten sagte diese Platine sei mist aber wir hatten keine Zeit neue anzufertigen wir hatten am anfang sehr viele probleme aber dann hats doch geglappt bei jeder Platine wie ich entdeckt hatte ist eine kleine stelle wo die leiterbahn gerissen ist da ist wohl bei der vorlage fürs belichten ein kratzer entstanden. tia
was heisst das eigentlich
../Robo_Schalter.c:2:1: warning: "__AVR_ATmega88__" redefined
und wiso ist das hier nicht richtig
#define __AVR_ATmega88__
Sachen, wo zwei #Unterstriche vor sind, sind für den Programmierer eigentlich tabu, das brauchst Du garnicht eintragen.
Der µC, den man nutzt wird im Makefile eingetragen, sonst nirgendwo
Gruß Sebastian
rob_88_20p
26.07.2008, 17:49
was heisst das eigentlich
../Robo_Schalter.c:2:1: warning: "__AVR_ATmega88__" redefined
und wiso ist das hier nicht richtig
#define __AVR_ATmega88__
Sachen, wo zwei #Unterstriche vor sind, sind für den Programmierer eigentlich tabu, das brauchst Du garnicht eintragen.
Der µC, den man nutzt wird im Makefile eingetragen, sonst nirgendwo
Gruß Sebastian
kann ich das #define __AVR_ATmega88__ einfach löschen ?
Du Programmierst doch in AVRStudio, da ist bei Projekteinstellungen der Prozessortyp einzutragen, sonst niergendwo.
im code gehört nur #include<avr/io.h> hin sonst nichts.
Ja Du kannst(sollst) die Zeile löschen, wie gesagt zwei Unterstriche sind für die Kompilerbauer bestimmt und da sollte man Finger von lassen, es sei den man weiß genau was man tut.
Gruß Sebastian
rob_88_20p
26.07.2008, 18:36
dann hab ich noch eine Frage zum Thema verzögerung sprich (delay)
ich habe hier einen code den ich nicht verstehe
void delay(long delay){
int i, dummy;
for(i=0; i<delay; i++)
{
dummy++;
}
}
wenn ich also einen Befehl schreibe zum beispiel
while(1){
if(switch1 == 0){
driveForward();
STATSLED1_OFF;
}
else if (switch1 == 1){
driveBackward();
delay(10000)
turnRIGHTforward();
STATSLED1_OFF;
}
}
}
muss ich jetzt das so schreiben ?
turnRIGHTforward();
delay(10000)
oder einfach so lassen turnRIGHTforward();
wenn das richtig ist wiso funktioniert das dann hier nicht ?
#include <avr/io.h>
//#include <iom88.h>
#define STATSLED0_ON (PORTC |= 1<<PC0)
#define STATSLED0_OFF (PORTC &= ~(1<<PC0))
#define STATSLED1_ON (PORTC |= 1<<PC1)
#define STATSLED1_OFF (PORTC &= ~(1<<PC1))
#define GET_IRSEN_RIGHT (PIND & 1<<PD4)
#define GET_IRSEN_LEFT (PIND & 1<<PD3)
void driveForward(){
// Motor 1 Forward
PORTD |= 1<<PD6;
PORTD &= ~(1<<PD7);
// Motor 2 Forward
PORTB |= 1<<PB2;
PORTB &= ~(1<<PB1);
}
void turnLEFTforward(){
// Motor 1 stop
PORTD |= 1<<PD6;
PORTD |= 1<<PD7;
// Motor 2 Forward
PORTB |= 1<<PB2;
PORTB &= ~(1<<PB1);
}
void turnRIGHTforward(){
// Motor 1 Forward
PORTD |= 1<<PD6;
PORTD &= ~(1<<PD7);
// Motor 2 stop
PORTB |= 1<<PB2;
PORTB |= 1<<PB1;
}
void stop(){
// Motor 1 stop
PORTD |= 1<<PD6;
PORTD |= 1<<PD7;
// Motor 2 stop
PORTB |= 1<<PB2;
PORTB |= 1<<PB1;
}
void driveBackward(){
// Motor 1 backward
PORTD &= ~(1<<PD6);
PORTD |= 1<<PD7;
// Motor 2 backward
PORTB &= ~(1<<PD2);
PORTB |= 1<<PD1;
}
void turnLEFTbackward(){
// Motor 1 backward
PORTD &= ~(1<<PD6);
PORTD |= 1<<PD7;
// Motor 2 stop
PORTB |= 1<<PD2;
PORTB |= 1<<PD1;
}
void turnRIGHTbackward(){
// Motor 1 stop
PORTD |= 1<<PD6;
PORTD |= 1<<PD7;
// Motor 2 backward
PORTB &= ~(1<<PD2);
PORTB |= 1<<PD1;
}
void delay(long delay){
int i, dummy;
for(i=0; i<delay; i++)
{
dummy++;
}
}
int main(void){
DDRD = 1<<PD6 | 1<<PD7; // PD6 PD7 Output Motor1;
DDRB = 1<<PB1 | 1<<PB2; // PB1 PB2 Output Motor2;
DDRD &= ~(1<<PD3 | 1<<PD4); // PD3 PD4 Input IR Sensors;
DDRC = 1<<PC0 | 1<<PC1; // PC0 PC1 Output StatusLED0 & 1;
//PORTD &= ~(1<<PD6);
//PORTD &= ~(1<<PD7);
while(1){
if( GET_IRSEN_RIGHT ) STATSLED0_ON;
else STATSLED0_OFF;
if( GET_IRSEN_LEFT ) STATSLED1_ON;
else STATSLED1_OFF;
if(! GET_IRSEN_RIGHT && ! GET_IRSEN_LEFT){
driveForward();
STATSLED0_OFF;
STATSLED1_OFF;
}
else if(GET_IRSEN_RIGHT && GET_IRSEN_LEFT){
driveBackward();
delay(10000);
turnRIGHTbackward();
delay(10000);
STATSLED0_ON;
STATSLED1_ON;
}
//PORTC = 1<<PC5;
//PORTC = 0<<PC5;
}
}
was ist das jetzt für eine delay Funktion ?
Warum nimmst Du nicht util/delay.h
und die Funktionen, die dort angeboten werden
_delay_us und _delay_ms ?
Beachtre nur, daß Du die Optimierung > O0 einschalten solltest.
Gruß Sebastian
Hubert.G
26.07.2008, 19:45
Ich bin der selben Meinung wie "radbruch"
Wie schon vorher geschrieben, ohne Schaltplan ist alles nur Spekulation und hilft dir nicht weiter.
rob_88_20p
26.07.2008, 22:13
also sollte ich jetzt dieses
void delay(long delay){
int i, dummy;
for(i=0; i<delay; i++)
{
dummy++;
}
}
einfach schweissen und dieses
util/delay.h
_delay_us und _delay_ms ?
einsetzten
kannst du mir hier mal ein beispiel machen ?
rob_88_20p
26.07.2008, 22:14
zu dem hier
#include <avr/io.h>
//#include <iom88.h>
long i;
#define STATSLED0_ON (PORTC |= 1<<PC0)
#define STATSLED0_OFF (PORTC &= ~(1<<PC0))
#define STATSLED1_ON (PORTC |= 1<<PC1)
#define STATSLED1_OFF (PORTC &= ~(1<<PC1))
#define STATSLED2_ON (PORTC |= 1<<PC2)
#define STATSLED2_OFF (PORTC &= ~(1<<PC2))
#define STATSLED3_ON (PORTC |= 1<<PC3)
#define STATSLED3_OFF (PORTC &= ~(1<<PC3))
#define SWITCH_LEFT (PINC & 1<<PC6)
#define SWITCH_RIGHT (PINB & 1<<PB4)
#define SWITCH_BACK_LEFT (PINB & 1<<PB6)
#define SWITCH_BACK_RIGHT (PINB & 1<<PB0)
void driveForward(){
// Motor 1 Forward
PORTD |= 1<<PD6;
PORTD &= ~(1<<PD7);
// Motor 2 Forward
PORTB |= 1<<PB2;
PORTB &= ~(1<<PB1);
}
void turnLEFTforward(){
// Motor 1 stop
PORTD |= 1<<PD6;
PORTD |= 1<<PD7;
// Motor 2 Forward
PORTB |= 1<<PB2;
PORTB &= ~(1<<PB1);
}
void turnRIGHTforward(){
// Motor 1 Forward
PORTD |= 1<<PD6;
PORTD &= ~(1<<PD7);
// Motor 2 stop
PORTB |= 1<<PB2;
PORTB |= 1<<PB1;
}
void stop(){
// Motor 1 stop
PORTD |= 1<<PD6;
PORTD |= 1<<PD7;
// Motor 2 stop
PORTB |= 1<<PB2;
PORTB |= 1<<PB1;
}
void driveBackward(){
// Motor 1 backward
PORTD &= ~(1<<PD6);
PORTD |= 1<<PD7;
// Motor 2 backward
PORTB &= ~(1<<PD2);
PORTB |= 1<<PD1;
}
void turnLEFTbackward(){
// Motor 1 backward
PORTD &= ~(1<<PD6);
PORTD |= 1<<PD7;
// Motor 2 stop
PORTB |= 1<<PD2;
PORTB |= 1<<PD1;
}
void turnRIGHTbackward(){
// Motor 1 stop
PORTD |= 1<<PD6;
PORTD |= 1<<PD7;
// Motor 2 backward
PORTB &= ~(1<<PD2);
PORTB |= 1<<PD1;
}
int main(){
DDRD = 1<<PD6 | 1<<PD7; // PD6 PD7 Output Motor1;
DDRB = 1<<PB1 | 1<<PB2; // PB1 PB2 Output Motor2;
DDRC = 1<<PC0 | 1<<PC1 | 1<<PC2 | 1<<PC3; // PC0 PC1 Output StatusLED 0 & 1 & 2 & 3;
//PORTD &= ~(1<<PD6);
//PORTD &= ~(1<<PD7);
// SWITCH_LEFT = STATSLED0
// SWITCH_RIGHT = STATSLED1
// SWITCH_BACK_RIGHT = STATSLED2
// SWITCH_BACK_LEFT = STATSLED3
while(1){
if( ! SWITCH_RIGHT && ! SWITCH_LEFT ){
driveForward();
STATSLED0_OFF;
STATSLED1_OFF;
STATSLED2_OFF;
STATSLED3_OFF;
}
else if(! SWITCH_BACK_RIGHT && ! SWITCH_BACK_LEFT ){
driveForward();
STATSLED0_OFF;
STATSLED1_OFF;
STATSLED2_OFF;
STATSLED3_OFF;
}
else if( SWITCH_RIGHT && SWITCH_LEFT ){
driveBackward();
STATSLED0_ON;
STATSLED1_ON;
STATSLED2_OFF;
STATSLED3_OFF;
}
else if( ! SWITCH_RIGHT && SWITCH_LEFT ){
turnLEFTbackward();
STATSLED0_ON;
STATSLED1_OFF;
STATSLED2_OFF;
STATSLED3_OFF;
}
else if( SWITCH_RIGHT && ! SWITCH_LEFT ){
turnRIGHTbackward();
STATSLED0_OFF;
STATSLED1_ON;
STATSLED2_OFF;
STATSLED3_OFF;
}
else if( ! SWITCH_BACK_RIGHT && SWITCH_BACK_LEFT ){
turnRIGHTforward();
STATSLED0_OFF;
STATSLED1_OFF;
STATSLED2_ON;
STATSLED3_OFF;
}
else if( SWITCH_BACK_RIGHT && ! SWITCH_BACK_LEFT ){
turnLEFTforward();
STATSLED0_OFF;
STATSLED1_OFF;
STATSLED2_OFF;
STATSLED3_ON;
}
//PORTC = 1<<PC5;
//PORTC = 0<<PC5;
}
}
rob_88_20p
26.07.2008, 22:16
wie muss ich das da rein schreiben und wenn ich jetzt will das der robot erst nach rets rückwerts fährt und dan wider geradeaus
mus ich dann das auch so schreiben
("befehl")
delay(10000)
("befehl")
rob_88_20p
26.07.2008, 22:43
also ich schreibe ja ganz oben
#include <until\delay.h
muss ich das jetzt einfach so scheiben
else if( ! SWITCH_RIGHT && SWITCH_LEFT ){
turnLEFTbackward();
delay(3000)
driveForward();
STATSLED0_ON;
STATSLED1_OFF;
STATSLED2_OFF;
STATSLED3_OFF;
}
oder wie ???
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.