hallo zusammen.
ich versuch mich gerade am assembler programmieren
habe einen atmega8 1Mhz
Ich wollte versuchen eine Led leuchten zu lassen und gleichzeitig einen
Buchstaben am lcd auszugeben.
Sieht dann so aus:
.include "m8def.inc"
.def temp1=r16
.include "lcd-routines.asm"
start:
ldi temp1, LOW(RAMEND)
out SPL, temp1
ldi temp1, HIGH(RAMEND)
out SPH, temp1
ldi temp3, 0xff
out ddrc, temp3
ldi temp3, 0xff
out portc, temp3
main:
rcall lcd_init
rcall lcd_clear
ldi temp1, 0x42
rcall lcd_data
loop:
rjmp loop
Die Led leuchtet zwar aber der lcd zeigt nichts an.
Was ist falsch?
Moin!
Du hast vergessen die register über .DEF als temp2 und temp3 zu
definieren ;)
und die include instruktion von lcd_routinen muss ganz ans ende des
progtramms
Hi
Wenn das wirklich dein komplettes Programm ist hast du einen kardinalen
Fehler:
>.include "lcd-routines.asm">start:
Vor dem Start des Programms darf kein anderer Code stehen.
MfG Spess
spess53 schrieb:> Hi>> Wenn das wirklich dein komplettes Programm ist hast du einen kardinalen> Fehler:>>>.include "lcd-routines.asm">>>start:>> Vor dem Start des Programms darf kein anderer Code stehen.>> MfG Spess
Direktiven dürfen auch davor stehen. Somal start nur eine Marke ist zu
der man mit rjmp springen könnte
Hi
>Direktiven dürfen auch davor stehen.
Bei z.B. .db, .dw, .dd und .dq würde ich das nicht pauschal
unterschreiben.
>Somal start nur eine Marke ist zu der man mit rjmp springen könnte
Dazu müsste das rjmp am Anfang der Bibliothek stehen. Das würde aber dem
Charakter von Bibliotheken widersprechen.
MfG Spess
Simon K. schrieb:> Direktiven dürfen auch davor stehen. Somal start nur eine Marke ist zu> der man mit rjmp springen könnte
Och, wie kleinlich.
.def, .equ ist OK, alles andere gehört hinter 'Main'
ich habe wieder ein problem
ich habe jetzt versucht ein ganz einfaches tasterprogramm zu schreiben.
sieht wie folgt aus:
.include "m8def.inc"
ldi r16,0x00
out ddrc, r16
ldi r16,0xff
out ddrb, r16
ldi r16, 0x00
out portb , r16
main:
warte:
in R16, PINc ; Portc einlesen
andi R16, 0b00000001 ; alles ausser schalter ausblenden
cpi R16, 0 ; Taster gedrückt?
breq taste_an
rjmp warte
taste_an:
ldi r16, 0xff
out portb, r16
rjmp main
ergebnis: die led leuchtet ununterbrochen
Hi
>ergebnis: die led leuchtet ununterbrochen
Abgesehen von solchen unwichtigen Informationen wie Taster L-/H-aktiv
LED L-H-aktiv: Wo ist die Stelle, an der du PortB wieder zurück setzt?
MfG Spess
spess53 schrieb:> Abgesehen von solchen unwichtigen Informationen wie Taster L-/H-aktiv> LED L-H-aktiv
Das verwundert mich auch immer wieder, manchmal so spannend wie Sudoku.
hi hab mich(joe) übrigens gerade angemeldet
ich verstehe nicht ganz warum ich portb zurücksetzen muss
Ich stelle mir das programm so vor:
eingabepins setzen
ausgabepins setzen
led an portb soll anfangs nicht leuchten
wenn der taster gedrückt wird springt das programm zu taste_an und die
led wird eingeschaltet
und sobald ich die taste loslasse geht die led wieder aus
Hi
>und sobald ich die taste loslasse geht die led wieder aus
Die LEDs sind an, wenn PortB 0xFF ist. Deinem 'Programm' fehlt die
Stelle an der festgestellt wird das die Taste wieder losgelassen ist
und der PortB auf 0x00 gesetzt wird. In deinem Programm bleibt PortB
bis zum Abschalten auf 0xFF.
MfG Spess
falscher alarm!
es funktioniert immer noch nicht.
hier der code:
.include "m8def.inc"
ldi R16, 0x00
out DDRC, R16
ldi R16, 0xff
out DDRb, R16
ldi R16, 0x00
out PORTb, R16
main_loop:
warte_auf_taste:
in R16, PINc
andi R16, 0b00000001
cpi R16, 0
breq taste_an
rjmp warte_auf_taste
taste_an:
ldi R16, 0xff
out PORTb, R16
warte_auf_taste_aus:
in R16, PINc
andi R16, 0b00000001
cpi R16, 0
brne taste_aus
rjmp warte_auf_taste_aus
taste_aus:
ldi R16, 0b00000000
out PORTb, R16
rjmp main_loop
die led leuchtet immer noch ununterbrochen.
Den Taster habe ich an portc und ground angesteckt
spess53 schrieb:> Sicher, das du das richtige Programm geflasht hast?
ja!
hat es was damit zu tun, dass ich die steckung für den lcd gerade
gesteckt habe?
oder ich habe den taster falsch gesteckt? einmal an den portc und in die
erdung
Joachim Jakob schrieb:> interner pullup? was ist das> ldi R16, 0x00> out DDRC, R16
---- ser R16
---- out PORTC, R16
> ldi R16, 0xff> out DDRb, R16
Das.
Hi
>interner pullup? was ist das
Wenn ein DDR-Bit einen Port-Pin als Eingang schaltet und das zugehörige
Port-Bit eine 1 enthält wird der interne Pull-Up-Widerstand (ca.50k)
eingeschaltet. Damit wird ein offener Port-Pin auf H gezogen.
MfG Spess
Marc Vesely schrieb:>> ldi R16, 0x00>> out DDRC, R16> ---- ser R16> ---- out PORTC, R16>> ldi R16, 0xff>> out DDRb, R16
ser R16
out PORTC, R16
wo kommt dieser Befehl genau rein?
wenn der taster abgefragt wird oder wenn der taster aktiviert ist
Joachim Jakob schrieb:> wo kommt dieser Befehl genau rein?> wenn der taster abgefragt wird oder wenn der taster aktiviert ist
Genau da wo er schon steht.
EDIT:
Entschuldige, so:
ldi R16, 0x00
out DDRC, R16
ser R16 ; R16 auf 0xFF
out PORTC, R16 ; Pullup einschalten für alle Pins
ldi R16, 0xff
out DDRb, R16
ldi R16, 0x00
out PORTb, R16
main_loop:
Joachim Jakob schrieb:> oh, nein> also muss ich jetzt noch> ldi r16,0xff> out portc, r16> schreiben?
Nee, warum ?
Und der Rest hängt davon ab, wie du deine LEDs schaltest.
Also:
PORTs vorbereiten
LED aus
PINC auf Zustand prüfen
Wenn Log.0 - Taster gedrückt, LED einschalten.
Wenn Log.1 - Taster losgelassen, LED aus
Und dann kommt noch Tasterprellen hinzu, aber probiere erst mal
das oben hinzukriegen, OK ?
Joachim Jakob schrieb:> was soll ich da jetzt genau machen?
Hmmm.
Paar Webseiten über Asm-programmierung besuchen ?
Hier:
main:
sbic PINC, 0
rjmp main
taste_an:
ser R16
out PORTB, R16
;*** Hier kommt normalerweise ein Delay von 20-50ms, kannst
;*** aber vorerst ohne versuchen.
; rcall Delay
warte_auf_taste_aus:
sbis PINC, 0
rjmp warte_auf_taste_aus
taste_aus:
clr R16
out PORTB, R16
;*** Auch hier kommt normalerweise ein Delay von 20-50ms
; rcall Delay
rjmp main
Probiere es aus.
Joachim Jakob schrieb:> fehlt da nicht das vorbereiten der ports oder so?
Ja, es fehlt.
Reset:
;*** Nach einem RESET sind alle Ports auf Eingang geschaltet,
;*** also sind die 2 Zeilen darunter nicht unbedingt notig.
clr R16
out DDRC, R16
;*** bis hier
ser R16 ; R16 auf 0xFF
out PORTC, R16 ; Pullup einschalten für alle Pins
out DDRB, R16
clr R16
out PORTB, R16
main:
sbic PINC, 0
rjmp main
taste_an:
ser R16
out PORTB, R16
;*** Hier kommt normalerweise ein Delay von 20-50ms, kannst
;*** aber vorerst ohne versuchen.
; rcall Delay
warte_auf_taste_aus:
sbis PINC, 0
rjmp warte_auf_taste_aus
taste_aus:
clr R16
out PORTB, R16
;*** Auch hier kommt normalerweise ein Delay von 20-50ms
; rcall Delay
rjmp main
Joachim Jakob schrieb:> ich hab alles nochmal überprüft, aber es will nicht funktionieren
Dann teile mal den Code in Abschnitte und gehe die einzeln ab.
Also:
Ports vorbereiten.
LED einschalten.
Leuchtet deine LED ?
Wenn ja:
LED ausschalten.
Weiter mit main, muß funktionieren.
Wenn nein:
LED und Verdrahtung überprüfen.
Hier ist noch eine Delay-Routine, in r16 die gewünschte Zeit in
ms laden. Berechnet für 1MHz.
Delay: ldi r17, 20
Wms_1: ldi r18, 17
Wms_2: dec r18
brne Wms_2
dec r17
brne Wms_1
dec r16
brne Delay
ret
es funktioniert immer noch nicht...
Ich habs zwar vorher schon mal erwähnt, aber ich frag nochmal.
Und zwar habe ich einen lcd angesteckt, dieser ist aber am portd.
Kann es vielleicht daran liegen?
Joachim Jakob schrieb:> Ich habs zwar vorher schon mal erwähnt, aber ich frag nochmal.> Und zwar habe ich einen lcd angesteckt, dieser ist aber am portd.> Kann es vielleicht daran liegen?
Ich hab langsam das Gefühl, ich werde hier auf den Arm genommen...
Ist es wirklich so schwer zu verstehen ?
Eins nach dem anderen !