ATMega 8, assembler | lcd und led funktionieren zusammen nicht

Gast #3802032
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?
Gast #3802109
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
Gast #3802118
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
#3802142
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
Gast #3802154
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
#3802207
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
Gast #3802271
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
(Firma: Vescomp) #3802316
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 ?
(Firma: Vescomp) #3802377
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.
(Firma: Vescomp) #3802399
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
(Firma: Vescomp) #3802462
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren