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);
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
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...)
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.
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.
Marco Müeller wrote:
> PORTD |=(0<<PD2);
Ein ODER mit 0 ist flüssiger als Wasser.
Peter
PORTD=(1<<PD2); // port auf logisch 1 setzen DDRD=0b11110100; // PD2 als ausgang konfig. hab ich doch genauso gemacht richtig?
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
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
Wieso verodern? Hab ich da ein || drin oder sowas? << ist doch nur die Bitzuweisung
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!
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.
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
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.........
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.
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
Stefan Ernst wrote: > Da kann ich dann allerdings auch nachvollziehen, dass der Code unbedingt > geheim gehalten werden muss. Vor allem vor den Auftraggebern... (SCNR;-)
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
@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 :).
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.
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...
@ 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.
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.
@ 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
> 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.
> 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);
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.
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)
> 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);
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.
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
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.