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 } } }
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
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
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
> 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).
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
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.
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.
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 } } }
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.