www.mikrocontroller.net

Forum: Compiler & IDEs Char Bit-weise auf PIN ausgeben


Autor: Sebastian B. (m0nkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
wie krieg ich es hin auf einem einzelnen PIN einen CHAR Bit-weise 
auszugeben?
Ich brauche das um Daten seriell an den D/A-Wandler zu übergeben, die 
CLK des D/A-Wandler ist gleich dem Timer1 und ist auf 64kHz gestellt.
Jetzt soll bei jedem auslösen des Timer1 1 Bit dieses Chars übergeben 
werden.

Gruß
Sebastian

Autor: Stefan Z (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Programmiersprache benutzt du?
Assembler, Bascom, C oder anderes?

Autor: Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char c;

while (c) {
 pin = c & 0x80; // LSB first
 c *= 2;
}

Autor: Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne, blödsinn

char c;

while (c) {
 pin = c & 0x80; // LSB first
 c = c << 1;
}

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne, blödsinn

char c;

while (c) {
 pin = c & 0x80; // MSB first
 c = c << 1;
}

Autor: D. E. (stb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal schnell hingeschrieben für 'nen AVR. Sollte so gehen, am besten 
nachvollziehen um eventuelle Flüchtigkeitsfehler zu eliminieren.

Die Umsetzung auf Dein Timer Problem schaffst Du jetzt sicherlich 
selbst.
// Beispiel für AVR in C

// MSB clocked out first

#define DTA    PORTB
#define DATABIT  0

unsigned char data, i;

...

    i = 7;
     do {
     if (data & (1<<7)) DTA |= (1<<DATABIT);    // DTA HIGH
        else DTA &= ~(1<<DATABIT);      // DTA LOW
     
     data = data << 1;
  
  } while (i--);



// LSB clocked out first

    i = 7;
     do {
     if (data & (1<<0)) DTA |= (1<<DATABIT);    // DTA HIGH
        else DTA &= ~(1<<DATABIT);      // DTA LOW
     
     data = data >> 1;
  
  } while (i--);


Autor: Volker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, seine ISR wird ja für jedes Bit einmal aufgerufen. Somit sollte 
das eigentlich ja so aussehen:
void ISR (void)
{
...
  static unsigned char ch, count = 0;
...

  if (!count)
  {
    ch = NextChar ();
    count = 8;
  }

  PIN = (ch & 0x80) >> 7;
  ch <<= 1;
  count--;

...
}

Allerdings ist der Overhead gewaltig! Ich würde die ISR mit 8kHz 
aufrufen lassen, dann stimmen auch die obigen Posts mit der Schleife.

Volker

Autor: Sebastian B. (m0nkey)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die super schnelle Antwort, hab auch alles soweit verstanden, 
habe allerdings noch eine allgemine Frage.

Bei dem Befehl:

DTA |= (1<<DATABIT); bzw. vegleichbar PORTB |= (1<<PD0)

Wird eigentlich auch eine 1 durch das PORTB Register geschoben oder wird 
direkt das Bit PD0 auf High gelegt?

EDIT: Vielleicht sollte ich dabei sagen das ich zwar den D/A-Wandler 
synchron zum Timer1 laufen lassen, allerdings rufe ich die 
Ausgabefunktion für die Bits nicht in der ISR Routine auf.

Autor: D. E. (stb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur das Bit wird auf 1 gelegt. Es wird nichts durch PORTB geschoben.

STB

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.