Probelme bei einem Programm

OP #399911
Lesenswert?

Hallo!

Ich stecke wie ja bekannt noch in den Anfängen des Ganzen hier.

ICh wollte jetzt folgendes Programm basteln, aber ich finde einfach
keinen Befehl, mit dem ich es hinbekomme bzw wie ich das Programm
zusammen basteln soll... vielleicht könnte ja einer das fertige
Programm mit einer zeilenweisen Erklärung reinstellen, dass wäre
natürlich super, dann könnte ich mir das mal genau ansehen...

Programm soll folgende Funktion haben: S1 and not S2 and S3 = H1

Hoffe ihr könnt mir helfen!

Gruß
Dominik
Gast #399915
Lesenswert?

Was sind S1 bis S3? Bitkonstanten? Dann müsstest du die Zugehörigkeit
mit in die Abfrage bringen:
if ((PINB &(1<<S!) && (!(PINB &(1<<S2)) && (PINB &(1<<S3))
{
 ...
}
wenn Port B (Eingang) abgefragt werden soll
Gast #399920
Lesenswert?

>In SPS Sprache wäre das ja nen Kinderspiel...

Eine SPS hat hier auch schon irgendwer mit einem AVR umgesetzt.

Zum "STK500-Problem":
Wie hast du die Flachbandkabel angeschlossen; sprich: Welcher Port ist
mit den Tastern verbunden und welcher mit den LEDs?

Die Taster des STK500 sind übrigens low-aktiv (gedrückt = 0V) und die
LEDs leuchten auch nur, wenn man eine 0 am entsprechenden Port
ausgibt.

Ist das dein allererstes Programm?
Dann würde es sich anbieten erst mal die LEDs leuchten zu lassen, dann
blinken und dann ein Lauflicht zu programmieren.
Dann kann man mit den Tastern rumspielen.
Das einfachste Programm ist sowieso:

PORTA = PINB;

(natürlich in ein C-Programm verpackt).
Gast #399922
Lesenswert?

if ((!(PIND &(1<<1))) && (PIND &(1<<S2)) && (!(PINB &(1<<S3)))
{
 PORTC &= ~(1<<1);
}
else
{
 PORTC |= (1<<1);

Und das schön ein C-Programm verpacken.
Die Klammern mußt du vielleicht noch mal durchzählen...
OP #399924
Lesenswert?

Hallo,

wieso in einem C Programm?

Habe bisher immer so programmiert

include "4433def.inc"     ;bzw. 2333def.inc

         ldi r17, 0xFF
         out DDRC, r17     ;Port B durch Ausgabe von 0xFF ins
                           ;Richtungsregister DDRB als Ausgang
konfigurieren
         ldi r17, 0x00
         out DDRA, r17     ;Port D durch Ausgabe von 0x00 ins
                           ;Richtungsregister DDRD als Eingang
konfigurieren
loop:
         in r17, PINA      ;an Port D anliegende Werte (Taster) nach
r16 einlesen
         out PORTC, r17    ;Inhalt von r16 an Port B ausgeben
         rjmp loop         ;Sprung zu "loop:" -> Endlosschleifede"
-> Endlosschleife


Das war jetzt nen Beispiel aus dem AVR Studio!

Diese programmstruktur bräcuhte ich!
Gast #399926
Lesenswert?

Warum sagste nicht gleich, dass Du in Assembler programmierst? Dann
hätten sich viele Leute viel Arbeit sparen können. Stattdessen erzählst
Du was von C un SPS...

In Deinem Beispiel schreibst Du
> in r17, PINA  ;an Port D anliegende Werte (Taster) nach r16 einlesen
> out PORTC, r17    ;Inhalt von r16 an Port B ausgeben
Überlege bitte mal, ob Du wirklich weißt, was Du willst. Und wenn ja,
dann sorge dafür, dass Programm und Kommentar sich nicht widersprechen.
Bringt Dich selber wahrscheinlich auch durcheinander...

Also, wenn S1..3 an den Pins 1..3 von Port D hängen, dann könnte das so
aussehen:

loop:
in r16, PIND
andi r16, 0b00001110 ;Pins maskieren, Bits 1..3
cpi r16, 0b00001010  ;Vergleich mit Maske "S1 && !S2 && S3"
breq led_ein    ;Springe zu "LED einschalten"
sbi portc, 0    ;LED an PORTC.0 aus
rjmp loop

led_ein:
cbi portc, 0    ;LED an PORTC.0 ein
rjmp loop
Gast #399930
Lesenswert?

Ach ja, die Taster sind beim STK500 in meiner Erinnerung ja Low-aktiv.
Muss also unten heißen

;...
andi r16, 0b00001110 ;Pins maskieren, Bits 1..3
cpi r16, 0b00000100  ;Vergleich mit Maske "S1 && !S2 && S3"
;...
OP #399931
Lesenswert?

Studio eingegeben und laut dem Studio sind 7 Fehler drin

Hier mal Das Programm..

include "4433def.inc"

         ldi r16, 0xFF  ;PortC als Ausgang konfigurieren
         out DDRC, r16


loop:
in r16, PIND
andi r16, 0b00001110   ;Pins maskieren, Bits 1..3
cpi r16, 0b00000100    ;Vergleich mit Maske "S1 && !S2 && S3"
breq led_ein        ;Springe zu "LED einschalten"
sbi portc, 0        ;LED an PORTC.0 aus
rjmp loop

led_ein:
cbi portc, 0        ;LED an PORTC.0 ein
rjmp loop



Ich verzweifel langsam noch.. sich das selber beizubringen ist nicht so
einfach wie ich mir das gedacht habe!

Danke für eure Geduld...
Gast #399935
Lesenswert?

binäre Schreibweise:
0b00000100

hexadezimale Schreibweise:
0x04

dezimale Schreibweise:
4

Das sollte man sich aussuchen können.

Falls du dich demnächst mit den im AVR integrierten Bausteinen (Timer,
USART etc) beschäftigst, solltest du dir gleich die
(1<<xyz)-Schreibweise angewöhnen, wobei xyz für die Bit-Bezeichnung
steht. Das erhöht die Lesbarkeit ungemein. Die BitBezeichnungen findet
man im Datenblatt. Da gibt es meist auch Codebeispiele in asm und C.
Gast #399936
Lesenswert?

Wieso hexadezimal? In meinem Beispiel sind sie binär maskiert... Du
kannst selbstverständlich anstelle von "0b00001010" auch "0x0a"
oder "10" schreiben, aber besonders anschaulich ist das glaub ich
nicht. Du willst das Programm ja später auch noch lesen können.

Wenn Du mit den Portpin-Definitionen aus der 4433def.inc arbeitest,
kannst Du aber auch die C-Notation nehmen, die in den anderen
Beispielen oben angegeben ist, also anstelle von "0b00001010" "(1 <<
PIND3)|(1 << PIND1)" schreiben...
Gast #399939
Lesenswert?

Es sind acht Taster. Ein Byte hat acht Bit.
Die Taster sind durchnummeriert. Entweder von 0 bis 7 oder von 1 bis 8
(ich vermute mal von 0 bis 7).
Benutzt man jetzt die Nummer (0..7) des Tasters, hat man den Exponenten
der Wertigkeit zur Basis 2.
Bei der binären Darstellung steht links das Bit mit dert höchsten
Wertigkeit und rechts das mit der niedrigsten (2^0 = 1).
#399942
Lesenswert?

Genau die gleiche wie die Bits, die sie im Program repräsentieren
wenn du das Byte vom Port einliest an dem die Taster hängen.

  0b00000000
    ^^^^^^^^
    |||||||1
    ||||||2
    |||||4
    ||||8
    |||16
    ||32
    |64
    128

Aber das interssiert eigentlich niemanden wirklich, da man
solche Dinge sowieso nicht dezimal angibt (ausser man ist
Masochist).
OP #399945
Lesenswert?

´´Habe gerade mal versucht auf PIN A einzulesen, da gibt er mir folgende
Fehlermeldung... liegts an mir oder am Board?

Recicht es für "in r16, PIND" einfach "in r16, PINA" zu schreiben
oder muss noch mehr geändert werden?


Building project...
C:\Dokumente und Einstellungen\Phil>del "C:\Dokumente und
Einstellungen\Phil\test0409.lst"
C:\Dokumente und Einstellungen\Phil\test0409.lst konnte nicht
gefunden werden
C:\Dokumente und Einstellungen\Phil>"C:\Programme\Atmel\AVR
Tools\AvrAssembler\avrasm32.exe" -fI  -o "C:\Dokumente und
Einstellungen\Phil\test0409.hex" -d "C:\Dokumente und
Einstellungen\Phil\test0409.obj" -e "C:\Dokumente und
Einstellungen\Phil\test0409.eep" -I "C:\Dokumente und
Einstellungen\Phil" -I "C:\Programme\Atmel\AVR
Tools\AvrAssembler\Appnotes" -w  -m "C:\Dokumente und
Einstellungen\Phil\test0409.map" "C:\Dokumente und
Einstellungen\Phil\test0409.asm"
AVRASM: AVR macro assembler version 1.76.4 (Aug  6 2004 07:02:13)
Copyright (C) 1995-2004 ATMEL Corporation
Creating   'C:\Dokumente und Einstellungen\Phil\test0409.eep'
Creating   'C:\Dokumente und Einstellungen\Phil\test0409.hex'
Creating   'C:\Dokumente und Einstellungen\Phil\test0409.obj'
Creating   'C:\Dokumente und Einstellungen\Phil\test0409.map'
Assembling 'C:\Dokumente und Einstellungen\Phil\test0409.asm'
Including  'C:\Programme\Atmel\AVR
Tools\AvrAssembler\Appnotes\4433def.inc'
C:\Dokumente und Einstellungen\Phil\test0409.asm(8) : error :
Undefined variable referenced
Assembly complete with 1 error
Deleting   'C:\Dokumente und Einstellungen\Phil\test0409.eep'
Deleting   'C:\Dokumente und Einstellungen\Phil\test0409.obj'
Deleting   'C:\Dokumente und Einstellungen\Phil\test0409.hex'
Deleting   'C:\Dokumente und Einstellungen\Phil\test0409.map'



Jetzt blicke ich wenigstens schonmal bei dem ZTahlensystem wieder
durch! Mühsam ernährt sich das Eichhörnchen! ;-)
Gast #399948
Lesenswert?

[OT]
l kommt auch noch vor m...
Meinst du, Andreas hat hier noch einen Beitragsnamensortieralgorithmus
mit eingebaut?

>Mühsam ernährt sich das Eichhörnchen! ;-)
Kennst du "Hammy"? Cola trinken verhilft manchmal zur höheren
Geschwindigkeit.
[/OT]

@Problem: Ich vermute es licht daran, dass dein Controller gar keinen
Port A hat. (Gibt's das?)
Gast #399952
Lesenswert?

Dann hast Du ein älteres STK500. Der 90S8515 hat aber auch nen Port A.
Wenn Du allerdings die 4433def.inc einbindest, kann das mit dem 8515
nicht klappen. Dann musst Du schon die 8515def.inc einbinden...
OP #399954
Lesenswert?

Hallo!

So habe mal ein bisschen rumgetestet und hoffentlich endlich
verstanden.

Jetzt hätte mal ne andere Frage..

Habe 2 Seiten mit verschiedenen befehlen von ATMEL.
Als Beispiel nehme ich mal das ANDI.

Auf dem Blatt steht dann da: ANDI / Rd, K  / Logical AND Register and
Constant / RD < Rd * K

Verstehe nicht wie man das Rd < Rd * K liest bzw. was es bedeutet.
Wofür steht das Mal Zeichen und so..etwas schwer zu erklären..

Hoffe ihr versteht was ich meine...

Gruß
Dominik
#399955
Lesenswert?

Halte dich einfach an die Beschreibung.
Das '*' ist einfach nur ein Symbol, das für UND benutzt
wurde und hat an dieser Stelle nichts mit Multiplikation
zu tun. So was wird in der Mathematik gerne gemacht: Irgendwelche
Symbole muss man ja nehmen, um eine Operation zu kennzeichnen.
Da kann man auch vertraute Symbole benutzen, solange man nur
definiert, was jedes Symbol bedeuten soll.
Gast #399957
Lesenswert?

ATMEL hat in Datenblättern und im Instruction Set Manual bei
Verknüpfungen eine etwas gewöhnungsbedürftige Notation für die
logischen Operatoren:

+                     entspricht ODER
+ mit Kreis drumrum   entspricht EXKLUSIV-ODER
dicker Punkt          entspricht UND

Hoffe, das hilft Dir weiter.
#399958
Lesenswert?

Das hat schon seinen Sinn.

Wenn ich 2 Zahlen addiere, dann ist das Ergebnis wahr, wenn eine der
beiden wahr ist (= ODER)

Wenn ich 2 Zahlen multipliziere, dann ist das Ergebnis nur dann wahr,
wenn beide wahr sind (= UND).


Heutige Logiksprachen (Abel) können aber auch richtig addieren und
multiplizieren, daher wird dort & für UND und # für ODER genommen.


Peter
OP #399963
Lesenswert?

Mhh.. also so langsam blicke ich endlich durch...aber das is sicher nur
subjektiv und beim nächsten Programm häng ich wieder in den Seilen...
mhh.

Wer bietet mir live Nachhilfe? Gegen Bezahlung? g

Problem wird einfach sein, dass ich es bis nächstes Jahr recht gut
können muss und das am besten schnell...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren