PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ansprechen der Eingangports



it03
28.04.2006, 17:36
Hallo,

habe mal eine Anfängerfrage:

Ich habe mich zwar durch das Handbuch hoch und runter gelesen finde aber nichts passendes. Ich habe ein Mega32 Board Ver 1.22 und möchte die Eingangsports (wie sie auf dem Board an sich betitelt sind) ansprechen bzw. auslesen.
Da es sich um Eingangsport handelt, muss ich sie mit PinX ansprechen wobei X für a,b,c,d steht. Soviel habe ich schon mitbekommen, aber ich weiß eben nicht ob es a,b,c oder d ist. Habe auch schon alle getestet (habe Port 1 und 2 der Eingangsports) eine 3V Spannung angelegt und weggenommen, aber kein Zustand hat sich geändert.

Mein Program




Dim X1 as Byte
.
.
.
Dim X8 as Byte

X1 = pina.0
X2 = pina.1
.
.
.
x8 = pina.7

Print X1;
Print X2;
.
.
.
Print X8


Habe danach Pina durch bin Pinb,c und d ersetzten lassen und die Spannung immer wieder angelegt und weggenommen, aber es änderte sich nichts in der Ausgabe... Woran kann das liegen, bzw. was habe ich falsch gemacht?

Gruß
it03

franzl
28.04.2006, 21:47
Hallo
hast du die Eingänge deklariert (dim porta = input)
normal musst du am Eingang nicht 3 sondern 5 Volt anlegen.
Du hast doch einen Atmega 32 oder?
3 Volt wird der wohl nicht erkennen.

robo_wolf
28.04.2006, 22:37
Hallo it03,
vermute mal du meinst das rnbfra 1.22 von robotikhardware.
Da sind doch schon einige Beispiel auf der CD-ROM mit geliefert.
Ein direktes Ansprechen ist da auch nicht möglich. Die Ein- und Ausgänge sind über I2C mit dem PCF verbunden.
So müssen die Eingänge über eine I2C Routine abgefragt werden.
--- Testprgramm 6 ---
### Silvio ###

it03
29.04.2006, 16:51
Hallo zusammen!
Richtig, ich habe das rnbfra 1.22 mit Atmega32.
Mein Problem ist jetzt: ich will von einem externen Gerät (Avisaro WLAN-Modul) Signale empfangen. An den Ports des WLAN-Moduls liegen entweder 0,5V(aus) oder 3V(an) an (sogn. I/O Ports die ich per Web-interfaces setzen kann). Davon gibts es 8 Stück welche ich mit den Eingangsports auf dem Board verbinden möchte. Wenn ich allerdings dann das Testprogram laufen lasse, wird weiterhin der Wert 255 ausgegeben (was ja auch logisch ist, da kein Port mit GND verbunden ist).
Meine Frage:
Kann ich die Eingangsports irgendwie "umswitchen", so dass sie direkt auf die anliegende Voltzahl reagiert? D.h. ich lege an meinen I/O Port vom Modul eine 1 (3V) an und der entsprechende Port auf dem Board ist dadurch auch auf 1 gesetzt. Das müsste doch möglich sein, oder?

Danke für die Hilfe

Hanni
29.04.2006, 17:07
Hallo
hast du die Eingänge deklariert (dim porta = input)
normal musst du am Eingang nicht 3 sondern 5 Volt anlegen.
Du hast doch einen Atmega 32 oder?
3 Volt wird der wohl nicht erkennen.

Datenblatt Seite 287 ... (http://atmel.com/dyn/resources/prod_documents/doc2503.pdf)

Dort steht was dazu, was der Mega32 als L / H erkennt ...

Grüße,

da Hanni.

it03
29.04.2006, 17:23
Danke für die schnelle Antwort Hanni!
Ich habe was vergessen: "dim porta = input" hatte ich probiert, Bascom hat vorgeschlagen "as" anstatt "=" zu verwenden. Aber wenn ich "Dim porta as input" eingebe sagt er, dass Input kein DATA TYPE ist und ich bekomme es nicht compiliert. Dann ist mir der Befehl Config eingefallen und ich habe " Config porta = Input" angegeben. Das hat er gefressen allerdings ohne Erfolg. Es liegt immernoch 5V auf den Eingängen...

darwin.nuernberg
29.04.2006, 17:35
In Bascom gibt es auch noch den feinen Unterschied:

Ports Setzen
Ausgänge kann man definieren was man will,
wenn Du einen Pin aus Ausgang deklariert hast,
kannst Du den mittels Pin setzen was Du willst, der wird nicht HI
(z.B. Set PinB.3 )
Du musst diesen mit Set portB.3 ansprechen
oder PortB = %00000100.

Abfragen muss man ihn mit Pin (x = PinB.3)


Da hab ich mich auch schon dumm gesucht.

Zusammenfasung:

Verwende PIN zum einslesen und
verwende PORT zum ausgeben.

Hanni
29.04.2006, 17:47
In Bascom gibt es auch noch den feinen Unterschied:

Ports Setzen
Ausgänge kann man definieren was man will,
wenn Du einen Pin aus Ausgang deklariert hast,
kannst Du den mittels Pin setzen was Du willst, der wird nicht HI
(z.B. Set PinB.3 )
Du musst diesen mit Set portB.3 ansprechen
oder PortB = %00000100.

Abfragen muss man ihn mit Pin (x = PinB.3)


Da hab ich mich auch schon dumm gesucht.

Zusammenfasung:

Verwende PIN zum einslesen und
verwende PORT zum ausgeben.

Hmm .. das steht aber auch im Datenblatt *grübel*

it03
29.04.2006, 17:56
mmh ja... ok Pin zum auslesen Port zum setzen. Soweit so gut aber es klappt nicht :-(

Egal welchen Wert ich PortA (PortA ist doch für die Eingangsports, oder?) geben, am Board liegen immer 5V :-(
Habe es auch mit DDRA = 0 versucht und die Werte habe ich auch schon in Binär (&B00000000) eingegeben. Hier mal mein Program:




'################################################# ##
'Testprogramm 6
'für
'RoboterNetz Standard-Roboter Board RBNFRA 1.1
'
'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
'################################################# ##


$regfile = "m32def.dat"

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

Set Porta = 0


Portd.6 = 0 'Schrittmotoren erst mal ausschalten
I2cinit

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
Print I ; " Pin1 " ; Pina.0
Print I ; " Pin2 " ; Pina.1
Print I ; " Pin3 " ; Pina.2
Print I ; " Pin4 " ; Pina.3
Incr I
Loop




End


Aber das kann doch nciht so schwer sein... Irgenwie muss ich da nen dicken Denkfehler haben.

Hanni
29.04.2006, 18:37
mmh ja... ok Pin zum auslesen Port zum setzen. Soweit so gut aber es klappt nicht :-(

Egal welchen Wert ich PortA (PortA ist doch für die Eingangsports, oder?) geben, am Board liegen immer 5V :-(


Mögliche Denkfehler:
Pullupwiderstände (egal ob intern oder extern) und "offener" PIN -> Messbar: 5V
eine externe Beschaltung, die diesen Pin auf einen 5V Pegel zieht
(Grundlagen Digitaltechnik ...)

Mal so als Ansatz ... ob und inwiefern der Code stimmt oder nicht, kann ich nicht sagen ... Bascom liegt mir nicht so ...

it03
29.04.2006, 18:40
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?

Hanni
29.04.2006, 19:21
Pullupwiderstände dienen dazu Eingänge auf definierte Pegel zu ziehen, wenn sie z.B. nicht beschaltet sind (offener Taster z.B.)




+5V
o
|
o
Widerstand
o
|
PIN o-----------------o Taster o-----------o Masse

Anmerkung zur Skizze:

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.

robo_wolf
30.04.2006, 11:52
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.

'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

An den PCF hast du kein PinA oder PortA.
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 ###

darwin.nuernberg
30.04.2006, 12:36
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.

I2csend _adr , &B10000001 ' den PCF8574 stellen 1. und letzter Bit
Diese Art nennt man dann open Drain

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/zeigebeitrag.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.

it03
30.04.2006, 13:09
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

robo_wolf
30.04.2006, 13:25
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 ###