Forum: Mikrocontroller und Digitale Elektronik DS18S20 wird vom ATmega8 nicht gefunden


von Otto L. (avrfreund)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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?

von Otto L. (avrfreund)


Angehängte Dateien:

Lesenswert?

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.

von Otto L. (avrfreund)


Lesenswert?

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

von Otto L. (avrfreund)


Lesenswert?

Entschuldigung passt schon zusammen ;-)

von Sascha W. (sascha-w)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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.

von Otto L. (avrfreund)


Lesenswert?

@Sascha Weber: Wenn ich die Klammern schließe bekomme ich noch mehr 
Fehlermeldungen
@Falk Brunner: Ok danke ich schau mal ob ich dass hinbekomme

von Otto L. (avrfreund)


Lesenswert?

@Falk B. Welches dieser Programme muss ich jetzt compilieren und wo wird 
es Angezeigt?

von Falk B. (falk)


Lesenswert?

@  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.

von Otto L. (avrfreund)


Lesenswert?

Ich denke auch, dass es mich überfordern wird ;-)
Aber trotzdem vielen Dank ich werde es mal versuchen

von Pete K. (pete77)


Lesenswert?

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?

von Otto L. (avrfreund)


Lesenswert?

@ 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.

von Stefan F. (Gast)


Lesenswert?

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!

von Stefan F. (Gast)


Lesenswert?

Ich würde mal den R/W Pin vom Display beschalten und R3 richtig 
anschließen. Ist dein Trimmpoti schon abgebrannt?

von Otto L. (avrfreund)


Lesenswert?

@ 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.

von Otto L. (avrfreund)


Lesenswert?

Nein mein Poti ist noch nicht abgebrannt.

von Pandur S. (jetztnicht)


Lesenswert?

Ohne Oszilloskop wird's schwierig...

von Otto L. (avrfreund)


Lesenswert?

Gibt´s eine alternative zum Oszi?

von Falk B. (falk)


Lesenswert?

@ 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)

von Joachim B. (jar)


Lesenswert?

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!

von Falk B. (falk)


Lesenswert?

Beitrag "Onewire + DS18x20 Library"

Achtung, nicht das Projektarchiv nutzen, das ist veraltet. Aber die 
Tipps beherzigen!

von Otto L. (avrfreund)


Lesenswert?

@ 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.

von Stefan F. (Gast)


Lesenswert?

> 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.

von Otto L. (avrfreund)


Lesenswert?

Ich kann ihn mal fragen vielleicht hat er es mir auch gesagt und ich 
habs ganz einfach vergessen (was ich eher denke).

von Otto L. (avrfreund)


Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

> 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.

von Otto L. (avrfreund)


Lesenswert?

@ 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.

von Sascha W. (sascha-w)


Lesenswert?

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

von Otto L. (avrfreund)


Lesenswert?

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
von Paul B. (paul_baumann)


Lesenswert?

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

von Otto L. (avrfreund)


Lesenswert?

@ 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.

von Otto L. (avrfreund)


Lesenswert?

Das Programm gibt "Sensor Fehler" aus, wenn etwas nicht stimmt. Dann 
kommt nur 255. Ich denke der Sensor ist kaputt.

von Joachim B. (jar)


Lesenswert?

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.

von Otto L. (avrfreund)


Lesenswert?

Ok vielen dank für die Info

von holger (Gast)


Lesenswert?

>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;)

von Joachim B. (jar)


Lesenswert?

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

von Paul B. (paul_baumann)


Lesenswert?

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-

von Pete K. (pete77)


Lesenswert?

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.

von Otto L. (avrfreund)


Angehängte Dateien:

Lesenswert?

Hier nochmal der Schaltplan, den ich jetzt in Eagle gezeichnet habe. So 
ist die Schaltung im Moment, funktioniert aber nicht.

von Paul B. (paul_baumann)


Lesenswert?

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

von Otto L. (avrfreund)


Lesenswert?

@ Paul B.: Ich habe leider keinen 4,7kOhm R zuhause gehabt aber ich hab 
eine Parallelschaltung aus zwei 10kOhm Widerstände gemacht.

von Falk B. (falk)


Lesenswert?

@ 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.

von Otto L. (avrfreund)


Lesenswert?

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

von Otto L. (avrfreund)


Angehängte Dateien:

Lesenswert?

Dies wird am Display angezeigt.

von Falk B. (falk)


Lesenswert?

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.

von Otto L. (avrfreund)


Lesenswert?

Es wird ja gleich am Anfang "Sensor Fehler" angezeigt wie sie in dem 
Bild sehen. Danach wird 255 angezeigt. Ich geb langsam auf....

von chris (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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.

von Otto L. (avrfreund)


Lesenswert?

@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?

von Falk B. (falk)


Lesenswert?

@ 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
von Falk B. (falk)


Lesenswert?

' Taktprüfung

Cls

For I = 1 To 9
Lcd I
Wait 1
Next

von Otto L. (avrfreund)


Lesenswert?

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.

von grundschüler (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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!

von Stefan F. (Gast)


Lesenswert?

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.

von Harald (Gast)


Lesenswert?

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.

von Otto L. (avrfreund)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

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?

von Michael (Gast)


Lesenswert?

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 
:-)

von Pete K. (pete77)


Lesenswert?

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.

von Paul B. (paul_baumann)


Lesenswert?

Pete K. schrieb:
> Hier muss eine Lernkurve durchlaufen werden.

Nach der Lernkurve kommt dann die Zielgerade?
;-)
MfG Paul

von Otto L. (avrfreund)


Lesenswert?

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
von Otto L. (avrfreund)


Lesenswert?

@ Michael: Vielen Dank!! Ich werde es gleich mal ausprobieren.

von S. Landolt (Gast)


Lesenswert?

> Nach der Lernkurve kommt dann die Zielgerade?

Solange die Fliehkraft nicht zu groß ist.

von Otto L. (avrfreund)


Lesenswert?

@ chris: Es liegt (so denke ich) an der Taktfrequenz, denn das Programm 
von Michael funktioniert auch nicht.

von chris (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@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.

von Otto L. (avrfreund)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

https://www.mikrocontroller.net/articles/AVR_Fuses

Im einfachsten Fall mit dem AVR-Studio.

von Otto L. (avrfreund)


Lesenswert?

Ok vielen vielen dank für die ganzen hilfreichen Antworten. Ich werde 
mich nochmal melden, wenn es funktioniert hat.

von Otto L. (avrfreund)


Lesenswert?

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...

von Otto L. (avrfreund)


Lesenswert?

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?

von grundschüler (Gast)


Lesenswert?

Falk B. schrieb:
> Es gibt 2 Möglichkeiten.

Es gibt nur eine, weil bascom-ds1820 mit 1mhz nicht funktioniert.

von Otto L. (avrfreund)


Lesenswert?

Und die Möglichkeit wäre dann die DIV8 Fuse zu löschen?

: Bearbeitet durch User
von Fred R. (fredylich)


Lesenswert?

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

von Otto L. (avrfreund)


Lesenswert?

@ Fred Red: Ok vielen Dank!!! Ich werde dass mal ausprobieren.

von chris (Gast)


Lesenswert?

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.

von Otto L. (avrfreund)


Lesenswert?

Würde hier auch 4,096Mhz Quarz funktionieren? einen 8Mhz hab ich im 
Moment nicht hier...

von Otto L. (avrfreund)


Lesenswert?

Noch zur Info ich nutze zum flashen der MC avrdude auf dem RasPi... 
Vielleicht hilft das weiter.

von Joachim B. (jar)


Lesenswert?

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!

von Otto L. (avrfreund)


Lesenswert?

@ 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?

von Fred R. (fredylich)


Lesenswert?

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ß

von Otto L. (avrfreund)


Lesenswert?

@ Fred Red: Heißt dass, mein Problem liegt wo anders als in der 
Taktfrequenz? Kann ich also die DIV8 Fuse drin lassen?

von Falk B. (falk)


Lesenswert?

@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!

von Falk B. (falk)


Lesenswert?

@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.

von Falk B. (falk)


Lesenswert?

@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!

von Otto L. (avrfreund)


Lesenswert?

@ 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.

von Falk B. (falk)


Lesenswert?

@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 ;-)

von Otto L. (avrfreund)


Lesenswert?

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!

von Otto L. (avrfreund)


Angehängte Dateien:

Lesenswert?

Ich finde hier nicht mal CKDIV8!!

von grundschüler (Gast)


Lesenswert?

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.

von Paul B. (paul_baumann)


Lesenswert?

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

von Otto L. (avrfreund)


Lesenswert?

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

von Paul B. (paul_baumann)


Lesenswert?

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

von Otto L. (avrfreund)


Lesenswert?

Also ich finde dort auch kein CKDIV8... ich werde es jetzt noch über 
ponyprog ausprobieren

von Paul B. (paul_baumann)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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"

von Otto L. (avrfreund)


Lesenswert?

@ 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)

von Otto L. (avrfreund)


Lesenswert?

Besonderer Dank gilt Falk Brunner, chris und Michael.
@ Falk Brunner: Ich denke sie haben einige Gedultsnerven mit mir 
verloren xD
Nochmals vielen dank

von chris (Gast)


Lesenswert?

Super hats ja noch geklappt aber lass uns dran Teil haben was denn jetzt 
genau der Fehler war bzw wo?

von Otto L. (avrfreund)


Lesenswert?

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
Noch kein Account? Hier anmelden.