Forum: Mikrocontroller und Digitale Elektronik Programmbeispiel Temepraturanzeige...


von Björn Wekerle (Gast)


Lesenswert?

Hallo Ihr Bastler;-)

Ich hatte vor zwei tagen ein Problem damit, meinen ATMEGA 163 zu 
programmieren...jetzt klappts (die Kabelbelegung, die unter 
mikrocontroller.net angegeben war, stimmte nicht mit Ponyprg überein).

Hab gestern das LCD-Temperaturprogramm laufen lassen: da ich ein 20x4 
Display am AVR-CRTL habe und eine ATMEGA 163 drauf, bin ich um ein paar 
Modifikationen m´nicht herum gekommen (include mega163.....diplay 
rows-anzahl....)

ABER: die Temperatur wird nur mit -999. °C angezeigt...woher kann das 
kommen? Muss ich eventuell noch am assemblercode etwas verändern???


Danke für die Hilfe und Grüße aus Stuttgart

Björn

von Björn Wekerle (Gast)


Lesenswert?

Hat nimenad eine Idee, wqarum die Anzeige nur -999. anzeigt???

von Peter D. (peda)


Lesenswert?

In den Kopf schauen kann Dir keiner !

Da must Du schon den Code posten, damit jemand was finden kann (z.B.
als Dateianhang).


Peter

von Björn Wekerle (Gast)


Lesenswert?

Hier nun noch der CODE:
-------------------------------------

#include <mega163.h>
#include <delay.h>
#include <stdio.h>

// 1 Wire Bus functions
#asm
   .equ __w1_port=0x12
   .equ __w1_bit=4
#endasm
#include <1wire.h>

// DS1820 Temperature Sensor functions
#include <ds1820.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15
#endasm
#include <lcd.h>

// Declare your global variables here

void main(void)
{
// Declare your local variables here
char text[16];
// Input/Output Ports initialization
// Port A
PORTA=0x00;
DDRA=0x00;

// Port B
PORTB=0x00;
DDRB=0x00;

// Port C
PORTC=0x00;
DDRC=0x00;

// Port D
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Output Compare
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Output Compare
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Output Compare
// OC2 output: Disconnected
TCCR2=0x00;
ASSR=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;

// 1 Wire Bus initialization
w1_init();

// LCD module initialization
lcd_init(20);
lcd_putsf("Temperaturanzeige");

while (1)
      {
      int temp;
      temp = ds1820_temperature_10(NULL);
       lcd_gotoxy(0,1);
       sprintf(text, "Temp:%i.%c \xDFC",temp/10,temp%10+0x30 );
       lcd_puts(text);
      };
}
------------------------------------------

von Peter D. (peda)


Lesenswert?

Das ist ja nur das Rahmenprogramm, da passiert ja nichts.
Wichtig ist, was in dieser Funktion erfolgt:

temp = ds1820_temperature_10(NULL);

Da muß es doch eine Doku dazu geben, die Du gründlich durcharbeiten
mußt.


Ich halte aber nichts davon, solche komplexen Programme blind zu
übernehmen. Die Erfolgsaussichten sind eher gering und man lernt dabei
auch nichts.
Entweder man versucht da erst durchzusteigen oder man schreibt sich
anhand des DS1820-Datenblattes seine eigenen Routinen.


Peter

von emil (Gast)


Lesenswert?

hi björn,

damit muss es klappen; nächstes mal beispiel besser studieren ;))

#include <mega163.h>
#include <stdio.h>
#include <ds1820.h>
#include <1wire.h>
#include <lcd.h>

#asm
   .equ __w1_port=0x12
   .equ __w1_bit=4
   .equ __lcd_port=0x15
#endasm

char text[16];
char rom_codes[9];

//falls du mehrere sens. hast, wird es dann
//rom_codes[n,9], wo n deren anzahl ist;


void main(void)

{
w1_init();
w1_search(0xf0,rom_codes);

lcd_init(20);
lcd_clear();
lcd_putsf("Temp., °C:");

while (1)
      {
      int temp;
      temp = ds1820_temperature_10(&rom_codes[0]);
      sprintf(text,"%2i.%-u",temp/10,abs(temp%10));

      lcd_gotoxy(0,1);
      lcd_puts(text);
      };
}

von emil (Gast)


Lesenswert?

btw, text[16] ist natürlich viel zu breit, text[5] reicht schon

von emil (Gast)


Lesenswert?

sorry, natürlich muss man noch
#include<math.h>
dazu schreiben, wegen der abs()-funktion.

von Peter D. (peda)


Lesenswert?

Wie es aussieht, ist es anscheinend doch jemandem gelungen, anhand
Deines Programmfragments zu erkennen wovon Du eigentlich sprichst.

Ich weiß immer noch nicht mehr, als das es um den DS1820 geht.


Du kannst in Zukunft ruhig etwas über die verwendete Hardware und
Software (Hersteller, Bezeichnung, Link) verlauten lassen.

Solche unkonkreten Aussagen, wie "das LCD-Temperaturprogramm" und
"am AVR-CRTL" ergeben bei Google nämlich keinen einzigen Treffer.


Peter

von Björn Wekerle (Gast)


Lesenswert?

Das Programm hat auch nicht mehr als

Temp., -C:
-999.9

auf das Display gebracht:-(

Eventuell aufgrund dieser Anzeige einen Tip????

von emil (Gast)


Lesenswert?

die funktion:

 ds1820_temperature_10(unsigned char *addr);

gibt den wert "-9999" zurück, wenn kein ds1820 gefunden wird;

hardware überprüfen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.