Forum: Compiler & IDEs Was mache ich falsch


von Stefan (Gast)


Lesenswert?

Hallo, ich bin AVR anfänger und versuche mich immoment mit der 
Bitmanipulation...wenn ich nun am pin pc5 ein signal bekomme soll der 
pin pb1 high gesetzt werden hier mal mein code :
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main (void) {     
5
6
 /* alle Pins von Port D als Eingang */
7
 DDRD  = 0x00; 
8
 /* alle Pins von Port B als Ausgang */
9
 DDRB  = 0xff;  
10
11
12
  while(1) {              
13
         /* Wenn PC5==1 dann Led ein */
14
  
15
         if ( PINC & (1<<PINC5) ) {
16
         /* Led ein*/
17
         PORTB = 0b00000001;
18
               }
19
          }                       
20
 
21
22
   return 0;                
23
}

danke für jeden tipp!!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Stefan schrieb:
> Was mache ich falsch

Keinen Sinnvollen Betreff zu wählen!

von Stefan (Gast)


Lesenswert?

also ist der code richtig ??

von tork (Gast)


Lesenswert?

Ich kann keinen Fehler entdecken, aber versuch doch mal de
n Pin ohne Abfrage zu setzen.

von Stefan (Gast)


Lesenswert?

okay danke ich versuche es noch mal so^^

von avr (Gast)


Lesenswert?

1
        if ( PINC & (1<<PINC5) ) {
2
         /* Led ein*/
3
         PORTB = 0b00000001;
4
               }
5
        else{ 
6
         /* Led aus*/
7
         PORTB = 0b00000000;
8
               }

Auch mal ausschalten ;)

avr

von Stefan (Gast)


Lesenswert?

bringt es das wirklich??

von Rolf Magnus (Gast)


Lesenswert?

Wenn er wieder ausgehen soll, ja.

von Stefan (Gast)


Lesenswert?

ja aber else wird ansich doch für das einschalten nicht benötigt oder??

von Robert K. (mr_insanity)


Lesenswert?

Stefan schrieb:
> ja aber else wird ansich doch für das einschalten nicht benötigt oder??

Richtig. Aber für das Ausschalten. Wenn Du dem Controller nicht sagst, 
was er machen soll wenn PC5 low ist, geht die LED nicht wieder aus.

von Bernd (Gast)


Lesenswert?

Wie prüfst du denn, ob der Pin bzw. die LED an ist?
Im Simulator, durch die LED, durch Messen?
Vielleicht machst du da was falsch.
Ansonsten sehe ich ein "}" zu viel und das mit dem Return, ist das so 
richtig?
Probier doch mal ein void main(void) { ... } ohne return.

von Günter R. (galileo14)


Lesenswert?

Im wesentlichen mußt du doch mal testen, ob deine LED auf das Setzen des 
Port-B-Pins überhaupt reagiert, d.h. ob du richtig gelötet hast.

Dazu solltest du einfach mal per Programm den PB0 auf low bzw. auf high 
setzen, dann muß die LED leuchten bzw. ausgehen (je nachdem ob du sie 
gegen GND oder Vcc geschaltet hast, Vorwiderstand nicht vergessen!). 
Wenn das funktioniert (und erst dann), kannst du mit dem Einlesen von 
Pins weitermachen und damit die LED steuern. Aber wie die Vorredner 
schon angesprochen haben: es wäre wohl nicht schlecht, wenn du sie auch 
wieder ausschalten könntest (else-Zweig), denn jetzt ginge sie ggf. 
durch den kleinsten Impuls an und leuchtet halt dann weiter, egal was an 
PC5 danach passiert.

von Bernd (Gast)


Lesenswert?

Tschuldigung... ich meinte ein int main(void) { ... } aber ohne return 
in der while(1) !!

von Stefan (Gast)


Lesenswert?

danke für die vielen infos, ich vermute mal stark dass ich auf die 
schnelle einen fehler in der lötung habe^^ Der else-Zweig wird jetzt 
noch ergänzt und dann versuche ich es mit nachgearbeiteter schaltung 
noch einmal...

von Sebastian R. (Gast)


Lesenswert?

Hi!

Das return ist okay, auf dem uC aber nicht so interessant.
Die Anzahl der geschweiften Klammern ist korrekt, wenn auch seltsam 
eingerückt.

Bei diversen AVRs liegt auf PORTC das JTAG, das werksseitig aktiviert 
ist. Dann funktioniert einige der Pins des Ports nicht "einfach" als 
Ein-/Ausgang. Über eine Fuse lässt sich ggf. das JTAG abschalten.

Gruß

von Bernd (Gast)


Lesenswert?

Jetzt habe ich es auch gesehen.
Klammern passen und das return steht unterhalb der while(1) Schleife, 
wird also nie ausgeführt.

von NV (Gast)


Lesenswert?

Du definierst Port D als Eingang, oder nicht?

     /* alle Pins von Port D als Eingang */
     DDRD  = 0x00;

...fragst aber auf Port C ab!

    if ( PINC & (1<<PINC5) )

von Sebastian R. (Gast)


Lesenswert?

Wenn das Programm so mit WinAVR übersetzt wurde und nicht noch extra ein 
Bootloader irgendwas verkurbelt, dann ist es okay.
(Ports sind erstmal alle Eingänge)

Ein Fehler außerhalb des Programmes wäre am Wahrscheinlichsten.
Wie tork schrieb, einfach mal nur

PORTB = 0b00000001;

in die while Schleife und gucken, am richtigen Pin ein high raus kommt.

von fliegermichl (Gast)


Lesenswert?

Hallo,

Zunächst einmal möchte ich noch mal auf die Antwort von NV hinweisen. Da 
ist schonmal der erste Fehler.

Wenn Du an PortD.0 einen Taster hast, der nach Masse schaltet, dann ist 
das Bit in PIND.0 gesetzt, wenn der Taster nicht gedrückt ist und 
gelöscht, wenn der Taster gedrückt ist.

Die Abfrage muss dann also auf ein gelöschtes Bit hin geändert werden.

if ( ! (PIND & 1<<PD0)) {
 // LED anschalten
 PORTB |= 1<<PB0;
} else {
 // LED ausschalten
 PORTB &= ~(1<<PB0);
}

von Ben S. (theben)


Lesenswert?

Was mir noch ein fallen würde ist das du einen eingang ab fragst und 
vorher den pullup nicht setzt
1
/* alle Pins von Port D als Eingang */
2
 DDRD  = 0x00; 
3
/* alle Pull up von Port D setzen */
4
 PortD  = 0xFF;

dies musst du machen wenn du deinen z.b. Taster diereckt an einem µC 
Eingang geschalten hast.

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.