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
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
1 | If Wert < 70 Then |
2 | Portb.0 = 1 |
3 | Else |
4 | Portb.0 = 0 |
5 | |
6 | If Wert > 577 Then |
7 | Portb.1 = 1 |
8 | Else |
9 | Portb.1 = 0 |
10 | |
11 | If Wert >= 70 And Wert <= 580 Then |
12 | Toggle Portb.4 |
13 | End If |
14 | End If |
15 | 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
1 | Main: |
2 | Do |
3 | ... |
4 | |
5 | Goto Main |
6 | 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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.