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
...und hier noch ein Bild dazu
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
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
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
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
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
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
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
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
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
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
Versuch mal: disp_memory[0] = dt.timestr[0] | 0x80;
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
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
Hey, hier anbei die Eagle-Files Gruß Denny
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
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
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
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
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
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 | }
|
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
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?!
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.
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
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
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
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
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
@Denny, jo das war es... Danke dir.
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
Unsigned char für negative Werte benutzt?
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
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 ?
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.