www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32 Eingänge einlesen und auswerten


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo zusammen,

ich bin etwas am Verzweifeln. Ich arbeite mit einem STM32F103ZET6 Board 
und habe es geschafft, die an den Ausgängen angeschlossenen LED´s zum 
leuchten zu bringen. Ich weiß auch ungefähr, wie ich einen Port als 
Eingang initialsieren muß. Aber ich weiß nicht, wie ich den Pin dann 
auswerten soll. Wir können mit userem Board mithilfe des Hyperterminals 
über RS232 auch zugreifen, um z.Bsp. Ausgänge zu schalten. Doch leider 
exisieren noch keine Befehle, um Eingänge zu schalten/abzufragen, 
geschweige denn später mal mit VS-Studio und WinForms was damit 
anzustellen. Hat jemand eine Idee, wie man sowas am Besten angeht, oder 
eine gute Lektüre ?

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Am besten denjenigen fragen, der das Programm für den STM32 geschrieben 
hat.

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
wie wertet man gerenell einen eingang aus ? man kann ja die led, die an 
einem pin leuchtet, auch wieder einlesen und auswerten

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
unser board hat z.bsp. 8 eingänge und ausgänge. man könnte doch das 
programm so ab ändern, wenn ich in meinem Programm in VS eine Checkbox 
aktiviere und die entsprechende LED am Ausgang auf dem Board leuchtet, 
zusätzlich noch eine andere, definierte LED leuchtet, oder nicht ?

Autor: Andreas W. (geier99)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
AR schrieb:
> wie wertet man gerenell einen eingang aus ? man kann ja die led, die an
> einem pin leuchtet, auch wieder einlesen und auswerten

In dem Du das IDR-Register vom entsprechen Port einliest und prüfst ob 
das Bit gesetzt ist.Beispiel:
 (GPIOA->IDR & (1<<PinNr)          //  0 oder 2^PinNr
oder
 ((GPIOA->IDR & (1<<PinNr)) >> PinNr  //liefert 0 oder 1.

Das ganze kann man dann noch schön in Makros verpacken :-)

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ich habe ja die outputs mit z.Bsp. "DO0((outputs&(1<<0)));" usw. 
definiert. Muß das IDR anstelle des outputs in dem Fall ?

Autor: Andreas W. (geier99)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
AR schrieb:
> Ich habe ja die outputs mit z.Bsp. "DO0((outputs&(1<<0)));" usw.
> definiert. Muß das IDR anstelle des outputs in dem Fall ?

ich dachte du wolltest Eingänge einlesen.

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ja, möchte ich auch. die frage ist ja, ob ich die eingänge ungefähr 
genauso definieren muß wie die ausgänge.....

Autor: Andreas W. (geier99)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ja, zb. im Modus:
GPIO_Mode_IN_FLOATING  // Eingang offen
oder
GPIO_Mode_IPU          // Eingang  mit Pullup
oder
GPIO_Mode_IPD          // Eingang mit PullDown

anstatt z.B.
GPIO_Mode_Out_PP

Der Rest bleibt gleich. Du must halt nur im GPIOx->CRx Register den 
richtigen mode einstellen.

PS: IDR ist das Input Data Register.

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
und wie würde dann eine if abfrage z.bsp. aussehen ? evtl so:

if

(GPIOA->IDR & (1<<02) == 1)
{
     dann tue irgendwas...........
}

oder wie ?

Autor: Andreas W. (geier99)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
AR schrieb:
> und wie würde dann eine if abfrage z.bsp. aussehen ? evtl so:
>
> if
>
> (GPIOA->IDR & (1<<02) == 1)
> {
>      dann tue irgendwas...........
> }
>
> oder wie ?
fast richtig :-)

 ((GPIOA->IDR & (1<<02))>> 0x02 == 1)

oder

 (GPIOA->IDR & (1<<02) == 4)

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das mit (GPIOA->IDR & (1<<02) == 4) verstehe ich nicht so richtig. Wenn 
man nur 0 oder 1 erhalten kann, kann doch da niemals eine 4 stehen, oder 
? Nur 0 oder 1 könnte da stehen......

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Was willst Du denn nun programmieren, den PC in einem PC Programm?
Oder schreibst Du ein Programm für den Prozessor?

Lese mal ein paar Toutorials über C Programmierung und vor allem was der 
Operator "<<" bedeutet.

Und dann lese in der Definition was für ein Datentyp die Variable 
"GPIOA->IDR" hat nach.

Autor: Flo (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
die frage ist auch,
arbeitest du mit der pheripherie standart library,
oder mit register direktzugriffen?

eingänge auslesen ist nicht schwierig,
dafür gibs ein extra register.

mit der pherstdlib kannst du auch die eingänge einzelnt
oder als port abfragen

alles in allem mal den datasheet zur pheripherie vom stm32
rausholen, um die funktionsweise üerhaupt zu verstehen
(für gpio aktivierung muss man zum beispiel auch noch die entsprechende 
clock aktivieren, also nicht ganz so trivial wie bei avrs)

Autor: Andreas W. (geier99)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
AR schrieb:
> Das mit (GPIOA->IDR & (1<<02) == 4) verstehe ich nicht so richtig. Wenn
> man nur 0 oder 1 erhalten kann, kann doch da niemals eine 4 stehen, oder
> ? Nur 0 oder 1 könnte da stehen......



 (1<<2) = 4  ==>  GPIOA->IDR & 4 ==> das kann nur 0 oder 4 werden

ansonsten die Tipps von meinem Vorgänger befolgen.
http://www.mikrocontroller.net/articles/Bitmanipulation

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

ich bins nochmal,

wenn ich möchte, dass bei PortF der Ausgang z.Bsp. 1 ist, soll bei PortF 
automatisch Ausgang 7 aktiviert werden.

    if((GPIOF->IDR & (1<<05))>> 0x05 == 1)
        {
             ((GPIOF->IDR & (1<<07))>> 0x07 == 1);
        }

Doch wird die Zeile "((GPIOF->IDR & (1<<07))>> 0x07 == 1);" blau 
unterstrichen nach dem compileren mit dem Hinweis: value computed is not 
used.

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
obiges thema hat sich erledigt. inzwischen ist ein neues problem 
aufgetaucht und zwar möchte ich mit:

   uint8_t ucStatus = 0;

ucStatus = GPIO_ReadOutputDataBit(GPIOF,GPIO_Pin_10);
    if(ucStatus == 32)
        {
             GPIOE->BSRR = GPIO_Pin_1;
        }

den zustand eines ausganges abfragen und wenn dieser 1 ist, dann soll 
pin 1 an port e gesetzt werden.

wie frägt man eine 8bit variable ab ? mache ich das so richtig ? glaube 
eher nicht ;-)

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
if(GPIOF->ODR & GPIO_Pin_10)
        {
             GPIOE->BSRR = GPIO_Pin_1;
        }

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
danke für die schnelle antwort,

was bedeutet ->odr

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Siehe Doku
RM0008 Reference_Manual
von ST

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
der eingang wird so aber leider nicht gesetzt

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ich meinte, der ausgang pin 1

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Der Ausgang GPIOF->ODR, GPIO_Pin_10 muss auch erst gesetzt sein

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
dann haben wir uns missverstanden,

ich gebe z.bsp. am ausgang pin10 24v rein, wird runtergeteilt auf 3,3v 
und dann gehts über eingang pin9 zum stm. wenn am ausgang pin10 die 24v 
anliegen, sollte an port3 pin 1 gesetzt werden.

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Gut, dann lerne mal den Unterschied zwischen Ausgang und Eingang.

Wenn Du die Doku von hier:
Beitrag "Re: STM32 Eingänge einlesen und auswerten"
liest, dann weißt Du auch wie man einen Eingang liest.

Wir sind hier alle so kleinlich.

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
wie würde denn so ein eingang in eine 8bit variable z.bsp. abgespeichert 
werden ? was würde in der variable drinstehen

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Der gesamte Eingangsport hat schon mal 16 Bit.
Also nochmal, Doku lesen.

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ja, aber in der doku steht ja nichts drin, wie ich die variable weiter 
verwerte. if(ucStatus == 0x80) dieser ansatz ist denke ich ja falsch, 
oder

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Da könnte dieser Tipp weiterhelfen:
Beitrag "Re: STM32 Eingänge einlesen und auswerten"

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Juhuuu, ich habs hinbekommen...

if((GPIOC->IDR & (1<<13))>> 13 == 1)
        {
             GPIOE->BSRR = GPIO_Pin_1;
        }

so funktioniert es wie ich es haben möchte. Aber was icch nicht 
begreife, warum man mit (1<<13) bitweise von 1 dann 13 mal nach links 
verschiebt und dann wieder mit >> 13mal zurück, das verstehe ich 
nicht...

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
das ganze funktioniert aber nur, wenn die 24v am eingang schon anliegen, 
während das board eingeschlten wird. wenn ich die 24v erst später 
einstecke, geht der ausgang trotzdem nicht an

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ok, habe es noch in die haupt while schleife gepackt und jetzt gehts. 
danke, super forum

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das ist die Kurzform:

if (GPIOC->IDR & GPIO_Pin_13)

schneller, effizienter, ohne schieben, klar und verständlich.

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
hallo,

jemand hat mal die ausgänge als z.bsp. "DO0((outputs&(1<<0)))" für 
outputs deklariert, sodass man mit einem stringvergleich über teraterm 
die eingänge per rs232 ein und ausschalten kann. wie könnte so eine 
definition für eingänge aussehen ?
ich möchte mal später das ganze in c# mit winforms integrieren.

Autor: Walter S. (avatar)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Die Natur hat hat ja durch trial and error sogar uns Menschen 
hervorgebracht, also warum sollte man nicht auch auf diese Weise ein 
Programm schreiben können,
dauert halt ein paar Jährchen ....

Autor: Reinhard B. (brainstorm)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo AR,

Du weißt ja jetzt wie man Ausgänge setzt und Eingänge einliest. Wenn du 
diese Funktionen über den UART nutzen willst, dann musst du dir dazu ein 
Protokoll überlegen. Beim Empfangen kannst du das dann - wie du selbst 
schon richtig erkannt hast - z. B. per Stringvergleich zerpflücken und 
die entsprechenden Aktionen ausführen.

Aber etwas Hirnschmalz wirst du da selber reinstecken müssen. Würde mich 
wundern, wenn sich jemand findet, der dir das bis ins Detail vorbetet. 
Vielleicht findest du ja irgendwo ein anderes Projekt, bei dem 
irgendetwas über UART gesteuert wird und kannst dir dort was abschaun.

mfg

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
kann mir mal jemand bitte erklären, was daran falsch ist an dem befehl:

#define  RELAIS(a)    {if(a>0)?(GPIOE->BSRR  |= GPIO_Pin_6) 
else(GPIOE->BRR  |= GPIO_Pin_6);}

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das Fragezeichen muss weg

Autor: AR (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
genau. so gehts jetzt:


#define  RELAIS(a)    {if(a>0)GPIOE->BSRR  |= GPIO_Pin_6; else 
GPIOE->BRR  |= GPIO_Pin_6;}

Autor: ar (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Habe mich nun mit dem Einlesen der Eingänge beschäftigt. Habe Sie in 
Ride7 definiert und kann nun über Stringvergleich im Hyperterminal 
abfragen, ob der entsprechende Eingang gesetzt ist oder nicht. Ich 
blicke aber immer noch nicht, wie ich diesen String dann über UART an 
meine C# WinForms Anwendung senden kann und dort ein Ereignis auslösen 
?? Kann mir bitte jemand weiterhelfen ????

Autor: Markus Müller (mmvisual)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
In der STM32F10x_StdPeriph_Lib_V3.5.0 von ST (Downloadbar bei ST) gibt 
es 12 Demo-Programme wie man einen UART nutzen kann.
Darunter sogar eines "HyperTerminal_Interrupt".

Arbeite mal die Demos alles durch.

Autor: ar (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ist das Lib nicht mehr verfügbar ?

Aber wenn ich im Hyperterminal die Eingänge bereits abfragen kann, dann 
müßte ich doch in C# den Befehl "nur" senden und wieder empfangen. Es 
soll der Zustand eines bestimmten I/O Ports abgefragt werden und dann in 
WinForms z.Bsp. eine PictureBox "aufleuchten".

Autor: ar (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hab das Lib gefunden. Muß es mal anschauen, blick da noch ned so ganz 
durch

Autor: ar (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
ich komm irgendwie nicht weiter....

Autor: Noname (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Um offen zu sein wundert mich das nicht.
Deine Fragen und Codebeispiele deuten darauf hin das Dir wesentliche 
Grundlagen fehlen, Datenblattstudium nur rudimentär erfolgt ist und Du 
sehr wenig Erfahrung hast.

Das nächste was Du tun solltest ist aus meiner Sicht:
1. Lerne Fragen vollständig und verständlich zu formulieren. Bei einem 
"ich komm irgendwie nicht weiter...." können wir allenfalls mitfühlend 
den Kopf neigen, Dich aber nicht weiterbringen. Wir müssen wissen, wo es 
hakt.

2. Lies ein C-Buch und das Datenblatt. Solche Code-Snippets wie
#define  RELAIS(a)    {if(a>0)GPIOE->BSRR  |= GPIO_Pin_6; else
GPIOE->BRR  |= GPIO_Pin_6;}
deuten auf einen Mangel in mindestens einer Hinsicht hin.
Das Datenblatt erklärt eindeutig, das BSRR resp. BRR jeweils eines oder 
mehrere derjenigen Bits löschen oder setzen die im Registerwert auf 1 
stehen. Das verodern ist unnötig, da beim lesen sowieso alle Bits auf 0 
stehen.

Nun, das ist alles kein Beinbruch und soll Dich nicht entmutigen. Jeder 
fängt mal an und macht dabei Fehler. Aber gib Dir bitte ein wenig mehr 
Mühe. Mir kommst Du wie ein Schüler vor, der gerade versucht den 
Lernaufwand zu minimieren.

Autor: ar (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hab mal einiges durchgelesen und versucht mich schlauer zumachen. Ich 
glaube, mit dem folgenden Beispiel was ich gefunden habe komme ich 
weiter, nur funktioniert es bei mir noch nicht so richtig:

        private void timer1_Tick(object sender, EventArgs e)
        {

            string input = "";
            string[] lesen;


            lesen = new string[8];

            serialPort.WriteLine("in 0\r\n");

            bool flag = false;
            do
            {
                input = serialPort.ReadExisting();
                flag = input.Contains("in 0 = 1");
            }
            while (flag != true);

            MessageBox.Show("Richitg");
            textBox2.Text = input;

        }

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net