Archiv verlassen und diese Seite im Standarddesign anzeigen : Eingang abfrage 5V
Guten Abend,
also irgendwie krieg ich das einfachste nicht mehr hin...
also ich möchte auf ein attiny eine Eingang abfragen, der aber auf eine 5 V Spannung wartet.
Also ich habe ein avr Net io und möchte wenn ein Ausgangs Signal gebe den mit den attiny abfragen,
sprich wenn auf ein pin eine 5V Spannung rein bekommt, gib der auf ein anderen Pin ein Ausgang raus der eine led blinken lässt.
Wenn ich aber ein Port auf Eingang setze, habe ich immer 5V drauf, auch wenn ich den internen Pull up widerstand drauf setze oder den PIN auf 0 setze ist immer 5 V drauf.
Was mache ich da falsch?
Hi,
wie sieht den die Beschaltung aus und wie sieht der Code aus?
Also weil ich keine lust habe immer rumzustecken programmiere ich den code auf den rn controll (ATmega32)
ich habe eine led an PORT D4
und den Eingang versuch ich über PORT B4 einzulesen
der Code ist:
DDRB=(0<<PB4); //PORTB = (1<<PB4);
PINB=(0<<PB4);
DDRD=0xff;
PORTD=0x00;
while(1)
{
if(PINB&(1<<PINB4))
{
PORTD|=(1<<PB4);
}
else
{
PORTD&=~(1<<PD4);
}
Probier es mal so ;)
/*
* Eingang.c
*
* Created: 30.03.2012 23:26:19
* Author: Daniel
*/
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRC = 0xFF; // Kompletter Port C auf Ausgang
DDRB = 0x00; // Kompletter Port B auf Eingang
while(1)
{
if(PINB & (1<<PINB0))
{
PORTC |= 0x01;
}
else
{
PORTC &= ~0x01;
}
}
}
Getestet auf dem RN-Control.
Edit:
Vergleich mal diese Zeilen:
PORTD |= (1<<PB4);
PORTD &= ~(1<<PD4);
Dann findest du den Fehler sicher ;)
sorry ist aber genau das gleiche wie davor,
die led ist die ganze zeit an, und wenn ich PB0 gegen masse schalte geht die aus.
Aber was ich brauche wäre das wenn ich PB0 gegen 5V schalte, etwas passiert...
Ja weil das Board so aufgebaut ist.
Schau dir mal den Plan hier an:
http://www.rn-wissen.de/index.php/Bild:Rncontrol1.4schaltplan90grad.gif
Dort siehst du das die LEDs active Low sind d.h. sobald der Pin High ist sind die dunkel und bei Low leuchten sie. Wenn du willst das die LEDs leuchten wenn du den Schalter auf 5V ziehst, drehst du die If-Abfrage einfach um. Wenn PB0 = 0 ist ist PC0 = 1 und bei PB0 = 1 ist PC0 = 0.
ne ich habe ja nicht die Led vom Board, dass weiß ich das die so funktionieren...
Habe eine externe led mit widerstand an port d4 gesteckt..
habe auch den Fehler behoben trotzdem ist die led die ganze zeit an, außer wenn ich auf PB4 auf masse gehe!
-schumi-
31.03.2012, 00:11
Ich kenne das Board nicht und weis jetzt auch nicht wie die Taster da drauf verschalten sind falls überhaupt schon welche drauf sind - oder wie du sie selbst verschalten hast falls du die selber da dran gebaut hast.
Aber ich würde mal tippen, dass du den Pulldown-Widerstand nach GND vergessen hast :)
(Ein offener Eingang wird als high erkannt, weil da ca. 1.6V von der Innenbeschaltung zurücksprotzen)
ja nach den Grundkenntnisse heißt es ja das man
1) DDRB = (1<<PB0); Eingang
2) PORTB = (1<<PB0); Pulldown widerstand aktivieren
das was ich dann versucht hatte war auch:
PINB = (1<<PB0); um den Eingang auf 0 zu setzen
also ich habe die LED selbst dran gemacht und den Taster ersetze ich damit das ich den Kabel auf 5V kontaktiere
-schumi-
31.03.2012, 00:30
DDRB = (1<<PB0); Eingang
Für mich heißt dass, dass der ganze Port (also PB0 bis PB7) Eingang ist, bis auf den PB0, der dann Ausgang ist.
PORTB = (1<<PB0); Pulldown widerstand aktivieren
AVRs haben doch nur PullUps?! oO
Was du da machst ist den Ausgang PB0 auf 5V setzen
das was ich dann versucht hatte war auch:
PINB = (1<<PB0); um den Eingang auf 0 zu setzen
Wenn ein Pin als Eingang gesetzt ist kann man mit dem Register "PINB" die PullUps aktivieren und deaktivieren (1 = Pullups aktiv, 0 = vollkommen offener Eingang)
Du kannst keine Eingänge setzen, nur Ausgänge
Um Ausgänge auf 0V / 5V zu setzen wird das PORTB-Register verwendet
Mir scheint du hast da bisschen was durcheinander gebracht. Könnte aber auch an der Uhrzeit liegen :) (Was du da schreibst erinnert mich an die PICs, dort kommt so Schwachsinn (meine Meinung), dass 1 ein Eingang ist und das man PullDowns reinbaut)
Viele Grüße
Ja kann die Uhrzeit auch gut sein werd glaub ich auch jetzt Richtung Bett gehen.
Hab viel durcheinander gebracht aber wie im Code:
Hab ich DDRB auf null gesetzt.
Aber wie frage ich den Pin denn ab, nach 5V.
Ich habe ein Kapazitäten Schalter und wenn er auf high ist, gibt er 5V ab.
Und ich möchte gerne das mit den Avr diese 5V abgreifen, ich möchte aber nicht auf etwas warten,
wo man da nichts mehr machen kann.
Wie krieg ich das realisiert wenn ein Eingang automatisch auf 5 V liegt?
-schumi-
31.03.2012, 00:52
D.h. das hier ist deine Schaltung?
_________________
AVR |
|
PB0--+--------- Kapazitiver Schalter, liefert 0V oder 5V
|
| ___ LED
PD4--+------|___|---|>|---+
| |
| ---GND
_________________|
Dann sollte das hier gehen:
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD = 0b00010000; // Pin 4 des PortD auf Ausgang
DDRB = 0b00000000; // Alle 8 Pins des PortB auf Eingang
while(1)
{
if(PINB & 0b00000001) // Wenn der Schalter 5V liefert...
{
PORTD |= 0b00010000; // ...die LED anschalten...
}
else // ...ansonsten...
{
PORTD &= 0b11101111; // ...die LED ausschalten
}
}
}
sorry hab schon alles zusammen gepackt und kann das jetzt nicht ausprobieren,
aber ist das nicht genau das, was ich im Code stehen hab.
Das Problem ist ja das der Eingang schon 5 V ausgibt und die LED die ganze zeit an ist,
ich glaub nicht das ich dann in PB0 noch 5 V einspeisen kann?
-schumi-
31.03.2012, 01:05
Das Problem ist ja das der Eingang schon 5 V ausgibt
Ein Eingang kann keine Spannung ausgeben, das kann nur ein Ausgang. Das einzige was ein Eingang machen kann ist, ein sehr sehr schwaches 5V-Signal anlegen, damit, wenn nichts an den Eingang angeschlossen ist, der Eingang einen definierten Pegel hat. Sonst wirkt er wie eine Antenne. Die schwachen 5V die der Eingang mit den Pullups bereitstellen kann werden aber z.b. von einem Taster der den Eingang nach GND schaltet einfach "geplättet", d.h. der Taster ist viel stärker als der Pullup-Widerstand.
Der Code den ich dir gegeben habe oder auch der von Kampi aktivieren keine Pullups. Abgesehen davon würde das jetzt keinen Einfluss auf deine Schaltung haben. Nimm mal ein Multimeter und miss die Spannung an PB0. Wenn dein Multimeter 5V anzeigt liest der AVR 5V. Wenn dein Multimeter 0V anzeigt liest der AVR 0V, so einfach ist das ;-)
ich glaub nicht das ich dann in PB0 noch 5 V einspeisen kann?
Die 5V die der Eingang mit Pullups bereitstellen kann sind so dermassen schwach, dass der Schalter das Signal ohne mit der Wimper zu zucken so hinbügeln kann wie er will.
So bin wieder dabei... :-(
also am eingang messe ich 1,5 V
nach dem einsetzen des Code von euch, passiert das gleiche wie bei meinem Code wo ich noch von überzeugt bin
das das genau das geiche ist...
Was sehr komisch ist, wenn ich den Eingang auf masse überbrücke geht der Ausgang(die LED) aus, sogar wenn ich
den Eingang beim betrieb messe geht die led aus ... sprich auf masse sehr empfindlich, bestimmt weil ich da kein Pullup aktiviert habe...
aber nichts desto trotz geht es nicht ich weiß nicht was ich falsch mache ...
Gibt's noch Vorschläge?
Um es nochmal zu beschreiben, sobald 5 V am Eingang sind soll einfach am Ausgang die led angehen ... mehr nicht :-(
Der Controller funktioniert aber einwandfrei?
sollte, hab letztens noch ein wlan Verbindung damit hinbekommen... hab aber drei rn controll versuch jetzt mal den anderen, aber auf ein attiny hatte ich es schon versucht... das Programm funktioniert ja irgendwie auch, aber nur wenn ich den Eingang auf masse überbrücke, und ich versteh nicht wieso???
Naja versuch das jetzt auf ein anderen rn-control
Hab es jetzt auf ein anderes rn-control versucht, gleiche Ergebnis... liegt an der Verschalung am Rn-control?
versuch es jetzt nochmal am attiny
... attiny das gleiche .... das kann doch nicht so schwer sein.... ich geh nochmal die in paar buche die Sachen durch, aber wenn jemand weiß wodran das liegt wäre nett, wenn er
es mir mitteilen könnte...
Danke
also ich weiß jetzt nicht warum das so anders ist als mein Code und euren Code aber so funktioniert es:
[QUOTE]#include <avr/io.h>
int main(void)
{
DDRB |= (1<<PB0) | (0<<PB2); /* PA0 als Eingaenge */
while(1)
{
if ( PINB & (1<<PB0) ) { //Abfrage ob an Pin C0 5V anliegen
PORTB = (1<<PB2); // Pin PB1 auf High
} else {
PORTB = (0<<PB2); //Pin PB1 auf Low
}
}
}
/QUOTE]
Vielleicht noch JTAG an und deswegen funktioniert PortC nicht richtig?
Ich weiß nicht, aber jetzt klappt es,
wobei ich noch ne kleine Frage habe, denn wenn ich den eingang mit 5V von der versorgungsspannung anlege,
schaltet der eingang.
sollte ich aber vom sensor, wo 4,8 V drann liegen, nimmt der attiny13 das nicht an... braucht er ein bestimmten strom noch, sonst versuch ich das mit ein transistor zu schalten,
oder wodran liegt das noch?
Danke schon mal für alle antworten
Grüß David
Ich weiß nicht, aber jetzt klappt es,
wobei ich noch ne kleine Frage habe, denn wenn ich den eingang mit 5V von der versorgungsspannung anlege,
schaltet der eingang.
sollte ich aber vom sensor, wo 4,8 V drann liegen, nimmt der attiny13 das nicht an... braucht er ein bestimmten strom noch, sonst versuch ich das mit ein transistor zu schalten,
oder wodran liegt das noch?
Danke schon mal für alle antworten
Grüß David
Hat der Sensor vielleicht eine andere Spannungsquelle als der Tiny? Weil wenn du den Sensor über ne Batterie betreibst und den Tiny über eine andere Batterie dann hast du ne galvanische Trennung und es funktioniert nicht ;)
Ne beide bekommen parallel die gleiche spannung aus ein netzteil. :-(
und ab 3,7 V ist das doch ein High Pegel oder?
Musst du im Datenblatt unter "Electrical Characteristics" gucken.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.