Was mache ich falsch

Gast #2305224
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!!
Gast #2305554
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.
#2305555
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.
Gast #2305866
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...
Gast #2305902
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ß
Gast #2306009
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.
Gast #2309217
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);
}
#2309243
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.

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