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