Forum: Mikrocontroller und Digitale Elektronik cbi und sbi jedoch mit variablen


von tuxianer (Gast)


Lesenswert?

hi,
ich wollt ne Steuerung für mein 2 Controller LCD schreiben...wenn eine 
Variable 1 ist soll der nächste befehl übersprungen werden wie macht man 
sowas. bei den Vergleichen geht das ja glaube nur mit srüngen oder? und 
das wärren in meinem fall ziemlich viele, was unpraktich wäre.

von µluxx .. (uluxx) Benutzerseite


Lesenswert?

es gibt sbic bzw. sbis "S kip if B it in reg I ster S et / C leared"
Datenblatt hilft....

von µluxx .. (uluxx) Benutzerseite


Lesenswert?

übringens hat deinposting wenig zusammenhang mit dem betreff...

von tuxianer (Gast)


Lesenswert?

sorry ich habe mich vertippt...ich meinte die befehle:


sbic und sbis und wollte sowas mit Variablen machen...

von tuxianer (Gast)


Lesenswert?

ich habe mal was mit registern probiert...allerdings kommt jetzt egal ob 
ich auf 1 oder display 2schalte immer auf beiden Text...


hier der Code:

.include "m32def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.def lcdno = r19


           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten 
RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten 
RAM-Adresse
           out SPH, temp1

           ldi temp1, 0xFF    ; Port D = Ausgang
           out DDRD, temp1

       cbr lcdno, 0
       rcall lcd_init     ; Display initialisieren
       rcall lcd_clear    ; Display löschen
       sbr lcdno, 0
       rcall lcd_init     ; Display initialisieren
           rcall lcd_clear    ; Display löschen


           cbr lcdno, 1
           ldi temp1, 'T'     ; Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 'e'     ; Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 's'     ; Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 't'     ; Zeichen anzeigen
           rcall lcd_data



           ;sbr lcdno, 1
       ;ldi temp1, 'T'     ; Zeichen anzeigen
           ;rcall lcd_data

           ;ldi temp1, 'e'     ; Zeichen anzeigen
           ;rcall lcd_data

           ;ldi temp1, 's'     ; Zeichen anzeigen
           ;rcall lcd_data

           ;ldi temp1, 't'     ; Zeichen anzeigen
           ;rcall lcd_data

loop:
           rjmp loop

.include "lcd-routines.asm"            ; LCD-Routinen werden hier 
eingefügt




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                 LCD-Routinen                ;;
;;                 ============                ;;
;;              (c)andreas-s@web.de            ;;
;;                                             ;;
;; 4bit-Interface                              ;;
;; DB4-DB7:       PD0-PD3                      ;;
;; RS:            PD4                          ;;
;; E:             PD5                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


.equ LCD_PORT = PORTD
.equ LCD_DDR  = DDRD
.equ PIN_E    = 5
.equ PIN_E2   = 6
.equ PIN_RS   = 4
.equ XTAL  = 15300000

 ;sendet ein Datenbyte an das LCD
lcd_data:
           mov temp2, temp1             ; "Sicherungskopie" für
                                        ; die Übertragung des 2.Nibbles
           swap temp1                   ; Vertauschen
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen
           sbr temp1, 1<<PIN_RS         ; entspricht 0b00010000
           out LCD_PORT, temp1          ; ausgeben
           rcall lcd_enable             ; Enable-Routine aufrufen
                                        ; 2. Nibble, kein swap da es 
schon
                                        ; an der richtigen stelle ist
           andi temp2, 0b00001111       ; obere Hälfte auf Null setzen
           sbr temp2, 1<<PIN_RS         ; entspricht 0b00010000
           out LCD_PORT, temp2          ; ausgeben
           rcall lcd_enable             ; Enable-Routine aufrufen
           rcall delay50us              ; Delay-Routine aufrufen
           ret                          ; zurück zum Hauptprogramm


 ; sendet einen Befehl an das LCD

lcd_command:                            ; wie lcd_data, nur RS=0
           mov temp2, temp1
           swap temp1
           andi temp1, 0b00001111
           out LCD_PORT, temp1
           rcall lcd_enable
           andi temp2, 0b00001111
           out LCD_PORT, temp2
           rcall lcd_enable
           rcall delay50us
           ret



 ; erzeugt den Enable-Puls
lcd_enable:
           sbrs lcdno, 1
       sbi LCD_PORT, PIN_E          ; Enable high
       sbrc lcdno, 1
       sbi LCD_PORT, PIN_E2          ; Enable high
           nop                          ; 3 Taktzyklen warten
           nop
           nop
           cbi LCD_PORT, PIN_E          ; Enable wieder low
       cbi LCD_PORT, PIN_E2
           ret
                                ; Und wieder zurück



 ; Pause nach jeder Übertragung
delay50us:                              ; 50us Pause
           ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
delay50us_:
           dec  temp1
           brne delay50us_
           ret                          ; wieder zurück

 ; Längere Pause für manche Befehle
delay5ms:                               ; 5ms Pause
           ldi  temp1, ( XTAL * 5 / 607 ) / 1000
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
           brne WGLOOP1
           dec  temp1
           brne WGLOOP0
           ret                          ; wieder zurück 
; wieder zurück

 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi   temp1, 0xFF            ; alle Pins am Ausgabeport auf 
Ausgang
           out   LCD_DDR, temp1

           ldi   temp3,6
powerupwait:
           rcall delay5ms
           dec   temp3
           brne  powerupwait
           ldi   temp1,    0b00000011   ; muss 3mal hintereinander 
gesendet
           out   LCD_PORT, temp1        ; werden zur Initialisierung
           rcall lcd_enable             ; 1
           rcall delay5ms
           rcall lcd_enable             ; 2
           rcall delay5ms
           rcall lcd_enable             ; und 3!
           rcall delay5ms
           ldi   temp1, 0b00000010      ; 4bit-Modus einstellen
           out   LCD_PORT, temp1
           rcall lcd_enable
           rcall delay5ms
           ldi   temp1, 0b00101000      ; 4 Bot, 2 Zeilen
           rcall lcd_command
           ldi   temp1, 0b00001100      ; Display on, Cursor off
           rcall lcd_command
           ldi   temp1, 0b00000100      ; endlich fertig
           rcall lcd_command
           ret



 ; Sendet den Befehl zur Löschung des Displays
lcd_clear:
           ldi   temp1, 0b00000001      ; Display löschen
           rcall lcd_command
           rcall delay5ms
           ret

 ; Sendet den Befehl: Cursor Home
lcd_home:
           ldi   temp1, 0b00000010      ; Cursor Home
           rcall lcd_command
           rcall delay5ms
           ret

von tuxianer (Gast)


Lesenswert?

oik....jetgzt bleibt zur abwechslung mal der Erste balken schwarz und 
egal was ich mache es kommt auf display 2...

von tuxianer (Gast)


Lesenswert?

irgendwie steht der text jedes mal, wenn ich Strom draufgebe wo anders..

von µluxx .. (uluxx) Benutzerseite


Lesenswert?

oh sry die befehle heißen "SBRC" und SBRS"

von Flo S. (tuxianer)


Lesenswert?

hat sich erledigt...ich habe auch nen neuen Thread mit richtiger 
Überschrift aufgemacht...der hier kann GELÖSCHT werden!!!!

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.