PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega48 tut nicht so wie ich will



Halodri
01.12.2010, 20:25
Hallo Leute!

Ich bin neu hier und versuche mich ein wenig in Sachen Elektronik damit man nicht auf der Strecke bleibt.

Ich habe ein ganz simples Projekt angefangen und frage mich was schief läuft.
Es geht um folgendes. 3 Eingänge sollen abgefragt werden. Wenn die Bedingungen vorhanden sind soll Ausgang Pinb.1 gesetzt werden.

So dachte ich mir kann ja nicht so schwer sein. In Bascom Simulator funktioniert alles denke ich mal zumindest solange ich Schritt für Schritt die Zeilen abarbeite. Lasse ich das Programm durchlaufen nunja ist wohl eher eine Zeile dann zeigt mir BAscom wirre Ausgänge an .. Jetzt bin ich nicht sicher ob das an meinem Rechner liegt. der eventuell zu schnell dafür ist die Rückmeldungen von BAscom anzuzeigen oder liegt es an meinem getippten Werk...


Do
If Fensterschalter = 1 And Tuerkontakt = 1 And Eingangrauchmelder = 0 Then
Alarm = 1
Else
Alarm = 0
End If
Wait 5
Loop

Die Aliasnamen hab ich gesetzt und auch über Config bestimmt was Eingang und was Ausgang ist.

Jetzt hab ich mir eine Einfache Schaltung zusammen gelötet die nach obiger Abfrage ein Relais ansteuert.
An PortB.1 (Alarm) hab ich nen 1K Widerstand gehängt hinter dem ein Transistor kommt der mir ein 5V Relais schalten soll.
Soweit so gut.. Nur habe ich vor dem Widerstand also an PinB.1 ca. 3.8V und nach dem Widerstand nur noch 0,56 Volt Was wahrscheinlich die Ursache für das Zappeln des Relais ist.

Die Relais Schaltung habe ich mir auf der Seite von

http://halvar.at/elektronik/kleiner_bascom_avr_kurs/last_anschliessen/ geholt...

Bitte helft mir auch wenn das Problem für Euch recht schnell zu lösen ist und der Eine oder Andere sagen wird da hättest Du auch selber drauf kommen können...

Vielen Dank schon mal...
Grüße aus dem Süden

Sauerbruch
01.12.2010, 20:37
Nur habe ich vor dem Widerstand also an PinB.1 ca. 3.8V und nach dem Widerstand nur noch 0,56 Volt

Das ist absolut normal - ca. 0,6 Volt fallen an der Basis-Emitter-Strecke ab, und der Rest am Vorwiderstand. Dafür ist er da.


Was wahrscheinlich die Ursache für das Zappeln des Relais ist

Kannst Du das etwas genauer beschreiben? Gibt Deine Stromversorgung genug Strom her um nicht einzubrechen, wenn das Relais anzieht?

Hast Du die Eingänge mit PullUp- oder PullDown-Widerständen beschaltet? Oder anders - was für ein Signal liegt an den Eingängen, wenn die damit verbundenen Kontakte offen sind?

Halodri
02.12.2010, 12:05
Hallo Sauerbruch

Also es hoert ssich an als ob das Relais staendig ein und aus schaltet.
Wegen der Pulldown Widerstaende da hab ich gespart ich dachte wenn ich den Portb.2 ueber den schalter laufen lasse und auf pinb.3 abfrage wuerde es reichen und ich komme ohne Widerstand aus.
Wegen Spannungseinbruch am Relais habe ich noch nicht gemessen weil ich stabilisierte 5V in die Schaltung gebe und das Relais ein 5V Relais ist ,,

Gruesse aus dem Sueden

for_ro
02.12.2010, 12:48
Zeig doch mal dein ganzes Programm.
Vielleicht liegt der Fehler ja ganz woanders.

Halodri
02.12.2010, 17:18
Also hier mal das mini Progrämmchen.

Es ist das Erste das ich getippelt habe.

$regfile = "m48def.dat"
$crystal = 8000000
$sim


Config Portb.1 = Output
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Pind.4 = Input
Config Pind.5 = Input
Config Pind.6 = Input
Config Pind.7 = Input
'Ports einrichten welcher Eingang und welcher Ausgang ist.'

Versorgungfensterschalter Alias Portd.0
Versorgungtuerkontakt Alias Portd.1
Alarm Alias Portb.1
Fensterschalter Alias Pind.4
Tuerkontakt Alias Pind.5
Eingangrauchmelder Alias Pind.6

'Alias Namen setzen'

Versorgungfensterschalter = 1
Versorgungtuerkontakt = 1
Alarm = 0

'Grundeinstellung'

Hauptprogramm:
Do
Wait 5

If Fensterschalter = 1 And Tuerkontakt = 1 And Eingangrauchmelder = 0 Then
Alarm = 1
Else
Alarm = 0
End If
Wait 5
Loop
End 'end program

Ich hoffe das es einigermassen ok so ist was ich gemacht habe.

Was mir daran noch aufgefallen ist wäre folgendes..

Wenn ich das Programm mit F8 im BascomSimulator durchlaufen lasse passt alles..

Fensterschalter=1 Tuerkontakt =1 Eingangrauchmelder =0
Alarm = 1

Wenn ich es aber mit F5 starte dann wird der Ausgang genau entgegen der gewünschsten Funktion gesetzt.

Fensterschalter =1 Tuerkontakt=1 Eingangrauchmelder= 1
Alarm = 1

Grüße aus dem Süden

Sauerbruch
02.12.2010, 19:16
wenn ich den Portb.2 ueber den schalter laufen lasse und auf pinb.3 abfrage wuerde es reichen und ich komme ohne Widerstand aus

Das verstehe ich zwar nicht ganz, weil B.2 und B.3 irgendwie gar nicht in Deinem Code vorkommen - aber wie auch immer: Du musst sicherstellen, dass Eingangspins niemals "in der Luft" hängen. D.h. wenn Dein Schalter nach Masse geht brauchst Du einen PullUp, und wenn er nach + geht einen PullDown. Komplett unbeschaltete Eingänge sind so hochohmig, dass sie sich ein vollkommen unkalkulierbares Sammelsurium an Störimpulsen einfangen - damt kann keine Eingangs-Abfrage funktionieren...

Btw: PullUp-Widerstände haben die Controller eingebaut - Du aktivierts sie, wenn Du das entsprechende PORT-Register auf 1 setzt.

Also z.B. PORTB.2 = 1, wenn Du PINB.2 als Eingang abfragen mächtest.

Halodri
03.12.2010, 12:21
So langsam kommt Licht ins Dunkel...

Ich versuchs nochmal anhand meines Programms nach zu vollziehen
In meinem Fall müsste ich also da ich Pind.4 bis Pind.7 als Eingang nutze
eine vorherige Initialisierung wie Portd.4 = 1 Portd.5 = 1 Portd.6 = 1 Portd.7 =1 machen um den internen Widerstand zu aktivieren? Das alles natürlich nur wenn ich ein Minus Signal schalte.

Wenn ich ein Plus Signal schalte dann muss ich mir 4 externe Widerstände nehmen sagen wir mal 1K oder weniger um die Pins Pind.4 ... Pind.7 auf 0 zu ziehen..??

Wenn ich jetzt sagen wir mal nur mit dem "d" Register arbeite muss dann die Initialisierung auch für das "b" und "c" Register erfolgen oder spielt das dann keine Rolle?

Danke für Eure Hilfe..

Grüße aus dem Süden

Sauerbruch
03.12.2010, 13:36
In meinem Fall müsste ich also da ich Pind.4 bis Pind.7 als Eingang nutze
eine vorherige Initialisierung wie Portd.4 = 1 Portd.5 = 1 Portd.6 = 1 Portd.7 =1 machen um den internen Widerstand zu aktivieren? Das alles natürlich nur wenn ich ein Minus Signal schalte.


...absolut korrekt!


Wenn ich ein Plus Signal schalte dann muss ich mir 4 externe Widerstände nehmen sagen wir mal 1K oder weniger um die Pins Pind.4 ... Pind.7 auf 0 zu ziehen..??

...fast korrekt - 50K reichen auch dicke aus; in dieser Größenordnung liegen auch die internen PullUp-Widerstände des Controllers. 1K würde halt schon 5 mA ziehen - bei vier Eingängen summiert sich das schon ganz schön...


Wenn ich jetzt sagen wir mal nur mit dem "d" Register arbeite muss dann die Initialisierung auch für das "b" und "c" Register erfolgen oder spielt das dann keine Rolle?

Wenn Du ganz sicher gehen willst, dass auch unbenutzte Eingänge nicht in irgendwelche undefinierbaren Zustände gehen, kannst Du auch für die restlichen I/O-Ports den PullUp aktivieren. Ist aber kein "muss".

Eine Frage habe ich noch: In Deinem Code ist ja eine Pause von 5 Sekunden. "Zappelt" das Relais denn im 5-Sekunden-Takt? Wenn´s schneller wäre, kann es eigentlich nicht am Programm liegen, denn das macht ja ohne Wenn und Aber für 5 Sekunden Pause. Das würde dann doch eher für Instabilitäten in der Spannungsversorgung sprechen.

Ob Ausgangsseitig alles okay ist, kannst Du ja mit einem kleinen Test-Code prüfen:



Config Portb.1 = Output

Do
Toggle Portb.1
wait 1
Loop


Wenn das Relais alle 1 Sekunde hin- und herschaltet, geht dieser Teil der Hardware schon mal.

Halodri
03.12.2010, 17:11
Guten Abend!

Also ich habe dieses Wait eigentlich nur Spaßhalber zu Testzwecken drin gehabt. Gerade weil das Relais so dermaßen schnell geschalten hat. Da dachte ich könnte ich das mit einem Wait etwas eingrenzen bzw. nähers lokalisieren woher der Fehler kommt.
Kurz gesagt das Relais schaltet ca 30 mal die Sekunde vom Gefühl her.


Ich habe nun mal das Test Prg. geladen und siehe da. Das Relais schaltet zwar nicht alle Sekunde aber alle ca. 2 Sekunden. Schön brav ein und aus.

Ich werde nun mal meinen 2 Eingängen die ich abfrage einen 50K Widerstand spendieren und dann nochmals Testen.
Auf alle Fälle ist ja schon mal ein kleines Erfolgserlebnis da. :-({|=


Dank für Eure Hilfe

Grüße aus dem Süden

Halodri
03.12.2010, 18:07
Hurraaaaa Es lag an den fehlenden Widerständen..

Jetzt schnurrt alles wie es soll.

Danke nochmals...

Richard
03.12.2010, 18:35
Hurraaaaa Es lag an den fehlenden Widerständen..

Jetzt schnurrt alles wie es soll.

Danke nochmals...

Also ich setze vorsorglich erst einmal alle Pull_Up mit Portx = 1 und dann wenn nötig einzelne mittels Portx.y = 0 zurück, dann kann ich nichts vergessen. :-)

Die Port Befehle sind NUR zum ein/ausschalten der Pull_up R's. Einen Port generell mittels config as input/output setzen habe ich erhlich gesagt noch nicht probiert und sehe auch nicht wirklich (wenn es überhaupt geht) einen Sinn darin.

EIn/Ausgänge setzen/Abfragen geschieht mittels dae PIN Befehls!


z.B. Lesen; if pinx.y = 1/0 then......

z.B. Schreiben Pinx.y = 1/0

Natürlich muss vorher der entsprechende Pin als input/output Deklariert werden. Bisher habe ich mit dieser Vorgehensweise immer Erfolg gehabt.

Gruß Richard

Sauerbruch
03.12.2010, 23:50
@ Richard:


EIn/Ausgänge setzen/Abfragen geschieht mittels dae PIN Befehls!


z.B. Lesen; if pinx.y = 1/0 then......

z.B. Schreiben Pinx.y = 1/0


Bist Du Dir sicher, dass man einen Ausgang mit PINX.Y auf 1 bzw. 0 setzen kann? Ich würde meine halbe Leber darauf verwetten, dass man Ausgängen immer nur mit PORTX.Y = 0/1 einen definierten Pegel zuweisen kann... :-)

for_ro
04.12.2010, 00:50
Ich würde meine halbe Leber darauf verwetten, dass man Ausgängen immer nur mit PORTX.Y = 0/1 einen definierten Pegel zuweisen kann... :-)
Nimm lieber ein unwichtigeres Organ.
Du hast natürlich im Normalfall recht, aber:
PinX.Y = 1
toggelt den Ausgang. Ist manchmal ganz praktisch.

Sauerbruch
04.12.2010, 11:17
Au weia - man gut, dass mir wenigstens die andere Hälfte noch bleibt :-)

Aber das mit dem Toggeln über PINX.Y ist wirklich schon "hohe Schule" - ich kann mir gut vorstellen dass jemand, der gerade die ersten Gehversuche macht, sicherlich verzweifeln wird, wenn er (wie vorgeschlagen) versucht, einen Ausgang über PINX.Y = 1/0 auf High oder Low zu setzen ;-)