mikrocontroller.net

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


Autor: Christian W. (christian_w)
Datum:

Bewertung
0 lesenswert
nicht 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:
int status_p(void)
{
  uint16_t warten = 1; // Anzahl Schleifendurchläufe * ms = Gesamtdauer
 
  while( (PIND & (1<<PIND1)) && (warten != 0) ) // Solange Eingangssignal erkannt
  {
    _delay_ms(25);
    warten--;
  }

  // Signal immer noch vorhanden UND Zeit abgelaufen? (sonst fehlen 25ms)
  if ( (PIND & (1<<PIND1)) && (warten == 0) )
    return 1;
  else
    return 0;
}

hier die funktion, die PD0 abfragt:
int status_l(void)
{
  uint16_t warten = 4; // Anzahl Schleifendurchläufe * ms = Gesamtdauer
 
  while( (PIND & (1<<PIND0)) && (warten != 0) ) // Solange Eingangssignal erkannt
  {
    _delay_ms(25);
    warten--;
  }

  // Signal immer noch vorhanden UND Zeit abgelaufen? (sonst fehlen 25ms)
  if ( (PIND & (1<<PIND0)) && (warten == 0) )
    return 1;
  else
    return 0;
}

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

hier der code, in dem die funktionen aufgerufen werden:
    do
    {      
      _delay_ms(25); // Warten

      PORTD = PIND ^ (1<<PIND4); // Betriebs LED blinken lassen (Status invertieren)

      warten--; // Runterzählen, und nach 20 Sekunden (800 Durchläufe) Vorgang abbrechen

    // Vorgang abbrechen, wenn...
    }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

:-)

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.