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
Mysteriöse Serielle Funktion
19.07.2014, 13:53 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2014 14:47 von Bitklopfer.)
Beitrag #1
Question Mysteriöse Serielle Funktion
Hallo zusammen,
mir ist da was aufgefallen dieser Tage. Und zwar wenn ich die Serial.aviable() Funktion scheint auch den Port 3 abzufragen wie eine Art Handshake und zwar stellt sich das Verhalten so dar das wenn die die Abfrage aktiv ist und man dann den Port 3 gegen GND schaltet das dann die Funktion meint es sein ein Zeichen im Puffer verfügbar und ruft dann hier im Programm die Serial.read() Funktion auf die dann eben eine "0" liefert. Auf der http://arduino.cc/en/Reference/HomePage Seite habe ich keinen Hinweis finden können der hier auf eine Art Handshake Funktion vom Port 3 hinweist. Weis hier zufällig Jemand etwas über diesen Sachverhalt ?
lg
bk

Das Testprogramm
Code:
// apropos Copyright, das urspruengliche Programm entstammt den Beispielen
// aus der Arduino IDE unter Communcation, sorry habe das Programm eben abgespeckt.
int incomingByte = 0;   // for incoming serial data
int led = 13;   // bei mir ist es die 9

void setup() {
  pinMode(led, OUTPUT);
        Serial.begin(9600, SERIAL_8N1);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

        // send data only when you receive data:
        while (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, HEX);
        }
        
          digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(100);               // wait for a second

}

Also Seriellen Monitor öffnen und Port 3 gegen GND schalten/tasten. Wenn man in der Eingabezeile vom Seriellen Monitor was abschickt wird es wieder ausgegeben, das funktioniert.

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2014, 16:12 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2014 16:13 von rkuehle.)
Beitrag #2
RE: Mysteriöse Serielle Funktion
Moin bk,

sicher dass die angezeigte 0 nicht von der Deklaration herrührt?
Soweit mir bekannt, wird die while- Schleife immer durchlaufen, auch wenn nix im Serial-Receive-Buffer steht.
Um sicher zu sein würde ich die while-Schleife in eine if (Serial.available()) Abfrage reinpacken. Die sollte nur true bringen wenn etwas im Buffer steht Huh
Natürlich ist dann nach wie vor die Geschichte mit Pin3 auf LOW bzw. GND interessant.

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2014, 17:01 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2014 17:07 von Bitklopfer.)
Beitrag #3
RE: Mysteriöse Serielle Funktion
(19.07.2014 16:12)rkuehle schrieb:  Moin bk,

sicher dass die angezeigte 0 nicht von der Deklaration herrührt?
Soweit mir bekannt, wird die while- Schleife immer durchlaufen, auch wenn nix im Serial-Receive-Buffer steht.
Um sicher zu sein würde ich die while-Schleife in eine if (Serial.available()) Abfrage reinpacken. Die sollte nur true bringen wenn etwas im Buffer steht Huh
Natürlich ist dann nach wie vor die Geschichte mit Pin3 auf LOW bzw. GND interessant.

Grüße RK

Hi RK,
nööö...die 0 der Variablendeklaration kann man auch auf 5 ändern oder ganz weglassen, ausgelesen wird immer eine 0x00 wenn man die Taste drückt. Und die while Schleife wird zwar abgefragt aber das Programm dahinter nur ausgeführt wenn die Taste gedrückt wird oder ein Zeichen im Buffer ist. Hier der erweiterte Code:
Code:
int incomingByte;   // for incoming serial data
int led = 9;
int led2 = 6;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
        Serial.begin(9600, SERIAL_8N1);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

        // send data only when you receive data:
        while (Serial.available() > 0) {
                digitalWrite(led2, HIGH);   // turn the LED on (HIGH is the voltage level)
                delay(100);               // wait for a second
                digitalWrite(led2, LOW);    // turn the LED off by making the voltage LOW
                delay(100);               // wait for a second
               // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, HEX);
        }
        
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(100);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(100);               // wait for a second

}
Die led2 blinkt nur einmal pro Tastendruck sprich reagiert nur auf die fallende Flanke wie bei nem Interrupt oder eben einmal pro eingelesenem Zeichen.
Ob man an der Stelle if oder while schreibt ist egal, das Verhalten ist das selbe.
Witzig, gell...vor allem weil der Port 3 nirgends definiert ist...
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2014, 20:37
Beitrag #4
RE: Mysteriöse Serielle Funktion
Yup,

habe ziemlichen Koks geschrieben. War nur ne Trockenübung (kein Ardu hier) und habe nen englischen Text gelesen und wohl falsch übersetzt Huh
Aber ist schon ein ziemlicher Hammer. Wüsste gern wen man dazu anschreibt / anfragt um zu erfahren ob das so gewollt ist oder eher so eine Art "Designfehler"
Interessant wäre ja die Frage ob es einen Unterschied macht den D3 auf GND zu ziehen (ohne pinMode-Setting) oder den D3 als INPUT setzt und dann auf LOW setzt (bzw. INPUT_PULLUP / HIGH).
Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.07.2014, 08:19
Beitrag #5
RE: Mysteriöse Serielle Funktion
(19.07.2014 20:37)rkuehle schrieb:  Yup,

habe ziemlichen Koks geschrieben. War nur ne Trockenübung (kein Ardu hier) und habe nen englischen Text gelesen und wohl falsch übersetzt Huh
Aber ist schon ein ziemlicher Hammer. Wüsste gern wen man dazu anschreibt / anfragt um zu erfahren ob das so gewollt ist oder eher so eine Art "Designfehler"
Interessant wäre ja die Frage ob es einen Unterschied macht den D3 auf GND zu ziehen (ohne pinMode-Setting) oder den D3 als INPUT setzt und dann auf LOW setzt (bzw. INPUT_PULLUP / HIGH).
Grüße RK

Moin Ricardo,
ooch solange du dir den Koks nicht als Linie reinziehst Wink ist doch alles im Grünen Bereich Big Grin
Der Witz ist das es auf dem Original UNO das Verhalten nicht gibt. Auf dem Board wo ich selber gestrickt habe ist aber der gleiche Bootloader drauf wie auf dem Original UNO weil ich denn von dort geklont habe via ISP und AVR Dragon. Habe jetzt zwar deinen INPUT D3 Programmiervorschlag nicht umgesetzt aber mal am Port nachgemessen was da anliegt und siehe da da scheint sogar der Pull-UP R geschaltet zu sein weil da die volle 5V anliegen. Ob das damit was zu tun hat das der USB Seriell Adapter (FTDI Chip) sich anderster verhält wie der ATmega16U2 auf dem UNO Board weil wenn ich den UNO als ISP Programmer für den ATtiny85 verwende dann geht das auch nur auf dem UNO und nicht auf dem Eigenbau und da hat sich bisweilen nun der Verdacht verdichtet das hier die USB Seriell Umwandlung unterschiedlich ist was auch verständlich ist da der AVRDUDE Steuerzeichen verwendet die auch zum Softwarehandshake bestimmt sind....und wird wohl der Hund begraben sein.... auf jeden Fall mal wieder ein spannendes Mikrokontroller Drama....
Oder hast du z.B. gewußt das wenn man einen Port nicht initialisiert hat das man dann trotzdem einen Ausgangsimpuls messen kann wenn man einen digitalWrite auf den Ausgang macht... logo...damit schaltet man den internen Pull-UP aus und ein....RolleyesRolleyesRolleyes
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.07.2014, 09:30
Beitrag #6
RE: Mysteriöse Serielle Funktion
Moin BK,
Zitat:verdichtet das hier die USB Seriell Umwandlung unterschiedlich ist was auch verständlich ist da der AVRDUDE Steuerzeichen verwendet die auch zum Softwarehandshake bestimmt sind....und wird wohl der Hund begraben sein....
Soweit scheint mir das nachvollziehbar...warum ist mir aber noch nicht ganz klar...
Zitat:Oder hast du z.B. gewußt das wenn man einen Port nicht initialisiert hat das man dann trotzdem einen Ausgangsimpuls messen kann wenn man einen digitalWrite auf den Ausgang macht
Hier http://arduino.cc/en/Tutorial/DigitalPins steht dazu:
Zitat:Arduino (Atmega) pins default to inputs, so they don't need to be explicitly declared as inputs with pinMode() when you're using them as Inputs
Ist der Pin im nichtinitialisierten Zustand also wirklich ein Ausgang Huh
Und ist PULLUP nicht generell eine Methode / Status / Verhalten für als INPUT gesetzte Pins Huh
Irgendwie immer noch (Verständnis-)Fragen bei mir Confused

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.07.2014, 16:08 (Dieser Beitrag wurde zuletzt bearbeitet: 24.07.2014 18:46 von Bitklopfer.)
Beitrag #7
RE: Mysteriöse Serielle Funktion
(24.07.2014 09:30)rkuehle schrieb:  [/qoute]
Zitat:Moin BK,
verdichtet das hier die USB Seriell Umwandlung unterschiedlich ist was auch verständlich ist da der AVRDUDE Steuerzeichen verwendet die auch zum Softwarehandshake bestimmt sind....und wird wohl der Hund begraben sein....
[quote]
Soweit scheint mir das nachvollziehbar...warum ist mir aber noch nicht ganz klar...
#### nun ich habe noch eine Möglichkeit zum austesten erkannt, den USB Light Adapter könnte ich noch mit der Software vom UNO USB ATmega verseuchen...dann mal sehen..dann ist alles gleich...nur der ATmega auf dem Light Adapter ist die 8U2 Version und aufm UNO ist der 16U2 wobei es nun auf die tatsächliche Codegröße ankommt.

##############
Nachtrag, der Versuch den 16U2 Code auf den 8U2 zu bringen ist gescheitert da in der oberen Speicherhälfte vom 16U2 Code eben auch Programmteile hinterlegt sind obwohl in der ersten Hälfte vom Programmspeicher eine riesige Lücke ist...Angry

Zitat:Oder hast du z.B. gewußt das wenn man einen Port nicht initialisiert hat das man dann trotzdem einen Ausgangsimpuls messen kann wenn man einen digitalWrite auf den Ausgang macht

Hier http://arduino.cc/en/Tutorial/DigitalPins steht dazu:
#### Wie mans richtig macht weiß ich wohl....aber ab und zu ist man eben Geistig umnachtet...TongueTongueTongue und dann stolpert man über sowas...

Zitat:Arduino (Atmega) pins default to inputs, so they don't need to be explicitly declared as inputs with pinMode() when you're using them as Inputs

Ist der Pin im nichtinitialisierten Zustand also wirklich ein Ausgang Huh
Und ist PULLUP nicht generell eine Methode / Status / Verhalten für als INPUT gesetzte Pins Huh
Irgendwie immer noch (Verständnis-)Fragen bei mir Confused
#### nun das ist recht einfach zu erklären, diese aufgehübschte Arduino Variante der I/O Port programmierung ist ja nun nicht das wie die Hardware auf dem CPU Chip aussieht sondern auf dem Kontroller sind immer mehrere Ports in einem Byte abgebildet. Dann gehören zu jedem Port 3 Register dazu, einmal das Data Register (z.B. PORTB) wo auch die Ausgabedaten hingeschrieben werden, dann das Data Direction Register (z.B. DDRB) das bestimmt ob der Port nun ein Eingang oder ein Ausgang ist, und das Input Pin Register (z.B. PINB) wo die Pinsignale eingelesen werden womit man auch seine eigene Ausgabe wieder zurücklesen kann ohne die Data Direction ändern zu müßen. Anzumerken sei noch das man in Assembler sich dann aussuchen kann ob man einen Port 8 Bit breit ansprechen will oder ob man einzelne Port Pins ansprechen möchte.
Alles nachzulesen im Atmel Datenblatt zum ATmega328.
lg
bk
...uhhh....diese Qouterei bring mich nochmal um...TongueTongueTongue

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Funktion mit Parameterübergabe - u8g torsten_156 8 403 22.06.2016 18:53
Letzter Beitrag: Pit
  Serielle Schnittstelle - Daten empfangen Datatom 8 779 22.05.2016 18:10
Letzter Beitrag: avoid
  Funktion in Loop einmalig ausführen Haustechno 4 647 09.03.2016 22:43
Letzter Beitrag: Haustechno
  "WORT" über die serielle Schnittstelle auslesen hannes77 1 539 08.03.2016 12:13
Letzter Beitrag: Binatone
  HC-05 Modul auf Funktion prüfen. arduinofan 2 365 03.02.2016 19:18
Letzter Beitrag: arduinofan
  Eine Funktion vorher definieren ? arduinofan 23 2.028 30.12.2015 08:42
Letzter Beitrag: amithlon
  Serielle Ausgabe, Reset ? Mathias 1 599 12.11.2015 18:12
Letzter Beitrag: hotsystems
  Funktion/Methode mit mehr als einem Ausgangswert Marduino_UNO 18 1.269 20.10.2015 10:30
Letzter Beitrag: Marduino_UNO
  Serielle Kommunikation arduino147147 1 670 15.10.2015 08:22
Letzter Beitrag: Binatone
  Serielle Kommunikation zw. zwei Arduino UNOs Marduino_UNO 2 1.118 20.08.2015 07:13
Letzter Beitrag: Marduino_UNO

Gehe zu:


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