Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage zu Assembler


von Ralph M. (revolt3c)


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.

von Holger (Gast)


Lesenswert?

Loop:

    $asm


Sollte man nicht beide Zeilen vertauschen?


mfg
Holger

von Sven P. (Gast)


Lesenswert?

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

von Andreas V. (tico)


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

von Ralph M. (revolt3c)


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.

von Ralph M. (revolt3c)


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

von Otto (Gast)


Lesenswert?

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

Otto

von Paul Baumann (Gast)


Lesenswert?

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

MfG Paul

von Sven P. (Gast)


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

von Ralph M. (revolt3c)


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?

von Otto (Gast)


Lesenswert?

Was soll das Programm den machen?

von Sven P. (Gast)


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.

von Ralph M. (revolt3c)


Lesenswert?

wenn ich PC0 auf high schalte soll der ganze portb 1 haben.

von Uwe (Gast)


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

von Sven P. (Gast)


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

von Hannes Lux (Gast)


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.

...

von Ralph M. (revolt3c)


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

von Ralph M. (revolt3c)


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?

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.