PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage Drehfeldausgabe



Picht
03.11.2006, 10:54
Hallo,
anbei ein Codeauszug.
Nacheinander werden jeweils Ports auf H gesetzt.
Es werden 3 Pins dann abgefragt.Und gibt pro Port 1 Pin(Durchgang)
aus.Das klappt auch alles.Es können jetzt mehrehre Ausgabevarianten
entstehen.L1,L2,L3... L3,L2,L1...usw.Die Ausgabevariante bestimmt
das Drehfeld(rechts oder lins).Meine Idee war jetzt im Speicher
für L1,L2,L3 die Ziffer 123 abzulegen und am Ende der Schleife
auszulesen und auszuwerten.
Also wie kriege ich die Ziffer hin 100ter,10ner,1ner.
Und kann ich readeprom und writeeprom verwenden.
Hat jemand eine Idee?



Do
'Pinauswertung
Portd.1 = 1
If Pind.1 = 1 Then
Print "L1"
Elseif Pind.2 = 1 Then
Print "L2"
Elseif Pind , 3 = 1 Then
Print "L3"
End If
Portd.1 = 0

Portd.2 = 1
If
'wie oben
End If
Portd.2 = 0

Portd.3 = 1
If
'wie oben
End If
Portd.3 = 0

'Drehrichtung
'If "L1" ; "L2" ; "L3" Then
'Print "rechts"
'Elseif "L2" ; "L3" ; "L1" Then
'Print "rechts"
'Elseif "L3" ; "L1" ; "L2" Then
'Print "rechts"
'Else
'Print "Links"
'End If

Loop


Wigbert

Marco78
03.11.2006, 23:01
Und kann ich readeprom und writeeprom verwenden.

Natürlich kannst du das. Aber wofür?


Also wie kriege ich die Ziffer hin 100ter,10ner,1ner.

A=0
A=A+100 'A ist 100
A=A+20 'A ist 120
A=A+3 'A ist 123



Dim A As Byte


Do

If Pind.1 = 1 Then
A = 100
Gosub L2
End If

Print A
If A = 123 Then Print "Rechts" Else Print "Links"

Wait 3

Loop

L2:

Do
If Pind.2 = 1 Then A = A + 23
If Pind.3 = 1 Then A = A + 32
Loop Until A > 100
Return

Picht
04.11.2006, 08:32
Hallo,
ganz so einfach ist es nicht .Jeder Eingangspin kann mit jeden
Ausgangspin angeschlossen werden.Es entstehen maximal
6 Varianten 3x rechts, 3mal links.Aber aus der Idee kann ich was
machen.Danke.
Aber mein Programm meckert, wenn ich im Gosub Programm Do und Loop until.... einsetze.

W.

Picht
04.11.2006, 08:52
Sorry,
es geht, hatte sich ein kleiner Fehler eingeschlichen.Aber warum muss
das Do-Loop Until... rein.

W.

Marco78
04.11.2006, 10:31
Das Programm startet quasi, wenn die erste Phase anliegt. Im Prinzip hätte man mit jeder beliebigen starten können. Aber so ist es evtl etwas einleuchtender.
Welche Phase garde anliegt wenn das Programm startet ist unbekannt. Also muss man sich einen Startpunkt setzen. In diesem Fall L1.

Nachdem L1 da war, folgen L2 oder L3. Wer zuerst kommt wissen wir ja nicht. Der Controller fragt die Eingänge aber um einiges schneller ab, als die Phasen den Eingang auf High schalten. Also muss für die Erkennung L2 oder L3 sichergestellt werden, das der Controller wartet, bis eine der beiden da war.

Nach L1 hat A=100. Also 100er-Stelle eine 1 für L1.
Loop Until wartet, bis A größer als 100 ist. Also bis A=123 oder A=132 ist. Weil erst dann war die nächste Phase da.
Wenn die Erkennung abgeschlossen ist, läuft das Programm weiter und und gibt das Drehfeld aus.

Es ist auch egal, ob du L2, L3 und dann L1 hast. Oder mit L3 anfängst. Alle möglichen Varianten abzufragen benötigt nur unnötig Speicherplatz!

Das ganze kann auch ohne das Label L2: programmiert werden.


ganz so einfach ist es nicht .Jeder Eingangspin kann mit jeden
Ausgangspin angeschlossen werden.

Ich verstehe nicht, was du meinst. In deinem Programm hast du doch nur drei Eingänge.

Picht
04.11.2006, 10:40
Hallo,
um das Drehfeld ausgeben zu lassen, multipl. ich Ausgangspin
mit Eingangspin.Da der Messzyklus Ausgangspins nacheinander
ein bzw. ausschaltet, muss sich das Programm den Wert merken.

portd.1 = 1 , welcher Pin hat 1?, merke Dir Ergebnis !
portd.1 = 0
portd.2 = 1 , wie oben
Portd.2 = 0
portd.3 = 1 , wie oben
portd.3 = 0

'gemerkte Ergebnis berechnen.

Also muss ich zwischenspeichern ?Und wenn ja wie kriege ich den Zwischenspeicher hin?

Berechnung Drehsinn

Ausgang

L1= 1
L2= 2
L3= 3


Eingang

L1' = 1
L2' = 2
L3' = 3


rechtsdrehsinn

1*1=1
2*2=4
Summe=5

1*2=2
2*3=6
Summe=8

1*3=3
2*1=2
Summe=5

linksdrehsinn

1*1=1
2*3=6
Summe=7

1*2=2
2*1=2
Summe=4

1*3=3
2*2=4
Summe=7



Also habe ich Wertzuweisungen für links und rechtsdrehsinn.
Den dritten Leiter braucht man nicht mehr auswerten.
Macht die Industrie auch nicht anders.

W.

Picht
04.11.2006, 10:58
Hallo Marco 78,
jetzt haben sich unsere Beiträge überschnitten.
Hatte wohl das nicht richtig verstanden.Probier Deine Variante noch
mal aus.

W.

Picht
04.11.2006, 11:29
Marco 78,
ich noch mal.Ich hab wohl nur die Hälfte beschrieben.
In jeden Messzyklus wird nur einer der 3 Eingänge H sein.
Dann der nächste, wieder nur einer, beim dritten Messzyklus
wieder nur ein Pin auf H.Welchen weiss ich nicht.
Müsste da nicht auch bei Deiner Variante ein zwischenspeichern
erfolgen?.

W.

Marco78
04.11.2006, 11:58
Ich speichere es doch in A zwischen.
Deine Ausgänge hast du im Programm aber nicht beschrieben. Ohne das man weiss, das du irgendetwas mit Ausgängen vor hast kann dir keiner helfen.
Außerdem kann ich nicht nachvollziehen, was du vor hast, bzw wie du es vor hast.

Wenn du den AVR nur nutzt, um Ausgänge 1:1 bei einem Eingangssignal zu schalten, kannst du ihn dir doch auch sparen?!?

Ich kenne es so, das Drehfeldprüfer entweder einen Drehfeldabhänigen Motor haben (gibt's die eigentlich heutzutage noch zu kaufen) oder es wird mit der Zeit der folgenden Phase gemessen. Kommt die nächste Phase zu spät, hat man linkes Drehfeld. Kommt sie wie erwartet, hat man ein rechtes.

Poste doch mal deinen ganzen Code und die Schaltung dazu. Dann kann man evtl besser nachvollziehen, was du eigentlich vor hast.

Hast du den Code von mir schon ausprobiert? Funktioniert er?

Picht
04.11.2006, 12:51
Hallo Marco,
Du hast natürlich recht .Manches kann man nur im Zusammenhang
erkennen.
Es wird ein Durchgangsprüfer fur 5 pol Verlängerungsleitungen.
Grunidee:
1.Messzyklus PE Leiter Portx = 1
-nur ein Pin darf H haben wenn nicht "Kurzschluss"
wenn ja, der richtige?wenn nicht "Unterbrechung"
sonst " SL OK"
Portx = 0
2.Messzyklus N-Leiter .....wie oben
3.Messzyklus L1-Leiter ....wie oben
" L1-L1 "( L1-L2 ,L1-L3)
4.Messzyklus L2......
5.Messzyklus L3......
6.Messzyklus Drehfeld

$regfile = "attiny2313.dat" 'AT90S2313-Deklarationen
$crystal = 9216000 'Verwendeter Quarz: 9,2160 MHz
$baud = 9600



Ddrb = &B11100000
Portb = &B00011111
Ddrd = &B1111100
E1 Alias Pinb.0
E2 Alias Pinb.1
E3 Alias Pinb.2
E4 Alias Pinb.3
E5 Alias Pinb.4
'$hwstack = 32
'$swstack = 8
'$framesize = 16
'Config Serialout = Buffered , Size = 10
Config Com1 = Dummy , Synchrone = 0 , Parity = Even , Stopbits = 1 , Databits = 8 , Clockpol = 0
Dim B As Byte
Dim D As Byte
Dim Summe As Byte
Declare Sub Summe
Declare Sub Leiter

Do
'Waitms 100
Portd.2 = 1
Summe
Print Summe
If Pinb.0 = 1 Then
Printbin &H04 ; &H53 ; &H04 ; &H00 ; &H53; 'Kursor
Printbin &H08 ; &H50 ; &H50 ; &H45 ; &H2D ; &H20 ; &H4F ; &H4B ; &H44; 'PE- OK
Else
Do
Printbin &H04 ; &H53 ; &H03 ; &H00 ; &H54; 'Kursor
Printbin &H0A ; &H50 ; &H50 ; &H45 ; &H2D ; &H42 ; &H72 ; &H75 ; &H63 ; &H68 ; &H2C; 'PE- Bruch
Loop
End If
Portd.2 = 0

Portd.3 = 1
Summe
If Pinb.1 = 1 Then
Printbin &H04 ; &H53 ; &H04 ; &H01 ; &H52; 'Kursor
Printbin &H08 ; &H50 ; &H4E ; &H4C ; &H2D ; &H20 ; &H4F ; &H4B ; &H53; 'NL- OK
Else
Do
Printbin &H04 ; &H53 ; &H03 ; &H01 ; &H55; 'Kursor
Printbin &H0A ; &H50 ; &H4E ; &H4C ; &H2D ; &H42 ; &H72 ; &H75 ; &H63 ; &H68 ; &H3B; 'NL- Bruch
Loop
End If
Portd.3 = 0
'Wait 1

Portd.4 = 1
Summe
Printbin &H04 ; &H53 ; &H04 ; &H02 ; &H51; 'Kursor
Printbin &H04 ; &H50 ; &H4C ; &H31 ; &H29; 'L1
Leiter
Portd.4 = 0
'Wait 1

Portd.5 = 1
Summe
Printbin &H04 ; &H53 ; &H04 ; &H03 ; &H50 '; 'Kursor
Printbin &H04 ; &H50 ; &H4C ; &H32 ; &H2A; 'L2
Leiter
Portd.5 = 0
'Wait 1

Portd.6 = 1
Summe
Printbin &H04 ; &H53 ; &H04 ; &H04 ; &H57; 'kursor
Printbin &H04 ; &H50 ; &H4C ; &H33 ; &H2B; 'L3
Leiter
Portd.6 = 0
'Wait 1
'Drefeld
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1
If Pinb.2 = 1 Then
D = 100
Gosub Drehfeld
End If
If D = 123 Then
Print "rechts"
Else
Print "links"
End If
'Wait 1
Loop
End

Sub Summe
B = E1 + E2
B = B + E3
B = B + E4
Summe = B + E5
If Summe >= 5 Then

Printbin &H02 ; &H43 ; &H41;
Do 'Löschen
Wait 1
Printbin &H04 ; &H53 ; &H02 ; &H03 ; &H56;
Printbin &H0D ; &H50 ; &H4B ; &H75 ; &H72 ; &H7A ; &H73 ; &H63 ; &H68 ; &H6C ; &H75 ; &H73 ; &H73 ; &H0A; 'Kurzschluss
Wait 1
Loop
End If
End Sub

Sub Leiter
If Pinb.2 = 1 Then
'Printbin &H04 ; &H53 ; &H06 ; &H02 ; &H53;
Printbin &H05 ; &H50 ; &H2D ; &H4C ; &H31 ; &H05; '-L1
Elseif Pinb.3 = 1 Then
'Printbin &H04 ; &H53 ; &H06 ; &H03 ; &H52;
Printbin &H05 ; &H50 ; &H2D ; &H4C ; &H32 ; &H06; '-L2
Elseif Pinb.4 = 1 Then
'Printbin &H04 ; &H53 ; &H06 ; &H04 ; &H55;
Printbin &H05 ; &H50 ; &H2D ; &H4C ; &H33 ; &H07; '-L3
Else
Printbin &H02 ; &H43 ; &H41;
Wait 1
Do
Printbin &H04 ; &H53 ; &H02 ; &H03 ; &H56;
Printbin &H0D ; &H50 ; &H4C ; &H65 ; &H69 ; &H74 ; &H65 ; &H72 ; &H62 ; &H72 ; &H75 ; &H63 ; &H68 ; &H10 ; 'Leiterbruch
Loop
End If
End Sub

Drehfeld:
Do
If Pinb.2 = 1 Then D = D + 23
If Pinb.3 = 1 Then D = D + 32
Loop Until D > 100
Return

schau Dir den Code mal an ,im groben läuft er.Aber wenn ich die
Pullupwiderstände einschalte,geht es auf Kurzschluss.Aber das ist wohl klar da alle Pins auf 1 gesetzt werden.
Da die Ausgänge 1 zuschalten und die Eingänge auf 0 geschaltet werden
müssen ist ein Simulation nur bedingt möglich.
Schau es Dir an und sag ich soll es wegschmeissen.
Ausgabe erfolgt über ein Miniteminal,deshalb der Hexcode.


W.

Picht
04.11.2006, 13:49
Hallo Marco,
die Simulation sieht gut aus.Es muss nur der Drehrichtungstest
mindestens 2 mal durchlaufen werden.ungünstigster Fall.
Die Ports werden am Ende wieder abgeschaltet.

W.

Picht
04.11.2006, 16:51
Hallo Marco,
Deine Idee war Brilliant.
Ich schalte nacheinander die 3 Ports zu ,bis Pind.2 = 1 ist .
Dann schalte ich den nächsten Port zu und nehme Deinen
Code, welcher Pin jetzt = 1 ist.Dadurch werte ich 2 Pins zeitlich nacheinander aus.
Also ähnlich wie im Netz.Ich springe dann gleich zur Anzeige
und das wars dann wohl.

W.

Marco78
04.11.2006, 17:53
Es freut mich, wenn ich helfen konnte.

Wie bist du denn auf das Delcare Sub gekommen? Programmierst du auch in VB?

Falls du das ganze mal mobil bauen willst, kannst du das auch ohne externen Quarz aufbauen. Die Schaltung würde sogar mit 1MHz laufen, wenn du auf die serielle Ausgabe verzichten kannst. Du kannst ja ein oder zwei oder drei LEDs nehmen. Blau für in Arbeit, grün für alles OK und rot blinkend für Fehler. Je nach Anzahl des Auflechten der roten LED ist ein ein bestimmter Fehler.
Oder wenn es wichtig aussehen soll mit 'nem LCD.

Picht
04.11.2006, 18:42
nö,
ich mache nur Bascom,eigentlich sind alle Befehle nur "geklaut".
Irgenwo hab ich mal gelesen Sub-Funktionen sind nicht gut.
Du hast Gosub genommen,würde mich mal interessieren
was besser ist.
Als Ausgabe benutze ich ein Nokia 3310 Display mit Miniterminal(RS232)
nach Mikrocontroller-Forum. Hab das mehrmals aufgebaut.Ich wollte mir schon immerein Zusatzgerärt zum VDE-Prüfgerät für
ortsveränd.Geräte bauen.
So ein Gerät mit Display sieht für den Kunden immer schw...Teuer
aus.Wobei es ersetzt nicht die VDE-Prüfung.Kann aber hilfreich sein.
Bei 6 Zeilen war eben Platz für Drehfeldausgabe.
Im Prinzip hast Du recht, mit der Ausgabe,geht es auch einfacher.
Mich würde mal auch die Meinung zum Code interessieren.
Dei meisten Probleme sind auch gelöst,nur mit der Kurzschlussanzeige
bin ich mir noch nicht sicher.Habe sie für die Simulation hoch gesetz.

W.

Marco78
04.11.2006, 19:26
Gosub/Goto Label benötigt weniger Programmspeicher als Declare Sub. Aber mit Declare Sub kann man leichter Werte übergeben.
Außerdem ist es eine Glaubensfrage, welche programmierung besser ist.

Jetzt fehlt dir noch die Funktion zu messen, ob der Schutzleiter niederohmig ist ;)

Zum Code:
Jeder so, wie er damit klar kommt.

Wenn du selbst ein programm schreibst und es nicht zusammenkopierst, wirst du deinen eigenen Still entwickeln.
Aber letztlich zählt nur eins. Das es funktioniert.

Picht
04.11.2006, 21:50
zum Abschluss,
ich meinte, ich habe viele Code studiert,und mir die nach meiner Meinung
funktionierenden Befehle übernommen.Ich versuche vieles über
Sub-Funktionen zu machen.Wie Du schon sagst jeder hat seinen
eigenen Stil.
Ich muss allen Lesern nochmals darauf hinweisen:

Eigenbaugeräte dürfen nicht für VDE-Prüfungen verwendet werden.

Es wird hier auch kein funktionierenden Code geben.

nochmals dank allen Beteiligten für die Hilfe.

W.