mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AtMega162 Portprobleme!


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurze Frage damit ich meinen Fehler irgendwie finde .
Ich deklariere wie folgt :

DDRA  = 0b11111100;
PORTA = 0b10000011;

also PA1 und PA0 auf Eingang .
Den Eingang frage ich dann folgendermaßen ab :

if (!(PINA & 0b00000001))
  {
           ...
         }

allerdings springt er immer wieder in die If Schleife obwohl ich den 
Taster gar nicht gedrückt habe .
Alles an einem AtMega162 betrieben .

Kann mir da jemand mal eben auf die Sprünge helfen ?!

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist denn Dein Taster angeschlossen?

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ganz normal . Wird er gedrückt wird GND durchgeschleift .

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du externe Pullups dran?

Falls nicht: Schreibst du an irgendeiner anderen Stelle im Code das 
PORTA-Register und deaktivierst damit vllt die internen Pullups?

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich PORTA  = 1 << 7; schreibe heißt das das ich
0b01000000 erhalte ? wenn mein Ausgangscode 0b00000000 war ? .
Kommer da irgendwie immer wieder durcheinandern :S .
Aber das könnte das Problem sein .

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan schrieb:
> wenn ich PORTA  = 1 << 7; schreibe heißt das das ich
> 0b01000000 erhalte ?
nein du erhältst 0b10000000, denn du shiftest die 0b00000001 7 mal nach 
links. Danach steht die 1 im höchsten Bit.

> wenn mein Ausgangscode 0b00000000 war ?
egal was vorher in PORTA drin war, ist nach der Zuweisung komplett mit 
(1<<7) überschrieben.

Hast du nun externe Pullups dran?

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skript Kiddy schrieb:
>> wenn mein Ausgangscode 0b00000000 war ?
>
> egal was vorher in PORTA drin war, ist nach der Zuweisung komplett mit
>
> (1<<7) überschrieben.


Aha ok das ist mein Problem dann habe ich mir damit immer den PullUp 
versaut .
Dachte er würde egal wie es vorher aussah dann nur die 1 an Stelle 8 
schreiben.
Wie kann ich denn ein Bit setzen ohne den Rest zu ändern ?

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine externen Pullups übrigens

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
setzen

PORTA = PORTA | (1<<7);   kürzer  PORTA |= (1<<7);


löschen

PORTA = PORTA & ~(1<<7);  kürzer  PORTA &= ~(1<<7);

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan schrieb:
> allerdings springt er immer wieder in die If Schleife obwohl ich den
> Taster gar nicht gedrückt habe .

achja schau mal hier hin:

http://www.if-schleife.de/

SCNR :)

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An der einen Stelle hat's geklappt an der anderen nicht .
Wenn ich

DDRC  = 0b11111111;
PORTC = 0b00000000;
deklariere soll mit

PORTC|=(1<<6);

eine LED angehen .
Allerdings geht PC1  und nicht PC 6 auf high ?! .
Wieso ?! :( .

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist JTAG per fusebit aktivert? Dann kannst du nämlich PC7:PC4 nicht 
schreiben, weil die Pins für JTAG verwendet werden.

Poste mal den gesamten Code als Dateianhang. Da kann ich mal schauen was 
da schief läuft.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schon Problem gelöst hatte ein Datenblatt mit falsche Pin Belegung . 
Mist google .

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte habe dir gerne geholfen.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skript Kiddy schrieb:
> Bitte habe dir gerne geholfen.

Allerdings ich danke dir vielmals .War eben nur so euphorisch das ich 
schnell alles ändern musste .
Also vielen Dank nochmal ohne dich hätte ich ewig gesucht .
Ich habe zwar gerade das neue Problem das ich die Pullups vom PORTA 
nicht an bekomme obwohl richtig gesetzt aber naja bekomme ich 
hoffentlich hin .
PORTA kann hoffentlich überhaupt auch als Eingang verwendet werden :S

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wollte im übrigen PA0 und PA1 als Eingang nutzen aber wie gesagt schein 
nicht zu gehen .

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan schrieb:
> PORTA kann hoffentlich überhaupt auch als Eingang verwendet werden :S

Ja kann er.

Bitte poste mal deinen Code. Ich hab meine Glaskugel nämlich aufgrund 
von Hitzeproblemen zurück in den Schrank gepackt. Aber bitte den Code 
als Anhang.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja der Quelltext ist leider etwas sehr umfangreich und vielleicht auch 
unübersichtlich .
Habe einen neuen Controller genommen und siehe da es klappt .
Hab beim rumprobieren vermutlich die Pullups gekillt :S

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.