mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC mit Thermowiederstand


Autor: ADC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute
Ich will mit meinem ATMega8 die Temperatur messen! Dazu hab ich einen 
Wiederstand, der je nach Temperatur seinen Wiederstand ändert! Jetzt 
weis ich aber nicht ob ich denn richtig angeschlossen habe!? hab den 
Wiederstand sowohl mal an GND als auch VCC angeschlossen und dann gegen 
PC0... Der hat ungefähr 1,5 Ohm bei raumtemperatur! Als Aref hab ich 
intern 2,5... V eingestellt!
Das hier ist mein Code:
.include "m8def.inc"


main:
  ;Stack initialisieren
  ldi r16, LOW(RAMEND)
  out SPL, r16
  ldi r16, HIGH(RAMEND)
  out SPH, r16
  
  ;Display initialisieren
  rcall lcd_init
  rcall lcd_clear
  
  ;ADC
  ldi r16, (1<<REFS0) | (1<<REFS1) | (1<<ADLAR) 
  out ADMUX, r16

  ldi r16, (1<<ADEN) | (1<<ADSC) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2)
  out ADCSRA, r16

  wait:
  sbic ADCSRA, ADSC
  rjmp wait
  
  ;Wert auslesen
  in r17, ADCL
  in r16, ADCH

  ;Auf LCD ausgeben
  sbrs r16, 0
  ldi r20, 0x30
  sbrc r16, 0
  ldi r20, 0x31
  rcall lcd_data

  sbrs r16, 1
  ldi r20, 0x30
  sbrc r16, 0
  ldi r20, 0x31
  rcall lcd_data

  sbrs r16, 2
  ldi r20, 0x30
  sbrc r16, 0
  ldi r20, 0x31
  rcall lcd_data

  sbrs r16, 3
  ldi r20, 0x30
  sbrc r16, 0
  ldi r20, 0x31
  rcall lcd_data

  sbrs r16, 4
  ldi r20, 0x30
  sbrc r16, 0
  ldi r20, 0x31
  rcall lcd_data

  sbrs r16, 5
  ldi r20, 0x30
  sbrc r16, 0
  ldi r20, 0x31
  rcall lcd_data

  sbrs r16, 6
  ldi r20, 0x30
  sbrc r16, 0
  ldi r20, 0x31
  rcall lcd_data

  sbrs r16, 7
  ldi r20, 0x30
  sbrc r16, 0
  ldi r20, 0x31
  rcall lcd_data

loop: 
  rjmp loop

.include "lcd_functions.asm"
Ist an dem Code was falsch? Und warum liegt an meinem Wiederstand keine 
Spannung an egal ob ich diesen gegen masse oder vcc schalte!?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.:
Das wird WIDERSTAND geschrieben!

2.:
Du musst einen Spannungsteiler mit einem zweiten WIDERSTAND aufbauen, 
sonst wird das nix.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ist an dem Code was falsch? Und warum liegt an meinem Wiederstand keine
>Spannung an egal ob ich diesen gegen masse oder vcc schalte!?

Wo soll die Spannung herkommen? Eine Spannung kannst du nur messen, wenn 
ein Strom durch den Widerstand fließt.

>Der hat ungefähr 1,5 Ohm bei raumtemperatur!

Nicht sehr geeignet.

MfG Spess

Autor: magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC schrieb:
> Dazu hab ich einen Wiederstand, der je nach Temperatur seinen
> Wiederstand ändert!

> Der hat ungefähr 1,5 Ohm bei raumtemperatur!

Bist du dir sicher dasses sich um einen temperaturabhängigen Widerstand 
(NTC bzw. PTC) und nicht um ein Thermoelement handelt?

Gruß,
Magnetus

Autor: ADC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh ja natürlich Widerstand...
Hab mich verschrieben! Der hat 1,5 KOhm! Das müsste ein Widerstand sein! 
Wenn ich ihn ans multimeter anstecke und ihn dann erwärme verringert 
sich sein widerstand...
Ich muss ihn also gegen Vcc stecken oder?

Autor: magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC schrieb:
> Ich muss ihn also gegen Vcc stecken oder?

Ob gegen GND oder VCC (genauer gesagt VREF) ist egal. Damit legst du 
eigentlich nur fest, ob die gemessene Spannung mit zunehmender 
Temperatur kleiner oder größer wird. Du musst halt nur mit Hilfe eines 
weiteren Widerstands einen Spannungsteiler aufbauen.

Gruß,
Magnetus

Autor: Ohforf Sake (ohforf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wichtig ist auch, dass nicht zuviel Strom durch den NTC fliesst, sonst 
erwärmt der sich selbst.

Autor: ADC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
durch denn Widerstand fliesen gerade mal 3,5mA... hab mal so ne 
spannungsteilerschaltung gebaut und jetzt kann ich auch ne Spannung 
messen! ca. 3V abhängig von der Temperatur... Diese schaltung sieht so 
aus:
                                > 1kOhm Widerstand----VCC(5V)
Masse(0V)----Thermowiderstand <
                                > PB0
Verständlich?
jedoch zeigt mir das Display immer nur zwei verschiedene Werte an:
10000000 und 00000000 (<--- nicht abhängig von der Temperatur glaub ich)
Was läuft da falsch?

Autor: magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC schrieb:
> Was läuft da falsch?

Du hast einen Fehler im Programm.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>ca. 3V abhängig von der Temperatur... Diese schaltung sieht so aus:....

Du hast nach eigenen Angaben 2,5V Referenzspannung. Also kannst du nur 
Spannungen <=2,5V Messen. Nimm statt dem 1K mal 2k.

MfG Spess

Autor: ADC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt mal die Referenzspannung hoch auf 5 V und 2 kOhm 
Widerstand genommen aber es kommen immer noch nur diese beiden Werte!?
@magnetus: Ja die Frage ist WO?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie sieht denn das Unterprogramm lcd_data aus ?

Autor: ADC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier ist die Datei "lcd_functions.inc"
// MAKROS
.equ LCD_PORT = PORTB
.equ LCD_DDR = DDRB
.equ PIN_E = 5
.equ PIN_RS = 4
.equ TAKT = 16000000

delay5ms:   /// Für 16 mhz ca. 5,02 ms
  ldi r16, (TAKT/1000)*(5/1000)  //1000 Rechenoperationen
                  //pro Schleifendurchlauf
  delay5ms_loop1: 
    ldi r17, 249

    delay5ms_loop2: 
      dec r17
      nop
    brne delay5ms_loop2

    dec r16        
  brne delay5ms_loop1      
  ret

delay50us:
  ldi r16, (TAKT/10)*(50/1000000)   //10 Rechenoperationen
                    //pro Schleifendurchlauf
  delay100us_loop:
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    dec r16
    brne delay100us_loop
  ret

enable:
  sbi LCD_PORT, PIN_E
  ldi r16, 0x04
  enable_loop: 
    dec r16
    brne enable_loop
  cbi LCD_PORT, PIN_E
  ret

lcd_init:
  ldi r16, 0xFF
  out LCD_DDR, r16
  rcall delay5ms
  rcall delay5ms
  rcall delay5ms
  ldi r16, 0b00000011    // $3
  out LCD_PORT, r16      // in PORTD ausgeben
  rcall enable      // Enable Bit setzen 1. mal
  rcall delay5ms      // min. 4,1 ms warten
  rcall enable      // Enable Bit setzen 2. mal
  rcall delay5ms      // min. 4,1 ms warten
  rcall enable      // Enable Bit setzen 3. mal
  rcall delay5ms      // min. 4,1 ms warten
  ldi r16, 0b00000010    // auf 4-Bit Modus umstellen
  out LCD_PORT, r16      
  rcall enable
  rcall delay5ms

  ldi r20, 0b00101000    // 4-Bit Modus, 2-Zeilig, 5*7 Pixel
  rcall lcd_command
  ldi r20, 0b00001111    // Display/Curser(-blinken) ein
  rcall lcd_command
  ldi r20, 0b00010100

  ret

lcd_command:         // Befehl in r20
  mov r21, r20
  swap r20
  andi r20, 0b00001111

  out LCD_PORT, r20
  rcall enable

  andi r21, 0b00001111
  out LCD_PORT, r21
  rcall enable
  
  rcall delay50us
  ret

lcd_data:
  mov r21, r20    
  swap r20
  andi r20, 0b00001111
  sbr r20, (1<<PIN_RS)    // RS auf Daten umstellen (1)

  out LCD_PORT, r20
  rcall enable

  andi r21, 0b00001111
  sbr r21, (1<<PIN_RS)    // RS auf Daten umstellen (1)
  out LCD_PORT, r21
  rcall enable

  rcall delay50us
  rcall delay50us
  ret

lcd_clear:
  ldi r20, 0b00000001
  rcall lcd_command
  rcall delay5ms
  ret

lcd_print_array:
  ldi ZL, LOW(text*2)
  ldi ZH, HIGH(text*2)
  ldi r16, 0
  wdh:
    lpm r20, Z+
    cp  r20, r16
    breq ende
    rcall lcd_data
  rcall wdh  

  ende:
  ret
Hab jetzt auch schon den Verdacht, dass es daran liegen könnte!?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
R20 enthält das anzuzeigende Zeichen:


lcd_data:
  mov r21, r20


Hier lädst Du mehrfach eine ASCII "1" nach R20 und gibst diese aus:

  ldi r20, 0x31
  rcall lcd_data


und dann führst Du eine Endlosschleife aus.

Welche Funktion erwartest Du von Deinem Programm ?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Hab jetzt auch schon den Verdacht, dass es daran liegen könnte!?

Nicht wahrscheinlich. Nach dem Programm in deinem 1.Post machst du nur 
eine Messung. Nach einer Umschaltung der Referenzspannung (in deiner 
Initialisierung) ist die erste Messung fehlerbehaftet. Füge mal eine 
Dummymessung ein.

MfG Spess

Autor: ADC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab in meinem Hauptprogramm noch einen Fehler entdeckt: ich hab 
immer geschrieben:
  sbrs r16, 7
  ldi r20, 0x30
  sbrc r16, 0         <-------
  ldi r20, 0x31
  rcall lcd_data
sbrc r16, 7
In der markierten zeile müsste anstelle der 0 eine 7 stehen(hab ich 
jetzt nur als Beispiel herangezogen! In den 6 anderen Fällen hab ichs 
jetzt auch geändert...
ich will von denn ganzen Code, dass er mir ein Byte in ASCII Zeichen 
(also '0' und '1') umwandelt und Bit für Bit jeweils als Byte auf dem 
Display ausgibt!
ja genau r20 ist für das aktuelle Byte vorgesehen, das als nächstes 
gesendet werden soll! aber ich überprüfe ja immer zuvor ob an der 
aktuellen Stelle im Byte eine 1 oder 0 steht!? je nach dem wird dann 
0x30 ('0') oder 0x31 ('31') geschrieben...
Könnt ihr mir folgen?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja - ok - hättest Du dazu schreiben sollen....

Wie spess schon schrieb, taugt die erste Messung nichts.

Ausserdem gibst Du mit R16 ja nur ADCH und nicht ADCL aus.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Noch was:

Du gibst meines Achtens die Bits in der falschen Reihenfolge aus.

Deine Bitabfragen kannst du dir sparen:
                   ldi r18,8
                   ldi r19,0

adc_out:           ldi r20,'0'
                   lsr r16
                   adc r20,r19
                   rcall lcd_data
                   dec r18
                   brne adc_out

gibt die Bits von r16 in der Reihenfolge '76543210' aus.

>Ausserdem gibst Du mit R16 ja nur ADCH und nicht ADCL aus.

ADLAR ist gesetzt.

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.