Forum: Mikrocontroller und Digitale Elektronik mega32 pins vergleichen


von Thorsten D. (jupiter1)


Lesenswert?

Hallo!

Habe wieder einmal ein Problem.

Ich möchte den gesamten PinA bereich einlesen,dieser Variiert, und 
möchte dann mit einem festen wert den ich in ein Register geladen habe 
,vergleichen.
Anhand dieses Vergleiches soll ein wert gesetzt oder nicht gesetzt 
werden.

Habe schon alles versucht, aber der Zustand des Wertes der gesetzt 
werden soll bleibt immer gleich ,ob ich die A pins als Ein oder Ausgang 
setze, das Ergebnis ist immer das gleiche.

Vielleicht hat einer ein Programmbeispiel weil er so etwas schon mal 
anwenden musste.

Danke

von Karl H. (kbuchegg)


Lesenswert?

Thorsten D. schrieb:

> Vielleicht hat einer ein Programmbeispiel weil er so etwas schon mal
> anwenden musste.

Zeig deinen Code und die äussere Beschaltung des µC.
Es ist viel sinnvoller dir in deinem Code/Beschaltung aufzuzeigen wo das 
Problem liegt, als irgendwelchen Code ins Blaue hinein für dich zu 
schreiben, ohne zu wissen ob es sich um ein Hardware oder 
Softwareproblem handelt.

Ein häufiger Fehler ist es zb. dass das PORT Register anstelle des PIN 
Registers genommen wird. Es kann aber auch sein, dass du eigentlich 
Pullups an den µC Pins haben solltest und nicht hast und daher offene 
Eingänge hast, die jeden beliebigen Zustand annehmen können, je nachdem 
ob der Radio nebenan eingeschaltet ist oder nicht.

von Thorsten D. (jupiter1)


Lesenswert?

Ist soweit richtig wie du sagst.

Ich habe vor den pins einen DIP-Schalter der ausgeschaltet ist.
Die A Pins setze ich alle auf 1 (pins haben 5V) und mit dem DIP-Schalter
ziehe ich die Pins auf 0V wenn ich einen Schalter betätige.

Habe insgesammt 6 Schalter und kann demnach von pina,7 bis pina,2 einen 
zustand bestimmen.

Ich hoffe das geht so.

von Karl H. (kbuchegg)


Lesenswert?

Zeig doch bitte einfach mal dein (Minimal-)Programm, mit dem du 
Schwierigkeiten hast.

von Thorsten D. (jupiter1)


Lesenswert?

in temp1,pina
ldi temp2,0b01010000

cp temp1,temp2
brsh weiter
call null

weiter:
call eins

von Thorsten D. (jupiter1)


Lesenswert?

Ist übrigens Assembler aus dem AVR Studio.

von Peter (Gast)


Lesenswert?

> cp temp1,temp2
> brsh weiter
> call null

> weiter:
> call eins

und wass passiert nach dem

call null

dann kommt ein

call eins

damit ist es immer eins

von Thorsten D. (jupiter1)


Lesenswert?

Ok habe vergessen...

in temp1,pina
ldi temp2,0b01010000

cp temp1,temp2
brsh weiter
call null
jmp zeige0

weiter:
call eins

zeige0:
..........

von Thorsten D. (jupiter1)


Lesenswert?

Sorry habe etwas Druck...

in temp1,pina
ldi temp2,0b01010000

cp temp1,temp2
brsh weiter
call null
jmp zeige0

weiter:
call eins
jmp zahl

zeige0:
..........

von Peter D. (peda)


Lesenswert?

Thorsten D. schrieb:
> in temp1,pina
> ldi temp2,0b01010000
>
> cp temp1,temp2
> brsh weiter
> call null
>
> weiter:
> call eins

Das ist also Dein ganzes Programm, dann kann es ja nicht funktionieren.
Du hast 6 Taster, also 2 Pins floaten immer lustig umher und die der 
offenen Tasten auch.

Nicht benutzte Pins ausmaskieren, benutzte an Pullups legen.
Und es gibt auch einen CPI-Befehl.

Peter

von Thorsten D. (jupiter1)


Lesenswert?

Also DDRA als Eingang definieren,10k Pullup Widerstände an die pins 
gegen Vcc
und mit diesem Programm ist der Fehler Geschichte!!

Programmausschnitt:
.....

einser:
   push temp1
   push temp2
   in temp1,pina
   ldi temp2,0x0a
   cp  temp1,temp2
   brsh einser0
   call null
   pop temp2
   pop temp1
   ret

einser0:
   call eins
   pop temp2
   pop temp1
   ret
......

Danke Peter!!!!!

von Peter D. (peda)


Lesenswert?

Thorsten D. schrieb:
> Also DDRA als Eingang definieren,10k Pullup Widerstände an die pins
> gegen Vcc
> und mit diesem Programm ist der Fehler Geschichte!!

Aber nur fast, weil Du nen Größer/Gleich-Befehl benutzt und die 
floatenden unbenutzten Pins die niederwertigsten sind.

Richtig:
1
   in    temp1,pina
2
   andi  temp1, ~0x03  ; mask pin 1,0
3
   cpi   temp1, 0x08   ; or 0x0C ? 
4
   brsh  einser0


Peter

von jupiter1 (Gast)


Lesenswert?

Habe ich gemacht.

Ich habe beim PortA generieren die Pins 0 und 1 als Ausgang gesetzt, nur
die anderen benutzt, also als Eingänge gesetzt.

ldi r16,0xc0
out ddra,r16

Denke das geht auch.

T.

von Peter D. (peda)


Lesenswert?

jupiter1 schrieb:
> Habe ich gemacht.
>
> Ich habe beim PortA generieren die Pins 0 und 1 als Ausgang gesetzt, nur
> die anderen benutzt, also als Eingänge gesetzt.
>
> ldi r16,0xc0

Das sind dann aber Pin 7, 6

> out ddra,r16
>
> Denke das geht auch.

Nö.

Wenn die Pins immmer nur auf konstantem Pegel sind, ist das doch 
ziemlich witzlos.
Wenn Du also die Pins benutzt, kennst Du ihren Zustand beim Vergleich 
nicht.

Machs wie alle, maskiere.


Peter

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.