Forum: Compiler & IDEs PORT Dauerhaft setzen


von Marco M. (marco1987)


Lesenswert?

Guten Morgen habe mal eine ganz einfache Frage,

ich will einen Port dauerhaft auf 5 V schalten nur wenn eine 
Abbruchbedingung kommt, dann will ich den Ausgang auf dauerhaft 0 V 
schalten lassen.

Irgendwie schaltet der mit dem befehl immer nur kurz einne Impuls dann 
is er wieder low:


PORTD |=(0<<PD2);

von Marian (Gast)


Lesenswert?


von Marco M. (marco1987)


Lesenswert?

Nein so geht es wie gesagt leider nicht , hab doch auch schon das 
tutorial durchgesehen er macht nur einen Impuls dann wieder low. Ich 
schreibe den befehlt gleich zu anfang der main nach der definition der 
ports

von Johannes M. (johnny-m)


Lesenswert?

Marco Müeller wrote:
> Nein so geht es wie gesagt leider nicht , hab doch auch schon das
> tutorial durchgesehen er macht nur einen Impuls dann wieder low. Ich
> schreibe den befehlt gleich zu anfang der main nach der definition der
> ports
Hast Du immer noch nicht kapiert, dass es völliger Unfug ist, hier 
irgendwelche Programmschnipsel verbal zu beschreiben? Warum zum Geier 
schickst Du nicht den dazugehörigen Code einfach mit? Dann sieht jeder 
sofort, was Du da gemacht hast (möglicherweise eine vergessene 
Endlosschleife oder ein Reset durch einen "vergessenen" oder falsch 
initialisierten Interrupt oder...)

von Marco M. (marco1987)


Lesenswert?

Ja ganz einfach, weil ich das nicht darf,

das ist für die industrie und da gilt höchste geheimhaltung, ist kein 
wichtigtun nur leider ist das so

was soll ich an Programmbeispiel schreiben....


ich will nur wissen wie ich einen µC von anfang an dazu bringen kann am 
ausgang 5 V auszugeben.

von Johannes M. (johnny-m)


Lesenswert?

Marco Müeller wrote:
> ich will nur wissen wie ich einen µC von anfang an dazu bringen kann am
> ausgang 5 V auszugeben.
So, wie es im Tutorial steht... DDRx auf Ausgang, PORTx auf 1! Ohne 
weitere Informationen deinerseits ist das alles, was man dazu sagen 
kann. Den Rest habe ich oben schon erwähnt.

von Peter D. (peda)


Lesenswert?

Marco Müeller wrote:

> PORTD |=(0<<PD2);

Ein ODER mit 0 ist flüssiger als Wasser.


Peter

von Marco M. (marco1987)


Lesenswert?

PORTD=(1<<PD2);  // port auf logisch 1 setzen


DDRD=0b11110100;  // PD2 als ausgang konfig.


hab ich doch genauso gemacht richtig?

von jl (Gast)


Lesenswert?

Wenn du deinen Compiler über diese Zeile laufen läss müsse er dir 
"remove dead code" bringen.

0<<x bleib 0 und ewas mi 0 zu verodern???


Ansonsten wirst du bestimmt noch mehr solcher Fehler haben die das ganze 
Port manipulieren und damit indirekt dein PIN verändern.



JL

von Peter D. (peda)


Lesenswert?

Marco Müeller wrote:

> hab ich doch genauso gemacht richtig?

Was Du wirklich gemacht hast, weiß keiner.
Mal schreibst Du Hüh und mal Hott
Entscheide Dich.


Wenn Du Dir nicht sicher bist, was eine Instruktion macht, dann schreibe 
ein Programm was nur das macht.
Und dann kannst Du es auch posten, damit man Deinen Fehler sieht.


Peter

von Marco M. (marco1987)


Lesenswert?

Wieso verodern? Hab ich da ein || drin oder sowas?

<< ist doch nur die Bitzuweisung

von Johannes M. (johnny-m)


Lesenswert?

Marco Müeller wrote:
> Wieso verodern? Hab ich da ein || drin oder sowas?
>
> << ist doch nur die Bitzuweisung
Sag mal, willst Du uns alle veräppeln? Du hast in deinem OP geschrieben
> PORTD |=(0<<PD2);
(wie PeDa schon zitiert hat). Und das ist erstens blühender Unsinn und 
zweitens ist da ein ODER ("|") drin!

von Stefan E. (sternst)


Lesenswert?

Marco Müeller wrote:

> das ist für die industrie und da gilt höchste geheimhaltung, ...

Du programmierst für die Industrie? Soll das ein Scherz sein?
Wenn ich mir diesen Thread (und auch deine Anderen) anschaue, läuft es 
mir kalt den Rücken runter. Wie kann man jemanden, der praktisch null 
Ahnung von C hat, eine Industrieanwendung programmieren lassen?
Da kann ich dann allerdings auch nachvollziehen, dass der Code unbedingt 
geheim gehalten werden muss.

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

Port D

lässt mich auf JTAG tippen

welcher µC konkret

da die Grundfunftionen offenbar nicht stehen, hast du vermutlich ein 
Problem mit den grundsätzlichen Einstellungen.

Die Cchips werden in einem bestimmten auslieferungs zustand versendet.
in selbeigem ist die Jtag aktiv. Bevor du  die nicht deactivierthast 
können einzelne Portpins blokiert sein. dies kannst entweder per fusebit 
ändern oder im Programm zur Laufzeit während der Initialisierung

von Marco M. (marco1987)


Lesenswert?

Marco Müeller wrote:
> PORTD=(1<<PD2);  // port auf logisch 1 setzen
>
>
> DDRD=0b11110100;  // PD2 als ausgang konfig.
>
>
> hab ich doch genauso gemacht richtig?

das hatte ich geschrieben und da sehe ich kein oder zeichen, wer lesen 
kann ist im vorteil. ^^

der letzte beitrag ist immer der aktuellste.........

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

jl wrote:

> Wenn du deinen Compiler über diese Zeile laufen läss müsse er dir
> "remove dead code" bringen.

Nö, da die PORTx-Register ja volatile sind, wird der Compiler
verpflichtet, das Register zu lesen und diesen Wert wieder
zurückzuschreiben.  Beispielsweise wäre ja:
1
  UDR |= 0;

eine lustige Variante für eine UART, die alle ihre empfangenen
Zeichen wieder echot.

von Peter D. (peda)


Lesenswert?

Marco Müeller wrote:
> ... wer lesen
> kann ist im vorteil. ^^
>
> der letzte beitrag ist immer der aktuellste.........

Der Ton macht die Musik und ich bin es nicht der Hilfe braucht.

Man könnte einfach dazu stehen, daß man Widersprüchliches geschrieben 
hat und sich dafür entschuldigen. Pampig werden kann ich auch.


Peter

von Johannes M. (johnny-m)


Lesenswert?

Stefan Ernst wrote:
> Da kann ich dann allerdings auch nachvollziehen, dass der Code unbedingt
> geheim gehalten werden muss.
Vor allem vor den Auftraggebern... (SCNR;-)

von Rudi (Gast)


Lesenswert?

lach
da kann das Programm ja nicht allzu lang sein, wenn man aus evtl. 10-20 
geposteten Zeilen bereits alle Komplettfunktionen des systems erkennen 
kann.
Andererseits muss man sich natürlich die Frage stellen: wenn es denn 'so 
geheim' ist, ist es dann überhaupt vom Fragensteller erlaubt, auch nur 
diese eine Zeile (dann auch noch in mehreren Variationen) ins Netz zu 
stellen??

In diesem Sinne wünsche ich euch ein sonniges WE

Rudi

von Marian (Gast)


Lesenswert?

@Marco Müeller:
Hättest du dir den Abschnitt den ich in meiner ersten Antwort gegeben 
habe durchgelesen, dann wüsstest du auch was du falsch machst und wozu 
diese | und & - Verknüpfungen gut sind. Die Antwort die "Winfried J." 
gegeben hat ist für dich auch sehr interessant, also überprüfe dies mal 
bei dir, also ob JTAG ein oder ausgeschaltet ist in den Fusebits.

Nochmal zur Klarstellung: Der Befehl den du gepostet hast (PORTD 
|=(0<<PD2);) ist erstens nicht ganz korrekt, er müsste so lauten: PORTD 
|= ~(1<<PD2); (wie im Link beschrieben), und zweitens sollte er das tun 
was du willst, d.h. den Pin 2 des Ports D  auf 0 setzen (0V). Er macht 
das natürlich nicht, wenn du JTAG noch aktiviert hast, denn dann kannst 
du diesen Pin (PORT) nicht so konfigurieren wie du möchtest, da dies von 
der JTAG-Schnittstelle übernommen wird. Also schalte JTAG in den 
Fusebits aus und dann kannst du ihn auch als Eingang oder Ausgang 
schalten. Übrigens um deine gewünschten 5V zu erreichen müsstest du 
diesen PIN 2 vom PORTD auf 1 setzen, also PORTD |= (1<<PD2); aber nur 
bei deaktiverter JTAG-Schnittstelle. Wie du diese deaktivieren kannst 
findest du im AVR-GCC-Tutorial, im Datenblatt deines Atmegas (oder was 
auch immer) oder hier im Forum in zahlreichen Threads.

@Alle anderen: Ist zwar lustig aber irgendwie auch echt traurig, wenn es 
wirklich so ist wie es scheint ;). Ich denke zwar, dass jeder mal 
anfängt aber wenn man für die "Industrie" sowas schreibt, sollte man 
schon etwas mehr Erfahrung haben. Naja belustigend ist es am Freitag 
trotzdem :).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Marian wrote:

> @Alle anderen: Ist zwar lustig aber irgendwie auch echt traurig, wenn es
> wirklich so ist wie es scheint ;). Ich denke zwar, dass jeder mal
> anfängt aber wenn man für die "Industrie" sowas schreibt, sollte man
> schon etwas mehr Erfahrung haben.

Nee, ist ja OK, anfangen muss wirklich jeder mal, aber wie Peter schon
schrieb, muss man ja deshalb nicht gleich pampig auftreten.  Nichts
ist schlimmer als Leute, die fundamentale Fehler machen und dann das
Auftreten eines Graf Koks von der Gasanstalt an den Tag legen.

von Johannes M. (johnny-m)


Lesenswert?

Marian wrote:
> [...] er müsste so lauten: PORTD |= ~(1<<PD2); (wie im Link beschrieben),
In welchem Link ist das so beschrieben?

> und zweitens sollte er das tun
> was du willst, d.h. den Pin 2 des Ports D  auf 0 setzen (0V).
Das macht der aber nicht...

> Er macht das natürlich nicht, wenn du JTAG noch aktiviert hast,
Auch mit deaktiviertem JTAG macht der das nicht...

Ich bin mir ziemlich sicher, dass im Tutorial ein "&" vor dem "=" steht 
und kein "|"...

BTW: Bei welchem AVR ist JTAG an Port D? Mir fällt jetzt konkret kein 
einziger ein...

von Stefan E. (sternst)


Lesenswert?

@ Jörg Wunsch:

> Nee, ist ja OK, anfangen muss wirklich jeder mal, ...

Also ich finde das nicht OK. Klar, jeder muss mal anfangen, aber im 
Falle einer Industrieanwendung sollte man doch wohl die 
Programmiersprache und den Umgang mit einem µC vorher lernen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan Ernst wrote:

> Also ich finde das nicht OK. Klar, jeder muss mal anfangen, aber im
> Falle einer Industrieanwendung sollte man doch wohl die
> Programmiersprache und den Umgang mit einem µC vorher lernen.

Warum?  Er könnte ja auch einfach dort Praktikant sein, und es ist
hinterher jemand da, der das betreuender Weise nochmal begutachtet.
Damit wäre er dennoch an die entsprechenden Geheimhaltungspflichten
gebunden.

von Marian (Gast)


Lesenswert?

@ Johannes M.:

Da hast du natürlich recht :)...mit dem PORTD |= ~(1<<PD2) habe ich mich 
vertan bzw. vertippt, meinte natürlich PORTD &= ~(1<<PD2). Sorry :)

Gruß,

Marian

von Stefan E. (sternst)


Lesenswert?

> Warum?  Er könnte ja auch einfach dort Praktikant sein, und es ist
> hinterher jemand da, der das betreuender Weise nochmal begutachtet.
> Damit wäre er dennoch an die entsprechenden Geheimhaltungspflichten
> gebunden.

Na, ich weiß nicht so recht. "Geheimhaltungspflicht" bedeutet ja, dass 
er an etwas Konkreten arbeitet, dass auch zum Einsatz kommen soll. Und 
"von Anfänger programmiert, dass von jemand Erfahrenen nochmal 
begutachtet wurde" ist nicht das gleiche wie "von jemand Erfahrenen 
programmiert". Man kann so vorgehen bei jemand, der noch keine Erfahrung 
mit dem bestimmten µC oder der bestimmten Programmiersprache hat, aber 
jemanden, der soo bei Null anfängt wie der OP, an ein konkretes 
Projekt zu setzen, halte ich nicht unbedingt für verantwortungsvoll. 
Zumal ich bei "ist für die industrie" in erster Linie an sowas wie 
Maschinen- und Prozesssteuerung denke, wo im Falle eines Fehlers auch 
ganz schnell mal die Gesundheit von Menschen gefährdet sein kann.

von Simon (Gast)


Lesenswert?

> Wieso verodern? Hab ich da ein || drin oder sowas?
>
> << ist doch nur die Bitzuweisung

"<<" IST KEINE BITZUWEISUNG!!!!! AAAAAHHHHHHHHHHHHH!!!!(Du betreust im 
Normalfall sicher nur irgendwelche Serveranlagen!)

allso ein <<(SHIFT LEFT) schiebt die Bits deiner Variable nach Rechts:
etwa so
00000001   <<2 ergibt:
00000100

und wenn du  0<< 2 schreibst ist dass:
00000000   <<2 ergiebt
00000000

Das musst du dann nur richtig (bitweise)verknüpfen:
um jetzt ein bit in einer Variable zu setzen:
01000000  //Die Variable
00000100  //Deine zuvor erstellte Maske(manche Leute nennen das so)
Und jetzt ODER verknüpfen "|" das doppelte "||" wäre nur eine Logische 
Verknüpfung
01000100

Wenn man jetzt annähme dass die Variable ein Port währe dann hättest du 
jetzt nur den einen Pin gesetzt.
In C schreibt man dass dann so:
PORTX = PORTX | (1<<2);
oder
PORTX |= (1<<2);

Willst du jetzt einen Pin wieder zurücksetzten dann machst du das so:
du nimmst deine zuvor erstellte Maske:
00000100 //und invertierst sie mit "~"(genannt tilde)
ergibt:
11111011

wenn du das dann "&" verknüpfst mit deinem Portregister ergibt das:
11111011
&
01000100
=
01000100

Oder in C:
PORTX = PORTX & ~(1<<2);

kürzer:
PORTX &= ~(1<<2);

von Simon (Gast)


Lesenswert?

Sorry! Bin ausgezuckt!
Daher protzt mein Text nur so von Rechtschreibfehlern.
Ich wäre daher sehr dankbar wenn einer mit den nötigen Rechten sich dem 
text annähme und ihn auf Satzbau und Rechtschreibung korregiert.

von Karl H. (kbuchegg)


Lesenswert?

Simon wrote:

> Ich wäre daher sehr dankbar wenn einer mit den nötigen Rechten sich dem
> text annähme und ihn auf Satzbau und Rechtschreibung korregiert.

Das können Moderatoren nicht.
Was du tun kannst: Den Text nochmal eingeben (Cut&Paste), selber
korrigieren und erneut posten. Dann kannst du den vorhergehenden
Post löschen. (Wenn du selbst nicht löschen kannst, kann ich das
für dich übernehmen)

von Simon (Gast)


Lesenswert?

> Wieso verodern? Hab ich da ein || drin oder sowas?
>
> << ist doch nur die Bitzuweisung

"<<" IST KEINE BITZUWEISUNG!!!!! AAAAAHHHHHHHHHHHHH!!!!(Du betreust im
Normalfall sicher nur irgendwelche Serveranlagen!)

Also ein <<(SHIFT LEFT) schiebt die Bits deiner Variable nach Links.
etwa so:
00000001   <<2 ergibt:
00000100

und wenn du  0<< 2 schreibst ist dass:
00000000   <<2 ergibt:
00000000

Das musst du dann nur richtig (bitweise)verknüpfen,
um jetzt ein Bit in einer Variable zu setzen:
01000000  //Die Variable
00000100  //Deine zuvor erstellte Maske(manche Leute nennen das so)
Und jetzt ODER verknüpfen "|" das doppelte "||" wäre nur eine Logische
Verknüpfung
01000100

Wenn man jetzt annähme dass die Variable ein Port währe dann hättest du
jetzt nur den einen Pin gesetzt.
In C:
PORTX = PORTX | (1<<2);
kürzer:
PORTX |= (1<<2);


Willst du nun einen Pin wieder zurücksetzten dann machst du das so:

Du nimmst deine zuvor erstellte Maske:
00000100 //und invertierst sie mit "~"(genannt tilde)
ergibt:
11111011

Wenn du das dann mit deinem Portregister UND"&" verknüpfst ergibt das:
11111011
&
01000100
=
01000100

Oder in C:
PORTX = PORTX & ~(1<<2);
kürzer:
PORTX &= ~(1<<2);

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan Ernst wrote:

> Na, ich weiß nicht so recht. "Geheimhaltungspflicht" bedeutet ja, dass
> er an etwas Konkreten arbeitet, dass auch zum Einsatz kommen soll.

Nein.  Oft genug musst du einfach mal bei Beginn deiner Tätigkeit
eine Schweigepflichtserklärung unterschreiben.

von Marian (Gast)


Lesenswert?

Ich möchte jetzt auch mal "klugscheissen" :).

@Simon: Kann es sein, dass in deinem Post ein kleiner Tippfehler 
enthalten ist? Speziell dieser Abschnitt:
>Wenn du das dann mit deinem Portregister UND"&" verknüpfst ergibt das:
>11111011
>&
>01000100
>=
>01000100

Ist aber nicht bös gemeint ;)

Wünsche allen ein schönes Wochenende :).

Gruß,

Marian

von Marco M. (marco1987)


Lesenswert?

Jörg Ernst hat alles gesagt,was zu sagen ist.

Genau so ist es!

Ich spiele mich sicher nicht hoch, habe mit µC noch keine Erfahrungen 
bin aber noch jung und werde das schon noch lernen:-)

Und an alle komischen Leute die sich meinen zu belustigen....

schönes Wochenende


achja und es klappt inzwischen,

hatte den PORTD schon mit dem Timer belegt das hatte ich vergessen da 
das Programm mitleiweile schon so 700 Zeilen Quellcode hat

von Marco M. (marco1987)


Lesenswert?

Stefan Ernst wrote:

> Na, ich weiß nicht so recht. "Geheimhaltungspflicht" bedeutet ja, dass
> er an etwas Konkreten arbeitet, dass auch zum Einsatz kommen soll. Und
> "von Anfänger programmiert, dass von jemand Erfahrenen nochmal
> begutachtet wurde" ist nicht das gleiche wie "von jemand Erfahrenen
> programmiert". Man kann so vorgehen bei jemand, der noch keine Erfahrung
> mit dem bestimmten µC oder der bestimmten Programmiersprache hat, aber
> jemanden, der soo bei Null anfängt wie der OP, an ein konkretes
> Projekt zu setzen, halte ich nicht unbedingt für verantwortungsvoll.
> Zumal ich bei "ist für die industrie" in erster Linie an sowas wie
> Maschinen- und Prozesssteuerung denke, wo im Falle eines Fehlers auch
> ganz schnell mal die Gesundheit von Menschen gefährdet sein kann.


Ja es handelt sich um Prozesssteuerung.Und mesnchenleben sind nicht 
direkt in Gefahr;-)

ich sage mal so....jeder fängt mal an, der eine gleiche alles auf einmal 
,der andere hat Zeit nach und nach alles zu lernen

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Marco Müeller wrote:

> ich sage mal so....jeder fängt mal an, der eine gleiche alles auf einmal
> ,der andere hat Zeit nach und nach alles zu lernen

Naja, nur mit Dingen wie <zitat>wer lesen kann ist im vorteil</zitat>
machst du dir halt keine Freunde unter denen, von denen du Hilfe
erwartest -- zumal du ja eingeloggt bist und damit auch in der Lage,
wenn du irgendwas falsch getippt hast, deine alten Postings für einige
Minuten noch zu editieren bzw. sie auch später noch zu Löschen.

von Simon (Gast)


Lesenswert?

Ja! Sorry! hab mich wohl vertippt mit dem "&".
soll heißen:
11111011
&
01000100
=
01000000

Es war nicht mein Ziel jemanden zu denunzieren.
Ich wollte Marco ledeglich, auch wenn es nicht zur Problemlösung 
beiträgt, darauf hinweisen, dass "<<" nichts mit Bitzuweisungen zu tun 
hat(wie er es offensichtlich zuvor glaubte).

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.