Port freischalten mit outp

Gast #236990
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 ???
Gast #236993
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 ?
Gast #236994
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 ?
Gast #236996
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 ?
Gast #236999
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 ?

:(
Gast #237001
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren