Forum: Compiler & IDEs Controler aktivieret falsche Pins


von R. S. (operaiter)


Lesenswert?

Hallöchen alle zusammen,

bei folgdendem Programmcode schaltet mein Atmega 16 den Port D als 
Ausgang, sprich auf den Pins von Port D liegen 5 Volt an.

Ist mein Code so korrekt?
1
#include <avr/io.h>          
2
 
3
int main (void) {            
4
 
5
           
6
  DDRB=0xff;     //Port B auf Ausgang stellen
7
  PORTB = (1<<PB0) | (1<<PB3);   //Relay 1 u 4 aktivieren 
8
9
  DDRC=(0<<DDC0) | (0<<DDC1) | (1<<DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5) | (1<<DDC6) | (1<<DDC7);     //Test SteuerungsPort auf Eingang stellen Pin0 und 1
10
11
12
   while(1) {               
13
     
14
   if ( PINC & (1<<PINC0) ) {
15
        PORTB = (0<<PB0);}     //Relay 1 auschalten, wenn Taster 1 gedrückt (Pin 0 an Port C)
16
   if ( PINC & (1<<PINC1) ) {
17
         PORTB = (0<<PB3);}     //Relay 4 auschalten, wenn Taster 2 gedrückt. (Pin 1 an Port C)
18
19
20
21
   }                        
22
 
23
  
24
   return 0;               
25
}

Relay 2,3 werden aktuell über den Code noch nicht angesprochen. Ziel ist 
>erstmal< dass zu beginn Relay 1,4 angehen, und bei drücken des 
Schalters wieder ausgehen. ... ... Später sollensie auch mal wieder 
angehen, aber erstmal kleine Schritte ;-)

Bin ich zu blöd?! :P

Wäre dankbar für eure Hilfe.

~OP

von Karl H. (kbuchegg)


Lesenswert?

Da du Port D nicht benutzt, sind seine Pins Eingangspins. Ein 
Eingangspin kann so ziemlich jeden Zustand annehmen, der sich zufällig 
ergibt, wenn an ihm nicht angeschlossen ist.

von R. S. (operaiter)


Lesenswert?

Karl heinz Buchegger schrieb:
> Da du Port D nicht benutzt, sind seine Pins Eingangspins. Ein
> Eingangspin kann so ziemlich jeden Zustand annehmen, der sich zufällig
> ergibt, wenn an ihm nicht angeschlossen ist.

Das stört mich ja eigentlich nochnicht einmal.

Das Problem ist, dass die Pins an Port B nicht aktiviert werden, sprich 
keine 5 Volt anliegen.

Würde da meine 5Volt anliegen, wäre mir wahrscheinlich garnicht 
aufgefallne, dass auf Port D 5 Volt liegen.

Wie Port D auf 0V schalten?
1
DDRD=0xff;
2
PORTD = (0<<PB0)|(0<<PB1)|(0<<PB2)|(0<<PB3)|(0<<PB4)|(0<<PB5)|(0<<PB6)| (0<<PB7)|;

So müsste Port D einen definierten zustand erhalten, der ihm sagt, dass 
er 0 Volt schalten soll oder?

von Karl H. (kbuchegg)


Lesenswert?

Da du den Port C benutzt:
Hast du mit der JTAGEN Fuse das JTAG am Port C abgeschaltet?

von Karl H. (kbuchegg)


Lesenswert?

So
1
       PORTB = (0<<PB0);}     //Relay 1 auschalten, wenn Taster 1 gedrückt (Pin 0 an Port C)

kann man einen einzelnen Pin nicht gezielt auf 0 schalten.
Eine 0 kannst du nach links schieben sooft du willst, sie bleibt 
trotzdem 0.

Diese Anweisung ist also nur eine glorifizierte Schreibweise für
1
       PORTB = 0;


Ein Bit wird gezielt so gesetzt
1
      PORTB |= ( 1 << PB0 );
und so gelöscht
1
      PORTB &= ~( 1 << PB0 );

Siehe auch AVR-GCC-Tutorial

Aber schalte erst mal JTAG aus, damit die C-Pins wieder ihre normale 
Funktion bekommen.

Wie sind eigentlich deine Taster verschaltet? Schalten die nach Masse 
oder nach Vcc?

von R. S. (operaiter)


Lesenswert?

AVR-GCC Tutorial habe ich in gedruckter Form hier vormir liegen. 
Au0erdem 20 andere Tutorials ;-) Nur irgendwie hapert es ein bisschen...

Ich will mal andersherum anfagen:

Was muss ich tun, damit ich alle zusatz Funktionen des Controlers 
deaktivieren kann? Ihc brauche erstmal kein I2C UART ADC usw... Ich 
würde einfach gerne alle Ports wie normale Port nutzen.

Bei den FuseBits habe ich nun einen Haken vor JTAG habe ich gerade 
entfernt. Wie schalte ich den Rest ab?! :-d Noch brauche ihc nur ISP!! 
:-D


Bisher habe ich nochgarkeinen Taster auf das Board gelötet ;-) Ich 
bekomme ja nochnichteinmal einfach so Strom auf die Pins, sprich die 
Ausgabe angesteuert. Wenn die Ausgabe läuft widme ich mich der Eingabe 
;-)

Was wenn ic mehrere Pits setzen will auf einmal?


1
   PORTB |= ( 1 << PB0 ) |= ( 1 << PB1 );

?!

Danke!

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

PORTx |= (1<<Pxx) | (1<Pxx) | ...
und
PORTx &= ~(1<Pxx) | ~(1<Pxx) | ...

von R. S. (operaiter)


Lesenswert?

1
#include <avr/io.h>          
2
 
3
int main (void) {            
4
 
5
           
6
  DDRB=0xff;     //Port B auf Ausgang stellen
7
  PORTB |= (0<<PB0);   //Port oben Linksmit Strom!?!!!!
8
9
10
   while(1) {               
11
     
12
13
14
   }                        
15
 
16
  
17
   return 0;               
18
}

Durch diesen Code müsste ich doch an dem Pin GANZ OBEN Links nun +5Volt 
messen können oder?

von Klaus W. (mfgkw)


Lesenswert?

nö, wieso?
Mach doch PORTB=255;
Dann ist jedes Bit in B an.

von Klaus W. (mfgkw)


Lesenswert?

PS: Wenn du eine 0 nach links schiebst, egal wie oft, kommt nur 0 raus.
Das ist übrigens keine Erfindung von mir; daß man mit 0<<irgendwas
keine Bits setzen kann, wurde dir hier doch schon kund getan.

von R. S. (operaiter)


Lesenswert?

...okay habe nun einfach mal meinen PC neugestartet, den Atmega 
gelöscht, und dann neu programmiert.

Endlich liegt NUR auf PB0 Strom :-D

Doche eine Frage hätte ich noch ;-)

Was kann ich an dem Gerät noch alles deaktivieren? Kann ich sonst auf 
alle Ports einfach so zugreifen?!

Danke!

von STK500-Besitzer (Gast)


Lesenswert?

Wie wäre es mit ein paar Bauklötzen?

von Karl H. (kbuchegg)


Lesenswert?

R. S. schrieb:
>
1
>   PORTB |= (0<<PB0);   //Port oben Linksmit Strom!?!!!!
2
>
>
> Durch diesen Code müsste ich doch an dem Pin GANZ OBEN Links nun +5Volt
> messen können oder?

Solange du nicht von deiner heiß geliebten 0 Abschied nimmst: Nein

> Was muss ich tun, damit ich alle zusatz Funktionen des Controlers
> deaktivieren kann?

JTAGEN abschalten reicht.

> Bisher habe ich nochgarkeinen Taster auf das Board gelötet

Dann solltest du das tun!
Einen Eingang lässt man nicht einfach offen in der Luft rumhängen ohen 
dafür zu sorgen, dass er immer irgendein definiertes Potential hat.

> AVR-GCC Tutorial habe ich in gedruckter Form hier vormir liegen.

Dann lies dir auch mal den I/O Abschnitt aus dem AVR Assembler-Tuorial 
durch. Das ist zwar für Assembler, aber die technologischen Grundlagen 
sind für C auch nicht anders (ist ja trotzdem derselbe Prozessor).
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen
Da steht eigentlich so ziemlich alles drinn, was man am Anfang über die 
Anschaltung von externer Hardware wissen muss.

Wie hast du eigentlich deine Relais angeschlossen? Mir schwant 
Schlimmes.

von Karl H. (kbuchegg)


Lesenswert?

R. S. schrieb:

> Endlich liegt NUR auf PB0 Strom :-D

Nomenklatur:

Da liegt Spannung!
Strom fließt. Allerdings nur dann, wenn es auch einen Verbraucher gibt.

Ist wie bei deiner Wasserleitung:
Da steht eine bestimmte Wassersäule (=Spannung).
Aber das Wasser fließt nur dann, wenn auch der Hahn (=Verbaucher) offen 
ist (=Strom; Wassermenge = Ampere, die fliessen)

von Karl H. (kbuchegg)


Lesenswert?

Nils S. schrieb:
> PORTx |= (1<<Pxx) | (1<Pxx) | ...
> und
> PORTx &= ~(1<Pxx) | ~(1<Pxx) | ...

Fast richtig.
1
PORTx &= ~( (1<<Pxx) | (1<<Pxx) | ... );

von Karl H. (kbuchegg)


Lesenswert?

R. S. schrieb:
> AVR-GCC Tutorial habe ich in gedruckter Form hier vormir liegen.
> Au0erdem 20 andere Tutorials ;-)

> Was wenn ic mehrere Pits setzen will auf einmal?
>
>
1
   PORTB |= ( 1 << PB0 ) |= ( 1 << PB1 );

Du sollst die Tutorials nicht ausdrucken, sondern lesen und auch die 
Beispiele studieren.
In
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
findet sich bei den Beispielen auch eines mit genau der korrekten 
Syntax, die du suchst.

von Julian O. (juliano)


Lesenswert?

R. S. schrieb:
> Was kann ich an dem Gerät noch alles deaktivieren? Kann ich sonst auf
> alle Ports einfach so zugreifen?!

ADC, I2C, UART etc sind in der Regel nach dem Reset bereits deaktiviert 
und müssen durch das Schreiben von Werten in Steuerregister aktiviert 
werden. Für genauere Infos (Welche Register etc.) sei dir ein tieferer 
Blick ins Datenblatt geraten.

Allgemein wäre es vermutlich sinnvoller das Datenblatt auszudrucken als 
zehn Tutorials!

von R. S. (operaiter)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wie hast du eigentlich deine Relais angeschlossen? Mir schwant
> Schlimmes.

Über einen Transistor ;-) :-D Keine Sorge :P

von R. S. (operaiter)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wie sind eigentlich deine Taster verschaltet? Schalten die nach Masse
> oder nach Vcc?

Wie würde es mir den besser helfen?! :-D

Ich überleg nämlich gerade auch wie ich den Schalter besser anlöte :-)
Ich möchte keine Internen Pull Up wiederstände nutzen, da ich angst habe 
diese mal versehentlich umzustellen, und dadurch zu deaktivieren... :-D


Habt erbarmen mit mir... :-D

von Karl H. (kbuchegg)


Lesenswert?

R. S. schrieb:
> Karl heinz Buchegger schrieb:
>> Wie sind eigentlich deine Taster verschaltet? Schalten die nach Masse
>> oder nach Vcc?
>
> Wie würde es mir den besser helfen?! :-D

Nach Masse.
Weniger Hardware, die du dranpappen musst.

> Ich überleg nämlich gerade auch wie ich den Schalter besser anlöte :-)
> Ich möchte keine Internen Pull Up wiederstände nutzen, da ich angst habe
> diese mal versehentlich umzustellen, und dadurch zu deaktivieren... :-D

Unsinn.
Sauber programmieren, immer nur die Pins antatschen, die man antatschen 
will und schon ist das alles kein Problem.

Ein bischen mitdenken und Vorsicht walten muss man beim Programmieren 
immer. Egal ob es sich um Pullup Widerstände handelt oder nicht. Damit 
einher geht Codegestaltung, die einen Fehler sehen lässt, bzw. das man 
sich selbst Hilfen baut, die es einem schwerer machen, Fehler zu 
begehen.

von Klaus W. (mfgkw)


Lesenswert?

R. S. schrieb:
> Wie würde es mir den besser helfen?! :-D

Prinzipiell ist es Jacke wie Hose, ob die Pins einen Pullup haben
und vom Schalter gegen Masse gezogen werden, oder einen Pulldown
und vom Schalter gegen VCC gezogen werden.
(Es gibt natürlich dezente Unterschiede wie Stromverbrauch etc, aber
das wird dich im Moment nicht jucken.)

Du musst dir nur klar sein, wie es ist und dementsprechend abfragen.

Pullup und Schalter gegen Masse = Pin ist low bzw. 0 beim Drücken
Pulldown und Schalter gegen VCC = Pin ist high bzw. 1 beim Drücken

von Andreas F. (aferber)


Lesenswert?

R. S. schrieb:
> Ich möchte keine Internen Pull Up wiederstände nutzen, da ich angst habe
> diese mal versehentlich umzustellen, und dadurch zu deaktivieren... :-D

Dann müsstest du auch Angst haben, dass du versehentlich mal die 
Richtung des Pins umschaltest und das nächste Mal, wenn jemand die Taste 
etwas länger drückt, raucht dir der µC ab. Also dürftest du 
konsequenterweise garkeine Taste anschliessen ;-)

Es gibt bei µC-Anwendungen häufig den Fall, dass durch Programmfehler 
Hardware zerstört werden kann. Da ist dein Fall der versehentlich 
deaktivierten Pullups am Taster noch harmlos, allerhöchstens kann es 
passieren, dass der gelesene Wert mit der Tasterstellung nicht mehr 
wirklich viel gemeinsam hat.

Aber nicht verzagen, ein wenig Sorgfalt hilft viel, und am Anfang zum 
Testen und Ausprobieren nicht gleich teure und empfindliche externe 
Bauelemente an den Controller hängen, so dass es nicht allzusehr 
schmerzt, wenn doch mal der magische Rauch entweichen sollte ;-)

Andreas

von Karl H. (kbuchegg)


Lesenswert?

Andreas Ferber schrieb:
´
> Aber nicht verzagen, ein wenig Sorgfalt hilft viel, und am Anfang zum
> Testen und Ausprobieren nicht gleich teure und empfindliche externe
> Bauelemente an den Controller hängen, so dass es nicht allzusehr
> schmerzt, wenn doch mal der magische Rauch entweichen sollte ;-)

Nachtrag:
Daher arbeiten auch die meisten Tutorials am Anfang mit LED an den 
Ausgängen. Das schlimmste was da passieren kann: Die LED leuchtet, wenn 
sie nicht leuchten soll bzw. umgekehrt. Da passiert dann nicht viel, 
wenn man sich mal vertan hat und das ist immer noch besser, als wie wenn 
ein Relais durch einen Programmfehler schaltet wenn es nicht schalten 
sollte und in 2 Zehntelsekunden das Aquarium leerpumpt :-)

von R. S. (operaiter)


Lesenswert?

Ja mit LED's arbeite ich auch sehr viel...

Als ich das erste mal einfach ALLE Ausgänge aktivierte mit LED.

Dann LED hinter Transistor.

LED gegen Relai ersetzt.

Da hinter nun auch ne LED :-D

Die ganze Platine besteht hier bald aus leuchtenden LED ;-) Muss mal 
gucken obs bei Ebay kein Big-Pack davon gibt ;-)

Ich werde meinen Taster gleich gegen VCC schalten, und einen internen 
PullUp wiederstand verwenden. Denke das sollte es tun... (Falls ich 
alles richtig verstanden habe... :-D

Ich baue gerade an einem Projekt, welches nach möglichkeit Solar 
betrieben werden soll, in diesem Sinne wäre es für mich auch doch 
interessant zuwissen welche möglichkeit Stromsparender wäre?! :-D

Danke <3

von Karl H. (kbuchegg)


Lesenswert?

R. S. schrieb:

> Ich werde meinen Taster gleich gegen VCC schalten, und einen internen
> PullUp wiederstand verwenden. Denke das sollte es tun... (Falls ich
> alles richtig verstanden habe... :-D


Anders rum.
Wenn du die internen Pullup Widerstände benutzt, dann schaltet der 
Taster nach Masse durch. Die Pullup halten den Pin auf Vcc, wenn der 
Taster nicht gedrückt ist und der gedrückte Taster zieht die Spannung 
nach unten auf GND (daher auch: Pull-UP. Die Widerstände ziehen die 
Spannung HOCH auf +5V Volt)

> Ich baue gerade an einem Projekt, welches nach möglichkeit Solar
> betrieben werden soll, in diesem Sinne wäre es für mich auch doch
> interessant zuwissen welche möglichkeit Stromsparender wäre?! :-D

Zíemlich egal.

Aber siehs mal so: Die internen Pullup kannst du programmgesteuert auch 
wieder abschalten, wenn du den µC schlafen legst (und dort, beim 
Schlafenlegen holt man sich die Stromersparnis). Die externen kannst du 
aber per Programm nicht auslöten lassen :-)

von R. S. (operaiter)


Lesenswert?

Karl heinz Buchegger schrieb:
> Die externen kannst du
> aber per Programm nicht auslöten lassen :-)

Ich will ja jetzt echt nicht kleinlich werden, aber...

doch geht ziemlich gut sogar. Einfch ein Servo, welches den Wiederstand 
auf zwei Kontakte legt ...<3

Aber ob das dann Stromsparend ist ;-)

Also:

Ich soll den Taster nun auf GND löten, und an den MC. Darüberhinaus geht 
vom MC noch ein Kabel an VCC. (Selber Pin also)

Ist das so richtig verstanden?

Mensch ich muss euch ja bald schon nerven... :-d

von Andreas F. (aferber)


Lesenswert?

R. S. schrieb:
> Die ganze Platine besteht hier bald aus leuchtenden LED ;-) Muss mal
> gucken obs bei Ebay kein Big-Pack davon gibt ;-)

Es kann nie schaden, ein paar (oder auch ein paar mehr ;-) 
Standard-08/15-LEDs auf Lager zu haben, die werden ja nicht schlecht. 
Nichts ist nerviger als wenn der Bastelsonntag am Ende an einem 
fehlenden Cent-Bauteil scheitert ;-)

> Ich werde meinen Taster gleich gegen VCC schalten, und einen internen
> PullUp wiederstand verwenden. Denke das sollte es tun... (Falls ich
> alles richtig verstanden habe... :-D

Nein, für einen Pull Up ist es immer erforderlich, den Taster gegen 
Masse zu schalten. Der Pull-Widerstand und der Taster müssen immer 
gegeneinander arbeiten, nicht parallel.

> Ich baue gerade an einem Projekt, welches nach möglichkeit Solar
> betrieben werden soll, in diesem Sinne wäre es für mich auch doch
> interessant zuwissen welche möglichkeit Stromsparender wäre?! :-D

Der Pullup verbraucht nur dann Strom (von Leckströmen mal abgesehen), 
wenn der Taster geschlossen ist. Der interne Pullup ist relativ gross, 
entsprechend gering ist der Strom, daher ist das schon eine recht 
stromsparende Variante.

Wenn das das gleiche Projekt wie das mit den Relais ist, dann ist der 
Stromverbrauch durch die Taster eher Peanuts gegenüber den Relais ;-) 
(mal davon ausgehend dass nicht der Taster alle zwei Sekunden gedrückt 
und das Relais dreimal im Jahr für 'ne Sekunde eingeschaltet wird ;-)

Andreas

von Karl H. (kbuchegg)


Lesenswert?

R. S. schrieb:

> Ich soll den Taster nun auf GND löten, und an den MC.

Ja

> Darüberhinaus geht
> vom MC noch ein Kabel an VCC. (Selber Pin also)

Nö.

Pin - Taster - Masse

und alles ist paletti.

Ich denke du hast die Tutorials studiert? :-)
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Pullup-Widerstand

Bild rechts am Fensterrand

von Andreas F. (aferber)


Lesenswert?

R. S. schrieb:
> doch geht ziemlich gut sogar. Einfch ein Servo, welches den Wiederstand
> auf zwei Kontakte legt ...<3

Aber nur wenn die Platine über Kopf hängt, oder der Strom ausreicht, 
dass nicht nur das Lötzinn schmilzt, sondern gleich der Widerstand 
verdampft ;-)

Und am wieder einlöten beim Aufwachen dürfte es endgültig scheitern ;-)

Andreas

von R. S. (operaiter)


Lesenswert?

Karl heinz Buchegger schrieb:

>
> Ich denke du hast die Tutorials studiert? :-)
> 
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Pullup-Widerstand
>
> Bild rechts am Fensterrand

AHHH das sieht ja schon "Normal"aus ;-)

Ich habe dieses Tutorial grad zwischen:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Unten bei Taster und Schalter ist das bissel Kacke.. .:-D


Aber mit deinem Bild weiß ich ja was ich zu tun hab <3

von R. S. (operaiter)


Lesenswert?

Andreas Ferber schrieb:
> R. S. schrieb:
>> doch geht ziemlich gut sogar. Einfch ein Servo, welches den Wiederstand
>> auf zwei Kontakte legt ...<3
>
> Aber nur wenn die Platine über Kopf hängt, oder der Strom ausreicht,
> dass nicht nur das Lötzinn schmilzt, sondern gleich der Widerstand
> verdampft ;-)
>
> Und am wieder einlöten beim Aufwachen dürfte es endgültig scheitern ;-)
>
> Andreas

Wer spricht vom Löten?! :-D

Lötest du in deiner FE rum, wenn du die raußmachst? Nö ein Hebel trennt 
ne Verbindung ^^ ...

Und an den Hebel könnte man auch ein Servo packen.

Nun ersetze man die FE gegen einen Wiederstand :-D

... Naja lassen wir das mal ;-)

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.