Forum: Mikrocontroller und Digitale Elektronik xmega pin als Eingang


von Markus C. (ljmarkus)


Lesenswert?

Guten Morgen,

folgdendes Problem mit xmega128a1: Bei Systemstart soll ein Pin 
eingelesen werden um je nach Pegel ein Display anders initialieseren.
1
int main(void)
2
{
3
 PORTB_DIRCLR = PIN1_bm;    // Pin als Input
4
 PORTB.PIN1CTRL = PORT_OPC_PULLUP_gc;  // interner PullUp PortB Pin1
5
 
6
7
 if (PORTB.IN & (1<<1)) LED0_ON(); else LED0_OF();
8
9
 ...
10
}

Das merkwürdige daran ist das manchmal beim starten der Pin falsch 
eingelesen wird.
Dh. der interne Pullup wird irgendwie nicht richtig gesetzt oder so.

Oder mache ich was falsch?

Danke, Markus

von Marvin M. (Gast)


Lesenswert?

Hallo,

du bist einfach zu schnell - mach mal eine kurze Verzögerung zwischen 
Initialisierung des Ports und Abfrage...

von Markus C. (ljmarkus)


Lesenswert?

mit einem _delay_us(100) funktioniert es.

Aber das ist schon komisch....

Danke,
Markus

von Michael (Gast)


Lesenswert?

Kommt natürlich darauf an an was am Eingang hängt. Kapazität.

von Markus C. (ljmarkus)


Lesenswert?

Nur ein Jumper nach GND

von Marvin M. (Gast)


Lesenswert?

Moin,

wenn der Jumper gesteckt ist, dann ist der Port-Pin niederohmig an Masse 
angelegt - da sollte nichts passieren.
Ist der Jumper offen, dann passiert folgendes: Der Prozessor startet, 
der Port-Pin floatet (hat undefiniertes Potential), auf "Eingang" 
schalten ist in diesem Fall eigentlich nicht notwendig (ist Default), 
dann wird der Pull-Up eingeschaltet. Da der relativ hochohmig ist, kann 
es eine Zeit lang dauern, bis der Port-Pin wirklich auf VCC "aufgeladen" 
ist. Deshalb funktionierts auch mit einem Delay.... Die Kapazitäten sind 
parasitärer Natur - d.h. Leiterplatte, Gehäuse-Pins etc.

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.