Forum: Mikrocontroller und Digitale Elektronik ATMega 8, assembler | lcd und led funktionieren zusammen nicht


von Joe (Gast)


Lesenswert?

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?

von Simon K. (assembler_simon)


Lesenswert?

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
von Joe (Gast)


Lesenswert?

temp3 ist in den lcd routinen definiert
ich werde sie mal unten einfügen

von spess53 (Gast)


Lesenswert?

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

von Simon K. (assembler_simon)


Lesenswert?

Lade doch lcd_routinen auch mal hoch vllt. liegt da auch der Fehler.
Hast du mit dem AVR-Tutorial hier aus dem Forum gearbeitet ?

von Joe (Gast)


Lesenswert?

das einfügen weiter unten hat geklappt
danke!

von Simon K. (assembler_simon)


Lesenswert?

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

von Simon K. (assembler_simon)


Lesenswert?

Joe schrieb:
> das einfügen weiter unten hat geklappt
> danke!

Immer gern ;)

von Joe (Gast)


Lesenswert?

kann ich gleich noch eine frage hier stellen?

von spess53 (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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'

von Joe (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Joachim J. (fhjgch)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joachim Jakob schrieb:
> und sobald ich die taste loslasse geht die led wieder aus

 Wie ?

von Joachim J. (fhjgch)


Lesenswert?

@logarithmus
jetzt blinkt die led beim drücken des Tasters

von spess53 (Gast)


Lesenswert?

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

von Joachim J. (fhjgch)


Lesenswert?

oh ja natürlich!
ich habe es jetzt hingekriegt.
Naja Übung macht den Meister...^^
Danke für die Hilfe

von Joachim J. (fhjgch)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Sicher, das du das richtige Programm geflasht hast?

MfG Spess

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joachim Jakob schrieb:
> Den Taster habe ich an portc und ground angesteckt

 Und du meinst, dass das so richtig ist ?

von Joachim J. (fhjgch)


Lesenswert?

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

von Joachim J. (fhjgch)


Lesenswert?

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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Joachim J. (fhjgch)


Lesenswert?

Marc Vesely schrieb:
> Schalte wenigstens internen Pull-Up ein.

interner pullup? was ist das

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joachim Jakob schrieb:
> interner pullup? was ist das

 Und Abfrage anders herum.

von Joachim J. (fhjgch)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Joachim J. (fhjgch)


Lesenswert?

also ich habs jetzt reingeschrieben, aber jetzt leuchtet die led 
garnicht mehr

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Marc Vesely schrieb:
> Und Abfrage anders herum.

 Getan ?

von Joachim J. (fhjgch)


Lesenswert?

oh, nein
also muss ich jetzt noch
ldi r16,0xff
out portc, r16
schreiben?

von Joachim J. (fhjgch)


Lesenswert?

das hab ich doch mit ser r16 schon getan

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Joachim J. (fhjgch)


Lesenswert?

Marc Vesely schrieb:
> Und Abfrage anders herum.

was soll ich da jetzt genau machen?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Joachim J. (fhjgch)


Lesenswert?

kann ich das jetzt so kopieren und builden?
fehlt da nicht das vorbereiten der ports oder so?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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

von Joachim J. (fhjgch)


Lesenswert?

also ich habs jetzt so gebuildet, aber es tut sich gar nichts..

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joachim Jakob schrieb:
> also ich habs jetzt so gebuildet, aber es tut sich gar nichts..

 Taster gedrückt ? ;-))

von Joachim J. (fhjgch)


Lesenswert?

ich hab alles nochmal überprüft, aber es will nicht funktionieren

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Joachim J. (fhjgch)


Lesenswert?

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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Joachim Jakob schrieb:
> es funktioniert immer noch nicht...

 Was ?
 LED an ?
 LED aus ?

von Joachim J. (fhjgch)


Lesenswert?

led bleibt aus

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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 !

von Joachim J. (fhjgch)


Lesenswert?

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
Noch kein Account? Hier anmelden.