Forum: Mikrocontroller und Digitale Elektronik Es funzt nicht


von Hein H. (huibuh)


Lesenswert?

Moin,
das hier läuft nicht. Soll nach der Anzahl Schritte anhalten, aber 
nichts, läuft weiter. Ohne Fehler. Geht in den uP. Mist! Wisst ihr 
warum?

/*
 *  main.c
 *
 *  Schrittmotorsteuerung
 *
 * Created: 3/21/2021 4:30:58 PM
 *  Author: HuiBuh
 *
 *
 *  Schrittfolge Ansteuerung mit ULN2003AN:
 *
 *  IN1  IN2  IN3  IN4
 *   0   0   0   1
 *   1   1   0   0
 *   0   0   1   0
 *   0   1   1   0
 *   0   1   0   0
 *   1   1   0   0
 *   1   0   0   0
 *   1   0   0   1
 *
 */

#define F_CPU 8000000UL
#include <xc.h>
#include <stdio.h>
#include <util/delay.h>

volatile unsigned int Schritte;

int main(void)
{

    DDRB = (1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3);  // PortB Pin 
0,1,2,3 als Ausgang

    // PortB Ausgänge 0 bis 3 auf Null - Vorbereitung

    PORTB &= ~(1<<PB0);  // IN4
    PORTB &= ~(1<<PB1);  // IN3
    PORTB &= ~(1<<PB2);  // IN2
    PORTB &= ~(1<<PB3);  // IN1

    // Zähler Schritte auf 0 setzen

    Schritte = 0;


    while(1)
    {

// Schritte rechte Drehung

PORTB = 1;      // IN4 = 1
Schritte++;
_delay_ms(2);
PORTB = 3;      // IN4 und IN3 = 1
Schritte++;
_delay_ms(2);
PORTB = 2;      // IN3 = 1
Schritte++;
_delay_ms(2);
PORTB = 6;      // IN3 und IN2 = 1
Schritte++;
_delay_ms(2);
PORTB = 4;      // IN 3 = 1
Schritte++;
_delay_ms(2);
PORTB = 12;      // IN2 und IN1 = 1
Schritte++;
_delay_ms(2);
PORTB = 8;      // IN1 = 1
Schritte++;
_delay_ms(2);
PORTB = 9;      // IN4 und IN1 = 1
Schritte++;
_delay_ms(2);

if (Schritte == 100)    //4095

{
  break;
}

    }

}

von STK500-Besitzer (Gast)


Lesenswert?

1. toller Thread-Titel, weil er so aussagekräftig ist.

2. Welche Schleife soll der Controller mit dem Break verlassen?
Die "while(1)"?
Und was soll er dann machen?

von Axel R. (axlr)


Lesenswert?

Du verlässt die While1 und dann die main und dann startet er von vorn, 
denk' ich...
kannst ja vor der While1 mal ein _delay_ms(255) reintun. dann läuft er 
immer 100 Schritte und mach ne kleine Pause, nachdem er neu gestartet 
hat. Probier mal.

von Achim M. (minifloat)


Lesenswert?

Hein H. schrieb:
> {
> break;
> }

Damit verlässt du die Mainloop und das Programm startet von vorn.

mfg mf

von MaWin (Gast)


Lesenswert?

Hein H. schrieb:
> das hier läuft nicht

Scheinbar läuft es schon, aber 100 lässt sich nicht durch 8 teilen, 
weiss schon der Grundschüler.

von Hein H. (huibuh)


Lesenswert?

Ha, ich habe es gefunden! Er macht bei jedem Durchgang 8 Schritte. Ich 
kann den Durchgang nur bei X mal 8 verlassen. Bei 8, 16, 32, und so 
weiter klappt alles. So long Kollegen. Danke!

von STK500-Besitzer (Gast)


Lesenswert?

Hein H. schrieb:
> Ha, ich habe es gefunden! Er macht bei jedem Durchgang 8 Schritte. Ich
> kann den Durchgang nur bei X mal 8 verlassen.

Oder eine bessere Lösung finden.
z.B. mit einem Array, in dem die acht Werte stehen.
Damit kann man den Motor auch rückwärts laufen lassen.

von Hein H. (huibuh)


Lesenswert?

Ja, habe ich gerade gemacht. Und ich benutze einen Interrupt durch einen 
Taster, dass er stoppt. Drei Taster für Vor, Zurück und Halt. Klappt 
(hoffe ich). Danke.

von Hein H. (huibuh)


Lesenswert?

MaWin: Liegt schon lange zurück. Aber ich wiederhole die 
Grundrechenarten :-)

Beitrag #6632627 wurde von einem Moderator gelöscht.
von Hein H. (huibuh)


Lesenswert?

STK500-Besitzer schrieb:
> 1. toller Thread-Titel, weil er so aussagekräftig ist.
>
Ne?! Finde ich auch.
> 2. Welche Schleife soll der Controller mit dem Break verlassen?
> Die "while(1)"?
Jo!
> Und was soll er dann machen?
Nicht! Soll ja nur ein Test sein. Aber schön, eine STK500 habe ich auch. 
Läuft aber nur unter Win7. Unter 10 kommen dämliche Fehlermeldungen 
betreffs des Treibers. Daher habe ich einen Schlepptop mit Win7 laufen. 
Win 10 ist nichts für mich. Zu viel Schnüffelei! Und unter LINUX bin ich 
beim Probieren. Was mich da anödet ist die Schräubchendreherei!

von Wolfgang (Gast)


Lesenswert?

Hein H. schrieb:
> Unter 10 kommen dämliche Fehlermeldungen betreffs des Treibers.

Dann wolltest du für deinen Prolific USB-Seriell-Wandler besser nicht 
den verblockten Win10-Treiber nehmen, sondern einen funktionierenden.

Wenn allerdings "dämlich" das einzige an den Fehlermeldungen ist, was du 
verstehst, ist das dämlich ;-)

von Hein H. (huibuh)


Lesenswert?

Wolfgang schrieb:
> Wenn allerdings "dämlich" das einzige an den Fehlermeldungen ist, was du
> verstehst, ist das dämlich ;-)

:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.