mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage zu Assembler


Autor: Ralph Müller (revolt3c)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi @ all,

lese mich gerade ein und hab mein erstes kleines programm in bascom 
geschrieben. leider funzt es noch nicht. könnt ihr mir sagen was ich 
falsch mache`?

   $regfile = "m8def.dat"



Loop:

    $asm

ldi r16, 255
Out Ddrb , R16

ldi r16, 1
Out Portb , R16

ldi r17, 0
Out Ddrc , R17

NOP

in r17, PINC

cp r16, r17

breq Main



rjmp Loop


Main:

ldi r18, 255
Out Portb , R18



    $end Asm




ich setze portb als ausgang und portc als eingang. setze das bit 1 des 
r16 auf high und frage anschließend die eingangssignale von portc ab. 
nun werden die beiden register verglichen und wenn wahr dann gesamtes 
byte von r16 auf high. leider brennt beim versuchsaufbau nur die 1. LED 
und zwar die die am anfang im portb gesetzt wurde.

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Loop:

    $asm


Sollte man nicht beide Zeilen vertauschen?


mfg
Holger

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat das einen speziellen Sinn, dass du BASCOM programmierst und dann für 
solch simple Aufgaben schon Assemblercode einbettest?

Autor: Andreas Vogt (tico)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralph Müller wrote:
> könnt ihr mir sagen was ich
> falsch mache`?

Möglicherweise, wenn Du uns sagst, wie Dein Port C beschaltet ist. ;)

Autor: Ralph Müller (revolt3c)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ holger, ups ja hab ich vertauscht ;) geht aber immer noch nicht.

@haku: ich hätte besser geschrieben das ich das ganze mit dem programm 
bascom-avr geschrieben hab, in assembler ;)

@tico: nun erstmal garnicht :P habe dann einfach zum versuch eine 
drahtbrücke hergestellt und den PIN 0 auf PORTC auf high beschalten.

Autor: Ralph Müller (revolt3c)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
programm noch ein wenig abgeändert, geht aber immer noch nicht. sobald 
ich den portc im programm auf high setze funzt es.



   $regfile = "m8def.dat"





    $asm


Loop:


ldi r16, 255
Out Ddrb , R16

ldi r16, 1
Out Portb , R16

ldi r17, 0
Out Ddrc , R17




in r17, PINC
Out Portc , R17



cp r16, r17

breq Main

rjmp Loop


Main:

ldi r18, 255
Out Portb , R18



    $end Asm



Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die DDR müssen nicht im "Loop" stehen, dafür würde ich am Ende von 
"Main" ein "rjmp Loop" schreiben.

Otto

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Loop" ist in Bascom ein reserviertes Wort. (Do-Loop-Schleife)
Das könnte eventuell auch noch Ärger machen.

MfG Paul

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe trotzdem nicht, warum jemand sich schon BASCOM anschafft, 
um dann als erstes Assembler einzubetten. Hat BASCOM keine 
'$config'-Dinger, um Ports zu beschreiben?!

Autor: Ralph Müller (revolt3c)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab mir das programm hauptsächlich gesucht weil ich damit simulieren 
kann
und ich nach diesem tutorial gehe: 
http://www.roboternetz.de/wissen/index.php/Assembl...

will ja auch assembler lernen.


habe den code geändert:


   $regfile = "m8def.dat"





    $asm



ldi r16, 255
Out Ddrb , R16


ldi r17, 0
Out Ddrc , R17


Test:




ldi r16, 1
Out Portb , R16






in r17, PINC
Out Portc , R17



cp r16, r17

breq Main

rjmp Test


Main:

ldi r18, 255
Out Portb , R18

rjmp Test


 $end Asm   


geht aber immer noch nicht. muss aber dazu erwähnen das ich die datei 
bei bascom-avr abspeichere und dann über myavrdemo plus hochlade weils 
direkt nicht geht. wird auch übertragen aber vllt liegt da die 
fehlerquelle?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll das Programm den machen?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Jott...>_>

Wenn du Assembler lernen willst, nimm das AVR-Studio, da ist der 
Assembler eingebaut und du kannst den Mist durchsimulieren, bis du 
kunterbunt wirst.

Autor: Ralph Müller (revolt3c)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich PC0 auf high schalte soll der ganze portb 1 haben.

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Willst du nur Bit0 abfragen? Wenn Ja, musst du die anderen Bits 
ausmaskieren(and $01) sonst prüfst du die auch mit.
noch einfacher ginge:

Loop:

ldi r16, 255
Out Ddrb , R16

ldi r17, 1
Out Portb , R16

ldi r17, 0
Out Ddrc , R17

sbis PinC,0
rjmp Loop

Main:

Out Portb , R16

Viel Erfolg, Uwe

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> wenn ich PC0 auf high schalte soll der ganze portb 1 haben.
  clr    R0
  ldi    R16, 0xFF

  out    DDRC, R0              ; PORTC als Eingänge
  out    PORTC, R16            ; Pullups auf PORTC
  out    DDRB, R16              ; PORTB als Ausgänge

schleife:
  sbis  PINC, PINC0            ; Wenn PC0 NICHT gesetzt ist...
  ldi    R16, 0x00              ; ...lade 0
  sbis  PINC, PINC0            ; Wenn PC0 NICHT gelöscht ist...
  ldi    R16, 0xFF              ; ...lade 255

  out    PORTB, R16            ; Auf den Ausgang

  rjmp schleife

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich hab mir das programm hauptsächlich gesucht weil ich damit simulieren
> kann

Achja, hat AVR-Studio keinen Simulator? Zugegeben, er ist nicht so 
knallig bunt wie in BASCOM, aber die Dinge, die man zum Erlernen von 
Assembler braucht, die simuliert er auch.


> und ich nach diesem tutorial gehe:
> http://www.roboternetz.de/wissen/index.php/Assembl...

Dann stellt sich die Frage, warum Du Dir die Hilfe zu einem RN-Tutorial 
nicht im RN holst?

> will ja auch assembler lernen.

Gute Idee, aber dann nimm doch auch das richtige Werkzeug dazu. Dies 
wäre das AVR-Studio von ATMEL.

Und dann beherzige bitte, ein Programm besteht meist aus:

- Interrupt-Sprungtabelle (auch mein erstes AVR-ASM-Programm auf dem
  AT90S1200 hatte einen (Timer-) Interrupt
- Reset-Routine (Initialisierung der benutzten Hardware-Features)
- Mainloop
- Unterprogramme der Mainloop (in Hochsprechen meist als "Funktion")
- Interrupt-Service-Routinen

Beim Erlernen der ersten Schritte kann zwar erstmal Einiges entfallen, 
aber Reset (Initialisierung) und Mainloop (immer wieder kehrende 
Aufgaben) sollte man schon auseinander halten.

...

Autor: Ralph Müller (revolt3c)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@hannes lux: ich habe mir bascom-avr runtrgeladen weil ich da genau das 
tutorial durcharbeiten wollte. als anfänger will man estmal schritt für 
schritt abkupfern. da sind selbst kleinste unterschiede die solch 
programme an sich haben schon ein großes hinderniss :) ich schuae mir 
natürlich auch das avr tutorial an, die beiden tutorial ergänzen sich 
irgendwie. lade mir gerade avr studio runter, hatte ich bisher noch 
nicht.


@haku: nach dem programm leuchtet mein ganzer portb von anfang an. du 
zieht doch mit deinem pullup den ganzen portc auf 1. ich möchte das über 
einen schalter tun.


gruss

Autor: Ralph Müller (revolt3c)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay habe das programm eeeendlich zum laufen gebracht. habe es mal mit 
folgendem programm versucht:

main:  ldi  r16,lo8(RAMEND)
  out  SPL,r16
  ldi  r16,hi8(RAMEND)
  out  SPH,r16


programm:  ldi  r16,0xFF
  out  DDRB,r16  ; Port B ist Ausgang

  ldi  r17,0x00
  out  DDRD,r17  ; Port D ist Eingang
  
  ldi  r16,0x00
  out  PORTB,r16  ; PORTB auf 0xFF setzen -> alle LEDs aus

loop:  sbis  PIND,0  ; "skip if bit cleared", nächsten Befehl überspringen,

  rjmp  loop  ; Sprung zu "loop:" -> Endlosschleife

  ldi  r16,0b11110001
  out  PORTB,r16  ; Bit 3 im IO-Register PORTB auf 0 setzen -> 4. LED an

ende:  rjmp  ende  ; Endlosschleife




schaltung funzt, jedoch muss ich wenn ich meinen controller von der 
spannung nehm und wieder einsteck reseten da er dann immer noch in der 
endlosschleife steckt. wie kann man das programmieren wenn er nach jeder 
abschaltung im programm von vorne anfangen soll? oder muss ich den 
resetpin von aussen beschalten?

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.