www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Temperaturschalter mit atmega8 (Assembler)


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich will einen Kühlschrank auf 40°C temperieren. Mit einem NTC 
und einem Widerstand wird ein Pegel erzeugt, den der Atmega8 umwandelt. 
Mit dem folgenden Programm soll der Atmega8 die Heizung über 40°C 
ausschalten und unter 40°C einschalten. Nur irgendwie bekomme ich unter 
40°C ein Rechtecksignal auf meiner Platine (im Simulator nicht). 
Schonmal Danke im Vorraus.
  ldi    r16,  0xFF
  out    DDRD,  r16
  sbi    DDRB,  0

  ldi    r16,  (1<<REFS0) | (0<<REFS1)
  out    ADMUX,  r16

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

  ldi    r18,  LOW(400)
  ldi    r19,  HIGH(400)
 Main:

; neuen ADC-Wert lesen
    sbi     ADCSRA, ADSC        ; den ADC starten
 
wait_adc:
  sbic    ADCSRA, ADSC    ; ADC fertig -> Bit wird gelöscht
    rjmp    wait_adc

; ADC einlesen:
        in      adlow, ADCL
        in      adhigh, ADCH

; Auswertung:
  cp    adlow,  r18
  cpc    adhigh,  r19
  brsh  Heizung_Ein
  brlo  Heizung_Aus
    rjmp    Main
 

Heizung_Ein:
  ldi    r16,  0x00
  out    portd,  r16
  rjmp  Main
Heizung_Aus:
  ldi    r16,  0xff
  out    portd,  r16
  rjmp  Main

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Stefan (Gast)

>Hallo, ich will einen Kühlschrank auf 40°C temperieren.

Ist das dann noch ein KÜHLschranl?

>Mit dem folgenden Programm soll der Atmega8 die Heizung über 40°C
>ausschalten und unter 40°C einschalten. Nur irgendwie bekomme ich unter
>40°C ein Rechtecksignal auf meiner Platine (im Simulator nicht).
>Schonmal Danke im Vorraus.

Das klappt so nicht. Wenn die Schaltschwellen nach oben und unten gleich 
ist,  dann "flattert" dein Ausgang beim Übergang. Was di brauchst ist 
eine Hysterese, sprich verschiedene Schaltschwellen für An und 
ausschalten. Z.B. bei 41 Grad ausschalten und bei 39 wieder einschalten. 
Siehe Schmitt-Trigger.

MFG
Falk

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn die Schaltschwellen nach oben und unten gleich
>ist,  dann "flattert" dein Ausgang beim Übergang.

Stimmt ja, wenn ich ziemlich genau bei 40°C liege. Zum testen habe ich 
den NTC auf ca 60°C erwärmt und auf 25°C abgekühlt. Somit dürfte es 
wenn, nur im Übergang "flattern". Ich habe aber bei 25°C immer noch ein 
Rechtecksignal obwohl dies doch nicht sein dürfte oder?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Uhu Uhuhu (uhu)

>Kann es sein, daß eine Ausgabe eines 1-Bits auf Portd das Bit toggelt?

Nöö, das macht bestenfalls PIND. Aber nicht beim MEGA8.

MFg
Falk

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt.

Ist der Controllertyp richtig eingestell?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich mein schon

.include "m8def.inc"

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann sieh dir mal den Maschinencode im Dump-Fenster an und suche die 
I/O-Registeradresse, auf die der Befehl "out    portd,  r16" schreibt 
und vergleiche sie mit der Adresse des Portd des Atmega8.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aus m8def.inc
.equ  PORTD  =$12


73:         out    portd,  r16
+00000024:   BB02        OUT     0x12,R16         Out to I/O location

sie stimmen überein oder habe ich dich falsch verstanden?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Willst Du in der Tat den ganzen PortD setzen oder löschen? Normal macht 
man das doch nur mit einem Pin. In dem Fall kann man auch z.B.

sbi PortD, 0  ;Pin setzen
oder
cbi PortD, 0  ;Pin löschen

schreiben.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur leider ändert es nicht's an meinem Rechtecksignal. Ich glaube dass 
ich den A/D-Wandler falsch benutze, den der A/D-Wandler muss doch das 
Signal zum Ein oder Ausschalten geben. Wenn ich den Port direkt auf 0 
oder 1 setze, dann funktioniert es ja. Es "flattert auch nicht". Das 
Problem tritt erst auf, wenn ich den A/D-Wandler zwischen schalte.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan wrote:
> aus m8def.inc
> .equ  PORTD  =$12
>
>
> 73:         out    portd,  r16
> +00000024:   BB02        OUT     0x12,R16         Out to I/O location
>
> sie stimmen überein oder habe ich dich falsch verstanden?

Wenn du wirklich wissen willst, was im Code steht, solltest du nicht in 
irgend welchen Listings nachsehen, sondern direkt in dem, was im 
Flashmemory deines Controllers steht, denn das wird ausgeführt und nicht 
unbedingt das, was man denkt ;-)

Wenn dir das zu kompliziert ist, kannst du ja mal folgenden Befehl 
schreiben:

   out   $12,R16

Das Rechtecksignal erweckt bei mir den Eindruck, daß du statt PortD PinD 
erwischst und der Simulator automatisch die richtige Einstellung 
übernimmt, die Hardware sich aber nicht weiter darum kümmert...


@ Travel Rec.

Das ist zwar richtig, aber behebt wohl kaum das Problem...

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das ganze mal gelöst, aber ich denke dass dein Problem 
irgendwie der ADC ist, du bildest ja keinen Mittelwert oder?
Irgendwelche Störeinflüsse beim Messen, die einzelne Werte komplett 
ungültig machen würden?
Wenn du dann noch die Schleife endlos durchlaufen lässt und den Wert 
sozusagen alle paar ms updatest, dann kanns natürlich sein dasses öfters 
flattert, jenachdem was dein ADC grad an Störungsmüll auffängt.



Ich denke das müsste gehn...
temperatur 1 würde deinem ADC-Mittelwert entsprechen, welchen du 
ausrechnen solltest
eHeizung:
       
       lds temp, temperatur1

       Sbis portb, PB0 ;skip if PB0=1(Heizung an)
       subi temp, 10
     

       sbic portb, PB0 ;skip if PB0=0
       subi temp, -10
       


     cp t1, temp
     brsh uAus  ;same or higher
     brlo uAn   ;lower


       
uAus:
     cbi Portb, PB0 ;clear bit
     ret


uAn:
     sbi Portb, PB0 ; set bit
     ret


.ESEG
Temperatur0:  .db     160

.DSEG                
Temperatur1:  .BYTE  1


Gruß Jens

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab den Befehl mal eingegeben (das andere ist mir zu kompliziert)

Ich hab mal was ausprobiert:
wenn ich eine Led anschließe, dann flackert diese
wenn ich eine Led mit Widerstand (470ohm), dann flackert diese nicht
wenn ich mit einer Led und dem Widerstand einen Transisor schalte, der 
eine weitere LED schaltet dann flackern beide
ich weiß nicht ob das weiterhilft

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dumme Frage: Hast Du alle Masse- und Vcc-Anschlüsse angeschlossen, also 
auch Avcc? Blockkondensatoren an allen Betriebsspannungsanschlüssen? 
ARef mit Kondensator nach Masse beschaltet?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was passiert, wenn du die ADC-Befehle auskommentierst und stattdessen 
adlow/adhigh mit einem Wert unter 400 lädst?

Poste mal die Schaltung und das komplette Programm.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hast Du alle Masse- und Vcc-Anschlüsse angeschlossen, also
>auch Avcc?
ja

>ARef mit Kondensator nach Masse beschaltet?
ja

>Blockkondensatoren an allen Betriebsspannungsanschlüssen?
wie ist das gemeint? Ich habe Vcc mit meiner Spannungsquelle verbunden 
und über einen 47ohm Widerstand mit AVcc verbunden (statt Spule hieß es 
irgendwo im internet)
AVcc habe ich über einen Folienkondensator mit Masse verbunden.
Im Anhang ist der Eagle Schaltplan

Autor: Stefan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Schaltplan

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.NOLIST                     ; List-Output unterdrücken
 .INCLUDE "m8def.inc"      ; das gibt es für jeden Controllertyp
 .LIST                      ; List-Output wieder aufdrehen
  .def adlow=r20
  .def adhigh=r21
.CSEG                      ; was nun folgt, gehört in den FLASH-Speicher

 ;------------------------------------------------------
 ;     Start Adresse 0000
 ;------------------------------------------------------
.org 0x000
.org 0x00E
  rjmp   INIT           ; Reset Handler
 ;------------------------------------------------------
 ;     ISR VECTORS
 ;------------------------------------------------------
.org ACIaddr

INIT:  
 ;------------------------------------------------------
 ;     INITIALIZE
 ;------------------------------------------------------  
  ldi    r16,  0xFF
  out    DDRD,  r16
  sbi    DDRB,  0

  ldi    r16,  (1<<REFS0) | (0<<REFS1)
  out    ADMUX,  r16

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

  ldi    r18,  LOW(400)
  ldi    r19,  HIGH(400)
 ;------------------------------------------------------
 ;   HAUPTSCHLEIFE
 ;------------------------------------------------------
 Main:

; neuen ADC-Wert lesen
 
    sbi     ADCSRA, ADSC        ; den ADC starten
 
wait_adc:
  sbic    ADCSRA, ADSC        ; wenn der ADC fertig ist, wird dieses Bit gelöscht
    rjmp    wait_adc

; ADC einlesen:
 
    in      adlow, ADCL         ; immer zuerst LOW Byte lesen
    in      adhigh, ADCH        ; danach das mittlerweile gesperrte High Byte

  cp    adlow,  r18
   cpc    adhigh,  r19
  brsh  Heizung_Ein
  brlo  Heizung_Aus
    rjmp    Main
 

Heizung_Ein:
  ldi    r16,  0x00
  out    $12,  r16
  rjmp  Main
Heizung_Aus:
  ldi    r16,  0xf0
  out    $12,  r16
  rjmp  Main

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinst du nicht, daß der Siebkondensator vor dem Regler etwas mickrig 
ausgefallen ist?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir den Schaltplan leider nich ´reinziehen, da mein Eagle zu alt 
ist. Könntest Du bitte ein PNG-Bild des Plans exportieren und posten?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ´ne Idee: Watchdog aktiv?

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>.org 0x000
>.org 0x00E
>  rjmp   INIT           ; Reset Handler
> ;------------------------------------------------------
> ;     ISR VECTORS
> ;------------------------------------------------------
>.org ACIaddr

>INIT:

Das ist murks. Wenn Du schon Vektoren verwendest, dann lege eine 
komplette Vektoren-Tabelle an und lasse die nicht verwendeten Vektoren 
nach RESET springen. Bei RESET läuft dann das eigentliche Programm los. 
Die Tabelle beginnt dann mit .org 0x0000 und nach dem letzen Vektor 
folgt dann die RESET-Marke. Das erspart weitere .org Direktiven und 
fragmentiert die spätere *.hex-Datei nicht unnötig.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Travel Rec.:

Der Siebkondensator vor dem Spannungsregler ist 10 µF groß und davor 
kommt noch ein Brückengleichrichter...

Da er keine Interrupts freigibt, kann er auf die Vektortabelle ganz 
verzichten - der rjmp INIT am Anfang ist zwar überflüssig, aber er tut 
nicht weh.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe etwas neues festgestellt:
Wenn ich die Spannungsversorgung über mein STK500 laufen lasse flimmert 
die Led nicht.
Wenn ich die Spannungsversorgung über mein Netzteil laufen lasse 
flimmert die Led.

Kann das an dem Siebkondensator liegen, ich verstehe das Prinzip nicht

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist ein Watchdog? Ich hab ihn noch nie verwendet.

Autor: YS-500 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was ist ein Watchdog?
Den gibt es in jedem Tierheim.

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Kann das an dem Siebkondensator liegen, ich verstehe das Prinzip nicht

Wenn das Netzteil schwach auf der Brust ist und der Siebelko nicht 
wenigstens 470µF hat, bricht bei jeder Halbwelle der 
Eingangswechselspannung die Spannung ein. Das kann dazu führen, daß der 
Controller jedes Mal einen RESET ausführt.

Autor: txg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wird der atmel noch für weitere funktionen eingesetzt? ansonsten ist das 
meines erachtens overkill, ein temperaturschalter mit hysterese lässt 
sich auch wunderbar mit einem simplen opv und ein paar widerständen 
zusammenfrickeln.

mfg,
lukas

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keine Frage. Und?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lernen ist immer Overkill :-)

Autor: txg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...ich wollte ja nur eine einfachere alternative aufzeigen. dass diese 
dem threadersteller bewusst ist kann ich ja nicht riechen.

mfg,
lukas

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
txg wrote:
> ...ich wollte ja nur eine einfachere alternative aufzeigen. dass diese
> dem threadersteller bewusst ist kann ich ja nicht riechen.

Riechen nicht - sich denken tuts völlig. Schließlich hat jeder mal 
klein angefangen.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten. Ich such mal nen Kondensator der hinkommt. 
Wenns fertig ist meld ich mich nochmal;)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
;D es war der blöde Kondensator

Vielen Dank uhu und travelrec, wünsch euch frohe Weihnachten ;)

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan wrote:
> Was ist ein Watchdog? Ich hab ihn noch nie verwendet.

Das ist sowas wie das Toter-Mann-Pedal bei der Bahn: Ein Timer, der 
innerhalb einer vorgegebenen Zeit zurückgesetzt werden muß. Passiert das 
nicht, erzeugt der Watchdog einen Reset.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan wrote:
> Ich hab mal was ausprobiert:
> wenn ich eine Led anschließe, dann flackert diese

Die LED zieht Deine VCC runter (wenn sie schwach genug ist) und der MC 
geht in Reset.
Bei starker VCC geht entweder die LED, der MC oder beide flöten.


> wenn ich eine Led mit Widerstand (470ohm), dann flackert diese nicht

Boa ey, kaum macht mans richtig, funktionierts sogar.

LEDs betreibt man grundsätzlich immer mit Widerstand!


Peter

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nich so streng, Peter ;-) Jetzt hatter ja erstmal ´ne funktionierende 
Spannungsquelle.

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.