Hallo zusammen, ich habe mir zu Weihnachten ein STK500 zulegen lassen und komme soweit (d.h. das was ich mache verstehe ich auch ^^) klar damit. Ich scheitere aber bei den logischen Verknüpfung. Das liegt aber wohl eher daran dass ich in der Ausbildung mit der Simatic S7 zu tun hatte und da war das alles anders. Meine Zielstellung ist eigentlich ziemlich simpel: 2 Taster werden gedrückt, solange diese 2 Taster gedrückt sind leuchtet 2 LEDs auf dem STK. Ich habe einen ATmega8 und habe mit Assembler angefangen. Das Programm von dem ich mir denke, dass es eigentlich Funktionieren müsste ist im Anhang (AND.asm). Wenn ich die ganze Sache in den Speicher geladen habe, dann passiert aber nicht das was ich beabsichtige. In der Simulation passiert aber das richtige. Ich brauche bitte eure Hilfe, ich verzweifel hier sonst noch. Wenn ich irgendwo was vergessen hab, dann sagt bescheid. Und wenn ihr Tipps für einen Anfänger habt, dann immer her damit :) Mit freundlichen Grüßen Chris Maik
Gast
#2489281
sorry hab hier kein STK rumliegen. An welchen Pins hängen die Taster? An welchen die Leds? Soll ein Taster eine Led ansteuern oder sollen beide Leds angehen, wenn beide Knöpfe gedrückt sind?
1 | |
hier liegt der Hund begraben. Diese Bedingung ist nur wahr, wenn alle anderen Pins des Ports wirklich auf Low liegen. Das wird aber fast immer nicht der Fall sein. Also wenn nicht am Port folgendes anliegt, ist es immer ungleich: 00001010 Gruß Oliver
Du meinst die Taster auf dem STK500, die man erst mit Kabeln mit einem der Ports verbinden muß?
Außerdem sind die Taster low-aktiv zu interpretieren.
@Danny: Die LEDs sind an Port B und die Taster an Port D. Nochmal zur Funktion: Wenn beide Taster gedrückt sind (also wirklich nur diese beiden Taster), dann sollen die LEDs angehen. Ich nutze NUR die sache die auf dem STK drauf sind (Taster, LEDs). @Oliver: Und wie bekomme ich ein klares Low auf alle anderen Pins? Kommt das nicht durch die Pullups?
Du willst doch nur die bits 1 und 3 von portd abfragen. 1. Schritt Pin lesen: in r16,pind 2. Schritt: nicht benutzte Pins maskieren: andi r16,0x0a dann sind alle nicht benutzten bits zu Null gemacht 3. Schritt: eigentliche Abfrage für die bits 1 und 3: cpi r16,0x0a
Chris Hilarius schrieb: > Und wie bekomme ich ein klares Low auf alle anderen Pins? Du brauchst kein klares low auf den anderen Pins. Dein Programm muss so gestrickt sein, dass es die anderen Pins einfach ignoriert. >Kommt das nicht durch die Pullups? Pullups ziehen den Pegel gegen VCC und erzeugen ein High am entsprechenden Pin. Gruß Oliver
Gast
#2489563
Chris Hilarius schrieb: > Die LEDs sind an Port B und die Taster an Port D Mannomann. Den Unterschied zwischen Pin und Port kennst auch noch nicht, heh?
woraus schließst du das? Wenn die LEDs an Port B sind und die Taster an Port D, dann heißt das doch nicht, daßer nicht zwischen Pin und Port unterscheiden kann? Oder was habe ich übersehen?
Gast
#2489645
weil er die Frage nach den Pins mit den Ports beantwortet?
Danny schrieb: >weil er die Frage nach den Pins mit den Ports beantwortet? Danny schrieb: > An welchen Pins hängen die Taster? An welchen die Leds? Nix für ungut Danny, aber du wirfst auch PIN (=Eingang =Taster ) und PORT ( =Ausgang =LED) durcheinander.
Danny schrieb: > weil er die Frage nach den Pins mit den Ports beantwortet? ok, ist ein Argument. Wobei die Pins auch aus dem Quelltext ersichtlich wären, aber egal. Hans O. schrieb: >> An welchen Pins hängen die Taster? An welchen die Leds? > > Nix für ungut Danny, aber > du wirfst auch PIN (=Eingang =Taster ) > und PORT ( =Ausgang =LED) durcheinander. äh, Pin ist gleich PIN (PINA/PINB/PINC/PIND)?
Das schon, aber das ist auch nicht verwunderlich. Liegt doch der Port(Ausgang) auf bis zu Acht Pin's (Stiften) welche per Daterichtungsregister ebenso als PIN (Eingänge) geschaltet werden können, Das ist sogar der Defaultzustand. Also Termini und Mnemonic studieren insbesondere solche Feinheiten
Gast
#2489694
Ich weiss nicht was ihr habt. Der Ausdruck "Port" ist vollkommen richtig in der Verwendung, die er gewählt hat und stimmt in der Verwendung mit dem Datenblatt (vrgl. Block-Diagramm) überein. Register-Naming (PINx/PORTx) würde ich nicht als Termini/Mnemonic bezeichnen. Es ist eine rein controllerspezifische Nomenklatur und wurd' nichtmal angesprochen vom TE
Gast
#2489902
um das nochmal aufzuklären: PIN ist das Eingangsregister PORT ist das Ausgangsregister Pin ist ein kleines Stückchen Draht am IC. Natürlich kann man die Pins aus dem Quelltext lesen. Aber der Quelltext scheint ja in der ursprünglichen Fassung noch fehlerhaft zu sein.
OT: Mann sind hier spitzfindige Leute unterwegs.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
Also, wenn Du schon feststellst, daß r16 gleich 0x0A ist und verzweigst, dann brauchst Du anschliessend nicht nochmal zu überprüfen, ob r16 nun nicht 0x0A ist, denn es kann es ja nicht sein. Wenn es doch so sein sollte, solltest Du danach noch den möglichen Fehler abfangen und nicht einfach in den nächsten Programmteil laufen lassen. Ansonsten ist der Hinweis, die anderen Eingänge auszumaskieren der richtige. Du kannst zur Probe in Deinem Programm auch mal die 0x0A durch 0xF5 ersetzen. Gruß Jobst
Oliver J. schrieb: > OT: Mann sind hier spitzfindige Leute unterwegs. Lol, Du kennst mikrocontroller.net noch nicht. Lies mal ein paar Monate mit, wirst Dich wundern was hier so abgeht. Und meist sind es dann jene, die keine Eier haben, ihren Unsinn angemeldet zu posten.
Gast
#2489985
Hi Chris Es sind zwar schon die richtigen Antworten gegeben, aber ich denke,trotzdem, das nochmal eine Antwort hilfreich ist. Wenn du in der S 7 Welt ausgebildet wurdest, dann sind Signalzustände "0" und "1" bekannt. Des weiteren auch, auf welches Spannungspotential sie sich beziehen. Nun ist ein µC keine S 7 und der Taster hinterläßt im offenen Zustand kein Potential, er ist ja offen. Hochohmig würde aber ein Controller mit allem möglichen definieren. Deshalb hast du richtiger Weise auch die pull-Ups zugeschaltet. Somit liest du bei jedem Durchgang "11111111! ein. Also alle Eingänge des Ports sind "1". Wenn du nun die Taster drückst, legst du den Eingang auf "0" weil er gegen GND schalten sollte. (bei einer solchen Konfiguration. ob es das STK auch so macht, weiß ich nicht, da ich ihn nicht habe.) Domit liegt dann im Register "11110101" vor, also, nicht "0A"hex, sondern "F5"hex. Setz mal direkt hinter den Einlesebefehl einen "COM" Befehl. Der invertiert die Bits und du erhälst für einen betätigten Schalter auch die gewünschte "1". Des weiteren darfst du auch ruhig eine Maske mit einem "And" Befehl anwenden, um z. B. unerwünschte Bits auszublenden. Hier mal ein bearbeiteter Auszug aus deinem Programm:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
Auch wenn es hier keine Rolle spielt und den Code unnütz aufbläht, erinner ich dich trotzdem mal, wie eine SPS ihr Programm bearbeitet. Eingänge lesen bearbeiten Ausgänge setzen Wen du mit den ersten Programmen beginnst, dann solltest du dir folgendes angewöhnen, auch wenn es etwas Rechenleistung kostet. Programm Start mit Aufruf von Initialisierungsroutinen Danach die Schleife: Zuerst einlesen der Eingänge und Ablegen in einer Variablen mit richtiger Signallage Dann bearbeitungsroutinen dann eine Ausgaberoutine mit einer Variablen, in der die Bits für die Ausgänge gesetzt sind. Ich halte es speziell bei Assembler für sehr hilfreich, in der Schleife nur Unterprogrammaufrufe zu haben. Die Routinen sind somit u.U. für andere Programme Nutzbar. Etwa so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
Nun kannst du nach und nach die Unterprogramme füllen. Gruß oldmax
Hallo, Ich habe das mal im Simulator laufen lassen. Beachte, das beim STK500 die LEDs bei Low leuchten ! So wie unten, müsste das Programm nach deinen wünschen laufen.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
Grüsse Jürgen
Noch eine Variante. Macht das gleiche wie oben, nur mit einer anderen Taktik.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.