www.mikrocontroller.net

Forum: Compiler & IDEs Port freischalten mit outp


Autor: Phozz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ???

Autor: Chris (Gast)
Datum:

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

Autor: Phozz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch schon probiert, nix :(

Autor: Phozz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Phozz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> i=PINB;

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

Autor: Phozz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So funktioniert's:
if(inp(PINB) & (1<<PINB3)) {
  ...
}

Autor: Phozz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

:(

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ersetze '&' durch '&&'.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.