Hi
Ich steh wieder mal vor einem Problem. Mein kleines Program funktioniert
nicht. Ich hab schon viel überlegt, warum, und habe auch eine kleine
Sicherheitsabfrage eingebaut, aber es funktioniert nicht. Das Prg grhört
zu einem VU-Meter mit 10 Leds (so ne Zeile 7*gr-3*rt). AUfjedenfall
leuchten alle Leds recht schwach und es geht garnichts mehr. Ich bin mir
nicht sicher aber ich glaube es passiert beim anschlag. also beim Wert
1023 vom ADC. Aber durch nachrechnen komm ich nicht auf einen ungültigen
Wert.
1023 + 1 = 1024
Log2(1024) = 10
2 ^ 10 = 1024
1024 - 768 = 256
256 - 1 = 255 -> invertiert 0
Der Ausgang wird invertiert, da ich sonst die Leitung überkruzen müsste.
Und ja man könnte das sich mit dem Log sparen, aber so kann ich davor
eine Zahl zw. 1 und 10 angeben und sie wird ausgegeben.
Hier der Code:
1 | $regfile = "m8def.dat"
|
2 | $crystal = 8000000
|
3 |
|
4 | Dim Ad As Word
|
5 | Dim Temp As Single
|
6 | Dim Pb As Byte
|
7 |
|
8 | Config Portd = Output
|
9 | Config Portb.0 = Output
|
10 | Config Portb.1 = Output
|
11 | Portb = 255 - 31
|
12 | Config Adc = Single , Prescaler = Auto , Reference = Avcc
|
13 | Start Adc
|
14 | Portb = 0
|
15 | Portd = 0
|
16 | Waitms 100
|
17 |
|
18 | Do
|
19 |
|
20 | Ad = Getadc(0)
|
21 |
|
22 | 'Linear Method
|
23 | 'Ad = Ad / 94
|
24 |
|
25 | 'Expotential Method
|
26 | Ad = Ad + 1 'Log 0 is imposible
|
27 | Temp = Ad
|
28 | Temp = Log(temp)
|
29 | Temp = Temp / Log(2)
|
30 | Ad = Temp
|
31 |
|
32 | 'LED Routine: Ad ^= On Leds
|
33 | Ad = 2 ^ Ad
|
34 |
|
35 | Pb = 0
|
36 | If Ad = 512 Then
|
37 | Ad = Ad - 256
|
38 | Pb = 1
|
39 | End If
|
40 | If Ad = 1024 Then
|
41 | Ad = Ad - 768
|
42 | Pb = 3
|
43 | End If
|
44 |
|
45 | If Ad > 256 Then
|
46 | 'µC should never be here
|
47 | Do
|
48 |
|
49 | Toggle Portd
|
50 | Waitms 100
|
51 |
|
52 | Loop
|
53 |
|
54 | End If
|
55 |
|
56 | Ad = Ad - 1
|
57 | Portd = 255 - Ad
|
58 | Portb = 3 - Pb
|
59 |
|
60 | Loop
|