mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom: Problem mit DAC


Autor: trinity4711 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe folgendes Problem. Ich lese eine analoge Spannung ein. Da diese 
nicht linear ist, wandele ich diese um und möchte diesen gewandelten 
Wert wieder als Analogwert ausgeben. Als DAC verwende ich den MAX5154

Hier der Code:

 $regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64                                               ' default 
use 32 for the hardware stack
$swstack = 64                                               ' default 
use 10 for the SW stack
$framesize = 64                                             ' default 
use 40 for the frame space


'------------ Led-Ausgänge -----------------------
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.4 = Output

Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.4

'------------- Config für LCD -------------------
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , 
Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 2
Config Lcdmode = Port
Initlcd
Cursor Off
Cls

'------------- SPI Schnittstelle fuer MAX 5145 konfigurieren ---

Const Control = &H4000                                      ' Lade 
Eingangsregister A, DA-Register wird aktualisiert

Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , 
Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit

Ss Alias Portb.2
Ss = 1
'------------- Config für ADC -------------------
Config Adc = Single , Prescaler = Auto , Reference = Off
Config Portc = Input
Enable Interrupts
Start Adc

'------------- Variablen deklarieren ------------

Dim Wert As Word
Dim R As Single
Dim Entfernung As Single
Dim Ana As Word
Dim W As Word

Dim X As Byte
Dim Y As Byte

Dim V As Single
Dim Vref As Single
Vref = 2.56

Dim Spannung As Word
Dim Daten As Byte


Dim Da_data As Word
Dim B(2) As Byte At Da_data Overlay
Dim Vref2 As Single
Dim Voltage As Single

Declare Sub Set_dac(da As Word)


'------------- Start-Routine --------------------
Locate 1 , 1
Lcd " DISTANZMESSUNG "
Locate 2 , 1
Lcd ""
Wait 2
Cls

'------------- Hauptprogramm --------------------
Main:
Do
Wert = 0
Spannung = 0
Wert = Getadc(0)
Spannung = Getadc(1)
Locate 1 , 1
Lcd Wert ; "  "

Locate 2 , 1

'R =(2914 /(wert + 5)) - 1

Ana = Wert + 5
R = 2914 / Ana
R = R - 1
V = Vref / 1024
V = V * Spannung
V = Da_data


Lcd Fusing(r , "#.##") ; "cm "

'----------- Ledauswertung -----------------------

If Wert < 70 Then
Portb.0 = 1
Else
Portb.0 = 0

If Wert > 577 Then
Portb.1 = 1
Else
Portb.1 = 0

If Wert >= 70 And Wert <= 580 Then
Toggle Portb.4

End If
End If
End If
'----------- Ende Ledauswertung -----------------
'---------------- D/A Max 5145 -------------------
 Vref2 = 2.49
 Voltage = Vref2 * Da_data
 Voltage = Voltage / 4096
 Voltage = Voltage * 2
 Locate 1 , 5


 Lcd "DAC = " ; Voltage ; " V"
 Call Set_dac(da_data)

Sub Set_dac(da As Word)
 Shift Da , Left , 1                                        ' Platz für 
Bit S0 machen
  Da = Da Or Control                                        ' 
Kommandobits überlagern
  Ss = 0
  Waitms 10
  Spiout B(2) , 1
  Spiout B(1) , 1
  Ss = 1
End Sub
Goto Main
Loop

Mein Programm funktioniert nicht ganz richtig, denn es läuft nur bis zur 
DA-Wandlung und bleibt dann hängen. Eigentlich sollte es durchlaufen, 
damit ich Entfernungsänderungen angezeigt bekomme.

Wer kann mir weiter helfen ?

Gruss Michael

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne jetzt viel Ahnung von BASCOM zu haben

Kann man in BASCOM den Code korrekt einrücken?
Wenn ja, dann mach das mal.
Da sind einige Dinge, die nicht wirklich koscher aussehen.

Das hier
If Wert < 70 Then
  Portb.0 = 1
Else
  Portb.0 = 0

  If Wert > 577 Then
    Portb.1 = 1
  Else
    Portb.1 = 0

    If Wert >= 70 And Wert <= 580 Then
      Toggle Portb.4
    End If
  End If
End If

ich kann mir nicht vorstellen, dass das wirklich so gedacht ist. 
Beachte, wie die if's in den einzelnen else Zweigen geschachtelt sind.


Das hier
Main:
Do
  ...

  Goto Main
Loop

sieht auch nicht koscher aus. Wozu der Goto Main, wenn danach sowieso 
die Loop beendet wird? Ausserdem kreuzen sich die Ausführungspfade. Der 
Goto Main springt aus der Schleife raus, nur damit gleich danach mit Do 
die Schleife wieder betreten wird.

Wenn du im BASCOM Simulator nichts ausfindig machen kannst, bleibt dir 
immer noch die Möglichkeit, mittels strategischen LCD Ausgaben 
rauszufinden, wo dein Programm hängen bleibt.

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.