nur mal sicherheitshalber nachgefragt: Den Input liest du über Pinx-Register ..... nicht etwa über Portx-Register?Zitat:
Zitat von Radio Eriwan
Druckbare Version
nur mal sicherheitshalber nachgefragt: Den Input liest du über Pinx-Register ..... nicht etwa über Portx-Register?Zitat:
Zitat von Radio Eriwan
Moin alle,
Danke für den Tip mit 'wait' statt 'waitms'! Wieder was gelernt.Zitat:
Zitat von Gast
Die eigentliche Portkonfiguration hatte ich schon ähnlich gemacht, nur daß ich erstmal alle Pullup's zugeschaltet hatte.
Ich werde das Problem jetzt mal anders angehen, und eine LED als Sensor benutzen und eine andere als Indikator. Das sollte doch wohl hinzukriegen sein! :-k
Ja, das mache ich so. Ich hatte mir nämlich mal heftig ein Ei gelegt, als ich der Hilfe von Bascom blind vertraut hatte: Die schreiben in der Hilfe, daß der 'bitwait'-Befehl angeblich mit 'Portx.x' funktioniert, also z.B. 'Portb.7'. Das ist vollkommener Quatsch und funktioniert nicht. Richtig muß es da heißen 'Bitwait Pinb.7 , Reset' und nicht 'Bitwait Portb.7 , Reset'! Habe mir also gemerkt, daß eine Ausgabe mit 'Port' und eine Eingabe mit 'Pin' gemacht werden muß.Zitat:
Zitat von SprinterSB
Bevor ich nun weiter an der eigentlichen Lösung arbeite, werde ich mal etwas mit den Pins spielen, um das Verhalten des Atmels besser zu verstehen.
Dank' Euch für Eure Hilfe, wenn jemand noch eine Idee oder einen Tip hat, dann immer her damit! =P~
Viele Grüße,
Radio Eriwan
P.S. oder EDIT: Ich habe gerade mal folgendes ausprobiert: Wenn ich mein Programm (Pullup's nun für Portb.3 und .4 deaktiviert) laufen lasse, und mit einer Drahtbrücke während der Messung Masse an den Eingang lege, dann gibt er mir das auch hinterher richtig aus. So weit scheint mein Programm also schon mal einigermaßen richtig zu laufen.
Eine Frage noch zum Befehl 'Portb = &B': Mit diesem Befehl schalte ich ja (binär) die Pullup's ein oder aus. Es ist doch aber auch gleichzeitig der Befehl für eine 'normale' Portausgabe!?! Wo liegt der Unterschied zwischen 'Pullup's schalten' und 'Ausgabe'?
Port auf Ausgang (DDRx=1) --> PORTx legt Potential fest
Port auf EIngang (DDRx=0) --> PORTx kontrolliert Pullups
Danke für die Erklärung!
So, hier nun die neusten Ergebnisse meiner Tests der Ein- bzw. Ausgänge:
Ich habe mal eine kleine Testschaltung gebaut, bei der ich jeweils eine LED mit Vorwiderstand vom jeweiligen Pin (Pinb.3 und Pinb.4) des AT's an Masse gelegt habe. Eine LED zeigt mir den Programmschritt an, die andere den Zustand des Ein- bzw. Ausganges. Das Programm dazu befindet sich im Anhang.
Ergebnis: Eine an einen Ausgang gesendete '1' wird im Register gespeichert (logo!), beeinflußt aber auch das Ergebnis beim Einlesen, wenn dieser Pin nun als Eingang geschaltet wird. Es scheint, als wenn beim Umschalten auf Eingang das Register nicht vollständig 'abgekoppelt' wird.
Die entsprechende LED am auf Eingang geschalteten Pin glimmt munter so vor sich hin (Spannung mit LED Ausgang - Masse: 1,7 Volt); wenn ich sie rausnehme, habe ich volle 5 Volt.
Setze ich den Pin als Ausgang vorher auf '0', dann bleibt diese ebenfalls erhalten, wenn ich den Pin auf Eingang schalte; die LED bleibt dunkel und das Voltmeter zeigt nahezu null Volt.
Eine testweise gegen +Ub geschaltete LED verrät mir noch etwas anderes: Bei einem als Eingang geschalteten Pin gibt es, egal ob vorher eine '1' oder '0' auf den Ausgang gegeben wurde, keine (niederohmige) Verbindung zu Masse wie die zu +Ub.
Damit und somit kann ich 'meine' Idee wohl vergessen! Die LED bzw. ihre Kapazität kann so nicht entladen werden...
Viele Grüße,
Radio Eriwan
Code:' '
$regfile = "2343DEF.dat"
$crystal = 1000000
'
Config Portb = &B00011000
Portb = &B11100111
'
Dim A As Bit
'
Do
'
Gosub Led_1
Portb.4 = 0
Wait 5
Gosub Led_2
Portb.4 = 1
Wait 5
Gosub Led_3
Config Portb.4 = Input
A = Pinb.4
Wait 5
Gosub Led_4
Config Portb.4 = Output
Wait 5
'
Loop
'
Led_1:
Portb.3 = 1
Waitms 50
Portb.3 = 0
Return
'
Led_2:
Portb.3 = 1
Waitms 50
Portb.3 = 0
Waitms 50
Portb.3 = 1
Waitms 50
Portb.3 = 0
Return
'
Led_3:
Portb.3 = 1
Waitms 50
Portb.3 = 0
Waitms 50
Portb.3 = 1
Waitms 50
Portb.3 = 0
Waitms 50
Portb.3 = 1
Waitms 50
Portb.3 = 0
Return
'
Led_4:
Portb.3 = 1
Waitms 50
Portb.3 = 0
Waitms 50
Portb.3 = 1
Waitms 50
Portb.3 = 0
Waitms 50
Portb.3 = 1
Waitms 50
Portb.3 = 0
Waitms 50
Portb.3 = 1
Waitms 50
Portb.3 = 0
Return
'
End
Daß die LED glimmt mit pullup aktiv ist doch ok, oder?
Zitat:
Zitat von AVR-Manual
Hallo Sprinter,
vielen Dank für Deinen heißen Tip!!!
Während Du das geschrieben hast, hatte ich im Programm zeitgleich schon ausprobiert, den Pullup nach Umschalten auf Eingang nochmals abzuschalten! Man, was für ein Zufall! :-) Das mit den Zwischenzuständen beim Umschalten ist ja fast wie Fahren bzw. Schalten mit 'Zwischengas'...
Ich dachte, die Pullup's am Programmanfang einmal zu aktiveren/deaktivieren reicht.
Mal testen...
Es grüßt...
...Radio Eriwan
Hi alle,
so, fertig, es ist geschafft!
Ein dickes 'Danke schön!' an Dich, Sprinter!
Meine Schaltung besteht nun aus einem AT90S2343, einem Widerstand und einer LED. Wird die LED angestrahlt, quittiert sie dies mit 10 kurzen Blinkimpulsen. Die Reichweitenmessung mußte ich nach 9 m abbrechen; länger war der Flur nicht.
Mein Fehler (neben dem mit den Pullup's): Die Eingänge sind dermaßen hochohmig, daß meine Zeitschleife 'Entladen' einfach viel zu kurz war... ;-)
Jetzt löppt das alles und ich freue mich einfach!
Viele Grüße,
Radio Eriwan
Hi Eriwan,
Glückwunsch!
Verrätst du auch, wie du das geschaltet hast?
Einfache die LED zwischen 2 Ports?
Was ist das für eine LED ist es?
Und mit welchen Zeiten muss man da rechnen?
Hallo Sprinter,
klar 'verrate' ich es (ein Schaltplan sagt mehr als tausend Worte ;-) ):
Bild hier
Die LED ist eine ultra-helle rote 5 mm in transparentem Gehäuse. Es funktioniert jedoch auch mit jeder (!) anderen LED (grün, gelb); am schlechtesten bzw. unempfindlichsten haben sich allerdings rote LED's in rotem Gehäuse herausgestellt.
Zum Programm:
- LED wird für 1 ms 'geladen' (kann ggf. noch drastisch verkürzt werden)
- 1 ms (Entlade-)Wartezeit (diese Zeit bestimmt die Ansprechempfindlichkeit)
- danach Abfrage, ob Eingang '0' (hell) oder '1' (dunkel)
Das ist schon fast 'erschreckend' simpel! Wie gesagt, Reichweitenversuch mußte ich bei 9 m wegen Platzmangel abbrechen... ;-)
Ich hoffe, das hilft Dir und anderen weiter!?
Viele Grüße,
Radio Eriwan
Ja,
die Ladezeit kann IMHO deutlich gesenkt werden. 1µs ist da nicht zu kurz.
Der externe INT sollte gute Dienste zur Zeitmessung leisten in Zusammenarbeit mit einem Timer.
Nochwas: Welche Lichtquelle verwendest du?
Bei mir wird's leider nicht so einfach 8-[
Mit einer LED im Multiplex-Betrieb will ich die Umgebungshelligkeit bei normalem Umgebungs- und Dämmerungslicht bestimmen. Die LED soll also quasi gleichzeitig leuchten und die Helligkeit messen, damit ich ihre Helligkeit an die Umgebungshelligkeit anpassen kann. Erschwert wird das dadurch, daß die LEDs in diffusem Gehäuse stecken (weiß-diffuse Flächen-LEDs)