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
intmain(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
return0;
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
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.
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?
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?
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?
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.
...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!
>> 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.
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)
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?>>
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!
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
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.
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
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
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 :-)
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
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 :-)
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
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
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
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 ;-)