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
:
Bearbeitet durch User
temp3 ist in den lcd routinen definiert ich werde sie mal unten einfügen
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
Lade doch lcd_routinen auch mal hoch vllt. liegt da auch der Fehler. Hast du mit dem AVR-Tutorial hier aus dem Forum gearbeitet ?
das einfügen weiter unten hat geklappt danke!
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
kann ich gleich noch eine frage hier stellen?
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
Joe schrieb: > cpi R16, 0 ; Taster gedrückt? > breq taste_an ---- clr r16 ---- out portb, r16 > rjmp warte > taste_an: > ldi r16, 0xff > out portb, r16 Probieren.
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
@logarithmus jetzt blinkt die led beim drücken des Tasters
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
oh ja natürlich! ich habe es jetzt hingekriegt. Naja Übung macht den Meister...^^ Danke für die Hilfe
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
Hi Sicher, das du das richtige Programm geflasht hast? MfG Spess
Joachim Jakob schrieb: > Den Taster habe ich an portc und ground angesteckt Und du meinst, dass das so richtig ist ?
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
Marc Vesely schrieb: > Joachim Jakob schrieb: >> Den Taster habe ich an portc und ground angesteckt > > Und du meinst, dass das so richtig ist ? ja, ist es das auch?
Joachim Jakob schrieb: > ja, ist es das auch? Nein. PortC ist auf Log.0, also hilft Taster zum GND wenig. Schalte wenigstens internen Pull-Up ein.
:
Bearbeitet durch User
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:
:
Bearbeitet durch User
also ich habs jetzt reingeschrieben, aber jetzt leuchtet die led garnicht mehr
oh, nein also muss ich jetzt noch ldi r16,0xff out portc, r16 schreiben?
das hab ich doch mit ser r16 schon getan
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 ?
:
Bearbeitet durch User
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.
kann ich das jetzt so kopieren und builden? fehlt da nicht das vorbereiten der ports oder so?
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
also ich habs jetzt so gebuildet, aber es tut sich gar nichts..
Joachim Jakob schrieb: > also ich habs jetzt so gebuildet, aber es tut sich gar nichts.. Taster gedrückt ? ;-))
ich hab alles nochmal überprüft, aber es will nicht funktionieren
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
:
Bearbeitet durch User
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 !
wie bitte, ich verstehe nicht was du meinst?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.