PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : probleme mit digitalem eingang hilfeeeeeeeeeeeee^^



r37r0
19.06.2007, 16:43
hallo liebe MK (Mikrokontroller ) freunde, habe einen atmel mega 32, bzw das damit bestueckte roboternetz board rncontrol 1.4. habe folgendes problem habe eine Lichtschranke, und eine Inkrementalscheibe an meinem fahrzeug
bekomme ein 1 oder 0 signal wenn ich die scheibe drehe, bzw ein pegel von 4,7 und 0,3 V, das problem ist, das wenn ich es mit dem messgerät messe funktioniert es, wenn ich es mit den alalogeingängen messe geht es auch, aber mit keinem der digitalen wiederstände.
falls genauere infos zur lichtschranke erwünscht bitte melden poste sie dann.
also bisher klingt es nicht problematisch, denke das es ein programmier bzw initialisierungsfehler des digitalports ist, aber ka ^^
poste einach mal meinen quellcode, sry leider schlecht kommentiert, das projekt muss am fr fertig werde und mir rennt die zeit davon.
also zum projekt es soll eine sensorauswertung von temperatur strömmen und drehzahl an einem solarangetriebenen fahrzeug sein. strom und temp. gehen schon wunderbar.
und das printen der der sensoren1 - 6 dienen nur als schlüsselwörter für meine graphische oberfläche am pc
so nun der quellcode
achso ja ist in basic von bascom geschrieben , naja programmieren ist nicht so mein fall ^^ und die graphische oberfläche ist von abacom profilab compiliert worden aber selbst erstellt freu.





$crystal = 16000000 'Quarzfrequenz
$baud = 9600 'Baudrate
Config Adc = Single , Prescaler = Auto

Const Ref = 5 / 1023





Config Porta = Input
For I = 0 To 5 ' Alle internen Pullup 'Widerständ ein,bis auf Batteriespannungsmessungsport
Porta.i = 1
Next I



For I = 0 To 5
Start Adc
Ws = Getadc(i)
Volt = Ws * Ref
Print Volt
Print "sensor" ; I
Waitms 5

Next I


Config Portd = Input
Portd.2 = 1



For Z = 0 To 1000
'If Portd.2 = 1 Then
'Drehzaehlsec = 1
'Else
'Drehzaehlsec = 0
'End If
'Wait 1
If Portd.2 = 0 Then
Drehflanke = 0
End If

If Drehflanke = 0 And Portd.2 = 1 Then
Drehzaehlsec = Drehzaehlsec + 1
Drehflanke = 1
End If



Waitms 1

Next Z


Print Drehzaehlsec
Print "sensor6"
Drehzaehlsec = 0



waere euch zutiefst verbunden wenn mir einer den fehler zeigen könnte
der fehler liegt definitiv unter den sensor 5 sprich unter der 2. for schleife

mfg ein verzweifelter MKler

for_ro
19.06.2007, 19:58
Einen Eingangspin musst du mit Pind.2 = 0 abfragen, nicht mit Portd.2 = 0.

r37r0
19.06.2007, 20:02
ups sry digitale eingänge,
müsste eigentlich nur wissen wie man digitale eingänge benutze. würde es auch mit dem analogeingang machen, aber durch den a/wandler befürchte ich
geschwindigkeitseinbusen beim zählen oder?
naja der motor dreht teilweise 3000 umdrehungen, jedoch zaehlt er nichtmal einen zustanswechsel der incrementalscheibe

r37r0
19.06.2007, 20:05
und dann müsste es gehen, ok probiere ich, was für wiederholraten kann ich denn von dem digitaleingang erwarten
pro sec meine ich

r37r0
19.06.2007, 20:05
danke für die schnelle antwort

r37r0
19.06.2007, 20:07
ehm, kann es sein das beides geht,?
bei den analogeingängen hat es funktioniert, oder unterscheiden die sich von den digitalen

r37r0
19.06.2007, 21:39
gibt es denn vieleicht noch einen fehler

for_ro
19.06.2007, 21:43
Die analogen Eingänge benutzt du doch nur, wenn du die Amplitude, sprich die Spannung wissen möchtest. Wenn aber immer nur 0V und 5V anliegen, ist der digitale der richtige Eingang.
Wie schnell der wechseln kann und du das immer noch verarbeiten kannst, hängt von deinem Rest Programm ab. Aber ein 1/10 der Clock müsste drin sein.
Beim dem Einlesen der Analogeingänge gibst du auch gar keinen Pin oder Port an, sondern den Channel bei Getadc(channel), also kann da auch nichts schiefgehen.
Du kannst auch einen Eingangspin mit Portd.2 abfragen, bekommst dann aber das zurück, was du als Pull-Up oder Pull-down gesetzt hast.

r37r0
19.06.2007, 21:58
axo danke das hat mir sehr viel weitergeholfen thx juhu vieleicht wirds noch was hatte schon aufgeegebenn dachte, das das getadc(cannel was ich verwendet hatte nur für den a/d wandler sind)

r37r0
19.06.2007, 22:32
ne dann habe ich nochmals etwas falsch verstanden, also muss ich das portb = 1 wegglassen oder halt 0 damit er selbst den zustand ändern kann

recycle
19.06.2007, 23:35
ne dann habe ich nochmals etwas falsch verstanden, also muss ich das portb = 1 wegglassen oder halt 0 damit er selbst den zustand ändern kann


portb sind gleich 8 Pins und und mit portb=1 setzt du nur einen der 8 Pins auf eins. Vermutlich nicht den, den du setzen willst.

Mit portb.1 = 1 aktivierst du den Pullup von Pin1 and Port B.
Ob das sinnvoll/richtig ist, hängt davon ab, was du an dem Pin angeschlossen hast.
Wenn du wissen willst, welche Spannung an Pin1 von Port B anliegt (high oder low, bzw. 1 oder 0) musst du den Pin mit Pinb.1 und nicht mit portb.1 abfragen.

r37r0
25.06.2007, 20:54
hat alles geklappt, vielen dank leute, was würde ich ohne euch tun.
nochmals danke
mfg
fabian