Forum: Compiler & IDEs Port freischalten mit outp


von Phozz (Gast)


Lesenswert?

Tag,

ich muss zum teil mit der veralteten gcc lib arbeiten, da teile meines
codes mit dieser version gefertigt worden sind.

jetzt möchte ich port b freischalten.
macht man heutzutage ja so:

DDRB = 0x00;

da die alt lib mir hier aber ein invalid lvalue entgegenwirft muss ich
outp benutzen. schreib ich jedoch

outp(0x00,DDRB);

bleibt der port geschlossen und ist kein eingang ???

von Chris (Gast)


Lesenswert?

Vielleicht muss es outp(DDRB,0x00) heißen.

von Phozz (Gast)


Lesenswert?

auch schon probiert, nix :(

von Phozz (Gast)


Lesenswert?

ich seh gerade dass der port anscheinend doch freigeschaltet ist. so
wies ausschaut klappt das hier nicht:

while (PINB & (1<<PINB3))

wie heißt das auf "alt" also mit alten lib ?

oder vielleicht kann mir jemand sagen wieso die schrittmotorsteuerung
mit der alten lib funktioniert und bei der neuen lib der motor nur
"rumzuckelt" als hätte er nich genügend leistung ?

von Phozz (Gast)


Lesenswert?

sorry, nochmal ich.

int main(void)
{

stepper_on();
outp(0X00,DDRB);
// DDRB = 0x00;
sens_setLED(1,0);

uint8_t i;
uint8_t x;
uint8_t z;

while(1){

sens_setLED(0,1);

i=PINB;
z=1;

while (z<40){
x=PINB;


if (i!=x)   // pin 4 high ?
  {

diese codestelle mit der neuen lib und entsprechend umgeschrieben und
er geht in die if-abfrage rein und führt die nachfolgenden aktionen
aus, wenn ich was sense und sich x von i unterscheidet da sich ja der
port ändert.

mit der alten lib klappt das nicht ? wo ist das problem ? was mache ich
falsch ?

von Chris (Gast)


Lesenswert?

> i=PINB;

Ich meine, dass muss inp(PINB, i) oder so ähnlich lauten.

von Phozz (Gast)


Lesenswert?

ok, ich habs jetzt geschafft mit inp die zustände abzufragen.
jetzt muss ich nurnoch einzig und allein (HOFF) diese zeile

if(PINB & (1<<PINB3))


so übersetzen, dass sie von der alten lib verstanden wird, wie mach ich
das ?

von Chris (Gast)


Lesenswert?

Du liest mit inp den aktuellen Port-Status ein und testest mit & (1 <<
3), ob Bit 3 gesetzt ist. PINB3 ist ja AFAIK nur ein define für die
Zahl 3.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

So funktioniert's:
1
if(inp(PINB) & (1<<PINB3)) {
2
  ...
3
}

von Phozz (Gast)


Lesenswert?

super danke euch, das klappt soweit. jetzt würde ich gerne ne aktion
ausführen, wenn NUR PINB3 aus 1 gesetzt ist und PB0 bis PB2 auf 0.

SO klappt das schonmal net:

if (inp(PINB) & (1<<PINB3) & !(1<<PINB0) & !(1<<PINB1) &
!(1<<PINB2)){..

auch so:

if (inp(PINB) & (1<<PINB3) & (1>>PINB0) & (1>>PINB1) & (1>>PINB2)){..

komme ich zu keinem ergebnis ?

:(

von Rufus T. Firefly (Gast)


Lesenswert?

Ersetze '&' durch '&&'.

von Chris (Gast)


Lesenswert?

Ich fürchte, das funktioniert auch mit && nicht.

@Phozz:
Du solltest überlegen, was die Bitoperatoren und was der !-Operator
bewirken. Dann erkennst du bestimmt schnell, dass deine if-Abfrage so
ein wenig sinnlos ist.
Zum Beispiel schiebt "(1>>PINB1)" die 1 um eine Stelle nach rechts.
Dummerweise kommt da 0 raus, und "irgendwas & 0" ist in jedem Fall 0,
also false.

Du könntest das alles mit einer Kombination von & und == erschlagen. Du
müsstest nur dazu übergehen, statt endloser (1<<PINBn)-Ketten direkt den
passenden Hex-Wert, die Bitmaske, in den Code zu schreiben.

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.