Richtigen Pin bei STM8S ein- bzw. ausschalten

OP #4203483
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?
Persönliche Seite #4203533
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.
OP #4203541
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?
Persönliche Seite #4203631
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

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