Forum: Mikrocontroller und Digitale Elektronik IO-Probleme mit ATtiny 15L


von Jochen Müller (Gast)


Lesenswert?

Hallo,

habe ein kleines Problem mit dem Einlesen von Eingängen am ATtiny15L.
Gibts da was besonderes zu beachten oder hab ich im Code was ganz
falsch gemacht? Benutze den Compiler von Imagecraft.


#include <iotiny15.h>    // IO-Test

int main (void)
{
   PORTB = 0x00;    // set portb data register: portb4
  DDRB = 0x1B;    // set data direction B: 3 input rest output

  for (;;)
  {

  if ((PINB&0x04)!=1)
    {
    PORTB |= 0x10;    //nur portB4 1 setzen
    }

  if ((PINB&0x04)==0)
    {
    PORTB &= 0xEF;    //nur portB4 0 setzen
    }
  }
}

von Heinz Ketchup (Gast)


Lesenswert?

Das erste if...
if ((PINB&0x04)!=1)  <---- !=1  also ==0 ist das wirklich gemeint ?

das zweite if...
if ((PINB&0x04)==0)  <---- ==0 ?? ist doch das Gleiche wie oben


Heinz

von Andi (Gast)


Lesenswert?

Vielleicht noch die Pullups einschalten?

 DDRB = 0x1B  //0b00011011 Sicher mit 3 Inputs?
 PORTB = 0xE4 //0b11100100 Bei jedem Input (0) 1 Pullup

Ansonsten würde ich PB4 nicht mit PORTB = 0xnn ein oder ausschalten
sondern mit SBI PORTB,4 oder CBI PORTB,4 da Du alle anderen Port-Pins
auch beeinflusst.

Oder den Port vorher einlesen, verknüpfen mit OR oder AND und wieder
ausgeben.

Gruß
Andi

von Peter D. (peda)


Lesenswert?

if ((PINB&0x04)!=1)

macht das gleiche wie:

if( 1 )


(X & 4) kann nur 0 oder 4 ergeben und beides ist != 1 also immer wahr.


Peter

von Chris (Gast)


Lesenswert?

> Ansonsten würde ich PB4 nicht mit PORTB = 0xnn ein oder
> ausschalten sondern mit SBI PORTB,4 oder CBI PORTB,4 da Du
> alle anderen Port-Pins auch beeinflusst.

Genauso macht es der OP doch?

PORTB |= 0xnn wird zu sbi, PORTB &= ~0xnn zu cbi (die Funktionen
sbi/cbi gibt es ja schon seit einiger Zeit gar nicht mehr).

von Andi (Gast)


Lesenswert?

OK, habe mich mal wieder verkuckt da ich nur mit ASM und nicht mit C rum
mache.
Muß jetzt doch mal mit C richtig anfangen.

Gruß
Andi

von Jochen Müller (Gast)


Lesenswert?

Danke schon mal für die Antworten.
Werde dies heute abend nochmal testen. Irgendwo muß der Fehler ja sein.
Das mit dem Vergleich auf 0 bzw. 1 ist hier nur ein Schreibfehler,
sorry. Das Ausgeben über den PORTB funktioniert problemlos, nur mein
Eingang wird nicht eingelesen. Vielleicht hat  sich ja auch der µP
verabschiedet... werde nochmal verschiedens durchprüfen.

von Winne (Gast)


Lesenswert?

Innerhalb der "ifbedingunng" nen Port lesen und vergleichen hat bei
mir auch nicht funktioniert. Gönne Dir ein freies Register als lokale
Bytevariable und eine Zeile Code mehr und es wird gehen.

von Jochen Müller (Gast)


Lesenswert?

Hallo zusammen,

habe nochmal verschiedene Fehlerquellen untersucht - erfolglos. Hat
jemand Erfahrungen mit dem Compiler von Imagecraft bzw. hat der
vielleicht ein Problem? Nachstehend nochmal mein Testcode:

*/ IO-Test ATtiny15L

#include <iotiny15.h>

int main (void)
{
   unsigned char pinbtmp;

   DDRB = 0xF7;
  PORTB = 0x00;

  for (;;)
  {
  pinbtmp = PINB;

  if ((pinbtmp&0x08)==1)
    {
    PORTB |= 0x10;    //nur portB4 1 setzen
    }
  else
    {
    PORTB &= 0xEF;    //nur portB4 0 setzen
    }
  }
}

von Peter D. (peda)


Lesenswert?

if ((pinbtmp&0x08)==1)

Du must Dich unbedingt erstmal mit logischen Operatoren im Binärsystem
beschäftigen !!!


(pinbtmp&0x08) kann nur 0 0der 8 werden, aber niemals 1.


Peter

von Jochen Müller (Gast)


Lesenswert?

Hallo Peter,

verzeih mir diese Dummheit. Aufgrund von copy+paste aus alten
Programmen und lediglich kleinen Änderungen (Verstand ausgeschaltet)
kommt sowas zustande - Betriebsblindheit, wenn man immer nur auf 0
vergleicht und sich nicht klar machen will, daß das Bitergebnis ja gar
nicht ähnlich true/false bzw. 0/1 ist. Eigentlich sollte man so eine
Bremse im Forum steinigen :-) ... Sorry + nochmal: Danke! Hatte Deine
erste Antwort net logisch nachvollzogen sondern aus meinem Hirn
(welches eigentlich?) "verschoben".

Gruß Jochen

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.