LED per Schalter Ein - Aus // Problem mit serieller Schnittstelle


hallo,

ich bin noch sehr neu auf dem gebiet und habe nur "basic"-programmierkenntnisse.
ich arbeite mit einem arduino uno r3

zur Übung und für den einstieg wollte ich den beispielsketch "blink" etwas erweitern.
die idee war pin13 und gnd eine led anzuschliessen und pin 10 einen taster, der nicht im losgelassenem zustand die led aus und im gedrückten zustand die led einschalten sollte, sondern pro druckaktion den zustand der led ändern soll.

bisher habe ich das mit einer verschachtelten if-schleife gelöst, aber ich glaube es müsste doch hierfür auch eine kürzer methode geben um den zustand von pin13 bei einem knopfdruck ändern zu können? (das ist meine frage ;-) )

hier der code mit dem es bereits funktioniert:
code: [select]
void setup() {
  ddrb = 0b00100000; // pin13 output, rest input
  portb = 0b00000100; // pin13 auf low - pin10 pull-up aktiviert
}

void loop() {
if ( !(pinb & (1<<pinb2)) ){ // wenn bit nr. 2 gesetzt
     
      if(pinb & (1<<pinb5)){
       
         portb &= ~(1<<portb5); // pin13 auf high
      }
      if (!(pinb & (1<<pinb5))){
       portb |= (1<<portb5); // pin13 low
      }
    delay(200); // für die verweilzeit beim drücken
}   
}
 


nun zu meinem problem:
möchte ich mir pc-bildschirm über den serialmonitor den zustand der led ausgeben lassen (über serial.print("led an")) funktioniert leider garnichts mehr, allerdings ist mir aufgefallen, wenn der compiler und der upload abgeschlossen sind und ich im anschluss den serialmonitor starte, blinkt die led ein paar mal sehr schnell auf

hier der code mit der textausgabe, der nicht funktioniert:
code: [select]
void setup() {
  ddrb = 0b00100000; // pin13 output, rest input
  portb = 0b00000100; // pin13 auf low - pin10 pull-up aktiviert
}

void loop() {
  serial.begin(9600);
if ( !(pinb & (1<<pinb2)) ){ // wenn bit nr. 2 gesetzt
     
      if(pinb & (1<<pinb5)){
       
         portb &= ~(1<<portb5); // pin13 auf high
         serial.println("led an");
      }
      if (!(pinb & (1<<pinb5))){
       portb |= (1<<portb5); // pin13 low
       serial.println("led aus");
      }
    delay(200); // für die verweilzeit beim drücken
}   
}
 


vom prinzip ist das doch eigentlich man anfänglicher code nur mit serial erweitert?

vielen dank schonmal für die hilfe!

das serial.begin() gehört in setup(). das muss man nur einmal machen.

du kannst ein bit ganz einfach toggeln wenn du eine 1 auf das eingangs-register pinn schreibst. das ist auch die schnellste möglichkeit ein bit zu toggeln, da keine lese-operation nötig ist. siehe datenblatt seite 77:
quote

writing logic 1 pinxn toggles value of portxn, independent on value of ddrxn.


ansonsten ein xor mit 1 auf den wert des ausgangs-register portn (also portb ^= (1<<pb5)). das invertiert auch das entsprechende bit, da die wahrheits-tabelle wie folgt ist:
0 0 -> 0
0 1 -> 1
1 0 -> 1
1 1 -> 0


du hast übrigens bei den pin makros eine kleine inkonsistenz. du verwendest mal pinb5 und mal portb5. das existiert beides und ist gleichwertig. es ist einfach die nummer des pins - hier 5. eindeutigsten ist aber vielleicht wenn du statt dessen pb5 schreibst. dadurch verwechselt man es nicht einfach mit pinb und portb. das ist auch die variante die in beispielen i.d.r. verwendet wird.


Arduino Forum > International > Deutsch (Moderator: uwefed) > LED per Schalter Ein - Aus // Problem mit serieller Schnittstelle


arduino

Comments

Popular posts from this blog

opencv3, tbb and rasp pi 2 - Raspberry Pi Forums

small ethernet problem - Raspberry Pi Forums

Multithumb configuration params not working? - Joomla! Forum - community, help and support