Hallo liebes µC-Board, leider kenne ich mich nicht so recht mit der Elektrotechnik aus. Aber ich versuche es trotzdem =) Es geht um einen Hallsensor und seine Verkabelung mit dem AVR-Funk-Evaluationsboard, auf dem ein ATmega8 hockt, was aber nicht so wichtig sein wird. Ich habe auch schon ordentlich gesucht, nur ist das Problem, dass alles immer viel zu speziell ist, und mit Vokabeln um sich geschmissen wird, mit denen ich meist nur bedingt was anfangen kann. Zu meinem Problem: Ich möchte den Hallsensor (TLE4905L) mit meinem µC verkabel, sodass ich das Output-Signal an einem Pin des J4-Steckers anlegen kann, und mein ATmega8 diesen dann einließt. So wie ich es erklärt bekommen habe muss ich den Pullupwiederstand des Pins aktivieren, um so aus den Outputpin einen Ausgang zu machen, da dieser eigentlich ein Eingang ist. Mir wurde gesagt, ich müsse dann nicht mehr die Schaltung anpassen, die bislang wiefolgt angeschlossen ist: P1 des Sensors: VCC P2: GND P3 Output Ich habe den funktionstüchtigen Hall auch schon getestet, die aber mit Oszilloskop, vor dem dann ein Widerstand hing. Und was mich jetzt so irritiert, ist, dass ich an das Oszilloskop die Spannung geführt und sie zurück auf den "Eingang" des Sensors geleitet habe. Das macht für mich ja auch Sinn. Nur verstehe ich nicht, wie es funktionieren soll, wenn ich das Signal auf den Pin lege und der Pullup aktiviert ist. Vielen Dank schonmal für eure Erklärungsversuche, MfG Mauritz
Hi >So wie ich es erklärt bekommen habe muss >ich den Pullupwiederstand des Pins aktivieren, um so aus den Outputpin >einen Ausgang zu machen, da dieser eigentlich ein Eingang ist. Nein. Der Pin bleibt Eingang. Der Pull-Up-Widerstand legt lediglich einen definierten Pegel an den Eingang, wenn dieser offen ist. >Und was mich jetzt so >irritiert, ist, dass ich an das Oszilloskop die Spannung geführt und sie >zurück auf den "Eingang" des Sensors geleitet habe. Das macht für mich >ja auch Sinn. Nur verstehe ich nicht, wie es funktionieren soll, wenn >ich das Signal auf den Pin lege und der Pullup aktiviert ist. Ich, ehrlich gesagt auch nicht. Der Sensor hat einen Transistor als Ausgangsstufe. Wenn kein Magnetfeld da ist, ist der Transistor gesperrt. Der Pull-up-Widerstand zieht jetzt den Eingang auf VCC (Logisch H). Kommt jetzt ein Magnetfeld in die Nähe des Sensors wird der Transistor angesteuert und schaltet den Eingang auf Masse (logisch L). MfG Spess
Hallo Spess, vielen Dank. Mal sehen, ob ich das richtig verstanden habe. Ich fasse zusammen: Fall 1: kein Magnetfeld aufgebaut: - Transistor ist gesperrt - Pullup zieht P3 auf VCC Fall 2: Magnetfeld aufgebaut - Transistor aktiv - Transistor zieht P3 auf GND Fall 2 ist glaube ich klar. Wenn jetzt im Fall 1 der Pullup-Widerstand "zieht", ist es dann so, dass die Spannung über den µC in den Hallsensor und dann über P2 des Halls auf die Masse läuft? Und wenn ich dann mit meinem µC den Pin abfrage, an dem der Eingang mit seinem Pullup-Widerstand liegt, erkennt er diese "anliegende" Spannung? Ist sie denn dann noch eigenhend und nicht eher ausgehend? Oder unterscheidet die Abfrage dabei nicht? Vielen Dank nochmal, MfG Mauritz
Hi >Wenn jetzt im Fall 1 der Pullup-Widerstand >"zieht", ist es dann so, dass die Spannung über den µC in den Hallsensor >und dann über P2 des Halls auf die Masse läuft? Die Spannung 'läuft' nirgendwo hin. Ersetze mal gedanklich den Transistor durch einen Schalter. Wenn der Schalter offen ist ( Transistor gesperrt) sieht der Eingang nur den Widerstand nach VCC. Bei geschlossenem Schalter (Transistor durchgeschaltet) sieht der Eingang Masse. MfG Spess
Ah! Aber der Schalter schaltet von dem Eingang, dann entweder zur Masse oder zur Spannung, oder? Warum ist dann der Pin 3 eigentlich noch ein Eingang? Kommt nicht trotzem Spannung heraus? Oder habe ich das wieder falsch verstanden? Sind das die beiden Möglichkeiten? P3->P2 oder P3->P1 Müsste es eigentlich funktionieren und ich habe meine Pinabfrage falsch programmiert? Danke, MfG Mauritz
Hi Sieh dir doch mal das Schaltbild auf S.3 an. Der Ausgang des Sensors ist Kollektor des Ausgangstransistors. Aus diesem Kollektor kann aber keine Spannung herauskommen . Der Transistor kann nur eine Verbindung nach Masse herstellen. Und damit an deinen µC-Eingang bei gesperrten Transistor eine Spannung anliegt wird der Pull-Up-Widerstand benutzt. MfG Spess
Okay, ich nehme das einfach mal so hin, und denke auch, dass ich das so zu 80 % verstanden habe! :) Wo liegt denn dann jetzt aber mein Problem? Ich habe an P1 - VCC hängen an P2- GND und an P3 meinen µC an Pin 26 (PD0). Mit folgender Abfrage überprüfe ich nun, ob der Transisor gesperrt ist oder nicht:
1 | while(1) |
2 | {
|
3 | DDRD |= (1<<PD5)); // PD5 als Ausgang festlegen |
4 | DDRD &= ~(1 << PD0); // PD0 als Eingang festlegen |
5 | PORTD |= (1 << PD0); // Pullup für PD0 aktivieren |
6 | if (PIND & (!(1 << PD0))) // Wert von PD0 prüfen |
7 | {
|
8 | LED_AN(PD5); |
9 | }
|
10 | }
|
Danke nochmal für deine Hilfe! Mauritz
Hi >Mit folgender Abfrage überprüfe ich nun, ob der Transisor gesperrt ist >oder nicht:... Aber nur ein mal. Wann, oder besser wie, soll die Led wieder ausgehen? MfG Spess
Ahso, entschuldigung. Die Antwort ist: gar nicht, sie geht ja nicht mal an! ;) Danke! Mauritz
Hi Mess doch einfach mal am Eingangspin, ob du überhaupt eine Spannungsänderung hast. Hast du auch den richtigen Pol vom Magneten (ich glaube Südpol) benutzt? MfG Spess
Hi, irgendwie hat es jetzt geklappt, dass ich an dem Pin eine Spannungsänderung von 0 auf 5V habe. leider tut sich nichts bei meinen LEDs:
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | |
4 | #define LED_AN(LED) (PORTD |= (1<<(LED)))
|
5 | #define LED_AUS(LED) (PORTD &= ~(1<<(LED)))
|
6 | #define LED1 PD6
|
7 | #define LED2 PD5
|
8 | #define HALL1 PD0
|
9 | |
10 | int main(void) |
11 | {
|
12 | while(1) |
13 | {
|
14 | DDRD |= (1<<LED1) | (1<<LED2); // Port D: Ausgang für LED1 und LED2 |
15 | DDRD &= ~(1 << HALL1); // PD0 als Eingang festlegen |
16 | PORTD |= (1 << HALL1); // Pullup für PD0 aktivieren |
17 | if (PIND & (!(1 << HALL1))) // Wert von PD0 prüfen |
18 | {
|
19 | LED_AN(LED1); |
20 | LED_AUS(LED2); |
21 | |
22 | }
|
23 | else
|
24 | {
|
25 | LED_AUS(LED1); |
26 | LED_AN(LED2); |
27 | }
|
28 | }
|
29 | }
|
Danke nochmal, MfG Mauritz
Hi Vielleicht solltest du mal die Portinitialisierung aus der 'While'-Schleife herausnehmen. Einmal initialisieren reicht. MfG Spess
Upps, was für ein Quatsch. Aber leider hats auch nichts gebracht! =/ Vielleicht noch eine Idee? MfG Mauritz
Hi
>Vielleicht noch eine Idee?
Nicht so richtig. Bin eigentlich notorischer Assemblerprogrammierer mit
rudimentären C-Kenntnissen.
MfG Spess
Und die Verkabelung ist einwandfrei, oder? P1 - > J4-Pin40 (VCC) P2 - > J4-PIN39 (GND) P3 - > J4-PIN26 (PD0) Vielleicht noch jemand anders, der noch eine Idee hätte? Danke danke, Gruß Mauritz
Hi Leute, ich habs! =) Ich weiß zwar nicht so genau was daran falsch war, aber ich habe was weggelassen und nun gehts:
1 | if (PIND & (1 << HALL1)) |
Würde trotzdem gerne mal wissen, was daran falsch war! =) Juchee, gute Nacht, Gruß Mauritz
Hallo Mauritz, irgendwie passt deine jetzige beschriebene Code Zeile, nicht mir der im Beitrag wieter oben !! Vorher: if (PIND & (!(1 << HALL1)) Weggelassen: if (PIND & (1 << HALL1)) Sieht schon im grunde anderst aus zumindest eine Klammer war zuviel. Gruss
Du wolltest if (PIND & (~(1 << HALL1)) schreiben (Tilde statt Ausrufungszeichen, bitweises komplementieren statt *-1
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.