INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Fragen :serielle eingabe und Externe Interrupts
22.05.2017, 18:01
Beitrag #1
Fragen :serielle eingabe und Externe Interrupts
Hi all,


kurz zu meinem Projekt, ich möchte einen Schrittmotor als Linearantrieb an einer Traverse nutzen.

Anfang und Ende sind jeweils mit einem Endchalter versehen. Hier hatte ich gedacht diese an die beiden Externen interruptpins zu legen um das Programm zu unterbrechen wenn einer der beiden geschlossen wird und dann eine Variable zu setzen die verhindert das man weiter in die entsprechende Richtung fahren kann.
Hier ist mein Problem das nach dem Externen Interrupt das programm zum Anfang springen müsste es aber ja da weiter läuft wo es vor dem Interrupt war.
Jemand eine Idee wie man das am besten macht?

Der Schrittmotor wird über eine Endstufe per Pwm gesteuert.

Leider check ich nicht wie ich Timer 1 richtig setzen kann im datenblatt steht irgendwie alles über 50 Seiten verteilt...... deshalb benutze ich jetzt
DelayMicroseconds() für die weitergabe des PWM. Mit direkter portadressierung schaltet er auch so gut wie ohne verzögerung laut meinem Oszi.

Code:
unsgn long int x; //schritte
int start;

for( i=1 ; i<= x ; i++) // PWM ausgabe nach x Schritten
{
  PORTB |= (1<<PB1);
  delayMicroseconds(start);
  PORTB &= ~(1<<PB1);
  delayMicroseconds(start);

mein Problem ist die Eingabe im seriellen Monitor, ich habe dazu eine Funktion online gefunden die das bisher ganz gut gemacht hat.
Allerdings will ich nun auch mal größere Zahlen für die Schritte angeben und ab 30000 spielt er verrückt.....also manchmal steht da dann ~4Millionen und manchmal ne negative zahl.

Hier der code
Code:
unsigned long int x; //schritte  
int y; // geschwindigkeit in µs je mehr desto langsamer
unsigned long int i; //for zähler

char Data[10];
unsigned long int a;
unsigned long Tempo;
int start = 1000;
int x1;
int x2;

void setup() {


DDRB = (1<<PB1) | (1<<PB2) | (1<<PB3) | (1<<PB5); // PORT B  PIN PB1-3&5 auf Ausgang schalten
PORTB = (1<<PB2) | (1<<PB3); // PORT B  PIN PB&3 auf HIGH(5V) setzen.
PORTB &= ~(1<<PB5);
Serial.begin(9600);

}
         // *********SERIELLE EINGABE*******
do {
           if (Serial.available()) {      
             Data[a] = Serial.read();               //liest die Zeichen nacheinander ein
             a++;
             }    
           if(a<1)Tempo = millis();               // Startzeit abspeichern
           } while (a<6 && (millis()-Tempo) < 500);                
// schleife solange nicht 5 Zeichen übertragenoder 0,5 Sekunden vorbei sind
      
         Data[a] = 0;         // Abschluß der Zeichenkette mit Null für die Umwandlung
         y = atoi(Data);                        // Umwandlung Zeichenkette zu
         a=0;



Ach und zu guter letzt Blinkt die L Led auf dem Arduino die ganze Zeit wennd er serielle monitor zu ist. Dieses Blinken wird auch auf den PIN13 PB5 weitergegeben und ich weis nciht wieso er das macht selbst wenn ich den PIN auf LOW setze wie oben im code zu sehen ist.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
22.05.2017, 18:30
Beitrag #2
RE: Fragen :serielle eingabe und Externe Interrupts
Schau Dir mal den Wertebereich für int auf Arduino an. Da wirst Du die Lösung eines Deiner Probleme finden.
Der Timeout sollte auch etwas länger sein oder nimm mehr als 9600 Baud (z.B. 115200).
Ich schließe eine serielle Übertragung immer mit '\n' ab ('\r' unterdrücken, aber mit lesen). Damit ist man nicht an eine bestimmte Anzahl Zeichen gebunden.

Dein start in delayMicroseconds ist nicht initialisiert und wenn Du Glück hast 0.

Gewöhne Dir sprechende Variablennamen an. Was x1 und y sind weißt Du selbst in 2 Wochen nicht mehr und denen, die Deinen Code evtl. zur Fehlersuche lesen sollen, wird es schwerer gemacht. Evtl. schaut dann einer, der Dein Problem lösen könnte deswegen den Code nicht an.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.05.2017, 14:15 (Dieser Beitrag wurde zuletzt bearbeitet: 23.05.2017 14:18 von Treeshort.)
Beitrag #3
RE: Fragen :serielle eingabe und Externe Interrupts
jo danke schonmal für deine hilfe.

Das problem war aber nicht der wertebereich für int weil ich wie man sehen kann schon unsigned int genommen habe. das problem war atoi.
Atoi ist nämlich nur für int. will man größere zahlen haben muss man atol nehmen.
Damit funktioniert die eingabe ohne probleme und unkompliziert auch bei 9600 baud ohne endzeichen.

das start war leider noch mit drinnen, da ich versucht hatte eine rampe zu programmieren und diese hier nicht mit aufnehmen wollte. Sry im kompletten pogramm ist es aber mit werten versehen.

Ja das y, x sollte ich mir abgewöhnen mein problem ist grade bei arduino sind wörter wie speed oä. schon vorbelegt und da nervt es mich immer was neues zu suchen.


Hast du noch eine Idee zu den Interrupts wie ich aus der ISR zum anfang der loop springen kann?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.05.2017, 16:09
Beitrag #4
RE: Fragen :serielle eingabe und Externe Interrupts
In Deinem geposteten Code war es ein int y, dass Du mit atoi gefüllt hast, kein unsigned int, wie Du behauptest.

Dann nimm deutsche Bezeichnungen für die Variablen oder zusammen gesetzte Worte.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.05.2017, 16:17
Beitrag #5
RE: Fragen :serielle eingabe und Externe Interrupts
Ich hab mir den Sketch nicht durchgelesen, antworte hier also nur ganz allgemein:

Soll der Loop nicht einfach nach dem Interrupt weiter laufen, könnte man unmittelbar vor den wichtigen Tätigkeiten einfach nach einer boolschen Variable abfragen (volatile).
Ist die true, läuft das Programm normal.
Ist sie false, wird der kritische Bereich einfach übersprungen.
Am Ende vom Loop geht's ja eh wieder zum Anfang.

In der Interrupt wird die Var auf false gesetzt.
Am Anfang vom Loop auf true.

So wird der Loop beim Interrupt unterbrochen und danach geht's quasi ohne nennenswerte Aktivitäten zum Anfang zurück.

Vielleicht kann man auch ne Sprungmarke setzen und per Goto ansteuern.
Aber ob dies aus dem Interrupt heraus funktioniert, keine Ahnung!

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.05.2017, 17:03
Beitrag #6
RE: Fragen :serielle eingabe und Externe Interrupts
(23.05.2017 16:17)Binatone schrieb:  Vielleicht kann man auch ne Sprungmarke setzen und per Goto ansteuern.
Aber ob dies aus dem Interrupt heraus funktioniert, keine Ahnung!
Aus dem Interrupt per goto herausspringen sollte man tunlichst unterlassen - das geht nicht lange gut. Ganz davon abgesehen, dass goto eigentlich nie eine gute Idee ist.
Wenn es denn überhaupt ein Interrupt sein muß, dann dort ein Flag setzen, und im loop() abfragen.

(22.05.2017 18:01)Treeshort schrieb:  Der Schrittmotor wird über eine Endstufe per Pwm gesteuert.
Wie steuerst Du denn einen Schrittmotor über PWM? Oder meinst Du einfach Schrittimpulse? Das hat dann aber eigentlich nichts mit PWM zu tun.


(22.05.2017 18:01)Treeshort schrieb:  Ach und zu guter letzt Blinkt die L Led auf dem Arduino die ganze Zeit wennd er serielle monitor zu ist. Dieses Blinken wird auch auf den PIN13 PB5 weitergegeben und ich weis nciht wieso er das macht selbst wenn ich den PIN auf LOW setze wie oben im code zu sehen ist.
Pin13 / PB5 IST die L-Led auf dem Arduino. Da wird nichts weitergegeben. Die Led ist fest mit PB5 verbunden, und alles was Du an PB5 machst, siehst Du an der Led.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.05.2017, 15:24 (Dieser Beitrag wurde zuletzt bearbeitet: 30.05.2017 15:26 von Treeshort.)
Beitrag #7
RE: Fragen :serielle eingabe und Externe Interrupts
Zitat:Pin13 / PB5 IST die L-Led auf dem Arduino. Da wird nichts weitergegeben. Die Led ist fest mit PB5 verbunden, und alles was Du an PB5 machst, siehst Du an der Led.

Der Punkt ist aber das ich nix mit PB5 mache die L Led aber trotzdem sehr Schnell blinkt.

Das komische ist halt das ich wenn ich den Seriellen monitor öffne die Led dauerleuchtet und das Oszi mir anzeigt das das Porgramm läuft. sobald ich aber den seriellen monitor schließe, schläft auch der uno?!.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.06.2017, 16:52
Beitrag #8
RE: Fragen :serielle eingabe und Externe Interrupts
(30.05.2017 15:24)Treeshort schrieb:  
Zitat:Pin13 / PB5 IST die L-Led auf dem Arduino. Da wird nichts weitergegeben. Die Led ist fest mit PB5 verbunden, und alles was Du an PB5 machst, siehst Du an der Led.

Der Punkt ist aber das ich nix mit PB5 mache die L Led aber trotzdem sehr Schnell blinkt.

Das komische ist halt das ich wenn ich den Seriellen monitor öffne die Led dauerleuchtet und das Oszi mir anzeigt das das Porgramm läuft. sobald ich aber den seriellen monitor schließe, schläft auch der uno?!.
Solange Du nur ein kleines Fragment deines Sketches zeigst, wird man dir da nicht weiterhelfen können.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Serielle Ausgabe in Setup streikt Mustermann 2 406 10.10.2019 18:26
Letzter Beitrag: Mustermann
  Serielle Ansteuerung einer I2C LCD, Darstellung von Zahlen Peter05 7 1.115 21.05.2019 21:06
Letzter Beitrag: Bitklopfer
  nrf24l01 Fragen audis3stage4 9 1.556 08.05.2019 21:46
Letzter Beitrag: hotsystems
  Serielle Kommunikation hängt sich auf megamux 17 1.600 24.04.2019 17:25
Letzter Beitrag: hotsystems
  Fragen zu SPI Batucada 10 1.314 24.03.2019 09:39
Letzter Beitrag: amithlon
  Fragen und Hilfegesuch zu CAN BUS mc big d 17 1.667 07.02.2019 17:34
Letzter Beitrag: mc big d
  Variablen über Eingabe im Setup beschreiben heini320 3 780 30.12.2018 11:37
Letzter Beitrag: Tommy56
  Multiple Serielle Bytes mit Startmarke synchronisieren, was mache ich falsch Mosi 8 1.262 20.12.2018 18:33
Letzter Beitrag: Mosi
  Serielle Daten Windigipet 2018 Software, Arduino Mega 2560 verarbeiten/melden Christian_Moba-Arduino 11 2.909 15.09.2018 09:43
Letzter Beitrag: MicroBahner
  PHP WINDOWS XAMPP ARDUINO UNO SERVO steuern über Serielle Verbindung tr3 1 939 21.08.2018 21:59
Letzter Beitrag: georg01

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste