Roboter will nicht rückwärts fahren

Gast #4178264
Lesenswert?
• ▲
▼
Hallo Leute,

ich habe einen Roboter gebaut, dessen Antriebsmotor über einen TIP41C 
zur Leistungsregelung und einem zweifachen Wechslerrelais geregelt wird. 
Zur Steuerung verwende ich einen ATmega 32.
Vorwärtsfahren klappt ja soweit wie geplant, doch leider Will das Ding 
nicht rückwärts fahren.
Was habe ich falsch gemacht?
Im Anhang sind C-Code für den ATmega und eine Schaltskizze.
Danke im Voraus!

Viele Grüße,
Jonas Wühr
Angehängte Dateien:
#4178274
Lesenswert?
• ▲
▼
Bring erst mal einen COde in Ordnung.
Ich seh in deinem Code nichts, warum der Motor überhaupt auf rückwärts 
schalten sollte.

Da steht
1
int main()
2
{
3
   .... Initialisierung
4

5
  while( 1 )
6
  {
7
     Haufen auskommentiertes Zeug
8
  }
9
}

in anderen Worten: Der Robot macht nichts, weil du das genau so 
programmiert hast, das er nichts tun soll.
Gast #4178282
Lesenswert?
• ▲
▼
Dann prüfe doch erst mal systematisch ob mechanisch sich alles rückwärts 
bewegen lässt und das Polwenderelais wirklich schaltet. Außerdem ist 
eine kleine zeitliche Pause zwischen vor-und rückwärts nötig, da sonst 
der Motor noch als Generator arbeitet und viel Strooom fließt.
Weiterhin vermisse ich eine Freilaufdiode am Relais, um die böse 
induktive Abschaltspannung zu verhindern. Lies 
http://www.mikrocontroller.net/articles/Relais_mit_Logik_ansteuern
#4178297
Lesenswert?
• ▲
▼
Ich hab mir mal ein paar andere Posts von dir angesehen.
In einigen davon immer der gleiche 'Fehler'

In C kann man offiziell keine Funktionen innerhalb anderer Funktionen 
definieren.

man kann also nicht schreiben
1
int main()
2
{
3

4
  ....
5

6
  void vorwaerts(int v)
7
  {
8
    ...
9
  }
10

11
  ....
12
}

In C wird jede Funktion für sich selbst geschrieben, also nicht 
geschachtelt
1
void vorwaerts(int v)
2
{
3
  ...
4
}
5

6
int main()
7
{
8

9
  ....
10

11

12
  ....
13
}

Das das bei dir keine Fehlermeldung gibt, liegt an einer gcc 
Erweiterung, die du besser ignorierst.
Ausserdem scheinst du der Meinung zu sein, nur dadurch, dass du eine 
Funktion definierst, wird sie auch schon ausgeführt. Da muss ich dich 
enttäuschen: aufrufen musst du sie schon auch. Eine Funktionsdefinition 
ist erst mal genau das: wie sieht die Funktion aus. Ausgeführt wird sie 
erst, wenn sie aufgerufen wird.
1
void vorwaerts(int v)
2
{
3
  ...
4
}
5

6
int main()
7
{
8

9
  ....
10

11
  while( 1 ) {
12
    vorwaerts( 20 );
13
    ....
14
  }
15
}


Also bring deinen Code in Ordnung.
Und kauf die ein C-Buch. Das sind eigentlich banale Sprach-Grundlagen, 
die dir jedes C Buch problemlos beibringen kann. Kaum zu glauben, dass 
du den UART Teil selbst geschrieben hast, wenn es schon an solch simplen 
Sachen scheitert.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.