PhilippW
29.11.2005, 19:51
Hallo, allerseits!
Ich hab eine Frage zu einem altbekannten Problem: Spannung messen mit dem Atmega8...
Ich weiß, das wurde schon oft durchgekaut und ich habe mich heute schon den ganzen Tag durch alle möglichen Internetseiten, insbesondere der Roboternetz- und Mikrocontroller.net- Suche gewühlt, aber nichts passendes gefunden...
Bislang habe ich immer nur mit der C-Control zu tun gehabt und möchte mich nun auch mit den AVRs befassen...
Um mir den Einstieg zu erleichtern, hab ich auf mikrocontroller.net erfolgreich das Tutorial durchgearbeitet (allerdings mit einem Atmega8-16PC) und möchte jetzt den Teil mit dem AD-Wandler ein wenig vertiefen.
Dazu sollen Spannungen von 0 bis 5 Volt gemessen und über UART ausgegeben werden.
Probeweise habe ich mir folgenden Code zusammen gewurschtelt, welcher sich im Nachhinein aber als völliger Quatsch herausstellt hat... 8-[
.include "m8def.inc"
.def temp = r16
.equ CLOCK = 4000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ; TX aktivieren
ldi r16, 0x00
out DDRD, r16 ;Port D durch Ausgabe von 0x00 ins
;Richtungsregister DDRD als Eingang konfigurieren
loop:
in r16, PIND ;an Port D anliegende Werte (Taster) nach r16 einlesen
rcall serout ;Unterprogramm aufrufen
ldi temp, 10
rcall serout
ldi temp, 13
rcall serout
rjmp loop
serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, temp
ret ; zurück zum Hauptprogramm
Abfragen möchte ich nach Möglichkeit PD0 und den gemessenen Wert in ein Register speichern, um ihn nachher an ein LCD oder über die serielle Schnittstelle (UART) auszugeben...
Reicht es einfach, AREF an 5V zu legen oder muss ich Softwareseitig noch etwas einstellen?
Was muss ich machen, damit mein Code doch noch funktioniert.
Bei Assembler möchte ich auch gerne bleiben, da es mich irgendwie juckt, auch damit programmieren zu können... ;-)
Ich weiß, dass ich viel verlange, da das Thema ADC ja schon sehr oft besprochen wurde, aber ich komme immer noch mit der einfachen AD-Port-Abfrage der C-Control durcheinander...
Mit freundlichen Grüßen,
Philipp Wehner
Ich hab eine Frage zu einem altbekannten Problem: Spannung messen mit dem Atmega8...
Ich weiß, das wurde schon oft durchgekaut und ich habe mich heute schon den ganzen Tag durch alle möglichen Internetseiten, insbesondere der Roboternetz- und Mikrocontroller.net- Suche gewühlt, aber nichts passendes gefunden...
Bislang habe ich immer nur mit der C-Control zu tun gehabt und möchte mich nun auch mit den AVRs befassen...
Um mir den Einstieg zu erleichtern, hab ich auf mikrocontroller.net erfolgreich das Tutorial durchgearbeitet (allerdings mit einem Atmega8-16PC) und möchte jetzt den Teil mit dem AD-Wandler ein wenig vertiefen.
Dazu sollen Spannungen von 0 bis 5 Volt gemessen und über UART ausgegeben werden.
Probeweise habe ich mir folgenden Code zusammen gewurschtelt, welcher sich im Nachhinein aber als völliger Quatsch herausstellt hat... 8-[
.include "m8def.inc"
.def temp = r16
.equ CLOCK = 4000000
.equ BAUD = 9600
.equ UBRRVAL = CLOCK/(BAUD*16)-1
; Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp
; Baudrate einstellen
ldi temp, LOW(UBRRVAL)
out UBRRL, temp
ldi temp, HIGH(UBRRVAL)
out UBRRH, temp
; Frame-Format: 8 Bit
ldi temp, (1<<URSEL)|(3<<UCSZ0)
out UCSRC, temp
sbi UCSRB,TXEN ; TX aktivieren
ldi r16, 0x00
out DDRD, r16 ;Port D durch Ausgabe von 0x00 ins
;Richtungsregister DDRD als Eingang konfigurieren
loop:
in r16, PIND ;an Port D anliegende Werte (Taster) nach r16 einlesen
rcall serout ;Unterprogramm aufrufen
ldi temp, 10
rcall serout
ldi temp, 13
rcall serout
rjmp loop
serout:
sbis UCSRA,UDRE ; Warten bis UDR für das nächste
; Byte bereit ist
rjmp serout
out UDR, temp
ret ; zurück zum Hauptprogramm
Abfragen möchte ich nach Möglichkeit PD0 und den gemessenen Wert in ein Register speichern, um ihn nachher an ein LCD oder über die serielle Schnittstelle (UART) auszugeben...
Reicht es einfach, AREF an 5V zu legen oder muss ich Softwareseitig noch etwas einstellen?
Was muss ich machen, damit mein Code doch noch funktioniert.
Bei Assembler möchte ich auch gerne bleiben, da es mich irgendwie juckt, auch damit programmieren zu können... ;-)
Ich weiß, dass ich viel verlange, da das Thema ADC ja schon sehr oft besprochen wurde, aber ich komme immer noch mit der einfachen AD-Port-Abfrage der C-Control durcheinander...
Mit freundlichen Grüßen,
Philipp Wehner