AtMega Bitmanipulation für doofe

Seiten: (1)
Zurück zur Übersicht

SMD_Stefan

21.05.13 17:08

Hallo liebe Frickelgemeinde,

ich verzweifel grade seit einigen Stunden an einer scheinbar extrem leichten Aufgabe:

Ich möchte 2 I/O Pins an einem Atmega32 schalten, und zwar entweder als Eingang (Pull-up deaktiviert), oder als Ausgang (high oder low) und das voneinander unabhängig. Quellcode und Fehlerbeschreibung sind wie folgt:

1. Fall: beide I/O Pins als eingang (funktioniert)
PORTD &= ~((1<<PD2)|1<<PD3));
DDRD &= ~((1<<PD2)|(1<<PD3));

2. Fall: PD3 soll Ausgang (high) sein, PD 2 eingang
PORTD |= (1<<PD3);
DDRD |= (1<<PD3);
PORTD &= ~(1<<PD2);
DDRD &= ~(1<<PD2);
---> Beide Pins zeigen 5V an. Eigentlich soll ja nur PD3 5V ausspucken, und PD2 floaten (vermutlich nahe an 0V)

3. Fall: beide I/O Pins als Ausgang, beide low (funktioniert)
PORTD &= ~((1<<PD2)|(1<<PD3));
DDRD |= ((1<<PD2)|(1<<PD3));

4. Fall: beide I/O Pins als Ausgang, PD2 high, PD3 low:
PORTD |= (1<<PD2);
PORTD &= ~(1<<PD3);
DDRD |= ((1<<PD2)|(1<<PD3));
------> Beide Pins haben nun die gleiche Ausgangsspannung, und zwar etwa 2,6V.

5. Fall: wie 4. Fall, nur PD2 low, PD3 high:
PORT |= (1<<PD3);
PORT &= ~(1<<PD2);
DDR |= (1<<PD2);
DDR |= (1<<PD3);
(gleicher Fehler wie bei 4.)

Hat jemand eine Idee, bevor ich hier in den nassen, gebrauchten Kaffeefilter beiße?

Grüße...

shaun

21.05.13 17:24

Du hast einen Kurzschluss zwischen den beiden Pins...?

SMD_Stefan

21.05.13 17:30

shaun:
Du hast einen Kurzschluss zwischen den beiden Pins...?


oh ... mein .... GOTT!! Und du hast hellseherische Fähigkeiten...

Sieht so aus als wär das der Fehler. Vielen Dank!

Anse

21.05.13 17:34

Eine richtige Erklärung hab ich auch nicht. Ich schreibe an Stelle von PD3 einfach nur 3. PORTD|=(1<<3); Der Ausdruck heißt nur, das die 1 um 3 Stellen nach links verschoben werden soll und dann mit einem ODER mit dem Ziel, in dem Fall PORTD verknüpft werden soll.
Ich habe es auch noch nie probiert ob es einen Unterschied macht wenn man erst den PORT schreibt und dann das DDR.
Hast Du es schon mal ganz normal mit PORTD=0b00000110; probiert?. Wenn das nicht geht ist der Port vieleicht nicht in Ordnung.

shaun

21.05.13 17:44

Wenn PD3 im entsprechenden .h korrekt deklariert ist, entspricht das 1<<3, das ist einfach nur eine convenience-Sache.
Die 2,6V lassen sich nur durch einen defekten Chip, eine Routine die ein Rechteck mit ca 50% TV produziert oder eben einen Kurzschluss zweier ähnlich potenter Ausgänge auf 0 und 1 erklären.

SMD_Stefan

21.05.13 17:49

shaun:
Wenn PD3 im entsprechenden .h korrekt deklariert ist, entspricht das 1<<3, das ist einfach nur eine convenience-Sache.
Die 2,6V lassen sich nur durch einen defekten Chip, eine Routine die ein Rechteck mit ca 50% TV produziert oder eben einen Kurzschluss zweier ähnlich potenter Ausgänge auf 0 und 1 erklären.


Ich habs ja sogar mit dem Oscar gemessen (hätte ich vielleicht noch erwähnen können) und dabei festgestellt dass es wirklich eine DC- Spannung von ca 2,5..2,6V ist.

Letzten Endes war es wirklich ein Lötzinnkrümelchen, das sich selbstständig und ganz von alleine zum Nachbarn aufgemacht hat (MIR würde sowas blödes beim löten doch NIE passieren... )

Edit: Nochmal vielen Dank, darf geschlossen werden...


Zuletzt bearbeitet: 21.05.13 17:50 von SMD_Stefan

epsilon

21.05.13 17:57

SMD_Stefan:
shaun:
Du hast einen Kurzschluss zwischen den beiden Pins...?


oh ... mein .... GOTT!! Und du hast hellseherische Fähigkeiten...

Sieht so aus als wär das der Fehler. Vielen Dank!


Kurzschlüsse können schon lustige Fehler verursachen, wem ist das noch nicht passiert?

Eine andere Falle, die mich mal Tage gekostet hat, ist das JTAG-Interface. Das ist standardmäßig aktiviert und blockiert einige Pins in PortC. Das Ding wollte ums Verrecken nicht so wie ich. Da muß man eine Fuse (JTAGEN) umsetzen. Passiert mir nicht nochmal...

Gruß, Stefan.

shaun

21.05.13 18:10

Dabei hat Generation Arduino doch nix auszustehen. Als wir damals (tm) noch Z80 und 6502 (<- Gefahr einer intellektuellen Grabenschlacht, heute durch Intel/AMD, Windows/Linux, Apple/Android abgelöst) mit Modellbahnlitze auf gebrauchte Punktrasterplatinen gefrickelt haben, DA gab es noch Fehlerpotenzial. Aber holla! Nicht zuletzt dank ausschliesslicher Verwendung gebrauchter IC-Sockel, Kondensatoren etc. Taschengeld ging schliesslich für CPU, RAM, ROM, ACIA usw drauf!

epsilon

21.05.13 18:14

shaun:
Dabei hat Generation Arduino doch nix auszustehen. Als wir damals (tm) noch Z80 und 6502 (<- Gefahr einer intellektuellen Grabenschlacht, heute durch Intel/AMD, Windows/Linux, Apple/Android abgelöst) mit Modellbahnlitze auf gebrauchte Punktrasterplatinen gefrickelt haben, DA gab es noch Fehlerpotenzial. Aber holla! Nicht zuletzt dank ausschliesslicher Verwendung gebrauchter IC-Sockel, Kondensatoren etc. Taschengeld ging schliesslich für CPU, RAM, ROM, ACIA usw drauf!


JA!!! DAS waren noch Zeiten! Die habe ich auch beide gehabt. Die wurden dann abgelöst durch den 68008, bei dem habe ich mich zum erstenmal frei gefühlt. Man, was habe ich mit dem Ding alles gemacht. Ich glaube, eine zeitlang habe ich sogar in 68008-Assembler geträumt...

Zurück zur Übersicht
Seiten: (1)