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
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?
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
@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
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?
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
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
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.
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.
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
.include "m8def.inc"
2
;**********************************
3
;* --- Initialisierung Port --- *
4
;**********************************
5
ldi r16, 0xff ;0xff definiert PortB
6
out DDRB, r16 ;als Ausgang
7
8
ldi r16, 0x00 ;0x00 definiert PortD
9
out DDRD, r16 ;als Eingang
10
11
ldi r16, 0xff ;0xff aktiviert die Pull Up
12
out PORTD, r16 ;Widerstaende fuer PortD
13
;*********************************
14
15
Main: ;Beginn des Hauptprogramms
16
17
in r16, PIND ;Eingaenge an PORTD nach r16 einlesen
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:
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
.include "m8def.inc"
2
;**********************************
3
;* --- Initialisierung Port --- *
4
;**********************************
5
ldi r16, 0x00 ;0x00 definiert PortD
6
out DDRD, r16 ;als Eingang
7
8
ldi r16, 0xff ;0xff aktiviert die Pull Up
9
out PORTD, r16 ;Widerstaende fuer PortD
10
11
; ldi r16, 0xff ;0xff definiert PortB
12
out DDRB, r16 ;als Ausgang
13
;*********************************
14
15
Main: ;Beginn des Hauptprogramms
16
17
in r16, PIND ;Eingaenge an PORTD nach r16 einlesen