Forum: Mikrocontroller und Digitale Elektronik Attiny1634 - pb3 input problem


von Markus (Gast)


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;}
    }
}

von Markus (Gast)


Lesenswert?


von ehrengast (Gast)


Lesenswert?

Markus schrieb:

> hier noch der Link zum Datenblatt des 1634:
> 
http://www.atmel.com/Images/Atmel-8303-8-bit-AVR-Microcontroller-tinyAVR-ATtiny1634_Datasheet.pdf

Und? Selber lesen kommt nicht in Frage?

Dabei kommt raus, dass (neben einem Problem mit der Verdrahtung) nur 
eins als mögliche Ursache in Frage kommt: falsche Initialisierung von 
Timer1.

von Markus (Gast)


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

von neuer PIC Freund (Gast)


Lesenswert?

1
PORTB = (1<<PB3); // enable pullup input1
Die Jungens von Atmel sehen das evtl anders. Hör auf Sie.

von Draco (Gast)


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.

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


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

von neuer PIC Freund (Gast)


Lesenswert?

Tabelle 10-1. Datenblatt lesen hilft echt.

von Draco (Gast)


Lesenswert?

Ohh.. danke! Das kannt ich so auch noch nicht! PUExn... welche Atmels 
betrifft dies denn!?

von Markus (Gast)


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!

von Karl M. (Gast)


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);

von Markus (Gast)


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

von c-hater (Gast)


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.

von markus (Gast)


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

von captain (Gast)


Lesenswert?

Hallo,

Schau mal im Datenblatt unter Errata Punkt 1. Vielleicht reicht's, wenn 
du den Watchdog enablest.
Gruß,
Sascha

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Hallo Markus,

sollte es wirklich an dem von Sascha genannten Punkt liegen, so wäre es 
super, wenn du es später hier mitteilst.

captain schrieb:
> Hallo,
>
> Schau mal im Datenblatt unter Errata Punkt 1. Vielleicht reicht's, wenn
> du den Watchdog enablest.
> Gruß,
> Sascha

Viel Erfolg und schönes Wochenende,
Alex

von captain (Gast)


Lesenswert?

Das kann auf jeden Fall Probleme machen.
Da hatte ich mal einige Stunden viel Spaß!
Watchdog an, und gut war's.

von markus (Gast)


Lesenswert?

super, vielen dank für den Tipp, ich probiers am Dienstag! :) Gruss und 
auch ein schönes Wochenende! Markus

von Draco (Gast)


Lesenswert?

Mal so in den Raum gestellt: Was hat PB3 mit dem Watchdog zu tun?!

von markus (Gast)


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.

von Draco (Gast)


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!

von Paul B. (paul_baumann)


Lesenswert?

Draco schrieb:
> Da suchst man sich doch
> dämlich damit!

Richtig. Aber die Leute, die sofort mit der weisen Frage kommen:
"Was steht denn im Datenblatt?" -die sollen sich ruhig einen Wolf 
suchen.
Es steht eben NICHT alles im Datenblatt, was im Übrigen vom Umfang her 
eher ein DatenBUCH ist.

MfG Paul

von Peter D. (peda)


Lesenswert?

markus schrieb:
> Port pin PB3 is not guaranteed to perform as a reliable input when the
> Ultra Low Power (ULP) oscillator is not
> running.

Das ist natürlich der Hammer.
Darauf wäre c-hater nie gekommen.

von Markus (Gast)


Lesenswert?

captain schrieb:
> Hallo,
>
> Schau mal im Datenblatt unter Errata Punkt 1. Vielleicht reicht's, wenn
> du den Watchdog enablest.
> Gruß,
> Sascha


watchdog eingeschaltet, PB3 funktioniert.

Vielen Dank an Sascha und alle anderen!! :) :)

gruss und schöne Woche,
Markus

von captain (Gast)


Lesenswert?

Hallo Markus,

bitte, gerne ;-)
Freut mich, dass es jetzt geht!

dir auch eine schöne Woche

Gruß,
Sascha

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.