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