Hallo, ich versuche schon seit einer Ewigkeit einen DS18S20, der an Pin 13 eines ATmega8 hängt zum laufen zu bringen und die Temperatur auf einem 20*4 Zeichen LCD auszugeben. Ich habe schon verschiedene Programme in C, Bascom und Assembler ausprobiert, doch keines will funktionieren. Entweder ich bekomme 127,5°C oder FFFF... oder 0000... . Ich weiß nicht was ich falsch mache. Ich dachte der Sensor sei kaputt, doch dem ist nicht so, denn wenn ich ihn an einen Raspi anschließe, wird er sofort erkannt. Ich hoffe Ihr könnt mir Weiterhelfen. Danke schon mal im voraus. Mfg Lukas
Dann debugge das Problem systematisch. Zuerst würde ich prüfen, ob überhaupt etwas auf der Datenleitung passiert. Hast du ein Oszilloskop oder einen Logic-Analyzer? Zeige uns den Schaltplan.
tja ich sag mal das wird NICHT am Programm oder der Verdrahtung liegen denn da kann ich kein Fehler entdecken. Pullup dran? richtiger Pin in der SW eingestellt? SearchRom MatchRom SkipRom als Befehl genutzt?
Schaltplan ist im Anhang. Leider habe ich kein Oszi aber es muss was gesendet werden, denn am RaspberryPi wird die Temp ja angezeigt. Pullup ist dran. Richtiger Pin ist auch eingestellt. Ich habe mal ein Bascom Programm angehängt, nur bei dem kommt eine Fehlermeldung. Vielleicht hat es damit was zu tun.
Was ich noch sagen sollte ist, dass was auf dem Dispaly angezeigt wird der schaltplan passt nur im Moment nicht mit der Pinbelegung im Programm zusammen
Lukas L. schrieb: > Schaltplan ist im Anhang. Leider habe ich kein Oszi aber es muss was > gesendet werden, denn am RaspberryPi wird die Temp ja angezeigt. ?? Was hat der Raspi jetzt mit deiner μC Schaltung zu tun ?? > Pullup > ist dran. Richtiger Pin ist auch eingestellt. Ich habe mal ein Bascom > Programm angehängt, nur bei dem kommt eine Fehlermeldung. Vielleicht hat > es damit was zu tun. Sicher, wenn du dein Programm in Zeile 86+87 mal berichtigst, irgendwie hängen da so offene Klammern rum. Sascha
Beitrag "Re: Onewire + DS18x20 Library" Das hier funktioniert und zegt dir auch an, was es an ICs auf dem Bus findet. Damit sollte man was hinkriegen.
@Sascha Weber: Wenn ich die Klammern schließe bekomme ich noch mehr Fehlermeldungen @Falk Brunner: Ok danke ich schau mal ob ich dass hinbekomme
@Falk B. Welches dieser Programme muss ich jetzt compilieren und wo wird es Angezeigt?
@ Lukas L. (avrfreund) >@Falk B. Welches dieser Programme muss ich jetzt compilieren und wo wird >es Angezeigt? Das Projekt ist für den Arduino gemacht, der compiiert das schon richtig, wenn man das .ino File öffnet. Für deinen normalen AVR ohne Arduino-Umgebung muss man es manuell anpassen. Das ist aber schon mehr Arbeit, und ich glaube, daß diese dich bei deinem Wissensstand überfordert.
Ich denke auch, dass es mich überfordern wird ;-) Aber trotzdem vielen Dank ich werde es mal versuchen
Du könntest auch mal den ATMega anhand des Datenblatts beschalten sowie Abblockkondensatoren einbauen. Suche Dir debug-Möglichkeiten, z.B. Ausgabe auf einer seriellen Schnittstelle. Kannst Du auf das LCD senden ohne Sensor? Wie sehen die Rückgabewerte des Sensors aus?
@ Pete K: Ja ich kann ganz normal auf das Display senden. Die Rückwertegabe sieht so aus, wie ich es in meiner Frage erklärt habe also FFFF.... 0000.... 127,5°C.
Schon wieder einer, der keine Kondensatoren verwendet!?! Zu meiner Zeit hat man als ahnungsloser Anfänger erstmal funktionierende geräte zerlegt (manchmal auch zerstört) und sie sich angeschaut. Und da fielen dann stets zahlreiche Kondensatoren auf, deren Funktion nicht gleich offensichtlich war. Dann fragte man jemanden und schon hat man nie wieder Abblockkondensatoren vergessen. Wie lernt man heute Elektronik? Wer bringt euch bei, dass man keine Kondensatoren braucht und das man Dioden parallel schalten kann? Die Datenblätter der Bauteile sind es ganz sicher nicht!
Ich würde mal den R/W Pin vom Display beschalten und R3 richtig anschließen. Ist dein Trimmpoti schon abgebrannt?
@ Stefan Us: Die Grundkenntnisse der Elektronik hat mir Jemand erklärt, der einen Master auf diesem Gebiet gemacht hat. Ich habe selbst Geräte zerlegt, und mir sind da auch Kondensatoren aufgefallen, aber ich habe schon öffters bei MC auf Abblockkondensatoren verzichtet und alles ist gut gelaufen.
@ Lukas L. (avrfreund) >@ Stefan Us: Die Grundkenntnisse der Elektronik hat mir Jemand erklärt, >der einen Master auf diesem Gebiet gemacht hat. Master, soso . . . > Ich habe selbst Geräte >zerlegt, und mir sind da auch Kondensatoren aufgefallen, aber ich habe >schon öffters bei MC auf Abblockkondensatoren verzichtet und alles ist >gut gelaufen. So wie das fahren ohne Sturzhelm bei 300km/h und nasser Fahrbahn. Das KANN funktionieren . . . https://www.mikrocontroller.net/articles/Kondensator#Entkoppelkondensator Mein Tipp. Besog dir einen Arduino Uno, Nano oder ähnlich für kleines Geld und fang damit an, da hast du erstmal SICHER funktionierende Hardware. Und das Projekt läuft auch fast ohne Änderung (Ok, man muss das Datenpin für OneWire anpassen)
Lukas L. schrieb: > aber ich habe > schon öffters bei MC auf Abblockkondensatoren verzichtet und alles ist > gut gelaufen. sagen die bei rot über die Ampel auch immer!
Beitrag "Onewire + DS18x20 Library" Achtung, nicht das Projektarchiv nutzen, das ist veraltet. Aber die Tipps beherzigen!
@ Falk Brunner: Ok werde natürlich alle Tipps beherzigen, die mir hier gegeben wurden, besonders, dass ich mir einen Arduino Uno kaufen werde. Trotzdem vielen dank.
> ich habe schon öffters bei MC auf Abblockkondensatoren verzichtet > und alles ist gut gelaufen. Ich auch - bei kurzen Experimenten auf dem Steckbrett. Aber spätestens, wenn die Schaltung mal nicht tut, was sie soll, prüft man als allererstes die Stromversorgung. Und eine Stromversorgung ohne Abblock-Kondensatoren kann man als fehlerhaft (wenn nicht gar defekt) betrachten. Das sollte der Master wissen. Weiss er sicher auch......oder etwa nicht? Frag ihn mal, würde mich interessieren.
Ich kann ihn mal fragen vielleicht hat er es mir auch gesagt und ich habs ganz einfach vergessen (was ich eher denke).
Also ich hab ihn mal gefragt und er weiß es auch und er hat es mir schon gesagt.... ich hab aber jetzt nen Kerko eingebaut, es hilft aber nichts. Ich werde den Rat von Falk Brunner befolgen und mir einen Arduino Uno kaufen. Trotzdem vielen dank an alle.
Nicht so schnell aufgeben. Mit einem Programm das nicht kompiliert wird,
kannst du kein Ergebnis erwarten.
>Stemp = Scratch( - Scratch(7) 'Interpolation
da weiß man leider nicht was damit gemeint sein könnte - richtig ist es
jedenfalls nicht. Du musst den code ja irgendwo her haben. Nochmal
prüfen, ob du die Zeile richtig kopiert hast. Oder besser auf C
umsteigen. Da sind Funktionen besser nachzuvollziehen.
> ich hab aber jetzt nen Kerko eingebaut, es hilft aber nichts. Lass ihn trotzdem auf jeden Fall drin. Für solche seriellen Datenübertragungen braucht man zur Diagnose eigentlich ein Oszilloskop oder Logic-Analyzer. Hast du leider nicht. Zur Not kann man für niedrige Frequenzen auf die Soundkarte des PC missbrauchen, aber ich schätze, dass diese Option beim DS1820 nicht klappen wird. Dafür sind die High-Bits zu kurz.
@ Grundschüler: Ich werde den Code auf jedenfall nochmal überprüfen. @ Stefan Us: Ich werde mir demnächst einen Arduino Uno kaufen und gleich noch ein Oszi, dass wird schon drin sein. Ich werde auf jedenfall den Kerko drinnen lassen. Schaden kann es ja nicht. Trotzdem vielen dank für eure Antworten, werde die Tipps auf jedenfall beherzigen.
Luk L. schrieb: > @Sascha Weber: Wenn ich die Klammern schließe bekomme ich noch mehr > Fehlermeldungen Dann liegt das einfach daran das das nur die offensichtlichsten Fehler waren und der Compiler das Programm gar nicht weiter prüft/prüfen kann so lange derart syntaktische Fehler vorliegen. Wo ist denn das Programm her? So wird es doch dort sicher nicht gestanden haben. Sascha
http://www.makerconnect.de/index.php?threads/ds18s20.108/#post-32126 Dort findet ihr den Code. Bei ihm lag es nur an der Taktfrequenz.
:
Bearbeitet durch User
Da fehlt aber was: Stemp = Scratch( - Scratch(7) 'Interpolation Stemp = Stemp / Scratch( Da nicht mehr: Stemp = Scratch(8) - Scratch(7) 'Interpolation Stemp = Stemp / Scratch(8) Vervollständige das Programm mal damit, dann müßte es sich auch kompilieren lassen. MfG Paul
@ Paul Baumann: Danke es hat sich nun Compilieren lassen, die Temperatur wird aber immer noch nicht angezeigt. Dass Problem ist wsl. Hardware bedingt. Ich werde mir mal einen neuen Sensor kaufen und testen ob es mit diesem funktioniert. Ich habe auch in anderen Foren gelesen, dass viele einen DS18B20 verwenden. Vielleicht funktioniert es ja mit diesem.
Das Programm gibt "Sensor Fehler" aus, wenn etwas nicht stimmt. Dann kommt nur 255. Ich denke der Sensor ist kaputt.
Luk L. schrieb: > Ich werde mir mal einen neuen Sensor kaufen und testen ob es > mit diesem funktioniert. Ich habe auch in anderen Foren gelesen, dass > viele einen DS18B20 verwenden. Vielleicht funktioniert es ja mit diesem. letztens gab es Berichte hier das gefälschte in Umlauf sind, umgemalte NPN Transistoren also anderen Lieferanten andere Lieferungen testen.
>denn wenn ich ihn an einen Raspi anschließe, wird er sofort >erkannt. >letztens gab es Berichte hier das gefälschte in Umlauf sind, umgemalte >NPN Transistoren Wirklich hilfreiche Antwort;)
holger schrieb: >>denn wenn ich ihn an einen Raspi anschließe, wird er sofort >>erkannt. > >>letztens gab es Berichte hier das gefälschte in Umlauf sind, umgemalte >>NPN Transistoren > > Wirklich hilfreiche Antwort;) OK vergessen, trotzdem vielleicht sinnvoll zu wissen
Joachim B. schrieb: > OK vergessen, trotzdem vielleicht sinnvoll zu wissen Chinesischer Haushaltstip: Aus übriggebliebenen NPN-Transistoren lassen sich durch leichtes Erhitzen und neu Beschriften spielend leicht schmackhafte Temperatursensoren machen. Die Auswertung muß dann allerdings mittels OPV und Analog- eingang eines Kontrollers erfolgen. Dazu empfehlen wir braune Keramikkondensatoren je nach Saison um 100nF Mahlzeit ;-) -Paul-
Bitte schau nochmal nach der Beschaltung des ATMega. Du brauchst keine neue Hardware, wenn es mit dem RasPi klappt. AVCC muss beschaltet werden, AREF mit 100nF gegen GND und AGND mit GND verbunden. Und bitte zeige Deinen realen Aufbau, nicht ein Bild aus dem Internet. Das Programm muss fehlerfrei kompilieren, achte hier auch genau auf die Taktfrequenz und die Fusebits. Zur Kontrolle eine LED an einem Port anbringen und diese mit 1000ms toggeln. Die 1 Sekunde kann man gut abschätzen. Wenn das passt, dann ist die Frequenz ok.
Hier nochmal der Schaltplan, den ich jetzt in Eagle gezeichnet habe. So ist die Schaltung im Moment, funktioniert aber nicht.
Luk L. schrieb: > So > ist die Schaltung im Moment, funktioniert aber nicht. Bist Du sicher, daß der 5 KOhm Widerstand am Temperaturfühler tatsächlich 5 KOhm aufweist? Ich frage deshalb, weil das heute kein gängiger Normwert ist. Ich bin mit 4,7KOhm immer gut hingekommen. MfG Paul
@ Paul B.: Ich habe leider keinen 4,7kOhm R zuhause gehabt aber ich hab eine Parallelschaltung aus zwei 10kOhm Widerstände gemacht.
@ Luk L. (avrfreund) >Hier nochmal der Schaltplan, den ich jetzt in Eagle gezeichnet habe. So >ist die Schaltung im Moment, funktioniert aber nicht. Poste deinen aktuellen Quelltext.
1 | $regfile = "m8def.dat" |
2 | $crystal = 8000000 |
3 | $baud = 9600 |
4 | $hwstack = 64 |
5 | $swstack = 64 |
6 | $framesize = 64 |
7 | |
8 | Config Lcd = 20 * 4a , Chipset = Ks077 |
9 | Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5 |
10 | Initlcd
|
11 | |
12 | Config 1wire = Portd.7 |
13 | |
14 | Const Ds18s20 = &H10 |
15 | |
16 | Const Skiprom = &HCC 'Überspringe Rom Kommandos |
17 | Const Read_rom = &H33 'lese Rom |
18 | Const Convertt = &H44 'Start Temperaturmessung |
19 | Const Read_ram = &HBE 'Lese Scratchpad Ram |
20 | Const Write_ram = &H4E 'Schreibe Scratchpad RAM |
21 | Const Copy_ram = &H48 'Kopiere Scratchpad RAM |
22 | Const Recall_ee = &HB8 'Kopiere EEPROM nach RAM |
23 | Const Read_power = &HB4 'Abfrage Spannung |
24 | |
25 | Dim Family_code As Byte |
26 | Dim Serial_number(6) As Byte 'Sensor Seriennummer |
27 | Dim Crc As Byte 'DS18S20 Crc |
28 | Dim Scratch(9) As Byte 'Scratchpad RAM Kopie |
29 | |
30 | Dim I As Byte |
31 | Dim Temp As Word |
32 | Dim Temp1 As Integer |
33 | Dim Stemp As Single |
34 | |
35 | Do
|
36 | 1wreset |
37 | If Err = 1 Then Lcd "Sensor Fehler" |
38 | Wait 1 |
39 | Cls
|
40 | |
41 | 1wwrite Read_rom 'Lese ROM Kommando |
42 | |
43 | Family_code = 1wread() 'Auslesen ROM Inhalt |
44 | Lcd Family_code |
45 | Wait 5 |
46 | Cls
|
47 | For I = 1 To 6 |
48 | Serial_number(i) = 1wread() |
49 | Next
|
50 | Crc = 1wread() |
51 | |
52 | If Family_code <> Ds18s20 Then Exit Do |
53 | |
54 | 1wwrite Convertt 'starte Temperaturmessung |
55 | |
56 | Wait 2 'warte Temperaturmessung ab |
57 | |
58 | Do
|
59 | Temp = 1wread() |
60 | Loop Until Temp = &HFF 'warte bis Temperaturmessung beendet ist |
61 | |
62 | 1wreset |
63 | If Err = 1 Then Lcd "Sensor Fehler" |
64 | Wait 1 |
65 | Cls
|
66 | |
67 | 1wwrite Skiprom |
68 | 1wwrite Read_ram |
69 | |
70 | For I = 1 To 9 |
71 | Scratch(i) = 1wread() |
72 | Next
|
73 | |
74 | Temp = Scratch(2) |
75 | Shift Temp , Left , 8 |
76 | |
77 | Temp = Temp + Scratch(i) 'Word Format |
78 | Temp1 = Temp 'Integer Format |
79 | Lcd "T=" ; Temp ; "Counts." |
80 | Wait 1 |
81 | Cls
|
82 | Temp1 = Temp1 / 2 |
83 | Lcd "T=" ; Temp1 ; "Grad Celsius" |
84 | Wait 1 |
85 | Cls
|
86 | Stemp = Scratch(8) - Scratch(7) 'Interpolation |
87 | Stemp = Stemp / Scratch(8) |
88 | Stemp = Stemp + Temp1 |
89 | Stemp = Stemp - 0.25 |
90 | Lcd "exakte T=" |
91 | Wait 1 |
92 | Cls
|
93 | Lcd Fusing(stemp , "#.##") |
94 | Wait 1 |
95 | Cls
|
96 | Lcd "Grad Celsius" |
97 | Wait 2 |
98 | Cls
|
99 | |
100 | Loop
|
101 | |
102 | Lcd "Kein Temperatursensor" |
103 | Wait 1 |
104 | Cls
|
105 | |
106 | End
|
Und was passiert, wenn das Programm läuft? Wenn der Sensor gar nicht reagiert, muss gleich am Anfang "Sensor Fehler" ausgegeben werden. Alles in allem ist das nicht so ganz stimmig. Der Start der Temperaturmessung stimmt so nicht, da fehlt ein erneutes reset. Und ein klein wenig mehr Struktur würde dem Programm auch nicht schaden, Stichwort Funktionsaufrufe.
Es wird ja gleich am Anfang "Sensor Fehler" angezeigt wie sie in dem Bild sehen. Danach wird 255 angezeigt. Ich geb langsam auf....
Normalerweise für EINE kann der Ablauf so aussehen reset skip_rom convert_t reset skip_rom read_scratchpad reset Luk L. schrieb: > 1wreset > If Err = 1 Then Lcd "Sensor Fehler" > Wait 1 > Cls da du ja auf eine Rückantwort vom DS wartest und dieser wohl nicht kommt wird der Fehler augegeben
läuft dein AVR auch mit 8MHz? Oder hast du noch die CKDIV8-Fuse drin, das Display würde es nicht stören, das 1Wire Timing schon. Sascha
@ Luk L. (avrfreund) >Es wird ja gleich am Anfang "Sensor Fehler" angezeigt wie sie in dem >Bild sehen. Das bedeutet, daß der Sensor nicht mal auf den Resetpuls reagiert. Da ist grundlegend was faul. Hast du den vielleicht um 180 Grad verdreht eingesteckt? > Danach wird 255 angezeigt. Ich geb langsam auf.... Kleine Korrektur, ich hab mich oben geirrt. Nach dem Auslesen der ID darf kein Reset kommen, um die Temperaturwandlung zu starten. Man sollte aber auch mal die gelesene Seriennummer ausgeben.
@Sascha W.: Wie kann ich nachsehen, ob noch die CKDIV8-Fuse drin sind? @Falk B.: Haben sie zufällig ein Programm, dass Funktioniert und die ID anzeigt wird? @chris: wo muss ich diesen Code hinschrieben. Könnten sie mir vielleicht dir verbesserte Version Schicken?
@ Luk L. (avrfreund) >@Sascha W.: Wie kann ich nachsehen, ob noch die CKDIV8-Fuse drin sind? Lass eine LED oder LCD Ausschrift im 1s Takt blinken. Oder einfach Zahlen im 1s Takt ausgeben. Wenn der Takt nicht stimmt, ist es kein Sekundentakt. >@Falk B.: Haben sie zufällig ein Programm, dass Funktioniert und die ID >anzeigt wird? Schrieb ich das nicht bereits? Beitrag "Re: DS18S20 wird vom ATmega8 nicht gefunden" Ist aber nicht für deine Hardware, muss man anpassen. >@chris: wo muss ich diesen Code hinschrieben. Du hast keine blaßen Schimmer, was du da eigentlich tust, nicht wahr?
:
Bearbeitet durch User
Falk B. schrieb im Beitrag > Du hast keine blaßen Schimmer, was du da eigentlich tust, nicht wahr? Hab ich auch nie behauptet. Ich bin noch ein Anfänger was MC betrifft. Ich dachte, ich könnte schnell ein Programm kopieren und mit diesem einen DS18S20 auszulesen. Dem ist aber nicht so... ich werde mich nochmal besser mit MC und Bascom auseinandersetzen und dann nochmal auf eure Antworten zurück kommen. Trotzdem danke für eure Bemühungen.
Wo kommen die geschweiften Klammern auf dem "Sensor Fehler"-LCD her? Sieht so aus, als würden Teile des Programmcodes auf dem LCD dargestellt und nicht ausgeführt.... Unbedingt das Timing - wie mehrfach vorgeschlagen - überprüfen... Wenn du dich mit Bascom näher beschäftigen willst, steig gleich auf c um. Es ist nicht wesentlich schwieriger und eröffnet ganz andere Möglichkeiten.
Luk L. schrieb: > @chris: wo muss ich diesen Code hinschrieben. Könnten sie mir vielleicht > dir verbesserte Version Schicken? AAAllltteeerrrrr Schau ins Datenblatt da ist das Schema genau so erklärt und es ist nur der grobe Ablauf. Und lass jeglichen Müll nach den Unterroutinen weg. Du arbeitest mit fremden Bibliotheken die bei anderen zu 100% laufen, deine Sekunden dahinter, machen das alles nur unübersichtlich. nur um eine Überprüfung zu haben ob dein Code funktioniert?? Warum tust du das ? Weil du unsicher bist. Ok damit wir mal vorwärts kommen Zusammenfassung 1.Sensor in Ordnung da mit RasPi funktioniert! 2.Sensor in deiner Schaltung kontrollieren ob der richtig rum drin steckt! 3.Taktüberprüfung ? Nur weil du 8Mhz oben angegeben hast muss er nicht unbedingt auf 8 laufen. Auch die Bibliotheken prüfen LCD usw usf 4.Ist der PD 7 auch wirklich der an den der Sensor hängt bzw ist der auch in allen SW's eingetragen ? 5.Damit du mal den PresentsPuls prüfen kannst lass den DS drausen und schließe den PD7 kurz und entferne die Drahtbrücke dann wieder, danach muss der µC weiter machen. Wenn nicht musst du als erstes diesen Fehler finden sprung zurück zu NR.4 Sollte das funktionieren dann kümmer dich erstmal um deine Ausgaberoutine das die auch das richtig anzeigt, im ersten Post scheint dies zu funktionieren. 127,5 ist der Wert wenn kein Sensor dranhängt und oder dort immer 5V drauf sind also kein Kommunikation statt findet. Solltest du mal 85 angezeigt bekommen, wurde die Wandlungzeit nicht abgewartet von mind. 750ms.
Nachtrag Beitrag "DS18S20 - Bascom - Kommstelle auslesen" Beitrag "ATMEGA8 & DS1820 unter Bascom" Beitrag "DS18S20 mit Bascom-AVR" einfach mal durchlesen und wie die Jungs die Programme geschrieben haben vor allem von der Übersicht her. Grundsatz So wenig wie möglich so viel wie nötig!
Für Anfännger ist es äußerst hilfreich, nicht gleich eine komplette Anwendung zu Programmieren, sondern sich Schritt für Schritt heran zu tasten. Ich fange immer mit dem LED-Blinker an, um die grundsätzliche Funktion des Mikrocontrollers und seiner Taktfrequenz zu prüfen. Als nächstes könntest du versuchen, den Temperatursensor zu kontaktieren. Suche die dazu die einfachste Funktion heraus (reset, ID auslesen oder sowas). Dass lese Werte aus und zeige sie in Rohform auf dem Display oder einer seriellen Konsole an. Dann erst beginne mit der Verarbeitung der Messwerte. Wenn man direkt mit einem fertigen programm anfängt, ist das natürlich schwierig umzusetzen. Deswegen würde ich Anfängern auch raten, eben nicht mit fertigen programmen anzufangen - was auch meine Ablehnung des typischen Arduino Entwicklungsstils erklärt.
und vor allem ein Logic Analyzer kaufen, ein Saleae Clone gibt es unter 10Euro, freie Software dazu z.B. sigrok Das hilft einem zur Not auch ohne Oszilloskop.
chris schrieb: > AAAllltteeerrrrr Schau ins Datenblatt da ist das Schema genau so erklärt Tut mir wirklich sehr leid, dass ich mich so dämlich anstelle und danke dass ihr mir helft. > 3.Taktüberprüfung ? Nur weil du 8Mhz oben angegeben hast muss er nicht > unbedingt auf 8 laufen. Auch die Bibliotheken prüfen LCD usw usf Ein Beispielprogramm würde dann so aussehen, wenn ich das jetzt richtig verstanden habe:
1 | $regfile = "m8def.dat" |
2 | $crystal = 8000000 |
3 | |
4 | Config PORTD = Output |
5 | Do
|
6 | PORTD.7 = 1 |
7 | Wait 1 |
8 | PORTD.7 = 0 |
9 | Wait 1 |
10 | Loop
|
@ Stefan Us: Ich werde auf jedenfall nochmal klein anfangen und wie sie sagen, alles der Reihe nach aufbauen. @ Harald: Ich werde mir auf jedenfall so ein Gerät kaufen.
Otto L. schrieb: >> 3.Taktüberprüfung ? Nur weil du 8Mhz oben angegeben hast muss er nicht >> unbedingt auf 8 laufen. Auch die Bibliotheken prüfen LCD usw usf > Ein Beispielprogramm würde dann so aussehen, wenn ich das jetzt richtig > verstanden habe:$regfile = "m8def.dat" > $crystal = 8000000 > > Config PORTD = Output > Do > PORTD.7 = 1 > Wait 1 > PORTD.7 = 0 > Wait 1 > Loop jo und was sagt die blinkende LED kommt das ungefähr hin mit der 1s?
Ich habe hier einen fertigen Bascom-Code, der auch bei mir im Einsatz ist und funktioniert:
1 | '------------------------------------------------------------------------------ |
2 | 'name : display-test.bas |
3 | 'purpose : Test for TC1604A, DS18S20 |
4 | 'micro : Mega328P |
5 | '------------------------------------------------------------------------------ |
6 | |
7 | $regfile = "m328pdef.dat" |
8 | $crystal = 16000000 |
9 | Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 |
10 | Config Lcd = 16 * 4 |
11 | |
12 | $hwstack = 40 |
13 | $swstack = 40 |
14 | $framesize = 60 |
15 | |
16 | Declare Sub Temperatur_aus_ds18b20 |
17 | Declare Sub Temperatur_aus_ds18s20 |
18 | |
19 | Cursor Off |
20 | Cls |
21 | |
22 | Config 1wire = Portb.0 |
23 | |
24 | Dim Rom_code(8) As Byte |
25 | Dim I As Byte |
26 | |
27 | Lcd " ROM-Code-Leser" |
28 | |
29 | Rom_code(1) = 1wsearchfirst() |
30 | Locate 2 , 1 |
31 | If Err = 0 Then |
32 | Lcd "ROM-Code:" |
33 | Locate 3 , 1 |
34 | Lcd "Fam:" ; Hex(rom_code(1)) |
35 | Locate 4 , 1 |
36 | For I = 8 To 1 Step -1 |
37 | Lcd Hex(rom_code(i)); |
38 | Next I |
39 | Else |
40 | Lcd "Kein Slave!" |
41 | End |
42 | End If |
43 | Wait 3 |
44 | |
45 | Dim Scratchpad(9) As Byte |
46 | Dim Wert_aus_ds18x20 As Integer |
47 | Dim Vorkomma As Integer |
48 | Dim Nachkomma As Byte |
49 | Dim Temperatur_single As Single |
50 | Dim Direction As Bit |
51 | |
52 | 1wreset |
53 | 1wwrite &HCC |
54 | 1wwrite &H4E |
55 | 1wwrite &H00 |
56 | 1wwrite &H00 |
57 | 1wwrite &B0111_1111 |
58 | |
59 | Cls |
60 | Do |
61 | 1wreset |
62 | 1wwrite &HCC |
63 | 1wwrite &H44 |
64 | |
65 | Locate 4 , 1 'Progress animation |
66 | For I = 1 To 16 |
67 | If Direction = 0 Then |
68 | Lcd "#" |
69 | Else |
70 | Lcd " " |
71 | End If |
72 | Waitms 63 |
73 | Next I |
74 | Direction = Not Direction |
75 | |
76 | 1wreset |
77 | 1wwrite &HCC |
78 | 1wwrite &HBE |
79 | Scratchpad(1) = 1wread(9) |
80 | |
81 | Locate 2 , 1 |
82 | If Scratchpad(9) = Crc8(scratchpad(1) , 8) Then |
83 | Lcd "CRC ok" |
84 | Call Temperatur_aus_ds18s20 |
85 | ' Call Temperatur_aus_ds18b20 |
86 | Locate 1 , 6 |
87 | Lcd Fusing(temperatur_single , "#.#") ; "{223}C" |
88 | |
89 | Locate 3 , 1 |
90 | Lcd Bin(wert_aus_ds18x20) |
91 | Else |
92 | Lcd "CRC falsch" |
93 | End If |
94 | Loop |
95 | End |
96 | |
97 | Sub Temperatur_aus_ds18b20 |
98 | Wert_aus_ds18x20 = Makeint(scratchpad(1) , Scratchpad(2)) |
99 | Vorkomma = Wert_aus_ds18x20 |
100 | Shift Vorkomma , Right , 4 , Signed |
101 | Nachkomma = Scratchpad(1) And &B00001111 |
102 | Temperatur_single = Nachkomma * 0.0625 |
103 | Temperatur_single = Vorkomma + Temperatur_single |
104 | End Sub |
105 | |
106 | Sub Temperatur_aus_ds18s20 |
107 | Wert_aus_ds18x20 = Makeint(scratchpad(1) , Scratchpad(2)) |
108 | Vorkomma = Wert_aus_ds18x20 |
109 | Shift Vorkomma , Right , 1 , Signed |
110 | If Wert_aus_ds18x20.0 = 1 Then |
111 | Temperatur_single = 0.5 |
112 | Else |
113 | Temperatur_single = 0.0 |
114 | End If |
115 | Temperatur_single = Vorkomma + Temperatur_single |
116 | End Sub |
Anpassungen in den Zeilen 7 bis 10 und 22 nicht vergessen. Viel Erfolg :-)
Michael schrieb: > Ich habe hier einen fertigen Bascom-Code, der auch bei mir im Einsatz > ist und funktioniert: Damit weiss er beim nächsten Projekt immer noch nicht, warum es nicht geht. Hier muss eine Lernkurve durchlaufen werden.
Pete K. schrieb: > Hier muss eine Lernkurve durchlaufen werden. Nach der Lernkurve kommt dann die Zielgerade? ;-) MfG Paul
chris schrieb: > jo und was sagt die blinkende LED kommt das ungefähr hin mit der 1s? Es dauert 8 Sekunden bis die LED ausgeht und wieder angeht also LED an -> 8 sec. -> LED aus....
:
Bearbeitet durch User
@ Michael: Vielen Dank!! Ich werde es gleich mal ausprobieren.
> Nach der Lernkurve kommt dann die Zielgerade?
Solange die Fliehkraft nicht zu groß ist.
@ chris: Es liegt (so denke ich) an der Taktfrequenz, denn das Programm von Michael funktioniert auch nicht.
Otto L. schrieb: > chris schrieb: > >> jo und was sagt die blinkende LED kommt das ungefähr hin mit der 1s? > > Es dauert 8 Sekunden bis die LED ausgeht und wieder angeht also LED an > -> 8 sec. -> LED aus.... TOP ok und was ist deine Konsequenz daraus ??? Das dein Takt erstmal falsch eingestellt ist und zwar auf..... ????? 1MHz somit, wie hier schon öfter erwähnt wurde, müssen die Fusebit kontrolliert werden. Schau ob der Interne Oszillator oder ClkDv8 aktiviert ist. Paul B. schrieb: > Pete K. schrieb: >> Hier muss eine Lernkurve durchlaufen werden. > > Nach der Lernkurve kommt dann die Zielgerade? > ;-) > MfG Paul ne ehr eine Faulkurve xD ist doch eine Regelung
@Otto L. (avrfreund) Hießt du nicht mal Luk L. ? Naja, Namen sind Schall und Rauch. >Es dauert 8 Sekunden bis die LED ausgeht und wieder angeht also LED an >-> 8 sec. -> LED aus.... Dann ist die DIV8 Fuse in deinem AVR gesetzt, das ist der Nomalzustand bei der Auslieferung. Es gibt 2 Möglichkeiten. 1.) Ändere die Takteinstellung im Quelltext auf 1 MHz 2.) Lösche die DIV8 Fuse. Wie man das in BASCOM direkt macht, weiß ich nicht.
Falk B. schrieb: > > Es gibt 2 Möglichkeiten. > > 1.) Ändere die Takteinstellung im Quelltext auf 1 MHz > > 2.) Lösche die DIV8 Fuse. Wie man das in BASCOM direkt macht, weiß ich > nicht. Ok vielen dank!! Ich werde mich darüber mal im Internet schlau machen, wie man die DIV8 Fuse löscht.
Ok vielen vielen dank für die ganzen hilfreichen Antworten. Ich werde mich nochmal melden, wenn es funktioniert hat.
Also bei 1Mhz blinkt die LED in 1 sec. Abständen. Also die Taktfrequenz stimmt schon mal. jetzt muss ich das nur noch auf das Programm übertragen...
Dim Rom_code(8) As Byte Dim I As Byte Lcd " ROM-Code-Leser" Rom_code(1) = 1wsearchfirst() Locate 2 , 1 If Err = 0 Then Lcd "ROM-Code:" Locate 3 , 1 Lcd "Fam:" ; Hex(rom_code(1)) Locate 4 , 1 For I = 8 To 1 Step -1 Lcd Hex(rom_code(i)); Next I Else Lcd "Kein Slave!" End End If Wait 3 muss es dort nicht überall Rom_code(8) heißen?
Falk B. schrieb: > Es gibt 2 Möglichkeiten. Es gibt nur eine, weil bascom-ds1820 mit 1mhz nicht funktioniert.
Und die Möglichkeit wäre dann die DIV8 Fuse zu löschen?
:
Bearbeitet durch User
Hallo, Nun noch mein Kommentar. Mit Ausschnitt meines Codes Hat man nicht die optimalen Messgeräte ist eine Terminalausgabe um Inhalt der Variablen anzuzeigen sehr hilfreich. Meinen kleinen Adapter und Terminalprogramm möchte ich nicht mehr missen(Anzeige in String, Hex und Binär) Somit kannst Du an fast jeder Stelle im Code ein Print einfügen. 1MHz ist schon sehr kritisch. Stell diesen in Fusse auf 8MHz um. Zum lernen habe ich nach meinen Worten die wichtigsten Zeilen kommentiert. Natürlich auch hier Pin’s LCD und 1wire anpassen. Mit freundlichen Grüßen '****************** Test-Platine ************************ '* ist ein Testmodul für Digital Temperatur-Sensoren * '* [DS18x20] DS18S20 ist ein 9 Bit Family Adr &H10 * '* und DS18B20 ein 12 Bit Family Adr &H28 * '* somit große Unterschiede bei der "Empfindlichkeit" * '* Das lesen der Bit's ist somit auch Unterschiedlich. * '******************************************************** $regfile = "m8def.dat" $crystal = 8000000 'int 8MHz $hwstack = 40 $swstack = 32 $framesize = 32 $baud = 4800 Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2 Config Lcd = 16 * 2 'dies ist die Kennung für Lib Lcdpin Cursor Off Noblink 'Aus und nicht blinken Lcdinit Waitms 100 'für Test die am Port B.0 angeschlossenen Temperatursensoren Declare Sub Ds1820_alleseriennummern() 'Temperatursensor Anschluß an Portpin B.0 Dim 1wtemp_adresse_1(8) As Byte ' Adresse des Temperatursensors 1 Dim 1wtemp_adresse_2(8) As Byte ' Adresse des Temperatursensors 2 Dim Temp_bytes(9) As Byte Dim Tempdif As Integer Dim Tempdif1 As Integer 'Variable zur Temp. Berechnung DeziGrad Dim Temp1 As Single Dim Temp2 As Single 'Format für Single eine Nachkommastellen Config Single = Scientific , Digits = 1 'Temperatursensoren DS 18S20 an PortB.0 (Bascom Unterprogramm einbinden) Config 1wire = Portc.5 'Temperatursensor 1und2 Portc.5 = 1 'Port auf H schalten '------Temperatursensor erkennen------- 'testet die am Portpin C.5 angeschlossenen Temperatursensoren Call Ds1820_alleseriennummern() 1wtemp_adresse_1(1) = 1wsearchfirst() 'ist der erste gefundene Sensor 1wtemp_adresse_2(1) = 1wsearchnext() 'suche nächsten '1wtemp_adresse_3(1) = 1wsearchnext() 'wenn noch mehr erweitern Cls Do 'Temperatursensoren Daten einlesen Gosub Temperaturmessung Print " Temp1 " ; Temp1 Print " Temp2 " ; Temp2 'nun was anzeigen Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte Lcd " Temp1 " ; Temp1 Locate 2 , 1 'Cursor auf 2 Zeile, 1 Spalte Lcd " Temp2 " ; Temp2 Loop End Temperaturmessung: ' bei allen Sensoren den Messvorgang starten 1wreset 1wwrite &HCC ' SKIP ROM, alle Sensoren ansprechen 1wwrite &H44 ' CONVERT T, Temperatur messen 'Zeit zum Messen geben Waitms 50 '===== erster Temp.-Sensor ist ein S Typ===== 1wreset 1wverify 1wtemp_adresse_1(1) 1wwrite &HBE ' Read Scratchpad, Temperatur auslesen 'Zeit zum Messen geben Waitms 100 Temp_bytes(1) = 1wread(8) Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen Tempdif = Tempdif * 50 Tempdif = Tempdif - 25.6 Tempdif1 = Temp_bytes(8) - Temp_bytes(7) Tempdif1 = Tempdif1 * 100 Tempdif1 = Tempdif1 / Temp_bytes(8) Tempdif = Tempdif + Tempdif1 Temp1 = Tempdif / 100 '( '===== zweiter Temp.-Sensor wenn auch ein S Typ ===== ' Anfrage senden 1wreset 1wverify 1wtemp_adresse_2(1) 1wwrite &HBE ' Read Scratchpad, Temperatur auslesen Temp_bytes(1) = 1wread(8) Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen. Tempdif = Tempdif * 50 Tempdif = Tempdif - 25.6 Tempdif1 = Temp_bytes(8) - Temp_bytes(7) Tempdif1 = Tempdif1 * 100 Tempdif1 = Tempdif1 / Temp_bytes(8) Tempdif = Tempdif + Tempdif1 Temp2 = Tempdif / 100 'Zeit zum Messen geben Waitms 10 ') '===== erster Temp.-Sensor wenn es ein B Typ ist ===== ' Anfrage senden 1wreset 1wverify 1wtemp_adresse_2(1) 1wwrite &HBE ' Read Scratchpad, Temperatur auslesen 'Zeit zum Messen geben Waitms 100 Temp_bytes(1) = 1wread(8) Tempdif = Makeint(temp_bytes(1) , Temp_bytes(2)) 'erstes und 2 Byte(LSB+MSB) zusammenfügen. Tempdif = Tempdif / 8 'hier der Unterschied Tempdif = Tempdif * 50 Tempdif = Tempdif - 25.5 Tempdif1 = Temp_bytes(8) - Temp_bytes(7) Tempdif1 = Tempdif1 * 100 Tempdif1 = Tempdif1 / Temp_bytes(8) Tempdif = Tempdif + Tempdif1 Temp2 = Tempdif / 100 Return '----------------------------------------------------------------------- -------- '############# nach Neustart Temperatursensor Test ############### 'wird dieser Test Erfolgreich beendet wird die "Messung" oben in den Variablen 'geschrieben [1wtemp_adresse_1(1)] ist der erste Sensor und 'und [1wtemp_adresse_2(1)] ist der zweite usw. 'Gibt die Seriennummer aller Sensoren des Bus über COM aus. 'wenn Hardware-Fehler wird dieser angezeigt. Sub Ds1820_alleseriennummern() Local Crc As Byte Local I As Integer Local Anzahl As Integer Dim Adresse(8) As Byte Adresse(1) = 1wsearchfirst() 'prüft den ersten Teilnehmer am Bus If Err = 0 Then 'Wenn err, dann gibt es keinen Sensor 'ist nur für Info die Hex-Adresse ist "Name" mit dieser Kenntnis 'kannst Du mit [1wwrite &H55 und 1wwrite Sensor1_id("Name") , 8 'jeden einzeln ansprechen. Mach bei mehreren Sensoren Sinn. Print "sind Hex-Adresse der Ds18x20" 'ab hier prüfen Do Crc = Crc8(adresse(1) , 7) If Crc <> Adresse(8) Then Print "Daten fehlerhaft gelesen (CRC-Fehler)!" For I = 1 To 8 Print Hex(adresse(i)) ; Print " "; Next Print Adresse(1) = 1wsearchnext() 'nächste suchen Loop Until Err = 1 End If 'Print Anzahl = 1wirecount() 'Anzahl der Sensoren Print "Anzahl der Sensoren am Bus: " ; Anzahl Print Print "Test abgeschlossen" Print "Hauptprogramm wird gestartet" Print Wait 5 End Sub
@ Fred Red: Ok vielen Dank!!! Ich werde dass mal ausprobieren.
Das mit den 8Mhz nochmal, du musst einen externen Taktgeber anschließen. Zum Beispiel einen Quarz und dann muss das am AVR auf Crystal/Oscillator, mit z.B dem AVR Studio (Fuses), ausgewählt werden.
Würde hier auch 4,096Mhz Quarz funktionieren? einen 8Mhz hab ich im Moment nicht hier...
Noch zur Info ich nutze zum flashen der MC avrdude auf dem RasPi... Vielleicht hilft das weiter.
Otto L. schrieb: > chris schrieb: > >> jo und was sagt die blinkende LED kommt das ungefähr hin mit der 1s? > > Es dauert 8 Sekunden soso, dein Atmel läuft mit 8MHz durch div8 Fuse auf 1MHz die bleibt auch drin wenn du einen 4MHz Quarz nimmst, ergo wäre es leichter die div8 rauszunehmen als einen 4MHz Quarz zu setzen. Otto L. schrieb: > Würde hier auch 4,096Mhz Quarz funktionieren? einen 8Mhz hab ich im > Moment nicht hier... ??? kläre doch erst mal warum der auf 1MHz läuft!
@ Joachim B. Also wenn ich das richtig verstehe: wenn ich die DIV8 Fuse rausnehme, läuft mein ATmega8, wenn ich ihn im Code so einstelle auch wirklich auf 8Mhz?
Joachim B. schrieb: > Otto L. schrieb: >> chris schrieb: >> >>> jo und was sagt die blinkende LED kommt das ungefähr hin mit der 1s? >> >> Es dauert 8 Sekunden > > soso, dein Atmel läuft mit 8MHz durch div8 Fuse auf 1MHz > > die bleibt auch drin wenn du einen 4MHz Quarz nimmst, ergo wäre es > leichter die div8 rauszunehmen als einen 4MHz Quarz zu setzen. > > Otto L. schrieb: >> Würde hier auch 4,096Mhz Quarz funktionieren? einen 8Mhz hab ich im >> Moment nicht hier... > > ??? > > kläre doch erst mal warum der auf 1MHz läuft! Na Hallo, den Mega8 kann ein interner Takt von 8 MHz zugewiesen werden. Na klar nicht so präzise wie ein Quarz aber für diese Anwendung völlig ausreichen. Gruß
@ Fred Red: Heißt dass, mein Problem liegt wo anders als in der Taktfrequenz? Kann ich also die DIV8 Fuse drin lassen?
@Otto L. (avrfreund) >@ Joachim B. Also wenn ich das richtig verstehe: wenn ich die DIV8 Fuse >rausnehme, läuft mein ATmega8, wenn ich ihn im Code so einstelle auch >wirklich auf 8Mhz? Ja. Aber da das im Moment nicht ganz so einfach für dich ist, probier es doch einfach mal mit 1 MHz im Quelltext! Das dauert 1 Minute. Wenn es nicht funktioniert, so what!
@Otto L. (avrfreund) >@ Fred Red: Heißt dass, mein Problem liegt wo anders als in der >Taktfrequenz? Kann ich also die DIV8 Fuse drin lassen? NEIN! Es liegt an der Taktfrequenz! Die muss im Quelltext und im Controller gleich sein. Der Quelltext stellt NICHTS im Controller um, es sagt nur dem Compiler, was dort eingestellt ist, damit taktabhängige Verzögerungen richtig berechnet werden. Und genau DIE sind das Problem bei 1wire. Wenn die nicht stimmen, geht gar nichts.
@Joachim B. (jar)
>kläre doch erst mal warum der auf 1MHz läuft!
Das wissen wir längst! Mach doch mal nicht die Leute verrückt!
Das ist der Auslieferungszustand, wenn man einen ATmega im Laden kauft!
@ Falk B.: Ich hab jetzt im Quelltext 1 MHz eingegeben, 1 Min. gewartet, es hat sich nichts geändert. Ich kann aber die Fuse nicht in Bascom einstellen, da ich nicht mit dem PC flashe sondern mit dem RasPi. Also ich schreib das Programm in Bascom, schiebe es mit WINSCP auf meinen Pi und flashe es dort mit Putty auf den ATmega8. Ich muss also mit avrdude die DIV8 fuse löschen.
@Otto L. (avrfreund) >@ Falk B.: Ich hab jetzt im Quelltext 1 MHz eingegeben, 1 Min. gewartet, >es hat sich nichts geändert. Willst du mich veralbern? Logischerweise muss man auch das Programm auf den Controller laden und prüfen, ob der IC dann erkannt wird! >Ich kann aber die Fuse nicht in Bascom >einstellen, da ich nicht mit dem PC flashe sondern mit dem RasPi. Selber Schuld. Besorg dir gescheites Werkzeug, u.a. in Form des kostenfreien AVR- bzw. Atmel-Studios. Dort kann man die Fuses kinderleicht ändern, denn sie werden direkt angezeigt. Ein gescheiter Programmieradapter wie AVRISPMKII oder Atmel-ICE sind auch bezahlbar. >und flashe es dort mit Putty auf den ATmega8. Ich muss also mit avrdude >die DIV8 fuse löschen. Dann viel Spaß beim Herausfinden der Kommandozeilenparameter ;-)
Falk B. schrieb: > @Otto L. (avrfreund) > >>@ Falk B.: Ich hab jetzt im Quelltext 1 MHz eingegeben, 1 Min. gewartet, >>es hat sich nichts geändert. > > Willst du mich veralbern? Logischerweise muss man auch das Programm auf > den Controller laden und prüfen, ob der IC dann erkannt wird! Natürlich hab ich das Programm auf den Controller geladen und getestet... ich kenne mich zwar nicht besonders gut aus aber total verblödet bin ich auch nicht!
Otto L. schrieb: >Ich kann aber die Fuse nicht in Bascom >einstellen, da ich nicht mit dem PC flashe sondern mit dem RasPi. Dann bleibt dir als letzte Option der Wechsel auf C. Da funktionieren die ds1820 auch mit 1mhz.
Otto L. schrieb: > Ich finde hier nicht mal CKDIV8!! Blätter mal in dem oberen Feld, was unter dem Wort "Features" losgeht. Da müßte sich irgendwo auch "Int. RC Oszillator 8MHz...." finden lassen. Explizit nur CKDIV8 alleine ist wohl nicht vorgesehen. (Ich benutze das Programm nicht, insofern kann ich nur raten, wo es zu finden sein könnte) MfG Paul
grundschüler schrieb: > Dann bleibt dir als letzte Option der Wechsel auf C. Da funktionieren > die ds1820 auch mit 1mhz. Ich glaub das werde ich auch tun vielleicht werde ich dann entlich daraus schlau
Otto L. schrieb: > Ich glaub das werde ich auch tun vielleicht werde ich dann entlich > daraus schlau Du wirst Dich wundern... (Für die Streithähne: Nein, weiter gehe ich nicht darauf ein) MfG Paul
Also ich finde dort auch kein CKDIV8... ich werde es jetzt noch über ponyprog ausprobieren
Otto L. schrieb: > Also ich finde dort auch kein CKDIV8... Ich wiederhole mich aus gegebenem Anlaß: Paul B. schrieb: > Explizit nur CKDIV8 alleine ist wohl nicht vorgesehen. > Blätter mal in dem oberen Feld, was unter dem Wort "Features" losgeht. > Da müßte sich irgendwo auch "Int. RC Oszillator 8MHz...." finden lassen. Es hilft manchmal, wenn man tut, was die Leute raten. MfG Paul
Die gibt es bei diesem Typ nicht in der Form, das wird anders kodiert. Schau ins Datenblatt, Seite 30, Tabelle 9. "Internal Calibrated RC Oscillator Operating Modes"
@ ALLE: ICH HAB ES GESCHAFT. Die Temperatur wird korrekt angezeigt. Ich bin euch so Dankbar! Danke Danke Danke!!! Ich poste nochmal das Programm und die Einstellungen, die man über PonyProg am ATmega8 festlegen muss
1 | '------------------------------------------------------------------------------ |
2 | 'name : display-test.bas |
3 | 'purpose : Test for TC1604A, DS18S20 |
4 | 'micro : Mega328P |
5 | '------------------------------------------------------------------------------ |
6 | |
7 | $regfile = "m8def.dat" |
8 | $crystal = 8000000 |
9 | Config Lcd = 20 * 4a , Chipset = Ks077 |
10 | Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 = Portc.2 , Db4 = Portc.3 , E = Portc.4 , Rs = Portc.5 |
11 | |
12 | $hwstack = 40 |
13 | $swstack = 40 |
14 | $framesize = 60 |
15 | |
16 | Declare Sub Temperatur_aus_ds18b20 |
17 | Declare Sub Temperatur_aus_ds18s20 |
18 | |
19 | Cursor Off |
20 | Cls
|
21 | |
22 | Config 1wire = Portd.7 |
23 | |
24 | Dim Rom_code(8) As Byte |
25 | Dim I As Byte |
26 | |
27 | Lcd " ROM-Code-Leser" |
28 | |
29 | Rom_code(1) = 1wsearchfirst() |
30 | Wait 1 |
31 | Locate 2 , 1 |
32 | If Err = 0 Then |
33 | Lcd "ROM-Code:" |
34 | Locate 3 , 1 |
35 | Lcd "Fam:" ; Hex(rom_code(1)) |
36 | Locate 4 , 1 |
37 | For I = 8 To 1 Step -1 |
38 | Lcd Hex(rom_code(i)); |
39 | Next I |
40 | Else
|
41 | Lcd "Kein Slave!" |
42 | End
|
43 | End If |
44 | Wait 3 |
45 | |
46 | Dim Scratchpad(9) As Byte |
47 | Dim Wert_aus_ds18x20 As Integer |
48 | Dim Vorkomma As Integer |
49 | Dim Nachkomma As Byte |
50 | Dim Temperatur_single As Single |
51 | Dim Direction As Bit |
52 | |
53 | 1wreset |
54 | 1wwrite &HCC |
55 | 1wwrite &H4E |
56 | 1wwrite &H00 |
57 | 1wwrite &H00 |
58 | 1wwrite &B0111_1111 |
59 | |
60 | Cls
|
61 | Do
|
62 | 1wreset |
63 | 1wwrite &HCC |
64 | 1wwrite &H44 |
65 | |
66 | Locate 4 , 1 'Progress animation |
67 | For I = 1 To 16 |
68 | If Direction = 0 Then |
69 | Lcd "#" |
70 | Else
|
71 | Lcd " " |
72 | End If |
73 | Waitms 63 |
74 | Next I |
75 | Direction = Not Direction |
76 | |
77 | 1wreset |
78 | 1wwrite &HCC |
79 | 1wwrite &HBE |
80 | Scratchpad(1) = 1wread(9) |
81 | |
82 | Locate 2 , 1 |
83 | If Scratchpad(9) = Crc8(scratchpad(1) , 8) Then |
84 | Lcd "CRC ok" |
85 | Call Temperatur_aus_ds18s20 |
86 | ' Call Temperatur_aus_ds18b20 |
87 | Locate 1 , 6 |
88 | Lcd Fusing(temperatur_single , "#.#") ; "{223}C" |
89 | |
90 | Locate 3 , 1 |
91 | Lcd Bin(wert_aus_ds18x20) |
92 | Else
|
93 | Lcd "CRC falsch" |
94 | End If |
95 | Loop
|
96 | End
|
97 | |
98 | Sub Temperatur_aus_ds18b20 |
99 | Wert_aus_ds18x20 = Makeint(scratchpad(1) , Scratchpad(2)) |
100 | Vorkomma = Wert_aus_ds18x20 |
101 | Shift Vorkomma , Right , 4 , Signed |
102 | Nachkomma = Scratchpad(1) And &B00001111 |
103 | Temperatur_single = Nachkomma * 0.0625 |
104 | Temperatur_single = Vorkomma + Temperatur_single |
105 | End Sub |
106 | |
107 | Sub Temperatur_aus_ds18s20 |
108 | Wert_aus_ds18x20 = Makeint(scratchpad(1) , Scratchpad(2)) |
109 | Vorkomma = Wert_aus_ds18x20 |
110 | Shift Vorkomma , Right , 1 , Signed |
111 | If Wert_aus_ds18x20.0 = 1 Then |
112 | Temperatur_single = 0.5 |
113 | Else
|
114 | Temperatur_single = 0.0 |
115 | End If |
116 | Temperatur_single = Vorkomma + Temperatur_single |
117 | End Sub |
PonyProg: CLKSEL3 = 0 (programmed), CLKSEL2 = 1 (unprogrammed), CLKSEL1 = 0 (programmed), CLKSEL0 = 0 (programmed)
Besonderer Dank gilt Falk Brunner, chris und Michael. @ Falk Brunner: Ich denke sie haben einige Gedultsnerven mit mir verloren xD Nochmals vielen dank
Super hats ja noch geklappt aber lass uns dran Teil haben was denn jetzt genau der Fehler war bzw wo?
chris schrieb: > Super hats ja noch geklappt aber lass uns dran Teil haben was denn jetzt > genau der Fehler war bzw wo? Es war einzig und allein die Einstellung von den Fuses. Ich hab dann wie oben beschrieben in PonyProg die Taktfrequenz auf 8 MHz gestellt und schon funktionierts.
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.