Hallo,
ich bin neu in dem Thema, hab aber vor 30 Jahren schon Assembler (8085)
programmiert. Das Prinzip ist mir also schon klar, behaupte ich.
Jetzt hab ich mir das MyAVR Board MK2 besorgt, funktioniert auch soweit
mit den Beispiel-Progs. Nur meine eigenen Programme laufen nicht an.
Sogar die Primitiv-Version, einfach nur LED an, läuft nicht. Irgendeinen
prinzipiellen Fehler hab ich da noch drin, ich komm aber nicht dahinter.
Ich hab mal ein PRog angehängt, wird mit AVRStudio übersetzt, und
gebrannt. Das Board sagt aber dann keinen Pieps, so als ob die CPU gar
nicht loslaufen würde.
Flash-Rom hab ich ausgelesen, das Programm landet im Speicher. Die
Board-HW ist ok, das von myAVR gelieferte Testprogramm liest auf PortD
Schalter ein und steuert die LEDs über PortB, das funktioniert.
Egal welche (kurzen) Codeschnipsel ich aus dem Netz ziehe, sie laufen
nicht an. Ach ja, im AVR Studio läuft das jeweilige Programm fehlerlos.
Nachdem ich in der SW nichts finde, hab ich dann mal rumgeklickt und die
ersten beiden ATMegas gehimmelt. Mindestens einer davon steht auf
ext.Quarz, den muß ich wieder zurückholen. Sobald ich einen
Taktgenerator auftreibe :-)
Morgen krieg ich eine neue Lieferung von Prozessoren, die will ich nicht
gleich den ersten beiden hinterherjagen :-((
Wenn jemand Lust ha, kann er ja mal versuchen, mir unter die Arme zu
greifen. Irgendeine prinzipielle Kleinigkeit fehlt noch ....
Gruß
Ralf
Um die Pullups zu aktivieren musst du anstatt sbi DDRD,2 , sbi
Portd,2 schreiben.
Oben schaltest du deine Eingänge sofort wieder als Ausgänge um.
Grüsse
An die Interupttabelle würde ich vorne noch ein ".org 0x0000" anhängen
ldi r16,hi8(RAMEND)
out SPH,r16
ldi R16,lo8(RAMEND)
out SPL,r16
Kenne ich im AVRStudio nur mir "HIGH" und "LOW", aber das wirst du ja
nicht von ungefähr haben?
cbi DDRD,2
cbi DDRD,3
sbi DDRD,2
sbi DDRD,3
sbi DDRB,0
sbi DDRB,1
Das ist Käse, in zweierlei Hinsicht. Erstens ist es ziemlich unüblich
jedes Bit einzeln zu setzen, zweitens frage ich mich, wie du auf die
Idee kommst, dass mit DDR sowohl die Pinart als auch der Pullup gesetzt
wird. Richtig:
clr temp1
out DDRD, temp1
ldi temp1, (1<<PD2) | (1<<PD3)
out PORTD, temp1
ldi temp1, (1<<PB0) | (1<<PB1)
out DDRB, temp1
Deine Konstanten im Hauptprogramm sind Käse. Die Register des Mega sin
acht Bit breit. Nicht vier. Mit den Ports verhält es sich genauso.
Deswegen fehlen bei dir stets vier Bit.
ldi r16,0
sbic PIND,2 ; wenn Tast1
ori r16,0b0001 ; dann LED1
sbic PIND,3 ; dito mit 2. Taste
ori r16,0b0010
sbr r16,0b0100 ; bit3 immer an
out PORTB,r16 ; und raus damit
rjmp mainloop
Du hast doch die Pullups aktiviert... Ein Tastendruck an Taster1 zieht
doch den PIN auf logisch-0. In dem Moment soll LED1 leuchten. Also musst
du den Leuchtbefehl überspringen, wenn der Pin auf high ist "sbis"
main:
ldi temp1, 1<<PB2
sbis PIND, Taster1
sbr temp1, 1<<LED1
sbis PIND, Taster2
sbr temp1, 1<<LED2
out PORTB, temp1
rjmp main
Was du mit den den "ori" wolltest, verstehe ich auch noch nicht ganz.
Daniel P. schrieb:> Was du mit den den "ori" wolltest, verstehe ich auch noch nicht ganz.
Bits setzen ^^
@ Ralf:
Deine Main müsste laufen. Die LEDs müssten angehen
Jedoch ist deine Stackini auskommentiert, das funktioniert nur solange
du keine Unterprogramme, Interrupts push und pop benutzt.
probier mal:
Hallo,
jetzt bin ich wieder etwas beruhigt. Hab viel gelernt dabei!
1. Hochmut kommt vor dem Fall
Auch wenn man vor 30 Jahren mal 8085 programmiert hat, macht man Fehler.
2. manchmal ist es besser, mit kleinen Schritten anzufangen.
3. Das Board hier ist verdammt fix mit Hilfen
Ich hab die neuen ATMegas bekommen, langsam angefangen (LED Dauer-AN),
dann erst Umschalter dazuprogrammiert. Und dann auch noch die
Portbehandlung korrekt gemacht (Pullups).
Es funktioniert!
Danke!
Ralf
Nehme ich richtig an, dass Du mit gas (dem GNU Assembler) arbeitest?
Ich vermute das wegen hi8 und lo8. Dann musst Du das Argument von
I/O-Befehlen in _SFR_IO_ADDR() setzen, also statt
1
sbi DDRB, 1 ; falsch für GNU_Toolchain
muss es
1
sbi _SFR_IO_ADDR(DDRB), 1
heißen.
Du kannst auch stattdessen an den Beginn
1
#define __SFR_OFFSET 0
setzen.
Tust Du keines von Beidem, so setzt der GNU Assembler SRAM-Adressen
statt der um 0x20 niedrigeren I/O-Adressen ein.