So, ich hab jetzt nochmal den hier
zwischen den Prozessorpin und Gnd gehängt, und dann das hier korrigiert
3.:hatte ich den entsprechenden Prozessorpin als Eingang programmiert (DDRx.n=0) und dann den PORT an/abgeschaltet - bei PORT=0 und DDR=0 liegt der Pin aber nicht auf masse, sondern ist hochohmig - somit bin ich (durch selbstentladung etc...) also immer grad so unter der high-Pegel-Schwelle gewesen, statt auf Masse -> kein messbarer Unterschied. Zum Entladen muß der entsprechende Pin also ein Ausgang sein - zum Laden wegen des verwendeten internen Pullup jedoch Eingang. (sollte Punkt 2 ersetzen).
Das ganze läuft immer noch im Polling - also Pin auf Masse (warten), dann erst DDR auf 0, danach PORT auf 1 (also GND -> Tristate -> High über Pullup). Jetzt in einer endlosschleife solange einen Zähler inkrementieren, bis am PIN (!) ein High-Pegel anliegt, Zähler über UART ausgeben und umschalten auf Masse (wieder über Tristate)...
Bringt aber alles keinen Unterschied zu vorher: Zähler ist 1 ("offen"), bei Berührung (!) irgendwo zw 10 und 100, aber es wird eben keine Annäherung detektiert.
Hab ich das so richtig verstanden? Der tatsächlich am Prozessorpin liegende Pegel wird über das PIN-Register gelesen, das "Ausgabeverhalten" wird über das DataDirectionRegister (DDR) und das PortLatchRegister (PORT) gesteuert. Dabei gilt:
DDR--------PORT--------Zustand am Prozessorpin
---0--------------0------------hochohmig (tristate)
---0--------------1------------über internen Pullup an Vcc (klar, Pull
up)
---1--------------0------------Gnd
---1--------------1------------Vcc
Der Mega8 läuft mit den maximalen 8MHz, die der interne Taktgeber hergibt.
so, jetzt mal ein etwas veränderter Ansatz: als Zähler wird Timer1 mit InputCapture (steigende Flanke) verwendet. Das PORT-Register bleibt (immer) low, bei jedem TimerOverflow wird in der entsprechenden ISR das DDR getoggelt - somit schalte ich den Pin also zwische Gnd und Tristate hin und her. Verwendet wird also der InputCapturePin von Timer1 (ICP1) = PB0 beim Mega8. Am Pin liegt jetzt mein Sensor gegen Gnd, und ein (externer) hochohmiger (einige hundert kOhm?) Pullup (gegen Vcc). Bei jeder steigenden Flanke am ICP1 wird ja der Timer-Wert (automatisch) in das InputCaptureRegister geschrieben (ICR1), welches im Hauptprogramm ausgewertet/-gegeben werden kann. Der entsprechende Code sollte zB in Bascom in etwa so aussehen können:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
'Kapataster-Test
' D0,D1 = UART
' B0 = ICP1
$regfile = "m8def.dat" ' ATmega8
$crystal = 8000000 ' @ 8MHz
$baud = 19200 ' Programmer Baudrate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Baud = 19200 ' COM Baudrate (HW-UART)
Portb.0 = 0
Ddrb.0 = 1 'erfordert externen Pullup, sonst ddr und port toggeln
Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising
Start Timer1
On Ovf1 Pinstatechange
Enable Int1
Enable Interrupts
Do
Print Icr1
Waitms 400
Loop
Pinstatechange:
Toggle Ddrb.0
Return
|
Hmm... vielleicht heut abend mal zusammenstecken und testen...
Edit:
Arghh... DIEBE!!! MÖRDER!!! VERRÄTERISCHES PACK!!! Wo sind denn Die tabulatoren im Quellcode geblieben? In der POST-Vorschau waren sie noch da - jetzt sindse wech...