Blinken (Wieso geht der Code nicht?)

Gast #737579
Lesenswert?

#include <avr/io.h>
//#include <avr/interrupt.h>
//#include <avr/pgmspace.h>
//#include <avr/sleep.h>
//#include <inttypes.h>
#include <util/delay.h>


int main (void) {

  DDRA=0xff;
  uint8_t i;

    while(1) {

      PORTA |= (1 << PA0);


      for(i=0;i<1000;i++){

        _delay_ms(1);
      }



      PORTA &= (1 << PA0);


    }


}



die led bleibt leider immer aus! Einzeln an und aus schalten klappt.
Gast #737588
Lesenswert?

@ Spess

>Bei 1 ms wirst du aber nicht viel Blinken sehen.

Die Klammern bei seinen for() Schleifen sind scheisse gesetzt.
Da sieht man es halt nicht so schnell ;)

Ich persönlich bevorzuge dieses

      for(i=0;i<1000;i++)
       {
        _delay_ms(1);
       }

oder

      for(i=0;i<1000;i++) { _delay_ms(1); }
#737590
Lesenswert?

Um die eigentliche Frage zu beantworten: Der Code funktioniert nicht, 
weil du  nur anschaltest, dann eine Verzögerung hast, ausschaltest, und 
dann sofort wieder die Mainloop begonnen wird, dh. eingeschaltet wird. 
Folglich ist nur extrem kurz aus.

@holger: kürzer geht's noch:
1
while(1) {
2
      PORTA = PINA ^ (1 << PA0);
3

4
      for(i=0;i<1000;i++) {
5
        _delay_ms(1);
6
      }
7
}

Und was heisst da, 'scheisse gesetzt'? Das ist vollkommen 
standardkonform.
Gast #737593
Lesenswert?

@ Jemand

Deine Lösung ist natürlich eleganter !

>Und was heisst da, 'scheisse gesetzt'? Das ist vollkommen
>standardkonform.

Ja, mag sein. Aber UNÜBERSICHTLICH. Spess hats doch gerade vorgemacht ;)
Gast #737597
Lesenswert?

@Mario: Ist dir denn jetzt klar geworden, wo deine Fehler sind?

Holger hat zwar schon alles gleich richtig geschrieben,
aber hier trotzdem nochmal:

      PORTA &= (1 << PA0);

ändert rein gar nichts am Zustand deiner LED.
Du verundest das Bit mit 1.

Du willst es ja löschen. Deswegen also die Tilde ~
Damit verundest du mit dem bitweise invertierten Wert.

Zweitens: Du mußt natülich auch nach dem zweiten Statement
eine Pause machen.
#737610
Lesenswert?

>PINx ist nur für Eingänge gedacht. Du meinst sicherlich
>  PORTA = PORTA ^ (1<<PA0);

Nein, denn dann hätte ich PORTA ^= (1<<PA0); geschrieben.

Siehe auch Datenblatt:
"Independent of the setting of Data Direction bit DDxn, the port pin can 
be read through the PINxn Register Bit."

Was natürlich nicht unbedingt heissen muss, dass deine Lösung nicht 
funktioniert, wobei ich mich aber zu erinnern meine, dass das mit dem 
PORTx auslesen, nicht zum gewünschten Ergebnis führt.
#737614
Lesenswert?

Jemand -_- wrote:

> Was natürlich nicht unbedingt heissen muss, dass deine Lösung nicht
> funktioniert, wobei ich mich aber zu erinnern meine, dass das mit dem
> PORTx auslesen, nicht zum gewünschten Ergebnis führt.


Ich glaube du verstehst da etwas miss.
Wenn du PINx liest, erhälst du die Zustände der Portpins, die auf 
Eingang konfiguriert sind. Aus PORTx liesst du die Zustände der 
Portpins, die auf Ausgang geschaltet sind.

PORTx = PORTx ^ 1

ist in diesem Fall richtig.
Gast #737623
Lesenswert?

>Ich glaube du verstehst da etwas miss.
>Wenn du PINx liest, erhälst du die Zustände der Portpins, die auf
>Eingang konfiguriert sind. Aus PORTx liesst du die Zustände der
>Portpins, die auf Ausgang geschaltet sind.

Mit PINx liest man den Zustand der Portpins
der gerade dort anliegt. Dabei ist es EGAL ob Eingang oder Ausgang.

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