Hallo zusammen,
ich habe ein Problem beim Programmieren meines Arduino Leonardo mit
Serial1.begin() und Serial1.end(). Ich möchte die Serielle Schnittstelle
sowohl als Digital Output verwenden, als eben auch als Serielle
Schnittstelle (speziell PIN 1). Anbei erstmal der Code, bis jetzt nur
quick&dirty geschrieben, um zu sehen ob meine Gedanken überhaupt
umsetzbar sind:
#include <HardwareSerial.h>
#define BAUDRATE 9600
int Break = 1;
void setup() {
//Serial1.begin(BAUDRATE, SERIAL_8N1);
pinMode(Break, OUTPUT); // sets the digital pin as output
}
int start(void){
Serial1.end();
digitalWrite(Break, LOW);
delayMicroseconds(13*1e6/BAUDRATE);
return 0;
}
void loop() {
start();
Serial1.begin(BAUDRATE, SERIAL_8N1);
Serial1.write(0x55); //SYNC
Serial1.write(0xCF); //PID
Serial1.write(0x20); //CMD
Serial1.write(0x00); //DATA
Serial1.write(0x10); //CHECKSUM
//Serial1.end();
delayMicroseconds(1000);
start();
Serial1.begin(BAUDRATE, SERIAL_8N1);
Serial1.write(0x55); //SYNC
Serial1.write(0xCF); //PID
Serial1.write(0x61); //CMD
Serial1.write(0x40); //DATA
Serial1.write(0x8E); //CHECKSUM
delay(2000);
}
Das Problem besteht darin, dass ich den Pin 1 auch dazu benötige um für
eine gewisse Zeit den PIN auf LOW zu halten und dann anschließend Daten
über den gleichen PIN raus schicken möchte. Für den ersten Teil, also
senden des ersten Paketes funktioniert dies auch einwandfrei, wenn das
zweite Paket dann allerdings geschickt werden soll, fehlt sowohl das
Delay als auch die LOW Phase, wie beim ersten Paket. Es scheint so, dass
der Programmteil vor dem SYNC für den zweiten Teil komplett ignoriert
wird. Dabei sollte es möglich sein, auch laut bisherigen Recherchen, die
Schnittstelle zu schließen, als Digital PIN zu nutzen und anschließend
mit begin, wieder als Schnittstelle.
Ich bin ehrlich gesagt etwas ratlos, da ich im Netz auch keine weitere
Lösungsmöglichkeit gefunden habe, denn für den ersten Teil funktioniert
es so, wie es soll.
Habt ihr eine Erklärung öder Lösung für mein Problem?
Vielen Dank im Voraus.
Norbert Van der Heyd schrieb: > Habt ihr eine Erklärung öder Lösung für mein Problem? Wie wäre es damit, den PIN auf OUTPUT zu setzen, bevor Du ihn als OUTPUT verwendest?
1 | int start(void){ |
2 | Serial1.end(); // die Serial-Pins sind jetzt INPUT |
3 | // (jedenfalls dann, wenn Serial1 vorher aktiv war)
|
4 | pinMode(Break, OUTPUT); // Pin auf OUTPUT setzen |
5 | digitalWrite(Break, LOW); |
6 | delayMicroseconds(13*1e6/BAUDRATE); |
7 | return 0; |
8 | }
|
Norbert Van der Heyd schrieb: > Habt ihr eine Erklärung öder Lösung für mein Problem? Kann nur raten:
1 | int start(void){ |
2 | Serial1.end(); |
3 | ///////////////////////////////////////
|
4 | pinMode(Break, OUTPUT); // sets the digital pin as output |
5 | //////////////////////////////////////
|
6 | digitalWrite(Break, LOW); |
7 | delayMicroseconds(13*1e6/BAUDRATE); |
8 | return 0; |
9 | }
|
Jürgen S. schrieb: > Wie wäre es damit, den PIN auf OUTPUT zu setzen, bevor Du ihn als OUTPUT > verwendest? Hahaha. Das war aber Zeitgleich ;-D))
Vielen Dank für die beiden hilfreichen Antworten. Genau so hat es funktioniert, musste lediglich noch eine kurze Pause einfügen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.