Attiny1634 - pb3 input problem

Gast #4680108
Lesenswert?
• ▲
▼
Hallo zusammen,

Ich habe das Problem, dass bei einem Attiny1634  Pin PB3 (hw pin18) 
nicht als Input funktioniert. PC0 habe ich identisch initialisiert, hier 
funktionierts. PB3 funktioniert als Output, als Input jedoch gibt PB3 
immer eine 0 zurück, auch bei aktiviertem Pull-Up.

Hat jemand eine Idee, was ich übersehe?

Hier der Testcode zur Anschauung. Die Inputs sind jeweils als Low-Active 
konfiguriert (Taster gegen Gnd). Im Testcode leuchtet die Debug-Led 
dauerhaft, da PB3 immer als 0 eingelesen wird.

/*
 * ATtiny1634_io-test.c
 *
 */

#include <avr/io.h>

// outputs, low-active
#define EN_DEBUG_LED    PORTC &= ~(1<<PC1);
#define DIS_DEBUG_LED    PORTC |= (1<<PC1);

// inputs, low-active
#define INPUT1      !(PINB & 1<<PB3) // geht noch ned
#define INPUT2      !(PINC & 1<<PC0)

int main(void)
{
  DDRA = 0x00;
  PORTA = 0x00;

  DDRB = 0x00;
  PORTB = (1<<PB3); // enable pullup input1

  DDRC = (1<<PC1);  // set output debug-led
  PORTC = (1<<PC0); // enable pullup input2

    while (1)
    {
  if(INPUT1 || INPUT2)
  {  EN_DEBUG_LED;}
  else
  {  DIS_DEBUG_LED;}
    }
}
Gast #4680193
Lesenswert?
• ▲
▼
hey ehrengast,

Fehler in der Verdrahtung kann ich ausschliessen.

Im Datenblatt hab ich natürlich zuerst nach Hilfe gesucht, aber nix 
gefunden, deshalb die Frage, was ich übersehen habe.

Timer1 wird hier garnicht genutzt/initialisiert, OC1A ist eine 
alternative Portfunktion, also gehe ich davon aus, dass default-mässig 
ein io konfiguriert ist? Wenn du einen Hinweis hast, wo oder nach was 
genau ich im Datenblatt suchen muss, wäre ich dankbar! (Anfänger...)

gruess markus
Gast #4680213
Lesenswert?
• ▲
▼
neuer PIC Freund schrieb im Beitrag #4680204:
> PORTB = (1<<PB3); // enable pullup input1
> Die Jungens von Atmel sehen das evtl anders. Hör auf Sie.

Das ist schon richtig, das stimmt. Wobei ich da immer die Einstellung 
habe das ich es veroder - also PORTB |= (1<<PB3) - PB3 hat nun auch 
keine Sonderbaren (wie z.b. JTAG etc...) alternativen Zuweisungen.

Im Grunde KANN es nur eine fehlerhafte Beschaltung sein.
(Firma: Ucore Fotografie www.ucore.de) Persönliche Seite #4680221
Lesenswert?
• ▲
▼
Hallo Markus,
ich vermute PIC Freund möchte dich auf etwas hinweisen:

neuer PIC Freund schrieb im Beitrag #4680204:
>
1
> PORTB = (1<<PB3); // enable pullup input1
2
>
> Die Jungens von Atmel sehen das evtl anders. Hör auf Sie.

Laut dem von dir verlinkten Datenblatt, S. 72:
PUEB – Port B Pull-up Enable Control Register
PORTB – Port B Data Register

Wenn du also den Pull-Up aktivieren möchtest, musst du, wie es sich mir 
dastellt, das PUEB-Register bearbeiten.

Viel Erfolg und viele Grüße,
Alex
Gast #4680247
Lesenswert?
• ▲
▼
Hallo Zusammen,

erstmal Danke für eure Hilfe.

Wiegesagt, Fehler an der Verdrahtung ist auszuschliessen. Schliesse ich 
einen externen 10k Pullup an den Pin, sieht man die Schalterbetätigung 
auf den Osci (direkt auf dem Pin gemessen). Allerdings beträgt die 
Spannung nur 2,6V anstelle von 5V. Scheint also intern noch etwas 
anderes zu passieren... Achja, auch mit externen Pullup funktioniert die 
Auswertung des Inputs nicht.

@neuer Pic-Freund
ok, intepretiere ich die Tabelle richtig, dass ich die Pullups mit PUEx 
und nicht mit PORTx (wenn als Einfang definiert) steuern muss? Wieso 
funktioniert es dann bei PC0 einwandfrei?

hab die Initialisierung geändert auf:
DDRB = 0x00;
PUEB = (1<<PB3);
//PORTB = (1<<PB3); // enable pullup input1

ändert sich aber nix am Verhalten.

Weitere Hinweise nach was ich suchen muss im Datenblatt werden gerne 
entgegengenommen. Ist als Neuling relativ schwierig, sich da 
zurechtzufinden und die nötigen Informationen rauszusuchen...

Danke für eure Hilfe!
Gast #4680346
Lesenswert?
• ▲
▼
Hallo Markus,

ist dir der Unterschied zwischen
1
PUEB = (1<<PB3);
und
1
PUEB |= (1<<PB3);
bewusst ?

Denn hier, in der Schreibweise, lauern weitere Fehler !

Was bedeutet dieser Ausdruch ?
1
DDRB &= ~(1<<PB3);
Gast #4680432
Lesenswert?
• ▲
▼
Hallo Karl,

hm ja, der Unterschied ist mir soweit schon bewusst:
PUEB = (1<<PB3); setzt PB3 auf 1, alle anderen bits werden mit 0 
überschrieben
PUEB |= (1<<PB3); setzt PB3 auf 1, alle anderen bits bleiben unverändert
DDRB &= ~(1<<PB3); setzt PB3 auf 0, alle anderen bits bleiben 
unverändert

Sollte aber in meinem Testcode keine Rolle spielen, da nur PB3 von PortB 
genutzt wird?

thx!

gruess markus
Gast #4680857
Lesenswert?
• ▲
▼
Markus schrieb:

> Wiegesagt, Fehler an der Verdrahtung ist auszuschliessen.

Ja klar, und die Rente ist sicher...

> Schliesse ich
> einen externen 10k Pullup an den Pin, sieht man die Schalterbetätigung
> auf den Osci (direkt auf dem Pin gemessen). Allerdings beträgt die
> Spannung nur 2,6V anstelle von 5V.

Brauchst du NOCH MEHR Beweise für einen Schaltungsfehler? Das sieht doch 
sehr stark nach einem relativ hochohmigen Popel nach GND aus. Verkohltes 
Flussmittel z.B. käme da durchaus in Frage.

> Scheint also intern noch etwas
> anderes zu passieren...

Das wäre natürlich auch noch eine Möglichkeit. Der Controller ist 
schlicht defekt. Dann passiert natürlich durchaus mal was anderes, als 
im DB steht. Allerdings: so leicht bekommt man einen AVR8 auch wieder 
nicht kaputt, da muss man schon richtig Scheisse gebaut haben.
Gast #4681033
Lesenswert?
• ▲
▼
hallo c-hater,

ich schau mir den Aufbau am Dienstag nochmals genaustens an. ich habe 
zwei identisch bestückte PCBs, beide zeigen das selbe Verhalten. ich 
kanns mir kaum vorstellen, dass beim layouten, bestücken oder 
schaltungsdesign etwas dermassen daneben ging. aber who knows - evtl. 
seh ich den wald vor lauter bäumen nicht. die pause übers weekend ist da 
bestimmt hilfreich.
ich meld mich dann wieder.

gruess & thx,
markus
Gast #4681409
Lesenswert?
• ▲
▼
aus dem datenblatt:

31.1 ATtiny1634
31.1.1 Rev. C
• Port Pin Should Not Be Used As Input When ULP Oscillator Is Disabled
1. Port Pin Should Not Be Used As Input When ULP Oscillator Is Disabled
Port pin PB3 is not guaranteed to perform as a reliable input when the 
Ultra Low Power (ULP) oscillator is not
running. In addition, the pin is pulled down internally when ULP 
oscillator is disabled.
Problem Fix / Workaround
The ULP oscillator is automatically activated when required. To use PB3 
as an input, activate the watchdog
timer. The watchdog timer automatically enables the ULP oscillator.
Gast #4681415
Lesenswert?
• ▲
▼
markus schrieb:
> aus dem datenblatt:
>
> 31.1 ATtiny1634
> 31.1.1 Rev. C
> • Port Pin Should Not Be Used As Input When ULP Oscillator Is Disabled
> 1. Port Pin Should Not Be Used As Input When ULP Oscillator Is Disabled
> Port pin PB3 is not guaranteed to perform as a reliable input when the
> Ultra Low Power (ULP) oscillator is not
> running. In addition, the pin is pulled down internally when ULP
> oscillator is disabled.
> Problem Fix / Workaround
> The ULP oscillator is automatically activated when required. To use PB3
> as an input, activate the watchdog
> timer. The watchdog timer automatically enables the ULP oscillator.

Das steht dann aber nur in der Errata?! Warum schreibt man das dann 
nicht gleich mit zu die Portdefinitionen? Da suchst man sich doch 
dämlich damit!

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