Hallo alle Zusammen,
ich möchte mithilfe ATtiny26 Mikrocontroller eine spannung zwischen 0 und 5 v Messen, Vorerst gabe ich zur Erfassung der Spannung ADC eigenstellt. Darauf hin habe ich LCD intialisiert.. Soweit gut.. und ich habe dann das Programm laufen lassen, jedoch sehe keinen Balken an meinem LCD und es tut sich nichts..
Hier ist mein Quellcode:
;Voreinstellungen
.device ATtiny26
.nolist
.include "tn26def.inc"
.list
;Deklarationen
.def mp=R16 ;allgemeine Register
.def adhigh=R17 ;Ergebnis vom ADC
;Stackpointer initialisiern
ldi mp, RAMEND
out SP, mp
;Definition der Ein und Ausgänge
ldi mp, 0b11111111
out DDRB, mp
ldi mp, 0b11111110
out DDRA,mp
ldi mp,0b00000000
out TCNT0,mp
;Einstellungen des ADC Wandlers
;Die Spannung von 5V (analog) in eine 8 bit (digital) zahl umwandeln
;Initialisierund des ADMUX Registers
ldi mp,0b00100000 ;AVCC Betriebsspannung als Referenzspannung, Datenrichtung linksbündig
out ADMUX,mp ;ADC0 Analoger Eingang
;Initialisierung des ADCSR Registers
ldi mp,0b10000101 ;AD Wandler aktiviert, Einzelwandlung "Single Conversion", Vorteiler 32
out ADCSRA,mp
; ADC für eine Einzelwandlung starten
Main:
sbi ADCsRA, ADSC
LOOP:
sbic ADCSRA, ADSC
rjmp LOOP
;oberste 8 Bit einlesen
in adhigh,ADCH
;LCD
.def mp1=R18
.def mp2=R19
.def mp3=R20
;RS auf PA4
;E auf PA5
;PB4..PB5 auf PA1..PA2
;PB6..PB7 auf PA6..PA7
.equ LCD_PORT=PORTA
.equ LCD_DDR=PORTA
.equ PIN_E=5
.equ PIN_RS=4
LCD_init:
ldi mp1,11111110
out LCD_DDR,mp1
ldi mp3,6
powerupwait:
rcall delay5ms
dec mp3
brne powerupwait ;Wenn 5ms abgelaufen dann Schleife verlassen
ldi mp1, 0b00000011 ;muss dreimal hintereinander gesendet werden
out LCD_PORT, mp1
rcall LCD_enable ;1
rcall delay5ms
rcall LCD_enable ;2
rcall delay5ms
rcall LCD_enable ;3
rcall delay5ms
; 4-Bit-Modus einstellen
ldi mp1, 0b00000010
out LCD_PORT, mp1
rcall LCD_enable
rcall delay5ms
; Funktionen setzen
;DL=0-->4-Bit-Schnittstelle
;N=1--->zwei Zeilen
;F=0--->5x8 Matrix
ldi mp1,0b00101000
rcall LCD_command
;Anzeigenkontrolle ein/aus
;D=1 Anzeige ein
;C=0 Cursor aus
;B=0 Blinken aus
ldi mp1,0b00001100
rcall LCD_command
;fertig initialisiert
ldi mp1,0b00000100
rcall LCD_command
ret
;Löschen Anzeige
LCD_clear:
ldi mp1,0b00000001
rcall LCD_command
rcall delay5ms
ret
;Zurück
LCD_home:
ldi mp1,0b00000010
rcall LCD_command
rcall delay5ms
ret
;Datenbyte an das LCD senden
LCD_data:
mov mp2,mp1
swap mp1
andi mp1,0b00001111
sbr mp1, 1<<PIN_RS
out LCD_PORT,mp1
rcall LCD_enable
andi mp2, 0b00001111
sbr mp2,1<<PIN_RS
out LCD_PORT, mp2
rcall LCD_enable
rcall delay50us
ret
;Befehl an das LCD senden
LCD_command:
mov mp2,mp1
swap mp1
andi mp1,0b00001111
out LCD_PORT,mp1
rcall LCD_enable
andi mp2,0b00001111
out LCD_PORT, mp2
rcall LCD_enable
rcall delay50us
ret
LCD_enable:
sbi LCD_PORT, PIN_E ;Enable High
nop
nop
nop
cbi LCD_PORT, PIN_E ;Enable Low
ret
;Zeitschleife
;50 µs Pause
delay50us:
ldi mp1, $42
delay50us_:
dec mp1
brne delay50us_
ret
;Pause für die Befehle
;5ms Pause bei 1 MHz
delay5ms:
;äußere Schleife
ldi mp1, $21
;innere Schleife
Loop0:
ldi mp2, $C9
Loop1:
dec mp2
brne Loop1
dec mp1
brne Loop0
ret
Kann mir jemand sagen wo der Fehler ist?
Stimmt etwas mit der Initialisierung nícht??
viele Grüße