Anfängerfrage zu Assembler

#1221554
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`?

1
   $regfile = "m8def.dat"
2

3

4

5
Loop:
6

7
    $asm
8

9
ldi r16, 255
10
Out Ddrb , R16
11

12
ldi r16, 1
13
Out Portb , R16
14

15
ldi r17, 0
16
Out Ddrc , R17
17

18
NOP
19

20
in r17, PINC
21

22
cp r16, r17
23

24
breq Main
25

26

27

28
rjmp Loop
29

30

31
Main:
32

33
ldi r18, 255
34
Out Portb , R18
35

36

37

38
    $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.
#1221759
Lesenswert?

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


1
   $regfile = "m8def.dat"
2

3

4

5

6

7
    $asm
8

9

10
Loop:
11

12

13
ldi r16, 255
14
Out Ddrb , R16
15

16
ldi r16, 1
17
Out Portb , R16
18

19
ldi r17, 0
20
Out Ddrc , R17
21

22

23

24

25
in r17, PINC
26
Out Portc , R17
27

28

29

30
cp r16, r17
31

32
breq Main
33

34
rjmp Loop
35

36

37
Main:
38

39
ldi r18, 255
40
Out Portb , R18
41

42

43

44
    $end Asm
#1221784
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/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User

will ja auch assembler lernen.


habe den code geändert:


1
   $regfile = "m8def.dat"
2

3

4

5

6

7
    $asm
8

9

10

11
ldi r16, 255
12
Out Ddrb , R16
13

14

15
ldi r17, 0
16
Out Ddrc , R17
17

18

19
Test:
20

21

22

23

24
ldi r16, 1
25
Out Portb , R16
26

27

28

29

30

31

32
in r17, PINC
33
Out Portc , R17
34

35

36

37
cp r16, r17
38

39
breq Main
40

41
rjmp Test
42

43

44
Main:
45

46
ldi r18, 255
47
Out Portb , R18
48

49
rjmp Test
50

51

52
 $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?
Gast #1221794
Lesenswert?

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

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

8
schleife:
9
  sbis  PINC, PINC0            ; Wenn PC0 NICHT gesetzt ist...
10
  ldi    R16, 0x00              ; ...lade 0
11
  sbis  PINC, PINC0            ; Wenn PC0 NICHT gelöscht ist...
12
  ldi    R16, 0xFF              ; ...lade 255
13

14
  out    PORTB, R16            ; Auf den Ausgang
15

16
  rjmp schleife
Gast #1221801
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.

...
#1221817
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
#1222060
Lesenswert?

okay habe das programm eeeendlich zum laufen gebracht. habe es mal mit 
folgendem programm versucht:
1
main:  ldi  r16,lo8(RAMEND)
2
  out  SPL,r16
3
  ldi  r16,hi8(RAMEND)
4
  out  SPH,r16
5

6

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

10
  ldi  r17,0x00
11
  out  DDRD,r17  ; Port D ist Eingang
12
  
13
  ldi  r16,0x00
14
  out  PORTB,r16  ; PORTB auf 0xFF setzen -> alle LEDs aus
15

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

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

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

23
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

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