PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DS18S20 mit ATMEGA8515



demir
23.01.2006, 14:15
Hallo,

mein Ziel ist es, ein Temperatursensor (DS18S20) mit einem ATMEGA8515
anzusteuern, und auszulesen. Dafür habe ich den Code von Felix
genommen, und Ihn für den Prozessor mit 4MHz angepasst. Der Code ist
logisch und ist auch einfach zu verstehen. Da ich aber neu in Sachen
AVR Programmierung bin, und ich mich immer noch im Anfangsstadium
befinde, habe ich noch einige Fragen:

1. Theoretisch und Praktisch müsste der Temperaturwert im Register
Temperatur_LSB stehen, oder?

2. Wie kann ich die Adresse auslesen? Kann ich das mit Read, und dann
irgendwo als *.Hex File abspeichern? Müsste der Wert dann dort stehen?

Wenn Nein,

3. Wie kann ich dann die Echtzeittemperatur erfahren?

Ziel ist es, ein Temperaturwert über irgendeine Adresse binär
auszulesen, ohne den Wert an ein LCD, oder USART auszugeben. Das kommt später. Ich möchte vorerst nur wissen, wie der aktuelle Wert ist.

Danke für die Antworten.

MFG

Onur

matthias882
23.01.2006, 23:41
Hallo erstmal!

Also zu 1: Da dir dieser Sensor einen Wert liefert, dessen Auflösung genauer ist als 8-Bit, Passt dieser nicht in ein Register, sondern er benötigt 2 dafür. Du findest also in "temperature_lsb" die niederwertigen 8 Bit (0-7) und in "temperature_msb" die der höheren Wertigkeit (8-...)

2. Es wäre eine Möglichkeit, den ganzen Spaß im Eeprom abzuspeichern und das Ganze dann mit dem PC auszulesen, aber ich denke da hast du genausoschnell ein LCD angeschlossen.

Wenn du das Ganze in Echtzeit erfahren willst und dich binär nicht stört, dann nimm dir einfach 2 freie Ports an deinem AVR(als Beispiel B und C), definiere sie als Ausgang, schließe dort 16 LEDs an (Vorwiderstand nicht vergessen) und gebe dort temperature_lsb und _msb aus.

du musst dazu den wert mit "lds" aus dem Speicher in ein Register einlesen und ihn dann mit "out" an den Port schicken. Hab das mal kurz zusammengetippt, muss aber nicht unbedingt funktionieren ;-)


reset:
ldi temp1, 0 ;register und speicherstellen auf 0
ldi temp2, 0
ldi temp3, 0
ldi delay1, 0
ldi delay2, 0


sts temperature_lsb, temp1
sts temperature_msb, temp1
sts TH_register, temp1
sts TL_register, temp1
sts res_byte4, temp1
sts res_byte5, temp1
sts count_remain, temp1
sts count_per_c, temp1
sts crc, temp1

ldi temp1, ramend ;stack einrichten
out spl, temp1
ser temp1
out ddrb, temp1 ;portb als ausgang fürs MSB
out ddrc, temp1 ;PORT FÜRS LSB



;************************************************* *****************************
; Hauptschleife
;************************************************* *****************************

main:



rcall reset_pulse
rcall skip_rom
rcall convert_t
rcall reset_pulse
rcall skip_rom
rcall read_scratchpad
rcall reset_pulse ;jetzt müssten die werte in den
;entsprechenden speicherstellen stehen

lds temp0, temperature_lsb ;LÄDT DAS LSB IN TEMP0
out PORTC, temp0 ;UND GIBT ES AUF PORT C AUS

lds temp0, temperature_msb
out PORTB, temp0 ;und das gleich nochmal mit dem Msb

rjmp main


Den Rest (alles was nach main steht) einfach so lassen und nicht vergessen ganz oben bei include die richtige Datei einzubinden.
Müsste in deinem Fall glaub ich "m8515def.inc" heißen.

Jetzt bekommst du an PortB und PortC deinen Wert angezeigt. Er errechnet ich aus: Wert an PortB*256 + Wert an PortC.

Hoffe das hilft dir 'n bißchen weiter

Gruß Matthias

demir
25.01.2006, 10:45
Hallo,

Danke für den Tip. Mein Problem lag darin, dass ich mir nicht sicher war,
ob eine Umwandlung stattfindet, bzw. ob überhaupt etwas passiert. Immer nach einem Schritt (Z.B. Initialisierung) habe ich die LED's vom STK500 leuchten lassen.

Mal sehen, ob ich irgendwelche Daten ausgeben kann, oder ob ich noch Timing Probleme habe.

Gruß

Onur