mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pollin Addon-Board mit LCD


Autor: Carsten P. (rug)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe die LCD-Routinen aus dem AVR-Tutorial für mein 
Pollin-Addon-Board so angepasst, das man nur die Jumper PA4-PA7 und 
PB0-PB2 setzen muss.

Test mit folgendem Code lief einwandfrei:
.include "m32def.inc"
 
.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
 
.equ XTAL = 1000000
 
           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
 
        
           rcall lcd_init     ; Display initialisieren
           rcall lcd_clear    ; Display löschen
 
           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

       ldi temp1, ' '     ; Zeichen anzeigen
           rcall lcd_data

       ldi temp1, 102     ; Zahl anzeigen dec
       rcall lcd_number
       
       ldi temp1, ' '     ; Zeichen anzeigen
           rcall lcd_data
       
       ldi temp1, $0a
       rcall lcd_number_hex ; Zeichen anzeigen hex
       
       ldi temp1, 0b00011100  ; Alles nach rechts
           rcall lcd_command
       
              
loop:
           rjmp loop
 


 
.include "Lcd-routines-pollin-addon-board.asm"  ; LCD-Routinen werden hier eingefügt 

Nur wenn ich ein CR sende, komme ich nicht in die zweite Displayzeile. 
Es erscheint nur ein kryptisches Zeichen. Ebenso bei FF oder LF. Woran 
könnte das liegen?

Grüße
Carsten P.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

> .include "Lcd-routines-pollin-addon-board.asm"  ; LCD-Routinen werden hier > 
eingefügt

... die understützen das nicht.

MfG

Autor: Carsten P. (rug)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Konnte die Datei Lcd-routines-pollin-addon-board.asm nicht anhängen....
Also hier ihr Inhalt:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;  LCD-Routinen für das Pollin Addon-Board    ;;
;;  =======================================    ;;
;; 4bit-Interface                              ;;
;; DB4-DB7:       PA4-PA7                      ;;
;; RS:            PB2                          ;;
;; R/W:           PB1                          ;;
;; E:             PB0                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
      push  temp1
      push  temp2
      ldi    temp1, 0b11110000
      ldi    temp2, 0b00000111
      out    DDRA, temp1
      out    DDRB, temp2
             ldi    temp3,6
powerupwait:
      rcall  delay5ms
      dec    temp3
      brne  powerupwait
      ldi    temp1, 0b00000011     ; muss 3mal hintereinander gesendet
      ldi    temp2, 0b00000000    ; Berechnung der Bytes für PORTA und PORTB
      swap  temp1
      bst    temp1,0
      bld    temp2,2
      bst    temp1,2
      bld    temp2,0
      andi  temp1, 0b11110000
      andi  temp2, 0b00000101
      out    PORTA, temp1          ; Initialisierung
      out    PORTB, temp2
      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
      ldi     temp2, 0b00000000    ; Berechnung der Bytes für PORTA und PORTB
      swap   temp1
      bst   temp1,0
      bld   temp2,2
      bst   temp1,2
      bld   temp2,0
      andi   temp1, 0b11110000
      andi   temp2, 0b00000101
      out     PORTA, temp1
      out     PORTB, temp2
      rcall   lcd_enable
      rcall   delay5ms
      ldi     temp1,    0b00101000     ; 4 Bit, 2 Zeilen
      rcall   lcd_command
      ldi     temp1,    0b00001111     ; Display on, Cursor off
      rcall   lcd_command
      ldi     temp1,    0b00000110     ; endlich fertig
      rcall   lcd_command

      pop   temp2
      pop   temp1
      ret 
 
;sendet ein Datenbyte an das LCD
lcd_data:
      push    temp2
      push    temp3
      mov     temp2, temp1            ; "Sicherungskopie" für
                      ; die Übertragung des 2.Nibbles
      andi    temp1, 0b11110000       ; unteres Nibble auf Null setzen
      out     PORTA, temp1            ; ausgeben
      sbi   PORTB, 2         ; RS  auf 1
      rcall   lcd_enable              ; Enable-Routine aufrufen
                      ; 2. Nibble, swap 
      swap    temp2                               
      andi    temp2, 0b11110000       ; untere Hälfte auf Null setzen 
      out     PORTA, temp2            ; ausgeben
      sbi   PORTB, 2        ; RS auf 1
      rcall   lcd_enable              ; Enable-Routine aufrufen
      rcall   delay50us               ; Delay-Routine aufrufen

          pop     temp3
      pop     temp2
      ret                             ; zurück zum Hauptprogramm

 ; sendet einen Befehl an das LCD
lcd_command:                                ; wie lcd_data, nur ohne RS zu setzen
      push    temp2
      push    temp3
      mov     temp2, temp1            ; "Sicherungskopie" für
                                            ; die Übertragung des 2.Nibbles
      andi    temp1, 0b11110000       ; unteres Nibble auf Null setzen
      out     PORTA, temp1            ; ausgeben
      cbi   PORTB, 2         ; RS  auf 0
      rcall   lcd_enable              ; Enable-Routine aufrufen
                                            ; 1. Nibble, kein swap da es schon
      swap    temp2                               ; an der richtigen stelle ist
      andi    temp2, 0b11110000       ; untere Hälfte auf Null setzen 
      out     PORTA, temp2            ; ausgeben
      cbi   PORTB, 2        ; RS auf 0
      rcall   lcd_enable              ; Enable-Routine aufrufen
      rcall   delay50us               ; Delay-Routine aufrufen

      pop     temp3
      pop     temp2
      ret                             ; zurück zum Hauptprogramm

; Kurze Pause 
delay50us:                                  ; 50us Pause
          push   temp1
      ldi    temp1, ( XTAL * 50 / 3 ) / 1000000
delay50us_:
             dec    temp1
             brne   delay50us_
      pop   temp1
      ret                            
      
; Längere Pause für manche Befehle
delay5ms:                                 ; 5ms Pause      
      push   temp1
      push   temp2
      ldi    temp1, ( XTAL * 5 / 607 ) / 1000
WGLOOP0:     ldi    temp2, $C9
WGLOOP1:     dec    temp2
      brne   WGLOOP1
      dec    temp1
      brne   WGLOOP0
      pop   temp2
      pop   temp1
      ret                          

; Enable senden
lcd_enable:
      sbi   PORTB, 0                ; Enable high
      nop                             ; 3 Taktzyklen warten
      nop
      nop
      cbi   PORTB, 0                ; Enable wieder low
      ret
       
 ; Sendet den Befehl zur Löschung des Displays
lcd_clear:
      push    temp1
      ldi     temp1,    0b00000001     ; Display löschen
      rcall   lcd_command
      rcall   delay5ms
      pop     temp1
      ret

 ; Cursor Home
lcd_home:
      push    temp1
      ldi     temp1,    0b00000010     ; Cursor Home
      rcall   lcd_command
      rcall   delay5ms
      pop     temp1
      ret

 ; Einen konstanten Text aus dem Flash Speicher
 ; ausgeben. Der Text wird mit einer 0 beendet
lcd_flash_string:
      push    temp1

lcd_flash_string_1:
      lpm     temp1, Z+
      cpi     temp1, 0
      breq    lcd_flash_string_2
      rcall   lcd_data
      rjmp    lcd_flash_string_1

lcd_flash_string_2:
      pop     temp1
      ret

 ; Eine Zahl aus dem Register temp1 dezimal ausgeben
lcd_number:
      push    temp1
      push    temp2
      push    temp3

      mov     temp2, temp1
                      ; abzählen wieviele Hunderter
                      ; in der Zahl enthalten sind
      ldi     temp1, '0'
lcd_number_1:
      subi    temp2, 100
      brcs    lcd_number_2
      inc     temp1
      rjmp    lcd_number_1
                      ; die Hunderterstelle ausgeben
lcd_number_2:
      rcall   lcd_data
      subi    temp2, -100             ; 100 wieder dazuzählen, da die
                      ; vorherhgehende Schleife 100 zuviel
                      ; abgezogen hat

                      ; abzählen wieviele Zehner in
                      ; der Zahl enthalten sind
      ldi     temp1, '0'
lcd_number_3:
      subi    temp2, 10
      brcs    lcd_number_4
      inc     temp1
      rjmp    lcd_number_3

                      ; die Zehnerstelle ausgeben
lcd_number_4:
      rcall   lcd_data
      subi    temp2, -10              ; 10 wieder dazuzählen, da die
                      ; vorhergehende Schleife 10 zuviel
                      ; abgezogen hat

                      ; die übrig gebliebenen Einer
                      ; noch ausgeben
      ldi     temp1, '0'
      add     temp1, temp2
      rcall   lcd_data
  
      pop     temp3
      pop     temp2
      pop     temp1
      ret

; eine Zahl aus dem Register temp1 hexadezimal ausgeben
lcd_number_hex:
      push    temp1

      swap    temp1
      andi    temp1, $0F
      rcall   lcd_number_hex_digit

      pop     temp1
      push    temp1

      andi    temp1, $0F
      rcall   lcd_number_hex_digit

      pop     temp1
      ret

lcd_number_hex_digit:
      cpi     temp1, 10
      brlt    lcd_number_hex_digit_1
      subi    temp1, -( 'A' - '9' - 1 )
lcd_number_hex_digit_1:
      subi    temp1, -'0'
      rcall    lcd_data
      ret                          

Autor: M. W. (hobbyloet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

1. Ganz wichtig, Schaltplan von Hauptboard Ansehen!
   Da gehen viele PIN auf andere!

2. Den Schaltlplan für das Hauptboard öffnen un mit den gemeinten 
Port.Pin
   vergleichen.

Gruss und guten Rutsch in's neue Jahr

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

... ja wie geschriebnen. Keine Unterstützung für LF CR FF usw.

nacht

Autor: dummy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Nur wenn ich ein CR sende, komme ich nicht in die zweite Displayzeile.

du kannst hier Code posten soviel du willst,
Mit einem CR kommst du nicht in die zweite Zeile.
Du musst den Cursor erst in Zeile 2 setzen.
Dann kannst du dort auch was reinschreiben.

Autor: Carsten P. (rug)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah! Verstanden!

Mit

ldi temp1, 0b11000100
rcall lcd_command

hat es dann sofort geklappt.

Danke!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.