PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erstes Programm wo ist der fehler?



menselchen
02.07.2009, 06:49
Hallo ich bin neu hier und auch noch ein blutiger Anfänger
was Robotik betrifft. Ich habe bereits den Asuro gebaut und Programmiert und mich jetzt an ein eigenes Fahrzeug gewagt.
Die Hardware ist soweit fertig und ein Programm welches erstmal nur das fahren meines Roboters steuern soll. Doch es tut sich einfach nichts. Entweder es liegt daran, dass der Roboter keine verbindung zum Computer hat (Programmer STK200/300) oder das Programm ist falsch. Könntet ihr vielleicht mal einen Blick darüber werfen und mir sagen wo eventuell der Fehler liegt?


/*
* alf.c
*
* Created on: May 11, 2009
* Author: Julian Hengsteler
*/



#include <avr/io.h>
#include <util/delay.h>


#define leftdir
#define rightdir
#define right_speed
#define left_speed

inline void mspeed (unsigned char right_speed, unsigned char left_speed){
/*Timer 1 für PWM intialisieren*/
TCCR1A=(1 << WGM11);
TCCR1B=(1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10);
ICR1 = 255;

DDRB |= (1 << PB1);
TCCR1A |= (1 << COM1A1);

OCR1A = left_speed;


DDRB |= (1 << PB2);
TCCR1A |= (1 << COM1B1);

OCR1B = right_speed;
}


inline void leftdir(unsigned char left_dir){

if(left_dir==FWD){
DDRC |= (1<<PC7);
PORTC |= (1 <<PC7);
}

else if(left_dir==RWD){
DDRC |= (1<<PC6);
PORTC |= (1<<PC6);
}

else if(left_dir==BRK){
DDRC |= (1<<PC7) | (1<<PC6);
PORTC |= (1<<PC7) | (1<<PC6);
}

else{
left_speed = 0;
}



void rightdir(unsigned char right_dir){

if(right_dir == FWD){
DDRC |= (1<<PC5);
PORTC |= (1 <<PC5);
}

if else(right_dir == RWD){
DDRC |= (1<<PC4);
PORTC |= (1<<PC4);
}

if else(right_dir == BRK){
DDRC |= (1<<PC7) | (1<<PC6);
PORTC |= (1<<PC7) | (1<<PC6);
}

else{
left_speed = 0;
}


unsigned char FWD;
unsigned char RWD;
unsigned char BRK;



int main(void){

mspeed(255,255);
rightdir(FWD);
leftdir(FWD);
_delay_ms(100);

mspeed(255,255);
rightdir(RWD);
leftdir(RWD);
_delay_ms(100);

mspeed(0,255);
rightdir(FWD);
leftdir(FWD);
_delay_ms(100);

mspeed(0,255);
rightdir(FWD);
leftdir(FWD);


return 0;


}



Vielen Dank

Mit freundlichen Grüßen menselchen

Willa
02.07.2009, 07:38
Ob der µC keine Verbindung zum Programmer hat sollte sich doch einfach herausfinden lassen. Gibt es keine Fehlermeldung beim Programmieren?
Hast du für den µC deinen eigenen Schaltplan entworfen? Kannst du den hier mal reinstellen?
Ansonsten würde ich erstmal eine LED blinken lassen um zu schauen ob überhaupt irgendetwas funktioniert.

Hubert.G
02.07.2009, 11:48
Immer angeben welcher Controller und Compiler.
Dein Programm kann nicht funktionieren, was soll das
#define leftdir
#define rightdir
#define right_speed
#define left_speed

Dein Compiler müsste da ja laut aufschreien.

menselchen
02.07.2009, 14:40
doch anfangs kam die meldung das kein Controller gefunden wurde irgendwann jedoch nicht mehr.
Der Compiler hat aufgeschriehen oft sogar doch irgendwann ging es dann doch nachdem ich etwas verändert hatte.
#define wollte ich die verschiedenen variablen setzen die dann für das Gesammte Programm gelten.

@Willa:
Es gibt einen Schaltplan den ich aber von hand gezeichnet habe ich kann ihn mal reinstellen.


MFG

hosti
02.07.2009, 15:43
#define erstellt keine Variablen sondern KONSTANTEN

#define VIER 4
immer wen du im Programm VIER schreibst setzt dein Compiler eine 4 ein.

menselchen
02.07.2009, 15:48
oh
dann hab ich das wohl falsch gemacht :D
wie kann ich dann variablen für das gesammte Programm definieren?

menselchen
02.07.2009, 16:08
Hier ist der Schaltplan


http://img12.imageshack.us/img12/4889/img1110n.th.jpg (http://img12.imageshack.us/img12/4889/img1110n.jpg)

Hubert.G
02.07.2009, 16:34
8bit variable unsigned char leftdir;
16bit variable unsigned int rightdir;

Ich würde dir empfehlen das hier durchzu arbeiten: www.mikrocontroller.net/articles/AVR-GCC-Tutorial
www.rn-wissen.de/index.php/C-Tutorial

menselchen
02.07.2009, 16:56
ok ja das wusste ich auch aber ich dachte das geht nur innerhalb einer funktion und das mit dem #define hab ich wohl verwechselt

menselchen
09.07.2009, 13:53
Habt ihr euch den Schaltplan mal angeschaut?
Könnte das Funktionieren?

Wenn ich diese #define sachen in unsigned char umwandele funktioniert das Programm dann soweit?

Ich müsste das wissen da ich grade nicht die Möglichkeit habe es auszuprobieren :D

Besserwessi
09.07.2009, 18:12
Da sind noch mehr Fehler. Einer der gleich auffällt sind variablen FWD, RWD und BRK. Da wären gerade andersherum Konstante Werte (z.B. 1,2,3 )richtiger.

Hubert.G
09.07.2009, 18:15
Wie wäre es wenn du dir die FreeVersion von Eagle herunterladen würdest, dann könntest du ordentliche Schaltpläne zeichnen.
An VCC und AVCC gehört direkt beim µC noch je ein 100n Kondensator nach GND. AREF nicht auf VCC legen sondern über einen 100n Kondensator nach GND.
Wenn die Verbindungen zu L298 richtig sind sollte es passen.
Das Programm funktioniert auch wenn du diese #define umwandelst nicht, da sind noch etliche andere Würmer drinnen.
Warum definierst du die DDRx-Register immer wieder neu, das gehört ins main.
Am Ende von main fehlt die Endlosschleife. Klammerfehler sind einige vorhanden.

juhecomp
10.07.2009, 22:05
das mit AREF, VCC, ACC ... hatte ich im AVR tutorial
http://www.rn-wissen.de/images/2/2a/Avrtutorial_grundschaltung_spannung.gif
gesehen.

Habe ich mit return 0 in main nicht die Endlosschleife erzeugt?
Und kann ich den L298 auch ohne PWM einfach mal ansteuern wenn ich den pin auf ausgang 1 stelle? nur um zu testen ob es funktioniert.

Hubert.G
11.07.2009, 10:54
Das mit dem Tutorial weiss ich, es ist ja nicht falsch, in Bezug auf Fehlfunktion, es kann nur unter ungünstigen Umständen zu Komplikationen führen die sich dann nicht so leicht eruieren lassen. Solltest du vorhaben den ADC zu verwenden, ist die Beschaltung von AVCC lt. Datenblatt empfehlenswert.
Wo ist der Beginn der Schleife die du mit return beendest? Ins main am Beginn gehören alle Initialisierungsaufrufe die man nur einmal beim Start durchführt, dann kommt der Beginn der Schleife.
Ich starte diese Schleife mit for(;;){ und ein }am Ende, da brauche ich dann auch kein return.
Natürlich kannst du den L293 auch ohne PWM ansteuern.