Ansteuerung eines Analog-Multiplexers 74HC4051


Der nachfolgende Code kann dafür genutzt werden einen 8fach Analog-Multiplexer anzusteuern.
Die Ansteuerung des Multiplexers wird über drei Adressleitungen und einem ADC-Input Port durchgeführt.

Im Beispiel wird PORTA.3 als ADC-Eingang verwendet. Also über diesen Port werden die Daten von den Sensoren gelesen.

Zu Testzwecken wurden PORTA.4,A5,A6 für die Adressierung verwendet. Das ist aber eigentlich unsinnig, weil sie ja wertvolle ADC-Ports damit blockiert. Für die Adressierung sollten immer Digitial-Ports verwendet werden.

KEINE PANIK VOR DEM LANGEN CODE !!!!!!
Einfach mit Copy&Paste übernehmen. Bennent die Datei für den ersten Code-Block „modul_bumper.bas“.
Die Datei für das Testprogramm könnt Ihr nennen wie ihr wollt 🙂


'------------------------------------------------------------------------------
' BUMPER-Modul
'------------------------------------------------------------------------------
const bumper_port = 2
const bumper_offset = 50

declare function Bumper(side as byte , last_status as byte) as byte
declare function GetBumperValue(id as byte) as integer
declare sub CalibrateBumper()

dim bumpers(8) as word
bumpers(1) = 100 ' links
bumpers(2) = 100
bumpers(3) = 100
bumpers(4) = 100 'vorne - mittig
bumpers(5) = 100
bumpers(6) = 100
bumpers(7) = 100
bumpers(8) = 100 'rechts

'------------------------------------------------------------------------------
' Bumper
' überprüft ob einer der Drucksensoren gedrückt wurde
'
' Rückgabe: STATUS_BUMPER oder vorheriger Status
' Parameter: side = Drucksensornummer
' 1 = links1, 2=links2, 3=links3, 4=vorne,
' 5 = rechts3, 6 = rechts2, 7 = rechts3,
' 8 = hinten
' Last_status = vorheriger Status
'------------------------------------------------------------------------------
function Bumper(side as byte , last_status as byte) as byte
local value as integer
tmp_status = current_status
for x = 0 to 7
value = GetBumperValue(x)
'print "Val:" ; value ; " ";
if value > bumpers(x + 1) then
side = x
tmp_status = STATUS_BUMPER
last_status = current_status

#if log_level >= 1
print " B " ;
#if log_level >= 2
print "(" ; value ; ")";
#endif
#endif
else
#if log_level >= 1
print " - " ;
#if log_level >= 2
print "(" ; value ; ")";
#endif
#endif
end if
next
Bumper = tmp_status
end function

'------------------------------------------------------------------------------
' GetBumperValue
' setzt die BumperAddress (id) und liest dann den entpsrechenden ADC-Wert
' des adressierten Bumpers
'
' Rückgabe: ADC-Wert des adressierten Bumpers
' Parameter: id = Adresse des zu lesenden Bumpers (1-8)
'------------------------------------------------------------------------------
function GetBumperValue(id as byte) as integer
local v as integer
local b as byte
b = porta and &b11000111
b = id * 8
porta = b
'print " [" ; id ; "]";
v = getadc(bumper_port)
GetBumperValue = v
end function

'------------------------------------------------------------------------------
' Führt eine Kalibration der Drucksensoren durch. Die gemessenen Werte werden
' in der Sensortabelle gespeichert
'------------------------------------------------------------------------------
sub CalibrateBumper()
local value as integer
local sum as word

#if log_level >= 1
print "Calibrating bumpers ....."
#endif

for y = 0 to 7
sum = 0
for x = 1 to 50
value = GetBumperValue(y)
'print value ; " " ;
sum = sum + value
waitms 5
next
value = sum / 50
bumpers(y + 1) = value + bumper_offset
'print "V: " ; value

next

#if log_level >= 1
print "Calibrating bumpers finished"
#endif

for y = 1 to 8
#if log_level >= 1
print "bumpers(" ; y ; "): " ; bumpers(y)
#endif
next

end sub

###################################################
Hier das Testprogramm, welches das „modul_bumper.bas“ nutzt
###################################################


$regfile = "m32def.dat"
$framesize = 128
$swstack = 256
$hwstack = 64
$crystal = 16000000 'Quarzfrequenz

$baud = 57600

'------------------------------------------------------------------------------
' Konstanten / Variablen Zur Unterscheidung Verschiedener Status Des Roboters
'------------------------------------------------------------------------------
Const Status_cruise = 1
Const Status_line = 2
Const Status_avoid_obstacle = 3
Const Status_avoid_wall = 4
Const Status_begin_ramp = 5
Const Status_on_ramp = 6
Const Status_victim_rescue = 7
Const Status_victim_found = 8
Const Status_redzone = 9
Const Status_arc = 10
const Status_bumper = 11

'####################################################################
' const LOGGING = STATUS_AVOID_OBSTACLE
' Const Logging = Status_line Or Log_motor_pid
' const LOGGING = STATUS_AVOID_WALL
' const LOGGING = STATUS_ON_RAMP
' const LOGGING = STATUS_VICTIM_RESCUE
' const LOGGING = STATUS_VICTIM_FOUND
' const LOGGING = STATUS_REDZONE
' const LOGGING = STATUS_ARC
' const LOGGING = LOG_MOTOR_PID
const LOGGING = Status_line
Const Log_level = 2
'####################################################################

'------------------------------------------------------------------------------
' Config - ADC
'------------------------------------------------------------------------------
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.0 = Input ' Sensor 0
Config Pina.1 = Input
Config Pina.2 = Input
Config Pina.3 = output
Config Pina.4 = output
Config Pina.5 = output
Config Pina.6 = Input ' Sensor 7
Config Pina.7 = Input 'Für Bumper

Porta.0 = 1 ' PullUp
Porta.1 = 1 ' PullUp
Porta.2 = 1 ' PullUp
Porta.3 = 1 ' PullUp
Porta.4 = 0 ' PullUp
Porta.5 = 0 ' PullUp
Porta.6 = 1 ' PullUp
Porta.7 = 1 ' PullUp

Dim Current_status As Byte
dim Last_status as byte
dim Tmp_status as byte

Dim X As Byte
Dim Y As Byte

$include "Modul_Bumper.bas"

start adc

call CalibrateBumper()

do
current_status = Bumper(x , last_status)
print " Status: " ; current_status
waitms 250
loop

Advertisements
  1. Hinterlasse einen Kommentar

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: