Forum: PC-Programmierung Richtigen Pin bei STM8S ein- bzw. ausschalten


von Max M. (maxmicr)


Lesenswert?

Hallo,

ich versuche, ein externes LCD-Display blinken zu lassen, in dem ich 
einen bestimmten Port auf High oder Low setze. Dabei will es mir nicht 
gelingen, den richtigen Port zu erwischen.

Mein Programm:
1
#include <iostm8s003f3.h>
2
3
void delay(unsigned int n)
4
{
5
    while (n-- > 0);
6
}
7
8
int main( void )
9
{
10
  unsigned int cycle = 50000;
11
  PD_DDR = 0x20;
12
  PD_CR1 = 0x20;
13
  do{
14
    PD_ODR^=0x20;
15
    delay(cycle);
16
  }while(1);
17
}

Am Ausgang PD5 funktioniert es dann. Aber wie kann ich den Ausgang PD3 
ansprechen?

Nach dem Datenblatt des SO20 pinouts hat PD3 die Nummer 20. Hat das 
damit irgendwas zu tun?

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

http://www.st.com/st-web-ui/static/active/en/resource/technical/document/reference_manual/CD00190271.pdf
Ab Seite 106.

Und dann wäre die Frage wie kommst du auf den Wert:  0x20 ?
Reiner Zufall oder Copy & Paste ?

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Meine Antwort (Link) hast Du mehrfach in verschiedenen Threads bekommen.
In meinem Beispiel "STM32F030F4P6 Module Blink-Test" sind D3 und B5 
verwendet.

Dort wäre auch der Link auf die richtige IDE gewesen (anderer Thread).

: Bearbeitet durch User
von Max M. (maxmicr)


Lesenswert?

Torsten C. schrieb:
> Dort wäre auch der Link auf die richtige IDE gewesen (anderer Thread).

Warum ist die STM-IDE richtiger als die IAR-IDE?

Dennis H. schrieb:
> Reiner Zufall oder Copy & Paste ?

Copy Paste.

Dennis H. schrieb:
> Ab Seite 106.

Danke.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Max M. schrieb:
> Torsten C. schrieb:
>> Dort wäre auch der Link auf die richtige IDE gewesen (anderer Thread).
>
> Warum ist die STM-IDE richtiger als die IAR-IDE?
>
> Dennis H. schrieb:
>> Reiner Zufall oder Copy & Paste ?
>
> Copy Paste.
>
> Dennis H. schrieb:
>> Ab Seite 106.
>
> Danke.

Ich geb dir mal noch 2 Tipps mit auf den Weg.

0x20
kann man auch schreiben als
(1<<5) //entspricht Px5
0x08 kann man auch schreiben als
(1<<3) //entspricht Px3
und ist angenehmer und verständlicher lesbar

Wenn du die Werte von DDR etc. nach dem Init weiter beeinflußen willst 
schreibe nicht direkt deine Pinkonfiguration hinein, da bei dieser 
Methode die alten Werte verloren gehen.

setzen mit DDR |= (1<<5)
löschen mit DDR &= ~(1<<5)

manch intelligenter Compiler wandelt das dann zu Bitbefehlen des 
Controllers um, falls vorhanden.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Max M. schrieb:
> Warum ist die STM-IDE richtiger als die IAR-IDE?

Welche STM-IDE?

Max M. schrieb im Beitrag "Re: Welche IDE für STM8?"
> Ich hab einfach nur übersehen, dass es hier
> auch noch eine STM8-Version gibt

Das ist schon die richtige, die ich auch verlinkt habe.

von Max M. (maxmicr)


Lesenswert?

Torsten C. schrieb:
> Welche STM-IDE?

http://www.st.com/web/catalog/tools/FM147/CL1794/SC1807/SS1747/PF210567

Dennis H. schrieb:
> Ich geb dir mal noch 2 Tipps mit auf den Weg.

Danke, dass hat mein Problem gelöst :)

Edit:

Warum funktioniert das hier eigentlich nicht?
1
int main( void )
2
{
3
  unsigned int cycle = 50000;
4
  PD_DDR |= (1<<3);
5
  PD_CR1 |= (1<<3);
6
  do{
7
    PD_ODR |= (1<<3);
8
    delay(cycle);
9
    PD_ODR = 0x00;
10
  }while(1);
11
}

Beim Debuggen bekommt PD_ODR beim 2. Durchlauf den Wert 0x00, genau das 
gleiche weise ich ja mit
1
PD_ODR = 0x00
 auch zu?

: Bearbeitet durch User
von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Max M. schrieb:
> Torsten C. schrieb:
>> Welche STM-IDE?
>
> http://www.st.com/web/catalog/tools/FM147/CL1794/SC1807/SS1747/PF210567
>
> Dennis H. schrieb:
>> Ich geb dir mal noch 2 Tipps mit auf den Weg.
>
> Danke, dass hat mein Problem gelöst :)
>
> Edit:
>
> Warum funktioniert das hier eigentlich nicht?
>
>
1
> int main( void )
2
> {
3
>   unsigned int cycle = 50000;
4
>   PD_DDR |= (1<<3);
5
>   PD_CR1 |= (1<<3);
6
>   do{
7
>     PD_ODR |= (1<<3);
8
>     delay(cycle);
9
>     PD_ODR = 0x00;
10
>   }while(1);
11
> }
12
>
>
> Beim Debuggen bekommt PD_ODR beim 2. Durchlauf den Wert 0x00, genau das
> gleiche weise ich ja mit
1
PD_ODR = 0x00
 auch zu?

Dein PD_ODR ^= (1<<3) kannste ruhig beibehalten, es dient ja nur zum 
Toggeln dieses einen Bits und läßt die anderen unverändert.

Eventuell reicht auch dieses :
leuchtet dir sicher ein

do{
     PD_ODR |= (1<<3);
     delay(cycle);
     PD_ODR &= ~(1<<3);
     delay(cycle);
}while(1);

Die Schleife würde ohne das zweite delay ja sofort wieder das Bit auf 1 
setzen im ODR.

Einfacher geht es mit
do{
     PD_ODR ^= (1<<3);
     delay(cycle);
}

Eventuell solltest du dich mal mit Logikfunktionen und deren Wirkung 
auseinandersetzen.

http://m.eet.com/media/1061594/max-bb-02.gif

von Max M. (maxmicr)


Lesenswert?

Dennis H. schrieb:
> Die Schleife würde ohne das zweite delay ja sofort wieder das Bit auf 1
> setzen im ODR.

stimmt

Dennis H. schrieb:
> Eventuell solltest du dich mal mit Logikfunktionen und deren Wirkung
> auseinandersetzen.

definitiv.

Danke für deine Hilfe, jetzt klappts wunderbar.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.