Forum: Mikrocontroller und Digitale Elektronik Probelme bei einem Programm


von Dominik F. (dominik1202)


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

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Controller? Programmiersprache?

if (S1 && (!S2) && S3)
 {
  H1 = 1;
 }
 else
 {
  H1 = 0;
 }

Das war C...

von Dominik F. (dominik1202)


Lesenswert?

Programmiere das mit AVR Studio und dann will ich es auf dem STK 500
testen!

Ja C und SPS-Sprache kann ich ja, nur ich habe zur Zeit noch derbe
Probleme mit den Befehlen für den MC. Hab mir jetzt schon sone 2
seitige Liste mit allen Befehlen besorgt...

von johnny.m (Gast)


Lesenswert?

Wenn Du sagst, was genau S1..3 und H1 sind, dann kannst Du sicher besser
geholfen werden...

von Sonic (Gast)


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

von Sonic (Gast)


Lesenswert?

Ich glaub' ich hab' 'ne Klammer vergessen:
if ((PINB &(1<<S!) && (!(PINB &(1<<S2)) && (PINB &(1<<S3)))

von Sonic (Gast)


Lesenswert?

Ups:
if ((PINB &(1<<S!)) && (!(PINB &(1<<S2))) && (PINB &(1<<S3)))

jetzt aber!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Das hiesige AVR-GCC-Tutorial hast du dir schon angeguckt, oder?
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Dominik F. (dominik1202)


Lesenswert?

Sorry.. mit S1 S2 und S3 meinte ich Taster, also die Taster auf dem
STK500 und mit H1 die LED1...

komme aus der "grob" Elektrik g

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

von inoffizieller WM-Rahul (Gast)


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).

von Dominik F. (dominik1202)


Lesenswert?

Hallo!

Habe die LEDs schonmal leuchten lassen mit dem Programm S1 and S2
=H1..
War aber auch schon ein schwieriges Unterfangen!

Also die Taster stecken auf Port D und die LEDs auf Port C

Danke schonmal vorab für die gute Hilfe hier...

von inoffizieller WM-Rahul (Gast)


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...

von Karl-heinz D. (kalledom)


Lesenswert?

Es müssen Brücken von den Tastern (Pfosten SWITCHES) zu den Eingängen
des µC (Pfosten PORTA...PORTD) und eine Drahtbrücke von den LEDs
(Pfosten LEDS) zum Ausgang des µC (Pfosten PORTA...PORTD) gesteckt
werden.

von Dominik F. (dominik1202)


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!

von inoffizieller WM-Rahul (Gast)


Lesenswert?

>wieso in einem C Programm?
>Ja C und SPS-Sprache kann ich ja

Solche Aussagen lassen darauf schliessen.

von johnny.m (Gast)


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

von inoffizieller WM-Rahul (Gast)


Lesenswert?

...und ins aktuelle AVRStudio lässt sich der AVR-gcc problemlos
integrieren...

von Dominik F. (dominik1202)


Lesenswert?

sorry... hätte ich besser mal dran denken sollen...

von Dominik F. (dominik1202)


Lesenswert?

wer das Programm von johnny mal testen und meld mich dann gleich
nochmal...

Danke schonmal für eure Hilfe... die Erklärungen dahinter bringen mir
schon ne ganze Menge!

von johnny.m (Gast)


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"
;...

von Dominik F. (dominik1202)


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...

von Dominik F. (dominik1202)


Lesenswert?

Kleine Ursache, aber grosse Wirkung... Hab den fehler gefunden der zu
den problemen geführt hat..

der . vor include hat gefehlt.

von johnny.m (Gast)


Lesenswert?

So wie es oben steht, bekomme ich 2 Fehler. Wenn ich den fehlenden Punkt
vor dem include reinmache, assembliert er fehlerfrei...

von Dominik F. (dominik1202)


Lesenswert?

Programm ist nun auf dem Board...und läuft

Kann ich eigentlich die Taster nur hexadezimal maskieren oder auch
anders?

von inoffizieller WM-Rahul (Gast)


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.

von johnny.m (Gast)


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...

von Dominik F. (dominik1202)


Lesenswert?

mhh.. das sind so details mit denen ich mich noch intensiv beschäftigen
muss... habe lange nichts mit den verschiedenen Zahlensystemen
gemacht.. merke das ich schwer eingerostet bin...

von Dominik F. (dominik1202)


Lesenswert?

noch ne blöde Frage.. wie ist denn die Wertigekit der einzelnen Taster?

von inoffizieller WM-Rahul (Gast)


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).

von johnny.m (Gast)


Lesenswert?

Was verstehst Du unter "Wertigkeit"? Wenn ein Taster an Pin 3 von Port
D hängt, dann ist seine "Wertigkeit" 2^3, also 8, wenn es das ist, was
Du meinst...

von johnny.m (Gast)


Lesenswert?

Meine Güte, heute klappt das mit dem "gleichzeitig-posten" aber ganz
hervorragend...

von Karl heinz B. (kbucheg)


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).

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Wobei ich schneller bin...

von johnny.m (Gast)


Lesenswert?

@Rahul:
Meinste net, dass das alphabetisch geht? "i" kommt dummerweise vor
"j". Sollte mich vielleicht in Zukunft "Alfons" nennen...

von Dominik F. (dominik1202)


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! ;-)

von johnny.m (Gast)


Lesenswert?

Der 4433 hat keinen Port A...

von Dominik F. (dominik1202)


Lesenswert?

Was kann ich denn machen um den Port a benutzen zu können? Weil so ist
das ja mist!

von inoffizieller WM-Rahul (Gast)


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?)

von johnny.m (Gast)


Lesenswert?

Wenn Du Port A benutzen willst, musst Du Dir einen Controller kaufen,
der einen hat (Mega16, 32, 8515, 8535... nur um ein paar Beispiele zu
nennen)...

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Ein Mega16 war zumindest bei meinem "letzten"* STK500 dabei.

(*) das für die Firma.

von Dominik F. (dominik1202)


Lesenswert?

Also ich weiss nicht ob das jetztw as aussagt, aber ich habe nen
AT90S8515 auf dem Board stecken!

von johnny.m (Gast)


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...

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Dann hast du die falsche Inklude-Datei

von Dominik F. (dominik1202)


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

von Karl H. (kbuchegg)


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.

von Hannes L. (hannes)


Lesenswert?

@Dominik:
Drücke mal in AVR-Studio die F1-Taste während der Cursor (im Editor)
auf einem ASM-Befehl steht.

Bit- & Bytebruch...
...HanneS...

von johnny.m (Gast)


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.

von Peter D. (peda)


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

von johnny.m (Gast)


Lesenswert?

@Peter:
Klar ist das logisch, und ich persönlich komme damit gut klar, aber die
Notation ist in meiner Erfahrung eher ungebräuchlich...

von Dominik F. (dominik1202)


Lesenswert?

Wie kann ich folgende Anweisung bzw Operation verstehen?

BREQ:   if (Z=1) then PC<PC+k+1

Arbeite gerade die Liste der Operationen durh um sie zu verstehen und
hier bin ich mir nicht ganz klar...

von johnny.m (Gast)


Lesenswert?

Wenn Zero-Flag (Z) gesetzt, dann addiere zum aktuellen Stand des
Programmzählers (Program Counter, PC) den Wert k und eine 1.

von Hannes L. (hannes)


Lesenswert?

Wobei bei den Branch-Befehlen meist das Lebel angegeben wird, zu dem
gesprungen werden soll. Den Offset dazu berechnet der Assembler
alleine.

Einige ASM-Quelltexte auf relativ niedrigem Niveau (also gut zum Lernen
für den Einsteiger) findest Du z.B. hier:
http://www.hanneslux.de/avr/divers/index.html

Bit- & Bytebruch...
...HanneS...

von Dominik F. (dominik1202)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.