- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 4 von 4

Thema: DAC Ansteuerung AT-Mega 16 Code-Beispiel gesucht (Assembler)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2006
    Beiträge
    9

    DAC Ansteuerung AT-Mega 16 Code-Beispiel gesucht (Assembler)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi Leute,

    könnt ihr mir ein Beispiel Program zu schicken,
    ich habe nämlich keinen Schimmer wie ich mit einem AT-Mega 16 einen 12Bit-DAC (DAC7611) professionell ansteuere.


    Datenblätter


    AT-Mega16
    http://pdf1.alldatasheet.com/datashe.../ATmega16.html

    12-DAC 7611:
    http://pdf1.alldatasheet.com/datashe...N/DAC7611.html


    Vielen Dank!

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    12.09.2005
    Beiträge
    35

    DAC

    Hallo,
    ich habe auch dies Problem.....wer kann uns helfen..?
    Majid

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    21.06.2006
    Beiträge
    9
    Hab mittlerweile das Problem gelöst.
    Primitiv, aber es funktioniert mit jedem DAC (8Bit, 10 Bit...)

    Wäre aber schneller gegangen, wenn sich jemand bereit erklärt hätte uns zu helfen.

    (((( bin zu tiefst entäuscht!!!!!!


    Funktionsweise:
    8Bit-DAC bedeutet soviel, dass wenn ich dem Baustein seriell 8 Nullen (0b00000000 bzw. 0x00) zu schicke, am Ausgang 0V anliegt.
    Sende ich dem DAC-Baustein 8 Einsen (0b11111111 bzw. 0xFF), so liegt am Ausgang die "Versorgungsspannung" z.B. 5V an.

    8-bit: 2 hoch 8 = 256 (12Bit in 4096)

    Ein 8-bit DAC kann somit die Spannung von 5V in 256 Teilen zerlegen bzw. darstellen.
    5V / 256 = 0.020V -> 20mV Schritte (0b00000001 = 20mV am Ausgang)

    Überlegung:
    Ich muss also dem DAC Baustein irgendwie die einzelnen Bits "1" oder "0" zuschicken und dass 12 mal für 12Bit.... schaut euch einfach den Quellcode an

    Pin Beschreibung:
    SDI = Datenleitung, was hier anliegt "1" oder "0" wird mit jedem Takt in das Shift Register geschoben
    CLK = Taktleitung um die SDI Zustände in das Shift Register zu schieben
    CS = Liegt dieser Pin auf High, funktioniert der Takt-Pin CLK nicht, damit können mehere DACs geziehlt angesprochen werden
    LD = Load; Läd die im Shiftregister enthaltene Info (bits) in das DAC Register das die Ausgangsspannung definiert
    CLR = Setzt das DAC Register auf Null


    Code:
    ;Funktionsweise:
    ;---------------------------------------------------------------------------------
    ;- CLR auf High (Festverdrahtung)
    ;- Loadpin (LD) auf Low setzten, DAC Ausgang „aus“
    ;- CS auf Low um den DAC-Chip auszuwählen
    ;- Bits im Register (temp/temp2) mit 0 oder 1 vergleichen und je nachdem SDI setzten.
    ;- CLK an/aus für SDI Übernahme
    ;- Bits im Register (temp/temp2) schieben um das nächste Bit mit 1 oder 0 zu vergleichen und auszugeben 
    ;- Loadpin (LD) auf High, für die Darstellung der Bits am Ausgang als Spannung (Volt)
    
    
    
    ;DAC Steuerleitungen
    ;---------------------------------------------------------------------------------
    .equ SCL	= PC0	;Clock-Pin
    .equ SDI	= PC1	;Daten-Pin
    .equ LOAD	= PC2	;Daten ins DAC-Register laden
    .equ CS		= PC3	;Chip-Select DAC1/2 -Auswahl (aktive Low)
    
    ;Register
    ;---------------------------------------------------------------------------------
    .def temp	= r16
    .def temp2	= r17
    .def zaehler	= r18
    
    
    DAC1_out_12Bit:
    ;---------------------------------------------------------------------------------
      ldi temp2, 0b00001111 ; R16 + R17 => 12 Bit
      ldi temp, 0b11111111 ; R17 => 8Bit
      
      cbi PortC, Loadpin ;deaktiviere Übernahme der Daten aus dem DAC Register
      cbi PortC, CS
    
    mov R1, R16 	;kopiert den Inhalt von R16 in R1
    
    
    ;Schleife1
    ;---------------------------------------------------------------------------------
    ldi R18, 0x04 		;Oberes Nibble des Registers R16 0b00001111
    loop_4Bit:
      sbrc R9, 3 		;Überspringe wenn bit 3 Null "0" ist
      sbi PortC, SDI 	;“1“ an SDI
    
      sbrs R9, 3		;Überspringe wenn bit 3 Eins "1" ist
      cbi PortC, SDI	;“0“ an SDI
      
      ; SCL Takten
      sbi PortC, SCL	;”1” an SCL
      cbi PortC, SCL	;”0” an SCL
      
      lsl R1		;Inhalt des Registers R1 um 1 Stelle nach links schieben	
    
    dec zaehler		;Zählregister 0x04 - 1 
    brne loop_4Bit		;Springe wenn nicht „0“
    
    
    ;Schleife2 das gleiche noch mal, nur mit temp2
    ;---------------------------------------------------------------------------------
    mov R1, temp2
    
    ldi zaehler, 0x08
    loop_8Bit:
      sbrc R9, 7
      sbi PortC, SDI
    
      sbrs R9, 7
      cbi PortC, SDI
      
      sbi PortC, SCL
      cbi PortC, SCL
    
      lsl R9
    
    dec zaehler 
    brne loop_8Bit
    ;---------------------------------------------------------------------------------
      cbi PortC, Load	;Daten die ins Shiftregister getaktet wurden, 
      sbi PortC, Load	; in das DAC-Register übernehmen
    
    ret

    Es gibt bestimmt eine bessere Lösung, aber bis dahin


    Viel Spass!

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    12.09.2005
    Beiträge
    35
    danke,
    es war sehr hilfreich.
    bis dann
    majid

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress