hallo zusammen, hab ein problem mit dem PD0 (RXD) und PD1 (TXD) pin. kann ich diese ganz normal als I/O pins verwenden? weil: jedesmal wenn das programm durchläuft, habe ich an diesen beiden pins eine spannung von 1,12 volt! danke christian ;)
Man kann diese Ports als ganz normale I/O's verwenden. Du musst genau wie bei den anderen Ports einstellen ob Du einen Eingang oder Ausgang haben willst. Im Moment hast Du wahrscheinlich als Eingang und ohne PullUp konfiguriert. Daher diese Spannung denk ich mal.
hmmm... also ich habe an diesen beiden I/O pins einen pulldown widerstand von 10k auf masse, und einen eingangswiderstand von 33k zum signaleingang +12v. trotzdem verbleiben mir, nachdem das programm läuft, 1,12 volt an diesen pins... und manchmal erkennt genau deswegen der uC einen signaleingang, wo aber überhaupt keiner ist...
Und dein Programm sieht wie aus?
Betreibst du deinen Mega mit 3.3V? Wenn ich deinen Spannungsteiler durchrechne, komme ich drauf, dass du bei 12V nur 2.8 V am Eingang haben wirst. Bei einer 5V Versorgung bist du da weit in der Grauzone, in der die Spannung nicht eindeutig 0 und auch nicht eindeutig 1 ist. Das erklärt natürlich nicht, wo die 1.2V herkommen, wenn du extern 0V anlegst. Ich könnte mir vorstellen, dass du irgendwo irrtümlich den internen Pullup aktiviert hast. Daher die Frage nach dem Programm.
der atmega läuft über einen 7805 mit 5 v versorgungsspannung. hier ist das programm, das die zwei eingänge abfragt. durch verschiedene messungen habe ich herausgefunden, dass der I/O pin immer exakt bei 1,73 V einschaltet und bei 1,43 V ausschaltet. das sollte meiner meinung nach passen, wenn der spannungsteiler 2,8 Volt liefert? hm........ konfiguration der I/O pins
1 | DDRC |= (1<<PC0); |
2 | DDRC |= (1<<PC1); |
3 | DDRD |= (1<<PD2); |
4 | DDRD |= (1<<PD3); |
5 | DDRD |= (1<<PD4); |
abfrage von PD0:
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 | }
|
abfrage von PD1:
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 | }
|
Da du PD2 bis PD4 als Ausgänge benutzt: Es ist dir nicht zufällig dort irgendwo passiert, dass du irrtümlich Port D0 oder Port D1 auf 1 setzt? Nicht umsonst heißt es: Zeig alles! Der Fehler sitzt des öfteren nicht dort wo du ihn vermutest. Denn sonst hättest du ihn selber gesehen. Zum Spannungsteiler: Ich finde es trotzdem keine gute Idee, wenn du dich darauf verlässt, dass die 2.9V als High gewertet werden. Du hast 12V, du hast den Spannungsteiler in der Hand, im Moment seh ich keinen Grund warum man den nicht so dimensionieren kann, dass bei 12V hinten auch wirklich ~5V rauskommen. Aber das ist eine andere Baustelle.
hallo, hab hier mal die komplette c-datei angehängt wie gewünscht. da sehen ja dann 4 augen mehr, als 2. das stimmt. das mit dem spannungsteiler ist so beabsichtigt, da das modul im auto verwendet wird, und da bis zu 15,5 volt auftreten, ich will mir den chip nicht zerschießen wegen zu hoher eingangsspannung... wieviel eingangsspannung verträgt eigentlich ein I/O pin? 5 volt oder? hmmm..... hab ganz unten noch was eingefügt dass mir die dataregister der entsprechenden pins löscht. seitdem ist keine spannung mehr von 1,12 volt an den pins, sondern saubere 0,00 v wie es sich gehört. habe aber immer noch nicht begriffen, warum! :-))) 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.