Forum: Compiler & IDEs Port schalten einfacher


von cron (Gast)


Lesenswert?

hallo
Ich bin gerade in Mikrocontroller Programmierung eingestiegen.
Gibt es eine einfachere und kürzere Methode als wie die?

1
#include <avr/io.h>
2
#ifndef F_CPU
3
#define F_CPU 3686400UL     /* Quarz mit 3.6864 Mhz */
4
#endif
5
#include <util/delay.h>     /* in älteren avr-libc Versionen <avr/delay.h> */ 
6
7
int main( void )
8
{
9
    
10
unsigned short anlage=0001;
11
unsigned short modul= 001;
12
unsigned short kanal= 3;
13
int i;
14
15
if (anlage==0001){
16
if (modul==001){
17
18
  if (kanal==1){
19
  
20
    while (1>i) {                // Endlosschleife
21
    i++;
22
        PORTA ^= ( 1 << PA0 ); // Toggle PB0 z.B. angeschlossene LED
23
        _delay_ms(25);       // Eine Sekunde warten...
24
     PORTA &=~ ( 1 << PA0 ); //Schaltet port aus.  
25
}
26
return 0;  
27
}
28
  
29
30
if (kanal==2){
31
  
32
    while (1>i) {                // Endlosschleife
33
    i++;
34
        PORTA ^= ( 1 << PA1 ); // Toggle PB0 z.B. angeschlossene LED
35
        _delay_ms(25);       // Eine Sekunde warten...
36
     PORTA &=~ ( 1 << PA1 ); //Schaltet port
37
}
38
return 0;  
39
}
40
41
42
43
44
if (kanal==3){
45
  
46
    while (1>i) {                // Endlosschleife
47
    i++;
48
        PORTA ^= ( 1 << PA2 ); // Toggle PB0 z.B. angeschlossene LED
49
        _delay_ms(25);       // Eine Sekunde warten...
50
     PORTA &=~ ( 1 << PA2 ); //Schaltet port aus.  
51
}
52
return 0;  
53
}
54
55
56
....
57
  
58
}
59
}
60
}

Der Code ist noch nicht fertig, soll aber mal so sein das er Daten über 
die usart bekommt mit zahlen von  1 bis 16 drinnen.
Je nachdem soll er eine Port kurz öffnen und wieder schließen.

Gibt es eine kürzere Möglichkeit als 16 mal
1
if (kanal==3){
2
  
3
    while (1>i) {                // Endlosschleife
4
    i++;
5
        PORTA ^= ( 1 << PA2 ); // Toggle PB0 z.B. angeschlossene LED
6
        _delay_ms(25);       // Eine Sekunde warten...
7
     PORTA &=~ ( 1 << PA2 ); //Schaltet port aus.  
8
}
9
return 0;  
10
}
 zu schreiben.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Gleich mal OT:
1
unsigned short anlage=0001;
2
unsigned short modul= 001;
Du hantierst hier mit OKTAL-Zahlen (führende Null).
Ist dir das klar?

Auch
1
return 0;
macht sich bei einem uC in main() nicht so toll.
Wohin soll main() returnen?

Dieser Kommentar
1
int i;    <<<<< Glück gehabt, weil i mit 0 initialisiert wird???
2
:
3
:  
4
    while (1>i) {           // Endlosschleife    <<<<< der Kommentar hier
5
       i++;
6
       :
7
    }
ist falsch. Besser keinen als einen falschen  ;-)
Zudem solltest du dich nicht darauf verlassen, dass i hier tatsächlich 
kleiner 1 ist.

> Gibt es eine kürzere Möglichkeit als 16 mal ... zu schreiben?
Ja. Aber das ist derzeit noch eines deiner kleineren Probleme  ;-)

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.