STM32 Eingänge einlesen und auswerten

Gast #2616030
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 ?
Gast #2616041
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 ?
#2616049
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 :-)
#2616075
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.
(Firma: EleLa - www.elela.de) #2616203
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.
Gast #2616207
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)
Gast #2620419
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.
Gast #2620661
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 ;-)
Gast #2620711
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.
Gast #2620871
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...
Gast #2621081
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.
#2621324
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
Gast #2654016
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 ????
Gast #2655851
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".
Gast #2656110
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
1
#define  RELAIS(a)    {if(a>0)GPIOE->BSRR  |= GPIO_Pin_6; else
2
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.
Gast #2656198
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;

        }
Gast #4896790
Lesenswert?

hallo zusammen

kann jemand von Ihnen vielleicht mir erklären. Was bedeutet eigentlich 
diese Zeile ((GPIOC ->IDR& 0x80)==0x00) und die Beide Termen CR1, CR2

LCD_Glass_Init () ;                      //LCD Initialisierung
LCD_Glass_Clear () ;
GPIOC ->DDR =0x00;
GPIOE -> DDR =0xFF;
GPIOC ->CR1 =0x00;
GPIOE ->CR2 = 0xFF;
While (1) {

      If
  ((GPIOC ->IDR& 0x80)==0x00)
      {
      LCD_Glass_DisplayString (“EIN”);
      Delay_ms(100) ;
     }

Else

{
      LCD_Glass_DisplayString (“AUS”);
      Delay_ms(100) ;
}
}
}


Danke
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren