Forum: Mikrocontroller und Digitale Elektronik Serial.print() Zeit richtig anzeigen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Sebastian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo ich bin wieder auf ein kleines Problem gestoßen und zwar habe ich 
einen Timer so eingestellt das dieser alle 100ms in die ISR springt und 
die Zeit berechnet. Aktuell um einfach nur zu prüfen habe ich die 
Ausgabe in der ISR drin stehen siehe hier

ISR(TIMER1_COMPA_vect) { // called by timer1
  i++;
  if (i==10){
    Serial.print(minute);
    Serial.print(":");
    Serial.println(sekunde);
    sekunde++;
    i=0;
    if (sekunde>59){
      minute++;
      sekunde=0;

Jetzt wird mir natürlich im Monitor die Zeit gezählt aber solange die 
Minuten bzw. sekunden nur eine Stelle haben sieht das ganze natürlich 
doof aus wie bekomme ich das hin das es vernünftig angezeigt wird? Ich 
könnte das ganze natürlich mit einer if abfrage lösen aber ich meine 
damals bei BAscom konnte man da irgendwie ein Format beim Printbefehl 
eingeben geht das bei Arduino auch?

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> etzt wird mir natürlich im Monitor die Zeit gezählt aber solange die
> Minuten bzw. sekunden nur eine Stelle haben sieht das ganze natürlich
> doof aus

dann frage doch vor dem print ob Minute und Sekunde <10 ist
und "printe" erst eine '0' und dann Minute und/oder Sekunde

Wenn Minute und Sekunde >=10 ist "printe" normal

if (i>9 && i<60){
 Serial.print(minute);
}
else{
 Serial.print("0");
 Serial.print(minute);
}

erweitere das zu Sekunde, Minute, Stunde, Tag, Monat, Ja(h)r.

: Bearbeitet durch User
von Sebastian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ja aber das ging irgendwie mit Strings und Format oder so einfacher

von Joachim B. (jar)


Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Ja aber das ging irgendwie mit Strings und Format oder so einfacher

auch das kann man machen mit Formatvorgabe %02d

Ich bin ja eher der Fan von Brot für die Welt, nicht Brot verteilen 
sondern Hilfe zur Selbsthilfe geben!

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Bewertung
2 lesenswert
nicht lesenswert
War da nicht die Einschränkung, dass man keine serielle Ausgaben 
innerhalb der ISR machen darf? Ich meine mich zu erinnern, dass sich die 
Sache aufhängt, wenn der Ausgabepuffer voll läuft.

Ich würde die Zahlen innerhalb der ISR berechnen, die Anzeige aber 
innerhalb der Hauptschleife loop() machen. Dann ist auch egal, wie lange 
das dauert.

: Bearbeitet durch User
von Sebastian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ja natürlich das mache ich später nicht mehr in der isr das war nur zum 
testen

von Sebastian (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ja genau das meinte ich danke Joachim

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> auch das kann man machen mit Formatvorgabe %02d

Sebastian schrieb:
> ja genau das meinte ich danke Joachim

Ihr redet aber schon von sprintf() ?
1
   char foo[6];
2
3
   sprintf(foo, "%02d:%02d", minute, sekunde);
4
   Serial.println(foo);

Die Serial Klasse kann doch keine Formatierung, oder hab ich da was 
verschlafen :-) ?

von Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht lesenswert
Adam P. schrieb:
> Die Serial Klasse kann doch keine Formatierung, oder hab ich da was
> verschlafen :-) ?
Für die AVR Boards ist das richtig.
Für andere Boards muss man schauen.

Aber auch printf() lässt sich nutzen.

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Aber auch printf() lässt sich nutzen.

printf() mit Arduino?

Ja aber nicht einfach so...
dann musst du es manuell umbiegen, die Ausgabe - halt wie beim AVR.

von Arduino Fanboy D. (ufuf)


Bewertung
1 lesenswert
nicht lesenswert
Adam P. schrieb:
> Ja aber nicht einfach so...
> dann musst du es manuell umbiegen, die Ausgabe - halt wie beim AVR.

Yes!
1
int printCHAR(char character, FILE *stream)
2
{
3
  (void)stream;
4
  Serial.write(character);
5
  return 0;
6
}
7
//               { 0, 0, flags, 0, 0, put, get, 0 }
8
FILE outStream   { 0, 0, _FDEV_SETUP_WRITE, 0, 0, printCHAR, nullptr, 0 } ;
9
// Das Makro FDEV_SETUP_STREAM tut nicht mit C++
10
11
void setup() 
12
{
13
  stdout = &outStream;
14
  Serial.begin(9600);
15
16
  byte value = 7;
17
  printf("test 0x%02X\r\n",value);
18
  printf("test %02d\r\n",value);
19
}
20
21
void loop(){}

: Bearbeitet durch User
von Adam P. (adamap)


Bewertung
1 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Yes!

Genau das meinte ich,
bezweifel stark, dass ein typischer Arduino User dies versteht.

:-)
aber hey, Arduino IDE / Lib. ist nicht das Ende der Welt...
es geht noch tiefer :-D

von Arduino Fanboy D. (ufuf)


Bewertung
-2 lesenswert
nicht lesenswert
Adam P. schrieb:
> bezweifel stark, dass ein typischer Arduino User dies versteht.
Ich denke nicht, dass man Arduino User(überhaupt Menschen) in den Sack 
"typisch" stecken sollte.
Es sei denn man möchte den Knüppel rausholen und drauf kloppen.

Man nimmt ihnen durch Projektion den Raum für Entwicklung.
Übles Beispiel:
Beitrag "Re: Programmierung Arduino Nano"
Da sieht man, wie ein (vermutlich) erwachsener Mann ein (vermutlich) 
Kind mit der Nase in den Dreck stößt.
(aus dem Forum vertreibt)

---
Wenn 10% aller mitlesenden  Arduino User das Beispiel verstehen/anwenden 
können, dann hat sich das posten gelohnt.

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.