- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 173

Thema: Portbelegung auf ATMega für LCD1602

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #21
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    175
    So hab mal durchgeschaut... und das ein oder andere wurde schon angesprochen wie z.B. der Stack oder die Init.
    test3.txt

    Wenn du das LCD richtig angeschlossen hast solltest du mal den Kontrast so einstellen das man die Dots 5x7 ein wenig sieht. Kommt hier mit Erhöhung des KOntrastet nur die erste Zeile zum vorscheinen ist die Init des LCD nicht komplett oder unterbrochen worden.

    Sag mal wie fit bist du eigentlich im ASM beim AVR ?

    1.
    In die Initialisierung gehören alle Inits interner sowei externe Peripherie. Ebenso sollten alle Ints, also die gesamte Vectortabelle aufegführt werden entweder.
    Code:
    .org $0000
         rjmp   INIT
    reti
    reti
    reti
    reti
    reti
    .
    .
    .
    .
    .
    Oder
    Code:
    .org $0000
          rjmp INIT
    .org $0001
          rjmp  ???
    .org $0002
           rjmp  ????
    .
    .
    .
    .
    Denn wenn der SEI aktiv ist und man vllt sich mal vertan hat und der zugehörige Int wird ausgelöst und diese Tabelle fehlt kann es sein das dein Controller mitten in der Startinit wieder loslegt....


    1.1

    Code:
    ldi        lcdd,0x28    ;cd_function_set_std: 4Bit,2Zeilen,5*7 Font
        rcall    lcd_cmd4    ; Enthält bereits eine Zeitschleife
    es steht zwar dahinter aber wenn man doch mal fix was ändern möchte ist
    folgendes übersichtlicher
    Code:
    ;SET Function
    .equ F            =    2 ;1 = 5x10            0 = 5x7
    .equ N            =    3 ;1 = 2line(4line)    0 = 1line
    .equ DL            =    4 ;1 = 8bit int        0 = 4bit interface
    .equ HSF        =    5 ;immer 1 setzen Symbolisiert das Ende 
    
    ldi            temp1,(1<<HSF|0<<DL|1<<N|0<<F)        ;funktionset 
            rcall        lcd_command                            ;DatenLine1=8bit, N=1 2zeilig á 40 Zeichen d.h. 4zeilig á 20Zeichen
            ret
    Die LCD -Deklarationen sollten ebenfalls im Hauptprogramm ganz oben stehen

    1.2
    Zu den Registern sei gesagt die sollten nur einen allgm. Namen bekommen und haben nicht wirklich was mit den einzelnen Programmteilen, in textlicher Form, was zu tun. Ob es nun lcdd, tempx oder sonst wie benannt wird spielt keine Rolle da diese wirklich meist die absoluten temproären Daten sind und meist nur für die jeweilige Unterroutine wichtig sind.
    Daten die über mehrere Funktionen z.B. Sekunden/Minuten einer Uhr von Interesse sind werden im SRAM vorgehalten.
    Warum spreche ich das an ?
    Code:
    ;    ldi        XL,0x03        ;clr DSP, Curs > home (01)
    ;    rcall    lcd_cmd4    ; Erst wenn die komplette Init fertig ist Cursor Home schicken mit 0x01 
    ;woher also 0x03
    
    ;    rcall    lcd_dlys    ;dito
    
    ;    ldi        XL,0x06        ;also entry_mode DSP fest, Curs auto-inc
        ldi        lcdd,0x06    ; Und warum plötzlich in XL und nicht in lcdd ?    
        rcall    lcd_cmd4    ;
    
    ;    rcall    lcd_dlys    ;dito 
    
        pop        XL
        ret
    Hier hats dich ein wenig erwischt, Daten wurden in XL geschrieben obwohl du genau lcdd dafür vorgesehen hast somit wurde erst gar keine LCD-Daten ausgegeben.
    Der Befehl 0x01 ist LCD löschen und setzen auf Cursorpostition 0 in Zeile 1, würde ich erst immer nach der fertigen Initialisierung des LCD aufrufen.
    Das hier sollten die Hauptfehler gewesen sein, Wenn die Verkabelung stimmt ...

    Kleine Hausaufgaben
    1. Warum kannst du ohne weitere Deklarationen XL/ Z direkt nutzen ?
    2. Welche Register können nicht direkt mit Konstanten geladen werden ?

    2.
    Datenbanken so wie die dazugehörigen Textausgaben inklusive der Adressen, sollten in einer Include gepackt werden siehe hier
    https://www.roboternetz.de/community...Seriel-ATMega8 unter DbTxt_LCD.asm

    3.
    An Manchen Stellen hast du in der Unterroutine zum Schluss eine Zeitschleife und nachdem du diese Unterroutine verlassen hast folgt auf den Fuße wieder eine.
    Warum ? Entweder du entwickelst die Unterroutinen so das diese in und ansich voll funktionsfahig aus sich heraus sind. Zumindest solltest du dich nur auf einen Weg festlegen.


    puuhhhh jjaaaa das wars was mir erstmal aufgefallen war/ist...
    Geändert von avr_racer (02.01.2019 um 09:20 Uhr)

Ähnliche Themen

  1. [ERLEDIGT] Atmega 644 & atmega8 parallel am ISP ... Reset beider atmega notwendig ..
    Von Ritchie im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 29.03.2013, 11:18
  2. CCPRO M128: Portbelegung
    Von Dirk im Forum Robby RP6
    Antworten: 0
    Letzter Beitrag: 22.05.2009, 22:26
  3. Portbelegung bei diesem Display [erledigt]
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 18.11.2006, 18:12
  4. Portbelegung ATmega32
    Von Rob.Anfänger im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 15.11.2006, 19:59
  5. Antworten: 4
    Letzter Beitrag: 12.11.2006, 16:40

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress