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