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 | }
|