Forum: Mikrocontroller und Digitale Elektronik Spannung von 1,12 Volt an PD0 und PD1 nach Programmdurchlauf


von Christian W. (christian_w)


Lesenswert?

hallo zusammen,

ein kleines problem und zwar:

habe einen atmega8L-8PU. wenn ich diesen an spannung lege, habe ich an 
PD0 und an PD1 eine spannung von 0,00 V. sobald ich jedoch an einen der 
pins spannung lege, und somit einen programmablauf starte, hat der 
entsprechende pin von diesem moment an 1,12 V, und der geht auch erst 
nach einem reset wieder auf 0,00 V. An beiden I/O pins ist jeweils ein 
10k nach masse geschalten. eingangsseitig am pin ist ein 47k widerstand, 
da die eingangsspannung ca. 12 V beträgt. auch wenn ich die 
eingangsspannung an diesen pins komplett wegnehme, bleibt die spannung 
bei unerklärlichen 1,12 volt. ich kann mir nicht erklären, warum? 
interne pullup widerstände aktiviere ich zu keiner zeit in meinem code 
für PD0 oder PD1.

kann das sein dass genau diese RXD und TXD pins hier dazwischenfunken, 
und noch speziell als I/O pins konfiguriert werden müssen? da ja ich PD0 
und PD1 als eingänge verwende, habe ich mit DDRD... auch nichts 
konfiguriert. abgefragt werden die eingänge nicht mit PORT, sondern mit 
PIN. daran kanns also auch nicht liegen dass sich da was verändert...

hier die funktion, die PD1 abfragt:
1
int status_p(void)
2
{
3
  uint16_t warten = 1; // Anzahl Schleifendurchläufe * ms = Gesamtdauer
4
 
5
  while( (PIND & (1<<PIND1)) && (warten != 0) ) // Solange Eingangssignal erkannt
6
  {
7
    _delay_ms(25);
8
    warten--;
9
  }
10
11
  // Signal immer noch vorhanden UND Zeit abgelaufen? (sonst fehlen 25ms)
12
  if ( (PIND & (1<<PIND1)) && (warten == 0) )
13
    return 1;
14
  else
15
    return 0;
16
}

hier die funktion, die PD0 abfragt:
1
int status_l(void)
2
{
3
  uint16_t warten = 4; // Anzahl Schleifendurchläufe * ms = Gesamtdauer
4
 
5
  while( (PIND & (1<<PIND0)) && (warten != 0) ) // Solange Eingangssignal erkannt
6
  {
7
    _delay_ms(25);
8
    warten--;
9
  }
10
11
  // Signal immer noch vorhanden UND Zeit abgelaufen? (sonst fehlen 25ms)
12
  if ( (PIND & (1<<PIND0)) && (warten == 0) )
13
    return 1;
14
  else
15
    return 0;
16
}

hier meine ausgänge:
1
DDRC |= (1<<PC0);
2
DDRC |= (1<<PC1); 
3
DDRD |= (1<<PD2); 
4
DDRD |= (1<<PD3); 
5
DDRD |= (1<<PD4);

hier der code, in dem die funktionen aufgerufen werden:
1
    do
2
    {      
3
      _delay_ms(25); // Warten
4
5
      PORTD = PIND ^ (1<<PIND4); // Betriebs LED blinken lassen (Status invertieren)
6
7
      warten--; // Runterzählen, und nach 20 Sekunden (800 Durchläufe) Vorgang abbrechen
8
9
    // Vorgang abbrechen, wenn...
10
    }while( status_p() && !status_l() && warten != 0 );

jemand ne idee, wie ich PD0 und PD1 wieder "anständig" auf 0,00 V 
bekomme, wenn kein Eingangssignal anliegt? Es kam nämlich schon vor, 
dass diese 1,12 Volt fälschlicherweise als High-Pegel registriert 
wurden, und das Programm unverhofft startete.

Danke

Christian

:-)

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.