Hallo Leute =)
Ich erhoffe mir mal wieder eine gute Hilfe von euch und zwar
geht es um folgendes:
Auf mikrocontroller.net findet man ja im Toutorial eine
sehr gute beschreibung für eine LCD Ansterungsroutine
für eine 4 Bit Ansteuerung.
Da ich aber an meinen ATMega8 viele Pins habe und ich
nur ein paar Pins gebrauche (Display + 2 AD Wandler )
habe ich die Routine ( versucht)
auf 8 Bit umgeschrieben... und nun erhoffe ich mir
ob ihr diese mal auf Fehler kontrollieren könntet oder weitere
Tipps dazu geben könntet =)
Das Toturial auf µC.net
http://www.mikrocontroller.net/artic...-Tutorial:_LCD
Liebe Grüße
Namenlos
Code:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 8bit-Interface ;; ;; ;; ;; D0 = PortD0 ;; ;; D1 = PortD1 ;; ;; D2 = PortD2 ;; ;; D3 = PortD3 ;; ;; D4 = PortD4 ;; ;; D5 = PortD5 ;; ;; D6 = PortD6 ;; ;; D7 = PortD7 ;; ;; ;; ;; R/W = PortB0 ;; ;; RS = PortB1 ;; ;; E = PortB2 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .def init = r21 .def temp2 = r22 .def temp3 = r23 .ifndef XTAL .equ XTAL = 4000000 .endif lcd_data: ;RS = 1,;sendet ein Datenbyte an das LCD push init sbi PortB, 1 rcall lcd_enable rcall delay50us pop init ret lcd_command:;sendet einen Befehl an das LCD push init cbi PortB, 1 ;RS=0, Daten werden geschrieben rcall lcd_enable rcall delay50us pop init ret ;zurück zum Hauptprogramm lcd_enable: ;erzeugt den Enable-Puls ;Bei höherem Takt (>= 8 MHz) kann es notwendig sein, ;vor dem Enable High 1-2 Wartetakte (nop) einzufügen. ;Siehe dazu http://www.mikrocontroller.net/topic/81974#685882 sbi PORTB, 2 ; Enable high nop ; 3 Taktzyklen warten nop nop cbi PORTB, 2 ; Enable wieder low ret ; Und wieder zurück delay50us: ;Pause nach jeder Übertragung,50us ldi init, ( XTAL * 50 / 3 ) / 1000000 delay50us_: dec init brne delay50us_ ret ; wieder zurück delay5ms: ; 5ms Pause ldi init, ( XTAL * 5 / 607 ) / 1000 WGLOOP0: ldi temp2, $C9 WGLOOP1: dec temp2 brne WGLOOP1 dec init brne WGLOOP0 ret ; wieder zurück lcd_init: ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden ldi temp3,50 powerupwait: rcall delay5ms dec temp3 brne powerupwait ldi init, 0b00000011 ; muss 3mal hintereinander gesendet out PortD, init ; werden zur Initialisierung rcall lcd_enable ; 1 rcall delay5ms rcall lcd_enable ; 2 rcall delay5ms rcall lcd_enable ; und 3! rcall delay5ms ldi init, 0b00110000 ; 8Bit / 2 Zeilen / 5x7 rcall lcd_command ldi init, 0b00001100 ; Display ein / kein Cursor / kein Blinken rcall lcd_command ldi init, 0b00000100 ; inkrement / kein Scrollen rcall lcd_command ret lcd_clear: ;Sendet den Befehl zur Löschung des Displays ldi init, 0b00000001 ; Display löschen rcall lcd_command rcall delay5ms ret lcd_home: ;Sendet den Befehl: Cursor Home ldi init, 0b00000010 ; Cursor Home rcall lcd_command rcall delay5ms ret
musst ja nur das umtauschen weglassen (swap) und die initialisierung ein bisschen abwandeln.
hier mal meine 8-bit ansteuerung:
PD0-PD7 entspricht DB0-DB7
Rs is an PC5
E an PC3
dieser code funktioniert.
Code:;definitionsdatei .equ DBport= portd ; ausgabeport .equ RWport= portc ; RS,RW, E .equ DBddr= ddrd ; datenrichtung ausgabe .equ RWddr= ddrc ; datenrichtung rs, rw, e .equ pine= 3 .equ pinrw= 4 .equ pinrs= 5 .device mega8 .include "m8def.inc" ; Stack initialisieren ldi r16, LOW(RAMEND) out SPL, r16 ldi r16, HIGH(RAMEND) out SPH, r16 ;****************hier starten******************** rcall ms10 rcall ms10 rcall ms10 rcall ms10 rcall ini rjmp haupt ;****************Ein/Ausgänge********************* ddrdaus: ldi r16, $ff ; Datenausgänge DB0-7 out ddrd, r16 ret ddrdein: ldi r16, 0 out ddrd, r16 ret ddrcaus:ldi r16, $ff ; kontrollausgänge RS;RW;E out ddrc, r16 ret ddrcein:ldi r16, 0 out ddrc, r16 ret ;****************Warteschleifen******************* ms2: ldi r24, low (125) ;// 2000 = µs = 2ms; 4 = takte ldi r25, high (125) ;// 2000 = µs = 2ms; 4 = takte ms21: sbiw r24,1 ;//2takte brne ms21 ;//2takte ret ;//4takte ms5: ldi r24, low (1250) ;// 5000 = µs = 5ms; 4 = takte ldi r25, high (1250) ;// 5000 = µs = 5ms; 4 = takte ms51: sbiw r24,1 ;//2takte brne ms51 ;//2takte ret ;//4takte ms10: ldi r24, low (2500) ;// 10000 = µs = 10ms; 4 = takte ldi r25, high (2500) ;insgesamt 4Takte ms101: sbiw r24,1 ;//2takte brne ms101 ;//2takte ret ;//4takte ;****************Daten/Befehle senden************* ;----------Daten Senden daten: rcall ddrcaus rcall ddrdaus out portd, r17 sbi portc, pinrs nop sbi portc, pine nop nop nop nop cbi portc, pine rcall ms2 ret ;----------Befehle Senden befehl: rcall ddrcaus rcall ddrdaus out portd, r17 nop sbi portc, pine nop nop nop nop cbi portc, pine rcall ms2 ret ;----------Befehl für ini mit zeit befehlini: rcall ddrcaus rcall ddrdaus out portd, r17 nop sbi portc, pine nop nop nop nop cbi portc, pine rcall ms5 ret ;****************Initialisierung****************** ini: rcall ddrdaus ;ddrd = ausgang rcall ddrcaus ;ddrc = ausgang ldi r17, 0x00 out portd, r17 ldi r17, $30 ;$30 = 3 mal auf ausgang rcall befehlini ; 1 befehl senden rcall befehlini ; 2 befehl senden rcall befehlini ; 3 befehl senden ;Function set ;DL = 1 = 8bit-modus, N = 1 = 2 Zeilen, ldi r17, 0b00111000 ;Funtion set, DL, N, F rcall befehlini ;Display ON/OFF ldi r17, 0b00001110 ;Display, ON/Off, cursor an/aus, Block/Unterstrich rcall befehlini ldi r17, 0b00000001 rcall befehlini ret ;----------------Hauptprogramm------------------- haupt: ldi r17, '0' rcall daten ldi r17, '8' rcall daten ldi r17, '/' rcall daten ldi r17, '1' rcall daten ldi r17, '5' rcall daten loop: rjmp loop
Lesezeichen