mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik dezimal in 8-4-2-1 BCD


Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Profis!

Kenne die Programmiersprache C erst seit ca. 3 Tagen!
Suche nun einen Code der mir eine Zahl von 0-9 in einen BCD Code 
umwandelt.

Etwa so:
0 = 0000
1 = 0001
2 = 0010
Usw.

Den BCD Code möchte ich auf z.B. PortB ausgeben.

Wie funktioniert die Umwandlung und wie die Ausgabe?

Vielen Dank für eure Hilfe!

Ps: Kann gut sein das diese Frage schon einmal behandelt wurde, habe 
aber mit der Suchfunktion keine Antwort darauf gefunden. Wenn es dies 
trotzdem gibt, bitte Beitrag löschen vorher aber Link mitteilen. Danke

: Verschoben durch Moderator
Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es nur von 0-9 geht kannst du den Wert direkt an einen Port 
ausgeben (evtl. die oberen 4 Bit wegmaskieren)
Die Zahlen sind im Controller schon Binär vorhanden, da gibts kein 
Dezimal.

Wo kommen die 0-9 her?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach und:
> Forum: Codesammlung
> Wenn ihr eigene Programme oder Anleitungen geschrieben habt könnt ihr sie
> hier posten. Fragen werden gelöscht!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Ammann schrieb:
> Suche nun einen Code der mir eine Zahl von 0-9 in einen BCD Code
> umwandelt.

???

Nimm einen Taschenrechner (z.B. Windows), tippe die Ziffer 9 ein, 
schalte um auf Binärdarstellung, was siehst Du?

Tip:
Alle Zahlen werden CPU-intern binär dargestellt.


Peter

Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter
Ich habe geschriben ich suche einen Code der mir die Zahlen umwandelt 
nicht wie ICH ihn umwandeln kann.
#include <stdio.h>
#include <avr/io.h>         
 
main () { 
          
int einer;
int zehner;

einer = 0; 
zehner = 0;


  DDRB  = 0b11111111;    /*PortB als Ausgang setzen*/

  while(zehner != 12) {  /* wird nie erreicht*/

    if ( PIND & 0b00000001 ) {  /*Bit 0 an Port A = 1 ?*/

        einer = einer + 1;  
  
      if (einer > 9)  
      {
        einer = 0;  /* einer auf null stellen wenn 10 erreicht */
        zehner = zehner + 1;
      }
      
      if (zehner > 9)
      {
        zehner = 0;
      }      
    }

    if ( PIND & 0b00000010 ) {  /*Bit 0 an Port A = 1 ?*/

        einer = einer - 1;  
  
      if (einer < 0)  
      {
        einer = 9;  /* einer auf neun stellen wenn -0 erreicht */
        zehner = zehner - 1;
      }
      
      if (zehner < 0)
      {
        zehner = 0;
      }      
    }
        
  }

}


Nun möchte ich am PortB den BCD Code ausgeben: also Bit 0-3 = Einer Bit 
4-7 = Zehner

Gast schrieb:
> Wenn es nur von 0-9 geht kannst du den Wert direkt an einen Port
> ausgeben (evtl. die oberen 4 Bit wegmaskieren)
> Die Zahlen sind im Controller schon Binär vorhanden, da gibts kein
> Dezimal.

Könnte man dann schreiben
PORTB = einer + zehner; 
oder ähnlich?

MfG AmmannM

Autor: Bjojon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht ganz, du muß die Zehnerstellen auf die oberen 4 Bit schieben, 
sonst addierst du nur die beiden Stellen.

Sollte so aussehen:

Bit    7654 3210
Stelle ZZZZ EEEE

Also im Quelltext:

PORTB = (zehner<<4)|einer;

Autor: willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[c]

PORTB = (einer & 0b00001111) | (zehner<<4)

[c\]

der code "löscht" die ersten 4 bit von EINER, packt die in die unteren 4 
bit von PORTB, und packt dann die unteren 4 bit von ZEHNER in die oberen 
4 bit von PORTB

Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Hilfe! Werde den Code austesten.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Ammann schrieb:
> @Peter
> Ich habe geschriben ich suche einen Code der mir die Zahlen umwandelt
> nicht wie ICH ihn umwandeln kann.

Wie gesagt, da gibt es nichts umzuwandeln!
Intern ist alles binär, es gibt ja nur 0- und 1-Bits.

> int einer;
> int zehner;

Das ist Verschwendung, Du brauchst keine 16 Bit, um einen 4Bit-Wert 
darzustellen.
Das kleinste Format in C ist 8 Bit, nimm es:
uint8_t einer;
uint8_t zehner;

> Nun möchte ich am PortB den BCD Code ausgeben: also Bit 0-3 = Einer Bit
> 4-7 = Zehner

Das hattest Du aber vorher nicht erwähnt.

Einfach beide nicht gewandelten Werte verodern, vorher den Zehner um 4 
Bit nach links schieben.


Peter

Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, wieder was neues gelernt! habe es abgeändert und Simuliert. 
funktioniert alles wunderbar!
MfG AmmannM

Autor: Michael Ammann (ammannm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun habe ich aber warscheinlich noch ein anderes Problem. Wen die 
Befehle mit dem internen oszilator ablaufen also mit cg. 20Mhz (mal 
angenomen) und ich mit einem Taster den Eingang schalte, dan zählt es ja 
zu schnell auf und ab. Oder mache ich einen Überlegungsfehler?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Ammann schrieb:
> und ich mit einem Taster den Eingang schalte, dan zählt es ja
> zu schnell auf und ab.


> Oder mache ich einen Überlegungsfehler?

Das kann sein.
Kommt immer darauf an, was du willst.

Willst du, dass dein µC zählt solange eine Taste gedrückt ist

Oder willst du haben, dass dein µC nur dann zählt, wenn eine Taste 
gedrückt wurde. Sprich: wenn sich der Zustand der Taster von 'nicht 
gedrückt' in 'gedrückt' verändert.

Bei ersterem, reicht es aus, wenn du nur den aktuellen Zustand der Taste 
betrachtest. Bei letzterem musst du den jetztigen Tastenzustand mit dem 
Tastenzustand kurz davor vergleichen. Nur wenn der sich ändert, hat der 
Benutzer eine Taste gedrückt.

Wenns denn dann nur so einfach wäre. In der Praxis kommt dann auch noch 
das Problem der prellenden Taster dazu.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe geschriben ich suche einen Code der mir die Zahlen
> umwandelt nicht wie ICH ihn umwandeln kann.

Voraussetzung um überhaupt ein Programm schreiben zu können ist es 
immer, dass der Programmierer ein Problem mit Papier und Bleistift lösen 
kann. Wenn man ein Problem, zumindest im Prinzip, nicht selbst lösen 
kann, kann man auch kein Programm dafür schreiben.

Autor: Michael Ammann (ammannm)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ziel dieses Projektes ist es zwei 7Segment anzeigen anzusteuern via BCD.
Dabei möchte ich mit einem Taster höchzählen (0-99) mit dem zweiten 
runterzählen und beim Drücken beider Taster = Lampentest (88).

Ich weis das diese Aufgabe für einen mc eigentlich zu klein ist aber 
irgeneinmal kommt noch mehr dazu und ich bin somit flexibel. Um Pins zu 
sparen kommt die BCD ausgabe zum zuge. Habe ein ATTiny 461-20PU.
(Zum üben habe ich noch ein AVR Butterfly Demoboard)

Tasten entprellen:
Würde auch ein Kondensator reichen?

Autor: Sumynona (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Tasten entprellen:
> Würde auch ein Kondensator reichen?

Der bringt sicher Besserung, darauf verlassen kann man sich aber auf 
keinen Fall.

http://www.mikrocontroller.net/articles/Entprellung
(weiter unten im Artikel steht Softwareentprellung)

die Zahlen dann auf 7seg darstellen ist trivial
uint8_t wert = 95; //Wert der angezeigt werden soll

uint8_t zehner = (wert / 10);
uint8_t einer = (wert % 10);

//Ausgabe
PORTB = (zehner << 4) | einer;

Gut, das ganze geht auch ein stück effizienter, aber dein Controller 
langweilt sich ja noch.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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