Forum: Projekte & Code Tempertur/Feuchte Display/Logger mit ATMega128 / SHT75 / SD-Karte


von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

Hallo

Ich poste hier mal den Code zu meinem Temperatur/Feuchte Logger
mit 7-Segment Display.

Hardware:
- ATMega128 Board von Futurlec (ET-BASE MEGA128)
- Sensirion SHT75 Temperatur/Feuchte Sensor
- 4 x Kingsbright SC08-11SRWA 7-Segment LED's über einen MAX7219
- 5V SD-Card Modul von www.avrcard.com

Der SHT75 hängt an PORTC
  PC7 = CLOCK
  PC6 = DATA (mit 10kohm Pullup, Kabellänge 20cm)

Der MAX7219 hängt an PORTA
  PA7 = CLK
  PA6 = DIN
  PA5 = LOAD

Anbindung der 4 7-Segment Anzeigen nach Datenblatt des MAX7219.

An PA4 hängt ein Drucktaster mit 10kohm Pullup

Das SD/MMC Modul hängt an PORTB
  PB3 = SI
  PB2 = SO
  PB1 = SCK
  PB0 = SS

Leider hat das SD/MMC Modul die CardDetection und Lock Signale nicht
rausgeführt.

Nach dem PowerOn wird im Wechsel die Temperatur und Feuchte auf dem 
Display dargestellt. Nach dem Druck auf den Taster wird auf der 
(hoffentlich) eingelegten SD Karte (FAT16) das File "logger.csv" 
gesucht. Wenn vorhanden wird das File geöffnet und auf das Ende 
positioniert. Wenn nicht, wird das File neu erstellt. Nun wird im 
Minutentakt Temperatur, Feuchte und Taupunkt mit Strichpunkt (;) 
getrennt in das File geschrieben, solange bis der Taster erneut gedrückt 
wird.

File Inhalt:

Temperatur (Celsius); Feuchte (%); Taupunkt (Celsius)
+24.53;31.92;+6.73
+24.58;32.25;+6.92
.
.

Probleme:
- Zuerst war der Sensor zu nahe am Board. Resultat: 2-3 Grad
  zu hohe Temperatur.
- Die Verbindung PORTB --> SD-Modul war zu lange (10cm), desshalb
  keine/oder nur sporadische Verbindung zu SD-Karte. Jetzt sind es
  2-3cm und es läuft.

Ich hoffe das Ganze dient einem Anfänger wie ich es war (bin), als
Vorlage um rasch etwas Lauffähiges auf die Beine zu kriegen.

Ich weiss, der ATMega128 ist völliger Overkill hier, und der Code ist
nicht auf Speicherverbrauch optimiert (sprintf usw), aber bei meinem
Zeitbudget ist im Moment nicht mehr drin. Ich bin schon froh wenn das
Zeug's einigermassen stabil läuft ;-)

Meine nächste Hürde wird Eagle sein, um endlich ein Board nach meinen
Wünschen bauen zu können ;-) Dann gibt's auch endlich einen Schaltplan
zu meinen Projekten...

Daniel

von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

...und hier noch ein Bild dazu

von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

...oder auch zwei

von Denny (Gast)


Lesenswert?

Hi Daniel,

ein wirklich sehr schönes Projekt !!!

Ich sehe im Schaltplan vom MAX7219 das noch zusätzlich der MAX394 
verwendet wird.
Auf den Fotos von dir erkenne ich nur den MAX7219, daher denke ich das 
du die Ansteuerung ohne den zusätzlichen Baustein MAX394 bewerkstelligt 
hast

Hast du einen Plan oder Skizze wie man die Segmente richtig verdrahtet ?

Im allgemeinen sind Segmente und die Ansteuerung für mich noch absolutes 
Neuland und ich würde gern mit Segmenten arbeiten und dein Projekt als 
Grundlage benutzen.

Ich wäre dir sehr Dankbar wenn du mir in Sachen Schaltplan ein wenig 
weiter helfen könntest.

Grüße
Denny

von Daniel B. (dbuergin)


Lesenswert?

Hi Denny

Danke für die Blumen. Leider habe ich keinen gezeichneten Schaltplan, 
die Verkabelung ist aber wirklich easy.

Nein, den MAX394 brauchst Du nicht. Ich habe den Setup nach der 
Zeichnung auf Seite 1 im Datasheet gemacht:

http://datasheets.maxim-ic.com/en/ds/MAX7219-MAX7221.pdf

und unter anderem nach dieser Zeichnung:

http://www.mikrocontroller.net/attachment/38085/uhr_ucnet.png

Das ganze ist einfach ein bisschen ein Gefummel, wenn Du das (wie ich) 
mit Lackdraht auf einer Lochrasterplatine verdrahtest.
Am besten Du zeichnest es Dir auf einem Blatt Papier auf, so wie Du es 
dann beim Verdrahten vor Dir hast, also den MAX7219 von unten und die 
7-Segement Displays ebenfalls von unten. Dann fängst Du z.B. beim Port 
SEG A auf dem MAX7219 an und verbindest diesen Port mit dem Port 1 auf 
der 1. 7-Segment Anzeige, dann von dort auf den Port 1 der 2. 
Siebensegment Anzeige und so weiter bis zur letzten. Dann das gleiche 
mit dem Port SEG B usw.
Oder anders gesagt, Du vebindest die gleichen Segmente seriell mit 
einander und hängst sie an den entsprechenden Port des MAX7219.

Achtung: ev. weichen die Ports auf deinen 7-Segment Anzeigen von den 
meinigen ab. Im Datasheet deiner Anzeige findest du aber garantiert den 
Port, zu dem jewiligen Segment auf der Anzeige.

Nun nimmst du einen der Anoden/Kathoden Ports der ersten 7-Segment 
Anzeige (es hat meistens mehrere pro Anzeige) und verbindest diesen Port 
mit dem Port DIG 0 auf dem MAX7219. Die zweite 7-Segment Anzeige hängst 
Du auf Port DIG 1 usw.

That's it ;-)

Nun noch:
 - Die drei Ports des MAX7219 (DIN, LOAD und CLK) auf deinen 
Mikroprocessor verkabeln
 - Den 9.53kohm (10kohm bei mir) nicht vergessen, Port 19 --> 18
 - Die beiden Ports 4 und 9 auf GND legen
 - 5V an Port 19 und fertig.

Daniel

von Denny (Gast)


Lesenswert?

Hi Daniel,

vielen Dank für deine ausführliche Beschreibung.

Mit dem Datenblatt, dem Schaltplan und deiner Beschreibung habe ich das 
ganze jetzt verstanden und denke das ich das wunderbar umsetzen kann.

Ich werde mir die benötigten Teile bestellen und sobald ich 
Erfolgserlebnisse habe, mich hier nochmal melden.

Grüße
Denny

von Denny (Gast)


Angehängte Dateien:

Lesenswert?

Hi Daniel,

die Schaltung mit 8 Segmenten habe ich auf einem Steckboard aufgebaut. 
Funktioniert super !!!
Das ganze hat mir so gut gefallen das ich bereits eine Platine erstellt 
habe. (anbei mal ein foto)

Jetzt habe ich noch eine Frage zum Code:

Ich würde gern einen weiteren MAX7219 Baustein per Cascading an die 
Schaltung anschließen.

Funktioniert dein Code um zb. mittels "max7219_Write(9,.......);" auf 
ein 9. Segment eines weiteren MAX7219 Bausteins zu schreiben, oder muss 
der Code angepasst werden ?  Habe im Datenblatt was von NOP gelesen.

Gruß
Denny

von Denny (Gast)


Lesenswert?

Hallo nochmal,

das was ich im vorherigen Beitrag geschrieben hatte ist natürlich 
Quatsch.

Um einen weiteren MAX7219 der am DOUT des ersten MAX angeschlossen ist
richtig anzusprechen, muss ein No-Op 0x00 (No Operation) Command 
gesendet werden damit die Ausgaben nicht auf beiden MAX gleichzeitig 
angezeigt werden, was jetzt der Fall ist.

Dafür habe ich in der max7219.h folgendes eingetragen:
1
#define REG_NO_OP     0x00

Jetzt habe ich in der main.c versucht mittels
1
max7219_Write_cmd(REG_NO_OP, 0x00);
gefolgt von
1
max7219_Write(1,'-');

ein " - " ausschließlich auf das erste Segment des zweiten MAX zu 
bekommen,
da der No-Op Command dem ersten MAX7219 sagt das die Daten nicht 
ausgeführt werden sollen (sondern nur durchgereicht), aber das " - " 
erscheint auf beiden MAX7219 an jeweils SEG1.


Habe noch einige andere Sachen probiert, aber leider ohne Fortschritte.
Nach vielen Recherchen im Internet konnte ich bis jetzt keine für mich 
wirklich verständliche Info finden um 2 x MAX7219 getrennt durch den 
No-Op Command anzusprechen.

Ich wäre wirklich sehr dankbar wenn mir da jemand weiter helfen könnte.

Freundliche Grüße
Denny

von Daniel B. (dbuergin)


Lesenswert?

Hey Denny,

Sieht ja super aus, dein Board, irgend wann muss ich den Schritt zu
selber geätzten Board's doch noch machen.

Ich kann Dir am Wochenende Code-Teile für zwei cascaded MAX7219 
hochladen.
Bin gerade dabei mir einen Wecker auf Basis des AVR-Webmoduls von
Ulrich Radig und zwei MAX7219 zu bauen.

Gruss

Daniel

von Denny (Gast)


Lesenswert?

Hey Daniel,

ich benutze als Basis die ETH_M32_EX Sourcen von U.Radig
auf einem AVR-NET-IO Board von Pollin.

Den Code des MAX7219 von dir habe ich dort eingebaut.
Das ganze funktioniert einfach super.

Die aktuelle NTP Zeit und die Temperaturen meiner DS1820 Dallas Chips 
werden zurzeit im  Wechsel auf einem MAX7219 angezeigt und zudem sind 
die Werte über die Weboberfläche weltweit über das Internet abrufbar.

Wenn du mir die Code-Teile für 2 MAX zur Verfügung stellst,
wäre ich dir dafür echt sehr dankbar.

Ich habe vor, Zeit und Temperaturen seperat auf jeweils einem MAX7219 
anzuzeigen.


Gruß Denny

von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

Ok, hier ist der Code. Grundsätzlich funktioniert er folgendermassen.

Es gibt den globalen, 8-stelligen Buffer "disp_memory[]", dort legst
Du den String ab, den Du auf den 8-Ziffern sehen willst.
Dannach rufst Du "max7219_Display()" auf mit dem entsprechenden
MAX7219 Chip, auf den Du schreiben willst. Im Moment werden 2 Chips
unterstützt, also 1 oder 2.

Der Trick bei den MAX7219 ist der folgende. Du musst immer sowiele
Bytes durchschieben, wie Du MAX7219 in einer Reihe hintereinander
hast. Bei zwei Chips also 4 Bytes ( Adr, Data, Adr, Data ).
Die Bytes des MAX7219, auf den Du schreiben willst sind gefüllt,
die anderen sind auf 0x00. LOAD Leitung pulsen, so dass alle Chips
die Daten übernehmen.

Hoffe Du kommst damit klar, sonst melde Dich

Daniel

von Denny (Gast)


Lesenswert?

Hi,

mein Ansatz bezüglich des No-Op Command war also völlig falsch.

Wusste bis eben nicht das man die Daten durchschieben muss,
was bei einem Schieberegister aber irgendwo klar sein sollte...
Aber wie es nunmal so ist:
(man sieht den wald vor lauter bäumen nicht ;-)

Jetzt ist mir natürlich einiges klar geworden..

Vielen Dank für deine Unterstützung und deinen geposteten Code,
der übrigens exzellent funktioniert !!

Meine Uhrzeit und die Temperaturen werden jetzt wie gewünscht
auf zwei MAX7219 seperat angezeigt.


Freundliche Grüße
Denny

von Denny (Gast)


Lesenswert?

Eine Frage habe ich noch:

Wie setze ich im Aufruf bei " disp_memory[0] = dt.timestr[0]; " den 
Dezimalpunkt ??

Habe versucht mittels " disp_memory[0] = dt.timestr[0] | 0x07; " den 
Punkt mit einzufügen, funktionierte nur leider nicht.

In den ersten geposteten Sourcen von dir konnte man mittels 
"max7219_Write" und "max7219_WriteDP" bestimmen ob der Dezimalpunkt mit 
angezeigt werden soll oder nicht.


Gruß
Denny

von Daniel B. (dbuergin)


Lesenswert?

Versuch mal:

disp_memory[0] = dt.timestr[0] | 0x80;

von Denny (Gast)


Lesenswert?

Hab es jetzt so gelöst:
1
disp_memory[0] = dt.timestr[0] | (1<<DPBIT);

Wobei DPBIT  ja als " #define DPBIT 0x07 " definiert ist.

Aber mit dem " | (1<<DPBIT) " funktioniert es jetzt.


Danke nochmal

von Daniel B. (dbuergin)


Lesenswert?

Freut mich dass es nun klappt.

Jetzt hätte ich eine Frage/Bitte. Hast Du deine Display Platine mit
Eagle gemacht ? Wenn ja, könntest Du mir die Eagle Files dazu
zukommen lassen ? Ich brauche irgend einen Anfang um mich mit Eagle
zu beschäftigen.
Bin gerade dabei meine Wecker-Displayplatine mit 12 Led's von Hand zu
verdraten, und das wird langsam zum Alptraum....

Besten Dank

Daniel

von Denny (Gast)


Angehängte Dateien:

Lesenswert?

Hey,

hier anbei die Eagle-Files

Gruß
Denny

von Denny (Gast)


Angehängte Dateien:

Lesenswert?

Hi Daniel,

als weiteres Projekt auf der Todo Liste stand immer die Anbindung
von Speicherkarten an den Atmel.

Dein Quellcode der für mich mitterweile sehr verständlich ist,
beinhaltet bereits die Anbindung einer SD Karte.
Das wollte ich nun gern mal ausprobieren und bin völlig begeistert
von dem Temperatur Logger. (anbei mal ein foto vom aufbau)

Ich habe den Quellcode um die Anbindung von 1-Wire Dallas DS1820 
Temperaturmodule erweitert und dafür vorläufig
die SHT75 Routinen auskommentiert.

Das ganze funktoniert einwandfrei und sehr stabil.

Gruß
Denny

von Ralf K. (ralf82k)


Lesenswert?

Hallo Daniel,

ich hatte mir damals deinen Code wegen dem SHT75 kopiert und damit 
gearbeitet. Allerdings ist mir nun aufgefallen Das der SHT75 ca. 8% 
zuviel angezeigt hat (gemessen gegenüber ein 2% genauen Analogsensor). 
Nach durchsicht des Quellcodes war der Fehler auch schnell gefunden.

Du schriebst:
RHlinear = -4.0 + 0.0405 * ((double) RH) - 0.0000028 * ((double) RH)
Es hätte aber so lauten müssen:
RHlinear = -4.0 + 0.0405 * ((double) RH) - 0.0000028 * ((double) RH*RH)

Vergessen den RH Wert zu quadrieren. Machte gut 6,5% aus. Jetzt sind 
alle werte in Ordnung.

Gruß Ralf

von Denny S. (nightstorm99)


Lesenswert?

Hallo!

Ich benutze auch die SHT75 LIB und ich hab ein Problem/Frage.

Ich lasse jetzt alle Minute die Temperatur in der Hauptschleife messen, 
aber das Programm bleibt dann immer für die Zeit (3sek) stehen und macht 
nix anderes.

Kann man das ganze auch irgendwie eleganter lösen?
Im Timerintteruppt aufrufen ist ja sicher auch nicht gerade die Lösung 
oder?


Vielen Dank
Gruß Denny

von Ralf K. (ralf82k)


Lesenswert?

Hallo,

also 3 Sekunden sollte das aber keinesfalls dauern. Die reine 
Wandlungszeit beträgt 400ms. Und die Berechnung baucht vll. auch noch 
mal 1-2ms.

Ich löse im Timerinterrupt immer eine Feuchtemessung aus. In der 
Superloop prüfe ich dann nur den Wert der Datenleitung. Wenn diese "0" 
wird, ist die Wandlung fertig und kann ausgelesen werden. Danach noch 
die Temperaturmessung starten und wieder in der Superloop warten bis 
fertig.

PS: Die Taupunktberechnung hast du nicht zufällig noch drin?

Gruß Ralf

von Denny S. (nightstorm99)


Lesenswert?

Hallo!

@Ralf K.
Okay nun bin schon etwas schlauer, aber wie programmiere ich das?
Vielleicht könntest du ein wenig Code dazu posten!?!

Ja die Taupunktberechnung hab ich noch drin, sollte man diese lieber 
entfernen?

Danke und Gruß Denny

von Ralf K. (ralf82k)


Angehängte Dateien:

Lesenswert?

Hi, Das kommt natürlich drauf an ob du die brauchst. Wenn der Taupunkt 
für dich nicht relevant ist lass ihn weg (kann mir aber nicht vorstellen 
das dieser über 2 sekunden rechnet). Mein µC lief mit ca. 14Mhz und das 
ging in ner ms oder so.

Ich bin leider nicht der Profi C Programmierer. Hab erst vor 6 Monaten 
damit angefangen. habe das für dich mal so in etwa zusammen geschrieben 
wie ich es habe. Kann sein das jetzt noch kleine Fehler drinn sind, da 
ich es aus meinem Programm rauskopiert habe...
Man könnte das SHT Reset und SHT Start Temp auch noch aus der Interrupt 
Routine rausnehmen mit einem Merker.

Gruß Ralf
1
C-Code
2
3
unsigned char SHT_mode=0;
4
double Feuchte=0,Temperatur=0;
5
6
  ISR(TIMER1_COMPA_vect)
7
  {
8
  ShtReset();
9
  Sht_start_Temp();
10
  }
11
12
int main (void) 
13
{
14
OCR1A=XTAL/1024*1; //Wird jede sekunde ausgeführt
15
TCCR1A=0x00;
16
TCCR1B=0x0D; //  FCPU/1024
17
TIMSK=0x10;
18
19
// Begin der Superloop
20
while(1)
21
{
22
    if (Sht_ready()==1)
23
    {
24
      if (SHT_mode==1)
25
      {
26
      Feuchte=Sht_calc_humi(Sht_read(),Temperatur);
27
      if (Feuchte > 99.99) Feuchte = 99.99;
28
      if (Feuchte < 0.0) Feuchte = 0.00;
29
      SHT_mode=0;
30
      }
31
      else //(SHT_mode==0)
32
      {
33
      Temperatur=Sht_calc_temp(Sht_read());
34
      Sht_start_Humi();
35
      SHT_mode=1;
36
      }
37
    }
38
39
// Was anderes machen ......
40
// Werte können z.B. An UART gesendet werden
41
42
43
}
44
45
return 0;
46
}

von Daniel B. (dbuergin)


Lesenswert?

Hallo Ralf

Besten Dank für die Info, werde es korrigieren.

Gruss

Daniel

Ralf K. schrieb:
> Hallo Daniel,
>
> ich hatte mir damals deinen Code wegen dem SHT75 kopiert und damit
> gearbeitet. Allerdings ist mir nun aufgefallen Das der SHT75 ca. 8%
> zuviel angezeigt hat (gemessen gegenüber ein 2% genauen Analogsensor).
> Nach durchsicht des Quellcodes war der Fehler auch schnell gefunden.
>
> Du schriebst:
> RHlinear = -4.0 + 0.0405 * ((double) RH) - 0.0000028 * ((double) RH)
> Es hätte aber so lauten müssen:
> RHlinear = -4.0 + 0.0405 * ((double) RH) - 0.0000028 * ((double) RH*RH)
>
> Vergessen den RH Wert zu quadrieren. Machte gut 6,5% aus. Jetzt sind
> alle werte in Ordnung.
>
> Gruß Ralf

von Denny (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Daniel,

nach langer Zeit melde ich mich zurück und habe bezüglich der Sourcen
mit der Ansteuerung von 2 MAX7219 Bausteinen nochmal eine Frage.

Ich möchte gern einen weiteren, also 3.MAX Baustein ansteuern
und habe damit so meine Probleme.

Der Originalcode von dir aus der max7219.c
1
void max7219_Write (unsigned int max, unsigned char address, unsigned char data)
2
{
3
  if (max == 1)
4
  {
5
    // Daten fuer den zweiten MAX7219
6
    max7219_WriteByte(0x0);
7
    max7219_WriteByte(0x0);
8
    // Daten fuer den ersten MAX7219
9
    max7219_WriteByte(address);
10
    max7219_WriteByte(data);
11
  }
12
  else
13
  {
14
    // Daten fuer den zweiten MAX7219
15
    max7219_WriteByte(address);
16
    max7219_WriteByte(data);
17
    // Daten fuer den ersten MAX7219
18
    max7219_WriteByte(0x0);
19
    max7219_WriteByte(0x0);
20
  }
21
22
  // Nun die LOAD Line pulsen, damit uebernehmen die MAX7219 die Daten
23
24
  MAX7219_PORT |= (1<<MAX7219_PORT_LOAD);
25
  MAX7219_PORT &= ~(1<<MAX7219_PORT_LOAD);
26
}

Wie kann ich diese Ansteuerung so erweiteren das ich einen 3.Baustein 
ansteuern kann, meine Versuche liefen bisher ins leere.

Ich wäre sehr dankbar, wenn du mir nochmal unter die Arme greifen 
könntest.

Grüße
Denny

P.S.: Konntest du mit den Eagle-Files etwas anfangen?!

von Daniel B. (dbuergin)


Angehängte Dateien:

Lesenswert?

Hallo Denny

Ich versuche es mal, habe aber leider keinen zweiten und dritten Chip
zum testen, desshalb übernehme ich keine Garantie.
Ich nehme mal an, Du willst den dritten MAX7219 an die zwei ersten
hängen oder ? Wenn nicht, musst Du natürlich eine eigene
max7219_WriteByte () Routine schreiben, welche die PIN's bedient,
an welchen der dritte Chip hängt. Ansonsten kannst Du es mit
folgendem Code versuchen:
1
void max7219_Write (unsigned int max, unsigned char address, unsigned char data)
2
{
3
  if (max == 1)
4
  {
5
    // Daten fuer den dritten MAX7219
6
    max7219_WriteByte(0x0);
7
    max7219_WriteByte(0x0);
8
    // Daten fuer den zweiten MAX7219
9
    max7219_WriteByte(0x0);
10
    max7219_WriteByte(0x0);
11
    // Daten fuer den ersten MAX7219
12
    max7219_WriteByte(address);
13
    max7219_WriteByte(data);
14
  }
15
  else if (max == 2)
16
  {
17
    // Daten fuer den dritten MAX7219
18
    max7219_WriteByte(0x0);
19
    max7219_WriteByte(0x0);
20
    // Daten fuer den zweiten MAX7219
21
    max7219_WriteByte(address);
22
    max7219_WriteByte(data);
23
    // Daten fuer den ersten MAX7219
24
    max7219_WriteByte(0x0);
25
    max7219_WriteByte(0x0);
26
  }
27
28
  {
29
    // Daten fuer den dritten MAX7219
30
    max7219_WriteByte(address);
31
    max7219_WriteByte(data);
32
    // Daten fuer den zweiten MAX7219
33
    max7219_WriteByte(0x0);
34
    max7219_WriteByte(0x0);
35
    // Daten fuer den ersten MAX7219
36
    max7219_WriteByte(0x0);
37
    max7219_WriteByte(0x0);
38
  }
39
40
  // Nun die LOAD Line pulsen, damit uebernehmen die MAX7219 die Daten
41
42
  MAX7219_PORT |= (1<<MAX7219_PORT_LOAD);
43
  MAX7219_PORT &= ~(1<<MAX7219_PORT_LOAD);
44
}

Wie gesagt, nicht getestet.

Zusätzlich lade ich noch eine neue Version von mir hoch.
Aenderungen:
 - Fehler in Feuchteberechnung korrigiert (siehe weiter oben)
 - Einbau einer "logger.ini" Steuerungsdatei auf der SD-Karte.
   Ueber diese Datei kann der Logging Intervall von 60 - 3600s
   eingestellt werden. Einfach eine Datei mit Namen "logger.ini" mit
   einem nummerischen Wert am Anfang der Datei.

Gruss Daniel

P.S. Bin noch nicht dazu gekommen, eine Platine selber zu ätzen.

von Denny (Gast)


Lesenswert?

Hi Daniel,

du hattest richtig angenommen das ich 3x MAX7219
hintereinander schalten wollte.

Ich habe mir die Ansteuerung bereits umgeschrieben
und kann bestätigen das diese Wunderbar
mit 3 hintereinander geschalteten IC´s läuft.

(Sie ähnelt deinem obigen Code,
nur das ich jeden einzeln per  "max7219_Display( 1/2/3 );"  anspreche)

Das ganze sieht dann so aus:
1
void max7219_Write (unsigned int max, unsigned char address, unsigned char data)
2
{
3
  if (max == 1)
4
  {
5
    // Daten fuer den dritten MAX7219
6
    max7219_WriteByte(0x0);
7
    max7219_WriteByte(0x0);
8
    // Daten fuer den zweiten MAX7219
9
    max7219_WriteByte(0x0);
10
    max7219_WriteByte(0x0);
11
    // Daten fuer den ersten MAX7219
12
    max7219_WriteByte(address);
13
    max7219_WriteByte(data);
14
  }
15
  if (max == 2)
16
  {
17
    // Daten fuer den dritten MAX7219
18
    max7219_WriteByte(0x0);
19
    max7219_WriteByte(0x0);    
20
    // Daten fuer den zweiten MAX7219
21
    max7219_WriteByte(address);
22
    max7219_WriteByte(data);
23
    // Daten fuer den ersten MAX7219
24
    max7219_WriteByte(0x0);
25
    max7219_WriteByte(0x0);
26
  }
27
  if (max == 3)
28
  {
29
    // Daten fuer den dritten MAX7219
30
    max7219_WriteByte(address);
31
    max7219_WriteByte(data);
32
    // Daten fuer den zweiten MAX7219
33
    max7219_WriteByte(0x0);
34
    max7219_WriteByte(0x0);
35
    // Daten fuer den ersten MAX7219
36
    max7219_WriteByte(0x0);
37
    max7219_WriteByte(0x0);
38
  }
39
40
  // Nun die LOAD Line pulsen, damit uebernehmen die MAX7219 die Daten
41
42
  MAX7219_PORT |= (1<<MAX7219_PORT_LOAD);
43
  MAX7219_PORT &= ~(1<<MAX7219_PORT_LOAD);
44
}

Grüße
Denny

von Markus C. (ljmarkus)


Angehängte Dateien:

Lesenswert?

Hallo Daniel...

ich habe heute mal Deinen Code versucht und bekomme über Uart folgende 
meldung:

Temp:  ? Feuchte:  ? Taupunkt:  ? Status: 00 Error: 00<\n><\r>

Meinen Code habe ich mal als ZIP angehängt.

Wo könnte der Fehler sein ? Welche Infos benötigst du noch ?

Danke, Markus

von Daniel B. (dbuergin)


Lesenswert?

Hallo Markus

Den Fehler kann ich leider nicht für Dich suchen ;-)

Hier nur ein paar Tips:
- Stimmt die Verkabelung ?
- Ist das Kabel nicht zu lang ?
- Abschirmung des Kabels nur auf der Processorseite auf Masse
- Keine Flachbandkabel, oder wenn ja nur ein paar Zentimeter.
- Stimmt das Timing in den sht75_.. Routinen ?

Wenn Du etwas im Forum suchst, findest Du diverse Threads über die
SHT Sensoren. Die Dinger sind etwas heikel, was die Kabellänge und
Qualität derselben betrifft. Weiter muss das Timing in den
Routinen zur Abfrage der Sensoren stimmen.
Mit einem ATmega8 habe ich es noch nie probiert. Ev. müssen die Delays
hier angepasst werden.

Hoffe das hilft Dir etwas

Gruss

Daniel

von Markus C. (ljmarkus)


Lesenswert?

Hallo..

das Kabel ist 3cm lang und steckt am STK500.

mich wundert es ja nur etwas, das er ja ansprechbar ist und keine 
Fehlermeldung bekomme.


lg, markus

von Denny S. (nightstorm99)


Lesenswert?

Hallo!

@Markus C.

Schau doch mal in dein Makefile ob die Richtige
"PRINTF_LIB" drin steht, sonst gibs keine Double/Float Werte.
Das war bei mir immer das Problem.

Gruß Denny

von Markus C. (ljmarkus)


Lesenswert?

@Denny,

jo das war es...

Danke dir.

von Franz H. (durl)


Lesenswert?

Hi, habe folgendes Problem:
Ich verwende die sht-bibliotheken aus diesem projekt um einen sht15 über 
einen Atmega8 anzusteuern.

Anfangs hat das super funktioniert. Allerdings nur anfangs. Auf einmal 
bekomme ich für die Temperatur nur noch 216 und für die Luftfeuchtigkeit 
252 zurück. Und die Werte ändern sich auch nicht.

Woran kann das liegen?

Ich dachte zuerst dass der selbst geätzte Print einfach kontaktfehler 
hat. Aber ich hab jetzt schon einen neuen besseren und habe das selbe 
problem wieder. Kurz dazwischen hatte ich einmal annehmbare werte aber 
beim nächsten Verusch war ich wieder bei 216 und 252 :(

Hat jemand eine Idee?

mfg David

von Info (Gast)


Lesenswert?

Unsigned char für negative Werte benutzt?

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Hi Daniel,

ich hätte mal eine kurze Frage. Hat das Board zufällig einen Bootloader 
aufm uC? Ich habe das Hygrometer nachgebaut aber ich bekomme es nicht 
zum Laufen. Die 7-Segmente bleiben dunkel.  Ich habe für meine 
Verhältnisse schon alles versucht (Fusebits, anderer uC.....) Allerdings 
habe ich nicht das Board von Futurlec benutzt. Ist aber trotzdem ein 
Atmega128-16au.

Gruss Stefan

von Daniel B. (dbuergin)


Lesenswert?

Die Boards von Futurlec haben meines Wissens keine Bootloader, und wenn
habe ich ihn nicht genutzt. Ganz normal mit einem AVRISP mkII und
"avrdude" geflashed.

Die FUSES rühre ich normalerweise nicht an.

Wie kommst Du da auf einen Bootloader als Ursache ?

Was hast Du bis jetzt alles ausgeschlossen ?
- Kurzschlüsse bei eigenem Board ?
- Kannst Du mit einer LED "wackeln", diese also zum Blinken bringen ?

Oder anders gefragt, was geht, und was geht nicht ?

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Hi Daniel, das ging aber schnell :-) .....danke...

Was nicht geht ist meiner Meinung nach bis jetzt noch alles nicht. Die 
Displays zeigen nichts an (bleiben dunkel) und nachmessen kann ich nicht 
viel, da ich kein Oszi habe. Einzig auf den uC komme ich.

Ähhm wie ich auf den Bootloader komme ist ne gute Frage. Ich habe mal 
das Board von Futurlec gesucht und meine irgendwas mit Bootloader 
gesehen zu haben. Ich experimentiere schon seit einer Woche an der 
Platine rum und komme leider auf keinen grünen Zweig.

Ich muss dazu sagen, dass ich mit c noch nie irgendetwas zu tun hatte. 
Nachdem das fertige Hex-File ja schon bereit stand und es eigentlich 
"nur" Lötarbeiten waren (Max7219/Atmega128 und die 4 7-Segmentanzeigen) 
und ich finde die Idee mit den 7-Segment richtig cool.

Einen Lötfehler schließe ich aus, nachdem ich alles schon gefühlte 100 
mal durchgemessen habe.

Ich habe auch kein SD/MMC Modul und keinen Drucktaster angeschlossen, da 
mich nur die momentane Temperatur/Feuchtigkeit interessiert. Vielleicht 
gehts deswegen nicht. Bin der Meinung, dass das nicht zwingend 
erforderlich ist. Aber wie gesagt, ich habe leider keine Erfahrung mit 
c.

Ich benutze zum Flashen den Programmer von Diamex Prog-s und AVR v4 
(STK500).

Ich habe WINAVR installiert, um aus den Files ein Hex zu compilieren. 
Beim Compilieren bringt er einen Fehler in Main.c was mit dem UART zu 
tun hat. Aber das Hex funzt ja bei Euch. Sollte dadran auch nicht 
liegen.

Ich habe einen SHT75.

Würdest Du mir bitte die Fusebits verraten? Das könnte eventuell noch 
ein Fehler sein. Wie gesagt, ich habe kein Board von Futurlec.

Noch ne andere Frage, zeigen die Displays auch ohne Sensor irgendetwas 
an? Vielleicht ist ja auch der Sensor hinüber.

Grüße vom Bodensee

von Daniel B. (dbuergin)


Lesenswert?

Die FUSES kann ich Dir leider nicht zeigen, habe kein Equipment für den
AVR zur Hand. Bin vollständig auf Cortex-M4 umgestiegen, und da gibt es
andere Stolpersteine, aber zum Glück keine Fuses mehr ;-)

Ohne C-Kenntnisse und dem richtigen Equipment wird das wohl nichts.

Versuch mal den MAX7219 umzuhängen, sieht so aus, als hätte ich wohl
weiter oben etwas vertauscht:

 DIN auf PA5
 LOAD auf PA6

Und beim SD/MMC Modul stimmt auch noch was nicht:
  PB2 = SI (MOSI)
  PB3 = SO (MISO)

Mehr kann ich Dir leider nicht helfen. Nimm es doch als Einstieg in die
Welt der MC's. Lern C und lies so viel wie möglich hier im Forum.
Oder nimm ein Buch, meine Empfehlung:
"AVR Hardware und C-Programmierung in der Praxis" von Florian Schäffer.

von Stefan B. (sibbl) Benutzerseite


Lesenswert?

Hi Daniel,

vielen vielen Dank für die Infos....

DIN auf PA5 / LOAD auf PA6 wars....jetzt läuft das Ding wie geschmiert 
und zeigt ähnliche Werte wie auf meinem Billigthermometer/-hydrometer 
an.

Zum Anderen habe ich noch das geändert:

RHlinear = -4.0 + 0.0405 * ((double) RH) - 0.0000028 * ((double) RH*RH)

Vielen Dank auch an Ralf.


Das Forum hier ist echt genial.


Gruss Stefan

von Stefan B. (sibbl) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ich habe festgestellt, dass das Thermometer unter 10 Grad auf dem 
Display außer einem "E" und 2 Dezimalpunkte nichtsmehr anzeigt.

Ich habe die "main.c" bißchen angepaßt.

Nun sollte es durchgängig von über 10 Grad bis unter -10 Grad alles 
anzeigen.


Gruss Stefan

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.