mikrocontroller.net

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


Autor: Jochen Müller (Gast)
Datum:

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

Autor: Heinz Ketchup (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Chris (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

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

Autor: Jochen Müller (Gast)
Datum:

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

Autor: Winne (Gast)
Datum:

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

Autor: Jochen Müller (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Jochen Müller (Gast)
Datum:

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

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.