Ok.. danke
Pullupwiderstände das stand ja schon im Datenblatt aber was ist das genau und was kann ich damit wie machen. Da bin ich nicht so richtig schlau draus geworden.
Was meinst du mit offener Pin und externe Beschaltung?
Druckbare Version
Ok.. danke
Pullupwiderstände das stand ja schon im Datenblatt aber was ist das genau und was kann ich damit wie machen. Da bin ich nicht so richtig schlau draus geworden.
Was meinst du mit offener Pin und externe Beschaltung?
Pullupwiderstände dienen dazu Eingänge auf definierte Pegel zu ziehen, wenn sie z.B. nicht beschaltet sind (offener Taster z.B.)
Anmerkung zur Skizze:Code:+5V
o
|
o
Widerstand
o
|
PIN o-----------------o Taster o-----------o Masse
Fall 1 - Taster nicht gedrückt:
Am Pin liegen nahezu 5 Volt an, da der Widerstand und der geöffnete Taster einen Spannungsteiler geben und der Widerstand des offenen Tasters gegen unendlich geht.
Fall 2 - Taster gedrückt:
Am Pin liegt Massepotential an, da in diesem Fall die gesammte Spannung uber den Widerstand des gedachten Spannungsteilers abfallen. (geschlossener Taster = annähernd 0 Ohm).
Diese können bei den ATMEGA Mikrocontrollern intern aktiviert werden,DDR -> 0 & PORT -> 1 von dem entsprechendem PIN.
Ach ja, die internen Pullups funktionieren natürlich nur, wenn der entsprechende Pin als Eingang definiert wurde ... (siehe Datenblatt).
Offener PIN = z.B. nicht beschalteter PIN
externe Beschaltung = alles was um den Atmega oder den entsprechenden Baustein sonst noch an Bauelementen plaziert ist (z.B. Widerstände, Kondensatoren, LED's etc ...)
Ich hoffe dir damit ein wenig weiter geholfen zu haben.
Grüße,
da Hanni.
Hallo it03,
wo genau schließt du das Signal an direkt?
* an den Eingangsports 1 - 8
* direkt am Controller(z.B RNB-Bus)
Falls du die Eingangsports 1 - 8 verwendest, mußt du die ganze Abfrage über I2C machen. Da die Eingänge nicht direkt am Controller sondern am PCF2 hängen.
An den PCF hast du kein PinA oder PortA.Code:'Testprogramm 6
'für
'RoboterNetz Standard-Roboter Board RBNFRA 1.2
'
'Aufgabe:
'Testet Eingangsport indem Wert über RS232
'übermittelt wird (9600 Baud einstellen)
'
'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de
'###################################################
Const Writeeingabeport_adr = &H7E 'I2C Adr PCF 2
Const Readeingabeport_adr = &H7F 'I2C Adr PCF 2
Dim I2cdaten As Byte 'Datenbyte aus PCF8574
Dim I As Byte
$baud = 9600
$crystal = 8000000 'Quarzfrequenz
Config Scl = Portc.0 'Ports fuer IIC-Bus
Config Sda = Portc.1
Portd.6 = 0 'Schrittmotoren erst mal ausschalten
I2cinit
'******** Diese 4 Befehle sind nur ab RNBFRA Version 1.2 (nicht in V 1.1)
' notwendig und bzw. möglich (erweiterte Energiesparfunktion und LED´s)
' Bei Board 1.1 bitte auskommentieren oder löschen
I2cstart
I2cwbyte &H74 'Schreibbefehl an PCF3 schicken
' Led´s ein ,Motorendstufen ein, Port-Peripherie ein, RBN-Bus Sleep Modus aus (also Peripherie
aktiv)
I2cwbyte &B00000010 'Datenbyte an PCF3
I2cstop
'*********
I = 0
I2cdaten = 1
Do
I2cstart
I2cwbyte Readeingabeport_adr 'Lesebefehl an PCF schicken
I2crbyte I2cdaten , Nack 'Datenbyte von PCF lesen
I2cstop
Waitms 50
Print I ; " Eingangsport Wert" ; I2cdaten
Incr I
Loop
End
Wenn alle Eingänge offen sind hast du den
Wert 255 / &B11111111
Je nach dem welche Eingang du gegen Masse ziehst ändert sich z.B. der
Wert 254 / &B11111110
Eine 1 bedeutet offener Eingang (5V) eine 0 geschaltet auf Masse (0V).
Wenn du mit 5V -Signale arbeitest(also auf 1 schalten willst), müßtest du mit 10k Pulldown-Widerstände die Eingänge auf Masse ziehen. Geht aber nur mit externer Beschaltung. Dann würdest du anstatt 255(&B1111111 - 0(&B00000000) als offenen Eingang haben.
Eine weitere Möglichkeit wäre dann noch die direkte Beschaltung am Controller (z.B. am RNB-Bus). Da wäre dann ein direktes Abfragen der beschalteten Pins möglich.
### Silvio ###
I2C und PCF waren genau diee Stichworte welche gefehlt hatten.
Um den PCF8574 als Eingang zu verwenden muss folgendes geschehen:
Die Pins, welche als Eingang funktionieren sollen müssen zunächst mit einem Komando auf Hi gesetzt werden.
Der PCF kann dann feststellen ob dieser Pin auf LOW gezogen wird, sonst klappt das nicht.
Also erst mal einen Befehl senden, welcher den Port auf HI setzt:
dann Abfragen und nachsehen welcher Pin Low ist.
Diese Art nennt man dann open DrainCode:I2csend _adr , &B10000001 ' den PCF8574 stellen 1. und letzter Bit
Wenn man jetzt den PCF abfragt, erhält man den Wert 128.
Wird das Bit 7 gegen Masse geschaltet erhält man den Wert 1 (da ja nur Bit0 Hi ist),
Wird das Bit 1 gegen masse geschaltet erhält man den Wert 127 (da ja Nur Bit7 Hi ist),
und wenn beide ggen Masse geschaltet werden erhätman was? Ja "0".
Du erhält immer den Status des gesamten Bausteines,
Willst Du nur bestimmte Pins afragen, ohne die anderen berücksichtigen must Du vorher mit einer AND entsprechend Maskieren.
Du Willst also z.B. nur die unteren vier Bit abfragen Maskiest Du mit
&B0000111 AND Port_var (In Port_var ist das Ergebnis deiner Protabfrage gespeichert)
Das ganze ist in meiner Dokumentation zu meinem ProtobedApplication Board schön imBeispielcode erklärt und daher will ich es jetzt nicht nochmal schreiben.
https://www.roboternetz.de/phpBB2/ze...rag.php?t=5601
Zum Anschluss eines DFÜ-Gerätes (Funkmoden oder sonstigem) ist das natürlich nicht praktikabel, da zu langsam.
Aber um z.B. Taster abzufragen ist es sehr Portsparend.
Lies Dir meine Anleitung einfach mal durch.
Oh danke, danke für die vielen (nützlichen) Infos!
Aber eine Sache ist noch nicht beantwortet oder ich habe es nicht rauslesen können:
Gibt es eine Möglichkeit die 8 Eingangspins so zu schalten das sie permanent auf LOW sind (0V) und erst durch anlegen einer Spannung (von ausserhalb) auf High gesetzt werden?
Weil ich verstehe den Sinn nicht ganz das man denn Zustand des Pins durch anlegen einer Masse ändert. Ich denke mal das es doch üblicher ist das ein externes Gerät ein Signal schickt das man dann abfragen kann.
Gruß
it03
Hallo it03,
mit Anlegen eines Widerstandes am Pin auf Masse oder Versorgungsspannung setzt du den Pin auf ein bestimmtes Potential 0V oder 5V (LOW oder HI) wenn du den Pin dann mit deinem Programm abfragst bekommst du die entsprechende Werte zurück.
Wenn du nun einen Eingang mit Hi - Potential hast, kannst du beispilesweise mit einem Taster auf Masse, diesen auf LOW schalten.
Oder umgekehrt ein Eingang mit LOW - Potential mit einem Taster auf HI schalten. Je nach Anforderung...
Wenn nun dein externes Gerät im Aktionsfall ein Signal schickt mit Flanke auf HI sollte dein Eingang dies auch bemerken. Also sollte der Eingang auf LOW sein, so das das HI -Signal des externen Gerätes das LOW am Eingang zu einem HI schaltet und du es auswerten oder verarbeiten kannst.
Simple ausgedrück:
Du kannst keine Lampe einschalten, die schon leuchtet... aber ausschalten
eine Lampe die nicht leuchet kannst du auch nicht ausschalten... aber einschalten.
Es geht also darum, das du die richtigen Zustände abfragen kannst.
### Silvio ###