mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik erstes ASM Programm.wo ist der Fehler?


Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das ist mein erstes ASM Programm.

Leider funktioniert es nicht. Aber einen Fehler kann ich irgendwie nicht 
entdecken.

Eigentlich soll wenn Taste1 gedrückt LED1 leuchten und wenn Taste2 
gedrückt LED2 leuchten. Wenn keine Taste gedrückt dann sollen auch keine 
LED leuchten.
.DEVICE ATtiny2313
.INCLUDE "tn2313def.inc"


.EQU TAKT = 8000000


.CSEG

start:
  LDI R16, 0b0010100  ;lade wert in r16
  OUT DDRD, R16    ;pin2 und pin4 auf Eingang setzten

  LDI R18,0x00    ;setze vergleichsregister auf 00

loop:
  LDI R17, 0x00    ;setze R17 auf 0
  LDI R16, 0x00    ;setze R16 auf 0
  SBIC PIND,PIND2    ;prüfe ob PIN2 gesetzt
    LDI R17, 0xff  ;wenn JA dann setze R17 auf FF
  SBIC PIND,PIND4    ;prüfe ob PIN4 gesetzt
    LDI R16, 0xff  ;wenn JA dann setze R16 auf FF


  CP R17,R18      ;vergleiche R17 mit R18(00)
    BRNE weiter1  ;wenn ungleich 00 dann spring zu weiter1
  CP R16,R18      ;vergleiche R16 mit R18(00)
    BRNE weiter2  ;wenn ungleich 00 dann spring zu weiter2

  LDI R16,0b0000000  ;lade wert in r16
  OUT PORTD5,R16    ;lösche led an pin6 und lösche led an pin5
RJMP loop

;
;unterprogramme
;
weiter1:
  LDI r16,0b1000000
  OUT PORTD5,r16  ;setze led an pin6 und lösche led an pin5
RJMP loop

weiter2:
  LDI r16,0b0100000
  OUT PORTD5,r16  ;setze led an pin5 und lösche led an pin6
RJMP loop

Vielleicht seht ihr ja was was mir nicht auffällt als Anfänger?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Vielleicht seht ihr ja was was mir nicht auffällt als Anfänger?
auf anhieb nicht, aber warum geht du nicht einfach mit dem Simulator 
durch - im Einzelschritt modus.

Es könnte ja auch an der Hardware liegen - inverierte eingänge oder 
ausgänge?

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab den Simulator drüber laufen lassen.

Dort wurden jedenfalls schonmal keine Fehler festgestellt.

Allerdings weiß ich nicht wo ich mir die Ausund eingänge anzeigen lassen 
kann...? Sorry, bin echt noch voll der Anfänger. :(

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei den IO-Port, dort gibt es doch die gleiche bezeichung PORTA, DDRA, 
PINA

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  LDI R16, 0b0010100  ;lade wert in r16
>  OUT DDRD, R16    ;pin2 und pin4 auf Eingang setzten

Das setzt aber PB2 und PB4 auf Ausgang!

Autor: Anton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meinte natürlich PD2 und PD4 :-)

Autor: Dummi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTD5 durch PORTD ersetzen.

Und warum haben deine Binärkonstanten nur 7 Bit?

Deine internen Pullups sin ausgeschaltet.

mfg.

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Anton, das hab ich im Buch dann wohl genau falschrum gelesen.
.DEVICE ATtiny2313
.INCLUDE "tn2313def.inc"


.EQU TAKT = 8000000


.CSEG

start:
  LDI R16, 0b1101011  ;lade wert in r16
  OUT DDRD, R16    ;pin2 und pin4 auf Eingang setzten

  LDI R18,0x00    ;setze vergleichsregister auf 00

loop:
  LDI R17, 0x00    ;setze R17 auf 0
  LDI R16, 0x00    ;setze R16 auf 0
  SBIC PIND,PIND2    ;prüfe ob PIN2 gesetzt
    LDI R17, 0xff  ;wenn JA dann setze R17 auf FF
  SBIC PIND,PIND4    ;prüfe ob PIN5 gesetzt
    LDI R16, 0xff  ;wenn JA dann setze R16 auf FF


  CP R17,R18      ;vergleiche R17 mit R18(00)
    BRNE weiter1  ;wenn ungleich 00 dann spring zu weiter1
  CP R16,R18      ;vergleiche R16 mit R18(00)
    BRNE weiter2  ;wenn ungleich 00 dann spring zu weiter2

  LDI R16,0b0000000  ;lade wert in r16
  OUT PORTD,R16    ;lösche led an pin6 und lösche led an pin5
RJMP loop

;
;unterprogramme
;
weiter1:
  LDI r16,0b1000000
  OUT PORTD,r16  ;setze led an pin6 und lösche led an pin5
RJMP loop

weiter2:
  LDI r16,0b0100000
  OUT PORTD,r16  ;setze led an pin5 und lösche led an pin6
RJMP loop

So klappt es jetzt wie es soll.

>Und warum haben deine Binärkonstanten nur 7 Bit?
Das 8. Bit ist in AVR Studio eingegraut. daher dachte ich brauch ich es 
auch nicht zu setzten.

>Deine internen Pullups sin ausgeschaltet.
Woran siehst du das? Bzw. wie schalt ich sie ein?

Autor: Dummi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Pullups werden auch über den PORT gesetzt.
Du must natürlich keine 8 Bit hinschreiben aber es macht es für mich und 
andere leichter lesbar.
zb. bei 0b1000000 denk ich spontan das oberste Bit ist gesetzt.
Sehe sozusagen 0b10000000

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stackpointer initialisiert?
stackinit:      ;Stackpointer initialisieren
ldi temp, RAMEND
out SP, temp

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas O.
> Stackpointer initialisiert?
braucht er hier ja nicht, es wird ja kein (r)call verwendet und auch 
keine ISR

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die Pullups werden auch über den PORT gesetzt.
Wie jetzt, das versteh ich nicht.

Ich dachte mit

LDI R16, 0xFF
OUT PORTD,R16

setz ich die Ausgänge auf HIGH?


>Du must natürlich keine 8 Bit hinschreiben aber es macht es für mich und
>andere leichter lesbar.

Okay, merk ich mir.

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LDI R16, 0b0010100  ;lade wert in r16

Der Kommentar ist ja klassisch... Ich lach mir 'nen Ast. Geht aber noch 
besser:
LDI R16, 0b0010100 ; Lade Immediate in Register R16, und zwar folgende
                   ; 7 Bits: 0b0010100



Oder die C-Variante:
i++; // increase i by one

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja danke... omfg

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah jetzt hab ich das geblickt.

Also allen PIN's die auf Eingang geschaltet sind muß per PORTx der 
Pull-Up zugeschaltet werden.

So, da hab ich aber ein Problem:

Meine Ein- und Ausgänge liegen ja auf einem Port. Wie schalte ich nun 
die Wiederstände für die Eingangspin's ein, aber lasse die andren 
Ausgangspin's in ruhe?

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ldi temp, 0b11110000
out DDRA, temp        ;Pin 7-4 = Ausgang ; Pin 3-0 Eingang

ldi temp, 0b00001111
out porta, temp       ;Pullups für die Eingänge 3-0 aktiviert

um alle Pullups auszuschalten kann man auch das PUD-Bit im SFIO-Register 
setzen

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du die Ausgangspins in Ruhe lassen willst musst du erstmal 
feststellen wie die stehen und dann mit einer OR-Verknüpfung die Pins 
auswählen die die ändern willst.

  11110000
  00001111
= 11111111

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, dass das so geht hab ich mir schon gedacht.

Muß ich dann jedesmal wenn ich eine LED über OUT PORTD schalte auch 
wieder die Wiederstände mitschalten?
weiter1:
  LDI r16,0b1000000
  OUT PORTD,r16  ;setze led an pin6 und lösche led an pin5
RJMP loop

weiter2:
  LDI r16,0b0100000
  OUT PORTD,r16  ;setze led an pin5 und lösche led an pin6
RJMP loop


Da schalt ich ja jetzt nur die LED und würde ja die Wiederstände wieder 
auf 0 setzten. Muß ich dann das so schreiben?

  LDI r16,0b11010100
  OUT PORTD,r16  ;setze led an pin5 und lösche led an pin6

Autor: Thomas O. (kosmos)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
schau dir mal die Befehle
cbi, cbr, sbi und sbr an.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
>> Stackpointer initialisiert?
> braucht er hier nicht, es wird kein (r)call verwendet und auch keine ISR
Noch nicht   :-o
Die Anlagen dafür sind aber da:
;
;unterprogramme
;
Wenn blub² mal herausgefunden hat, dass Unterprogramme mit call 
aufgerufen werden, dann gibts das nächste Problem.

@ blub²
Lass die Kommentare weg. Diese sind überflüssig:
  CP R16,R18         ; vergleiche R16 mit R18(00)
  BRNE weiter2       ; wenn ungleich 00 dann spring zu weiter2
  LDI R16,0b0000000  ; lade wert in r16
Das steht kompakter im Befehl selbst.

Und der hier falsch:
OUT PORTD,r16  ;setze led an pin6 und lösche led an pin5
Der Befehl macht nicht das, was im Kommentar steht  :-/

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas O.

Danke für super Hilfe und Datei. Die hab ich noch garnicht entdeckt 
gehabt.

So, jetzt hab ich das ein bissel umgeschrieben.

Gemäß Simulation sollte das auch alles klappen. Aber wenn ich es dann im 
µC laufen lasse passiert folgendes:

Taste 1 gedrückt: beide LED leuchten
Taste 2 gedrückt beide LED leuchten

Das versteh ich jetzt nicht so richtig. Wo liegt der Fehler?

.DEVICE ATtiny2313
.INCLUDE "tn2313def.inc"


.EQU TAKT = 8000000


.CSEG

start:

  LDI R16, 0b011100011
  OUT DDRD, R16
  LDI R16, 0b000011100
  OUT PORTD, R16
  
  LDI R18,0x00

loop:
  LDI R16, 0x00
  LDI R17, 0x00

  SBIC PIND,PIND2
    LDI R16, 0xff
  SBIC PIND,PIND4
    LDI R17, 0xff

  CP R16,R18
    BRNE weiter1
  CBI PORTD,6
back1:
  CP R17,R18
    BRNE weiter2
  CBI PORTD,5
back2:
RJMP loop

;
;unterprogramme
;

weiter1:
  SBI PORTD,6
RJMP back1

weiter2:
  SBI PORTD,5
RJMP back2

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetz haben die Binärkonstanten 9 Bit

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups :(

Bei den ganzen nullen und einsen...

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ändert aber nix. Es leuchten trotzdem beide LED wenn ich eine Taste 
drücke.

Es gibt noch eine 3. Taste die im Programm nicht verwendet wird, aber 
trotzdem die LED's einschaltet????

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was passiert denn, wenn Du es so machst:

     CBI PORTD,6
     CBI PORTD,6

  SBIS PIND,PIND2
     SBI PORTD,6

  SBIS PIND,PIND4
     SBI PORTD,5

RJMP loop

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
start:

  LDI R16, 0b1100011
  OUT DDRD, R16
  LDI R16, 0b0011100
  OUT PORTD, R16
  
  LDI R18,0x00


loop:


     CBI PORTD,5
     CBI PORTD,6

  SBIC PIND,PIND2
     SBI PORTD,6

  SBIC PIND,PIND4
     SBI PORTD,5

RJMP loop


1. schlecht weil led's ständig an und aus geschaltet werden, wenn taste 
gedrückt (theoretisch)

2. funktioniert auch nicht, weil wieder beide led'S leuchten (praktisch) 
:(

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
man muss den Pin abfragen wenn er high ist, die LED einschalten 
ansonsten verzweigen und die LED ausschalten, wenn man die nicht 
auschaltet ist ja klar das die anbleibt. Ich jage den Code mal kurz 
durch den Simulator

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.DEVICE ATtiny2313
.INCLUDE "tn2313def.inc"


.EQU TAKT = 8000000


.CSEG

start:

  LDI R16, 0b011100011
  OUT DDRD, R16
  LDI R16, 0b000011100
  OUT PORTD, R16
  
  LDI R18,0x00

loop:
  LDI R16, 0x00
  LDI R17, 0x00

  SBIC PIND,PIND2 ;taster gedrückt?
    LDI R16, 0xff ;wenn ja
  SBIC PIND,PIND4
    LDI R17, 0xff

  CP R16,R18 
    BRNE weiter1
  CBI PORTD,6 ; hier led aus
back1:
  CP R17,R18
    BRNE weiter2
  CBI PORTD,5
back2:
RJMP loop

;
;unterprogramme
;

weiter1:
  SBI PORTD,6
RJMP back1

weiter2:
  SBI PORTD,5
RJMP back2

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 1. schlecht weil led's ständig an und aus geschaltet werden, wenn taste
> gedrückt (theoretisch)

Ist doch erst einmal Wurst....

Entweder hängen die Taster oder die LED nicht an den richtigen Ports

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.DEVICE ATtiny2313
.INCLUDE "tn2313def.inc"
.def  temp=r16
.EQU TAKT = 8000000

.CSEG

stackinit:      ;Stackpointer initialisieren
ldi temp, RAMEND
out SPL, temp

portinit:
  ldi r16, 0b011100011
  out ddrd, r16
  ldi r16, 0b000011100
  out portd, r16
  
Abfrage:
  SBIC PIND,PIND2
    RJMP PortD5an
  CBI PORTD,5
  
Abfrage2:
  SBIC PIND,PIND4
    RJMP PortD6an
  CBI PORTD,6

RJMP Abfrage

PortD5an:
SBI PORTD,5
rjmp Abfrage2

PortD6an:
SBI PORTD,6
rjmp Abfrage

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieder 9bit Binärkonstanten......

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Thomas O.

Danke. Nur leider funzt das auch nicht. Ich drücke eine Taste und beide 
LED gehen an. :(

Ich hau das Ding gleich in die Tonne. :'(

Gestern abend hatte ich das noch per Unterprogramm gemacht. Incl. 
Statckinit und da hat es geklappt. und mit den SBI CBI Befehlen funzt 
das nicht. Ich kapier nicht warum. Der Simulator zeigt doch an das es 
klappen sollte...

Autor: blub² (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sooooo, manchmal sieht man echt den Wald vor Bäumen nicht.

Man,man,man. Logisch, wenn man einen externen Pullup hat, braucht, bzw. 
sollte, man nicht noch den internen einschalten. OMFG

Also, Programm funzt. Danke euch, besonderst Thomas, dass ihr euch mit 
mir den Kopf zerbrochen habt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.