www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik hex zahl in binär und dann über einen Pin versenden


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin leute,

ich habe da ein Problem und weiß leider keine Lösung.
Ich habe einen AtMega16 und programmiere diesen in c++. Ich habe eine 16 
bit hex zahl und möchte diese über einen Pin versenden. Ich habe mir das 
so gedacht, dass ich diese Zahl in eine binär Zahl umwandle und sie dann 
mittels einer Scheleife über den Pin versende. Da dies relativ häufig in 
meinem Programm vorkommt, wollte ich mir eine Funktion dafür basteln.
Jetzt mein Problem: Mir fehlt leider die Erfahrung im Programmieren bzw 
ich bin Neuling. Hätte jemand vielleicht eine Idee wie so etwas aussehen 
könnte?

Danke im Voraus und
Gruß Martin

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Was hängt denn am anderen Ende des Pins? Das was du vorhast, klingt 
eigentlich ziemlich nach RS232, die Schnittstelle ist recht simpel und 
wird von den meisten AVRs (vom ATmega16 auch) direkt in Hardware 
unterstützt. Guck' mal im Datenblatt nach 'USART', beziehungsweise hier 
im AVR-Tutorial oder im AVR-GCC-Tutorial.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>klingt eigentlich ziemlich nach RS232,

Wohl eher nach SPI, für 16 Bit sendest dann einfach 2 x 8 Bit

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sie dann mittels einer Scheleife über den Pin versende.
Wie willst du die Datenübertragung synchronisieren?

Am einfachsten ist es, wenn du einen fertigen UART verwendest
oder einen Übernahmetakt mitsendest (wie z.B. bei SPI).

> AtMega16 und programmiere diesen in c++
Mit welchem Compiler?

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
compiler ist Programmer's Notepad.

ich möchte einen einen DAC (AD7808RZ) ansprechen und hatte mit das so 
gedacht, dass ich einfach zwei pins verbinde (also µC zu DAC) und der 
DAC die h l Signale nacheinander über den jeweiligen Pin einließt. Beim 
DAC ist dafür eben auch nur ein Pin vorgesehen.

unten mal meine Funktion mit der ich den DAC initialisieren wollte. Geht 
leider nicht Fehler meldung ist:

main.c:35: error: lvalue required as left operand of assignment


void DAC_initialisierung(void)
{

  PINB0=0x0060;    //DAC aus Standby holen
  PINB0=0x4110;    //DAC initialisieren
  PINB0=0x4210;
  PINB0=0x4310;
  PINB0=0x4410;
  PINB0=0x4510;
  PINB0=0x4610;
  PINB0=0x4710;
  PINB0=0x4810;    //DAC
}


beste Grüße Martin

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich habe mir das
>so gedacht, dass ich diese Zahl in eine binär Zahl umwandle und sie dann
>mittels einer Scheleife über den Pin versende.

Wie genau soll denn die Kommunikation aussehen? Da muß es ja eine 
Protokollbeschreibung geben: "über einen Pin senden" ist kein genormtes 
Datenformat.

>... und programmiere diesen in c++.

Das glaube ich nicht.

Oliver

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja ich möchte halt einfach den PINB0 high oder low setzen, was dann 
eine binäre Zahl darstellt.

Dadurch erkennt der DAC was er zu tun hat.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, das hattes sich überschnitten. Jetzt wird es etwas klarer.

>unten mal meine Funktion mit der ich den DAC initialisieren wollte. Geht
>leider nicht Fehler meldung ist:

Vielleicht arbeitest du zunächst mal das AVR-gcc-Tutorial (links oben) 
durch. Das erklärt gut, wie das mit I/O's und anderen Dingen im Mega so 
funktioniert.
PINB0=0x0060; 
geht aus zwei Gründen schief:

PINB0 ist kein Pin, sondern nur die Pin-Nummer. Das steht nichts anderes 
als
0=0x0060; 
und das verwirrt den Compiler doch etwas.

Und selbst wenn es ein Pin wäre, ginge das nicht, denn der könnte nur 
die Werte 0 oder eins annehmen, aber nicht 0x0060.

Dein AD7808 hat ein SPI-Interface. Das benötigt etwas mehr als nur einen 
Pin. Dafür gibts am Controller eine passede Einheit zur Kommunikation, 
die solltest du nutzen.

Oliver

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin
So einfach wird es nicht gehen, woher soll denn dein DAC wissen wenn der 
Pegel LOW ist wieviele 0en dabei übertragne werden.

Wenn du dir mal das Datenblatt für den DAC anschaust wird du ein 
Timingdiagramm finden wo die übertragung abgebildet ist.

Dabei wirst du auch feststellen das du dafür noch ein Clock signal 
brauchst. Du braucht also mindestens 2Pins, ein für die Daten und ein 
für den Takt.

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

Bewertung
0 lesenswert
nicht lesenswert
Martin schrieb:
> Naja ich möchte halt einfach den PINB0 high oder low setzen, was dann
> eine binäre Zahl darstellt.
>
> Dadurch erkennt der DAC was er zu tun hat.

Du gehst du einiges zu naiv an die Sache ran.
Nur mit einem Pin etwas rumwackeln ist zuwenig.
Der AD7808RZ wird ja ein Datenblatt haben in dem beschrieben ist, wie 
der Chip angesprochen werden möchte. Du musst dich da nach dem Chip 
richten und nicht umgekehrt.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Naja ich möchte halt einfach den PINB0 high oder low setzen, was dann
>eine binäre Zahl darstellt.

>Dadurch erkennt der DAC was er zu tun hat.

Das stellst du dir so viel zu einfach vor.
Dir fehlt Grundlagenwissen.

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klingt wirklich sehr nach SPI. Einfach 2 mal 8 Bit per SPI rausschicken. 
Das Aufteilen der 16 Bit in 2 mal 8 Bit sollte ja kein Problem sein.
uint8_t high = 16_bit_zahl >> 8;
uint8_t low = 16_bit_zahl & 0xFF;

In welchem Zahlensystem deine Zahl dargestellt ist sollte dabei egal 
sein.

Wenn du nur Stumpf die Zahl über einen einzelnen Pin raushaun möchtest 
(ohne Synchronisation oder ähnliches) dann geht das ja einfach über eine 
kleine Schleife.
// 16 Bit Zahl an PortB Pin1 ausgeben
DDRB |= 1 << DDB1;

uint8_t i;
for(i = 0; i < 16; ++i) {
    if(16_bit_zahl & 0x8000)
        PORTB |= 1 << PB1;
    else
        PORTB &= ~(1 << PB1);
}

Zur Not könntest du auch eine Software-SPI verwenden die direkt 16-Bit 
kann wie z.B.
uint16_t rf12_trans(uint16_t wert)
{  
  uint16_t wert_in = 0;
  uint8_t i;

  cbi(SPI_PORT, NSEL);
  cbi(SPI_PORT, SCK);

  for(i = 0; i < 16; i++) {
    if(wert & 0x8000) {
      sbi(SPI_PORT, SDI);
    } 
    else {
      cbi(SPI_PORT, SDI);
    }
    sbi(SPI_PORT, SCK);
    wert_in <<= 1;

    if(SPI_PIN & (1<<SDO)) {
      wert_in |= 0x0001;
    }
    cbi(SPI_PORT, SCK);
    wert <<= 1;
  }
  sbi(SPI_PORT, NSEL);

  return wert_in;
}

Autor: tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh da hab ich etwas sehr lange gewartet mit dem Abschicken... mein 
Beitrag oben wird wohl nicht zur Lösung führen.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> compiler ist Programmer's Notepad.
Hoppla, das ist doch kein Compiler.
Dieser Editor kann nur einen Compiler aufrufen...

Welchen C-plusplus Compiler verwendest du?

> Dadurch erkennt der DAC was er zu tun hat.
Ja, tut er das? So einen möchte ich auch...

Wie du an den Pins vom DAC herumwackeln solltest, steht im Datenblatt 
beschrieben.

> PINB0=0x4310;
Lies mal den Unterschied ziwchen einem PORT- und einem PIN-Register 
nach. Der Wert im PIN-Register kann nur gelesen werden. Auf einem PORT 
kann abhängig vom Richtungsregister etwas ausgegeben werden. Das sind 
aber wirklich elementarste Grundlagen  :-o

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.