Atmega88p 12bit senden ?

OP #5747407
Lesenswert?
• ▲
▼
Guten Abend,

ich habe einen ltc1257 D/A wandler den ich jetzt auf die einfachste art 
erst einmal ansteuern will. Dazu habe ich nachfolgenden Code erstellt. 
In dem ich mit der Variable data 8bit zu dem Dac sende, was mir aber 
nicht ganz klar ist, kann ich mit meinem Code auch 12bit senden ? wenn 
ja, kann mir das  hier Bitte jemand zeigen ?
1
/* soft_serial_01.c ATmega88 @ 16MHz */
2
#include <avr/io.h>
3
 
4
void soft_serial (uint8_t data)         // Funktion soft_serial
5
{
6
    for (uint8_t i=0; i<=7; i++)     // for-Schleife 8 mal ausführen
7
    {
8
        if (data & 1)                   // Wenn data an Stelle 0 = 1
9
            PORTD |= (1<<PD0);            // Data serial = 1
10
        else
11
            PORTD &= ~(1<<PD0);           // Data serial = 0
12
             
13
        PORTD |= (1<<PD1);                // PD1 = 1 (CLK = low)
14
        PORTD &= ~(1<<PD1);               // PD1 = 0 (CLK = high)
15
         
16
        data = data >> 1;             // data um 1 Stelle nach rechts schieben
17
    }
18
}
19
 
20
int main(void)
21
{
22
    uint8_t data = 0xAA;                // data = 1010 1010
23
    DDRD = 0xFF;                        // Richtungsregister PORTD = Ausgang
24
    PORTD = 0x04;                       // PD2 (RCK) = HIGH, 0x04 = 0000 0100
25
     
26
    while(1)
27
    {
28
        soft_serial(data);              // Funktionsaufruf und Übergabe von data
29
        PORTD &= ~(1<<PD2);               // PD2 = 0 (Takt = LOW für RCK)
30
        PORTD |= (1<<PD2);                // PD2 = 1 (Takt = HIGH für RCK -> Ausgabe Schieberegister)
31
    }
32
}
OP #5750237
Lesenswert?
• ▲
▼
So, jetzt funktioniert es wie unten im Code. Aber ich habe noch ein 
kleines Problem, und zwar sind doch 12bit 4095 dez. oder ?

ich steuere hiermit eine DAC an der von 0- 10V ausgibt.

und mit dieser Zeile in data & möchte ich die bits maskieren und zwar 
das das 12. an erster stelle steht, und ich somit der Variable data 
einen Wert von 0-4095 also 0-10V eingeben kann
1
if (data & 0xC00) //hier soll  Wenn data an Stelle 12 = 1

allerdings habe ich mit dem Oszi. festgestellt das bei einem Wert von 
ca. 3000 schon 10V ausgegeben werden. kann mir vielleicht bitte jemand 
sagen wie ich das richtig maskieren kann das das funktioniert ?
1
/*
2
 * LTC1257_2.c
3
 *
4
 * Created: 23.02.2019 17:06:43
5
 * Author : USER
6
 */ 
7

8
/* soft_serial_01.c ATmega88 @ 16MHz */
9

10
#define F_CPU 16000000UL
11
#include <avr/io.h>
12
#include <util/delay.h>
13

14
void soft_serial (uint16_t data)         // Funktion soft_serial
15
{
16
  for (uint8_t i=0; i<=11; i++)     // for-Schleife 12 mal ausführen
17
  {
18
    if (data & 0xC00)                   //hier soll  Wenn data an Stelle 12 = 1
19
    PORTD |= (1<<PD0);            // Data serial = 1
20
    else
21
    PORTD &= ~(1<<PD0);           // Data serial = 0
22
    
23
    PORTD |= (1<<PD1);                // PD1 = 1 (CLK = low)
24
    //_delay_us(1); 
25
    PORTD &= ~(1<<PD1);               // PD1 = 0 (CLK = high)
26
    
27
    data = data << 1;             // data um 1 Stelle nach links schieben
28
  }
29
}
30

31
int main(void)
32
{
33
  uint16_t data = 3000;              // hier soll ein Wert 0-4095 12bit funktionieren
34
  DDRD = 0xFF;                        // Richtungsregister PORTD = Ausgang
35
  PORTD = 0x04;                      // PD2 (RCK) = HIGH, 0x04 = 0000 0100
36
  
37
  while(1)
38
  {
39
    soft_serial(data);              // Funktionsaufruf und Übergabe von data
40
    PORTD &= ~(1<<PD2);               // PD2 = 0 (Takt = LOW für RCK)
41
    //_delay_us(1); 
42
    PORTD |= (1<<PD2);                // PD2 = 1 (Takt = HIGH für RCK -> Ausgabe Schieberegister)
43
  }
44
}

Antwort schreiben

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.

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.