Port schalten einfacher

Gast #1231975
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.
Moderator (Firma: Titel) Persönliche Seite #1232025
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  ;-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.