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 ?
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 ?
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 :-)
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.
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.
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)
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......
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.
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)
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
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.
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 ;-)
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.
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.
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...
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
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.
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 ....
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
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);}
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 ????
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.
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".
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
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.
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;
}
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.