Char Bit-weise auf PIN ausgeben

OP #1072198
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
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.
1
// Beispiel für AVR in C
2

3
// MSB clocked out first
4

5
#define DTA    PORTB
6
#define DATABIT  0
7

8
unsigned char data, i;
9

10
...
11

12
    i = 7;
13
     do {
14
     if (data & (1<<7)) DTA |= (1<<DATABIT);    // DTA HIGH
15
        else DTA &= ~(1<<DATABIT);      // DTA LOW
16
     
17
     data = data << 1;
18
  
19
  } while (i--);
20

21

22

23
// LSB clocked out first
24

25
    i = 7;
26
     do {
27
     if (data & (1<<0)) DTA |= (1<<DATABIT);    // DTA HIGH
28
        else DTA &= ~(1<<DATABIT);      // DTA LOW
29
     
30
     data = data >> 1;
31
  
32
  } while (i--);
Gast
Naja, seine ISR wird ja für jedes Bit einmal aufgerufen. Somit sollte 
das eigentlich ja so aussehen:
1
void ISR (void)
2
{
3
...
4
  static unsigned char ch, count = 0;
5
...
6

7
  if (!count)
8
  {
9
    ch = NextChar ();
10
    count = 8;
11
  }
12

13
  PIN = (ch & 0x80) >> 7;
14
  ch <<= 1;
15
  count--;
16

17
...
18
}

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

Volker
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.