Bascom ds1820 Problem atmega8 vs atmega32

Kasmodro

Neues Mitglied
02. Juni 2013
9
0
0
Heilbronn
Sprachen
  1. BascomAVR
Hallo zusammen,
bin neu dabei und möchte meine alte Poolsteuerung (Ccontrol1, die DS18s(?)20 Sensoren benutzt) gegen was eigenes tauschen. Die bekomme ich weder bei m atmega8 noch bei der 32er Version zum laufen deshalb habe ich mir testweise die DS1820 gekauft.
Und da fängt das "kleine" Problem an ;)
Bei einem atmega8 funktioniert mein Testprogramm und ich bekomm eine Temperatur auf meinem Display angezeigt, mit einem atmega32 16PU bekomm ich keine Anzeige.
Was ist nun bei einem 32er anders das ich keine TempAnzeige bekomme, muß ich einen speziellen Port nutzen?



Code:
' $regfile = "m32def.dat"
' $crystal = 4000000
' $hwstack = 40
' $swstack = 16
' $framesize = 32

$regfile = "M8def.dat"
$crystal = 1000000
$hwstack = 64
$swstack = 64

Config Lcdpin = Pin , Port = Portd , E = Portb.5 , Rs = Portb.4
Config Lcd = 20 * 4

Config 1wire = Portc.5

Dim Ar(2) As Byte , A As Byte , I As Byte , Temperatur As Integer
Dim Halb As Byte
Cls

Lcd "Temp:"
Do
Waitms 300
1wreset                                                     'reset the

1wwrite &HCC                                                'read ROM

1wwrite &H44

Waitms 200                                                  'read ROM

1wreset                                                     'reset the

1wwrite &HCC                                                'read ROM

1wwrite &HBE                                                'read ROM

For I = 1 To 2
Ar(i) = 1wread()                                            'place into

Next

Locate 2 , 1
Temperatur = Ar(1)

If Ar(2) > 0 Then Temperatur = 0 Else Shift Temperatur , Right

Lcd Temperatur ; ".";

Halb = Ar(1) And 1

If Halb = 1 Then Lcd "5" Else Lcd "0"

Lcd " C"
Loop

End
 
Hi,

und herzlich willkommen :flowers:

Bei einem atmega8 funktioniert mein Testprogramm und ich bekomm eine Temperatur auf meinem Display angezeigt, mit einem atmega32 16PU bekomm ich keine Anzeige.
Was ist nun bei einem 32er anders das ich keine TempAnzeige bekomme, muß ich einen speziellen Port nutzen?

Code:
...
..

Config 1wire = Portc.5

...
..

stell in den Fuses mal den JTAG ab. Der Mega32 hat nen JTAG-Interface was auf dem PortC.3 bis PortC.5 liegt.
Also JTAGEN in den Fuses abschalten (JTAG deaktivieren). Schau mal in die FAQs. Da hab ich was über die ganzen Fuses geschrieben. Da steht das auch drin. Das ist ein gern gesehener (oft gemachter) Fehler ;)

Gruß
Dino
 
Danke für das nette Willkommen,
habe JTAG deaktiviert, leider kein Ergebnis :(
Habe auch mal andere Ports getestet ... nix ... Wenn ich die Ports auf Ausgang schalte funktionieren sie aber.
N anderen Käfer hab ich auch schon getestet ... auch nix ...
Was mir bei den Fuse aufgefallen ist ... Fusebit High P : 1:eek:sc. Options not programmed ist das richtig?

gruß
Kasmo
 
Hi Kasmo,

Was mir bei den Fuse aufgefallen ist ... Fusebit High P : 1 : osc. Options not programmed ist das richtig?
Ja. Bei Speicherzellen von Flash, EEPROM und auch EPROM (UV-löschbar) werden beim Löschvorgang die Bits auf 1 gesetzt. Wenn du also einen unprogrammierten ATmega ausliest, dann siehst du im Flash und EEPROM immer 255dez oder FFhex oder 11111111bin. Also alle Bits gesetzt. Beim programmieren werden die Bits dann auf 0 gesetzt. Wenn du wieder Bits auf Eins setzen willst, dann mußt du löschen. Bei EEPROMs oder Flashs werden dann je nach Aufbau Bytes oder ganze Seiten (128Byte oder 256Byte oder ...) oder alles auf einmal gelöscht.

Also gelöschtes Bit ist 1
programmiertes Bit ist 0

Hast du den DS1820 mit nem 4,7k PullUp versehen? Verwendest du Phantomspeisung oder direkte Versorgung? Normalerweise geht das recht streßfrei.

Gruß
Dino
 
nabend dino,

also das mit dem Wiederstand hab ich nach Anleitung so verschalten :
1Wire-DS1820.png
ich hab auch wie gesagt kein Problem beim atmega8 ... der liest mittlerweile sogar die 1wire von meiner alten Poolsteuerung der CControl ohne zu murren ;), das ganze hab ich auf einem Labor-Steckboard, einem Amtel Evaluationboard v2.01, und nem Streifen-/Punktrasterplatinendingens aufgebaut, einzig die Pin-Belegung ist ein wenig anders wegen der Verbindungsplatiene (http://www.pollin.de/shop/downloads/D810057B.PDF.)
Ich werd mir morgen mal einen atmel644 zulegen und das ganze nochmals testen ... so was lässt mir keine ruhe :mad:
 
Hi,

Ich werd mir morgen mal einen atmel644 zulegen und das ganze nochmals testen ... so was lässt mir keine ruhe :mad:
zur Info: alle Megas ab 40 Pins (Mega16 aufwärts) haben JTAG.

Was mir auch bei deinem Quellcode aufgefallen ist ...
Code:
' $regfile = "m32def.dat"
' $crystal = 4000000    ' <<======= 4MHz
' $hwstack = 40
' $swstack = 16
' $framesize = 32

$regfile = "M8def.dat"
$crystal = 1000000    ' <<========= 1MHz
$hwstack = 64
$swstack = 64
Beim Mega32 hast du 4MHz und beim Mega8 1MHz bei Bascom angegeben. Stimmt das wirklich? läuft der Mega8 mit internen (oder externen) 1MHz und der Mega32 mit nem 4MHz Quarz? :confused: Nicht das es beim Mega32 am Timing liegt weil du Bascom den falschen Systemtakt gemeldet hast.

Da hab ich beim ersten Posting nämlich angenommen das es so stimmt und das es kein Fehler ist.

Gruß
Dino
 
aaaaalso, mir wurde erklärt das ich in Bascom für den Atmega8 die "m8def.dat" und beim atmega32 die "m32def.dat" auswählen muss,
wenn ich da dann "Add to Code" mache bekomm ich folgendes :

$regfile = "m8def.dat"
$Crystal=4000000
$hwstack=40
$swstack=16
$framesize=32

da ich faul bin, kopiere ich gerne die quellcodes und da begab es sich das ich plötzlich
'$crystal = 1000000 stehen hatte ...

mit der Vorgabe von Bascom ($Crystal=4000000) funktioniert der DS1820 NICHT !!!
durch meine Faulheit ;) aber mit
'$crystal = 1000000 schon :confused:

ich denke mal das wird bei der "m32def.dat" dann wohl auch so sein ... nur das leider '$crystal = 1000000 nicht das ist was er scheinbar will :(
also was ist nun bei nem atmega3216PU 1218 der richtige wert ?
 
Nein, Du stellst die Frage falsch...

Deinem Controller ist die Crystal-Angabe als solch schnurzpiepegal. Du sagst Bascom damit nur, wie schnell der Controller in Wirklichkeit getaktet ist. (Der Controller kennt ja keine Zeiten - nur eben Takte. Wenn Bascom also irgendwelche Zeiten einhalten soll, muß es wissen, wielange ein solcher dauert. Deswegen gibst Du diesen Wert als Compilerdirektive an).
Wie schnell Du den Controller Taktest, können wir hier nicht wissen.

Was ist Deine Taktquelle? Externer Quarz, interner Oszillator, oder was?
Welchen Wert hat der Quarz? / Wie ist der Oscillator eingestellt (Fusebits)?

(Grundzustand ist beim Mega32 "interner RC-Oscillator mit 1MHz", aber welchen Zustand Dein Controller (inzwischen) hat, können wir nicht Hellsehen...)
 
ok, dann hab ich dinos post falsch verstanden, sry
bei beiden also dem atmega8 und dem 32er

int. RC Osc. 1 MHz ... Default value
sry, will euch nicht auf die klöten gehen oder euch die zeit rauben ... am atmega8 geht es, muß ich eben schauen das ich mit dem auskomme.

gruß
kasmo
 
Hi,

bei beiden also dem atmega8 und dem 32er

int. RC Osc. 1 MHz ... Default value
sry, will euch nicht auf die klöten gehen oder euch die zeit rauben ... am atmega8 geht es, muß ich eben schauen das ich mit dem auskomme.

dann ist es natürlich klar das es beim Mega32 nicht geht :p

Wenn er in Wirklichkeit mit 1MHz rennt und du Bascom sagst es soll das gesamte Timing auf Basis von 4MHz Systemtakt berechnen soll :rolleyes:

Dann meint Bascom das der Atmel 4x so schnell läuft wie er in Wirklichkeit läuft. Es werden also alle Zeiten (zB 1Wire-Timing, Wait-Befehle, ...) 4x so lange dauern wie sie im Programm angegeben sind und Frequenzen logischerweise dann 4x so langsam sein wie sie sein sollen. Ein "Waitms 100" wird also in deinem Programm 400ms dauern :p

Das wär so als wenn du einem sagst das deine Uhr für jede Umdrehung des Minutenzeigers 15 Minuten benötigt, sie in Wirklichkeit aber 60 Minuten braucht. Kapiert? ;)

Gruß
Dino
 
Jap, das hab ich nun verstanden und gleich geändert ... mit dem gleichen Ergebnis :confused:
ein bekannter versucht die Schaltung mit dem Prog mal nachzuvollziehen ma sehen was raus kommt :)

gruß
Kasmo
 
Jetzt schon aufgeben?!?
Du hattest ganz am Anfang geschrieben, Du würdest "keine Anzeige" mit dem Mega 32 bekommen - selbst wenn er sich beim Empfang via 1wire aufhängt/totwartet, sollte zumindest "Temp:" in der ersten Zeile erscheinen.

Ich würde meinen Logic8 dranhängen - falls Du sowas nicht hast, eben oldschool: Statusinfos über UART oder LCD ausgeben lassen (da Du dasLCD eh verwenden willst, bietet sich das hier an...
-direkt nach dem LCD-init irgendwas ausgeben lassen
-dito nach dem Zuweisen der 1wire-pins
-das Do auskommentieren, und direkt vor loop eins einfügen (also effektiv nur einen Durchlauf, und dann 'ne leere Endlosschleife)
-nach jedem 1wire-Kommando 'ne neue LCD Ausgabe

ggf erstmal irgendwo am Anfang in'ner Endlosschleife mit 'nem wait oder so 'ne LED blinken lassen, um zu sehen, ob der Takt stimmt.
(halbwegs stimmt, zumindest die Dimension - über die Genauigkeit des internen RC will ich nichts sagen...)

Edit: was denn nun?
beide laufen physisch mit 1MHz?
beim Mega8 gehts, wenn Du Bascom sagst Crystal=1MHz?
und beim Mega32?
Da hattest Du geschrieben
...ich denke mal das wird bei der "m32def.dat" dann wohl auch so sein ... nur das leider '$crystal = 1000000 nicht das ist was er scheinbar will :(
also was ist nun bei nem atmega3216PU 1218 der richtige wert ?
 
Mal ein Auszug aus dem DS18S20 Datasheet:

NOTES:
1. Temperature conversion takes up to 500 ms

Also warte mal ein wenig länger bis die A/D Wandlung durchgeführt ist und erhöhe dein Waitms 200 nach '1wwrite &44' auf z.B. 750.

Und wenn Du dann auch noch in Bascom den richtigen Takt angibst '$crystal = 1000000' dann wirds schon passen;)

Hier mal ein Codeausschnitt aus meinem Funkthermometer der 100% mit nem Atmega 8 ,16 ,32, 328 läuft.
Code:
Sub Temp_ds1820()

   1wreset                                                  'Bus reset damit alle Sensoren hören
   1wwrite &HCC                                             'Alle Sensoren am Bus werden angesprochen
   1wwrite &H44                                             'Rom Befehl: Sensoren veranlassen die Temperatur A/D-Wandlung durchzuführen
   Waitms 750                                               'Warten bis fertig (Achtung!Ist die Zeit zu kurz Temp = 85,0°C -> Power-on / reset)

   1wreset                                                  'Bus reset damit alle Sensoren hören
   1wwrite &HCC                                             'Alle Sensoren am Bus werden angesprochen
   1wwrite &HBE                                             'Rom Befehl: Scratchpad lesen
   Scratchpad(1) = 1wread(9)                                'Alle 9 Scratchpad bytes in ein Array übertragen  (byte9 = checksumme)
   1wreset

   If Scratchpad(9) = Crc8(scratchpad(1) , 8) Then          'überprüfe Checksumme

      spad = Scratchpad(1) And 1
      If spad = 1 Then Decr Scratchpad(1)
      Dg = Makeint(scratchpad(1) , Scratchpad(2))           'erstes und 2 Byte (LSB+MSB) zusammen fügen
      Dg = Dg * 50
      Dg = Dg - 25
      Dg1 = Scratchpad(8) - Scratchpad(7)
      Dg1 = Dg1 * 100
      Dg1 = Dg1 / Scratchpad(8)
      Dg = Dg + Dg1
      Dg2 = Dg / 100

      TempDS1820_tmp = Fusing(dg2 , "#.#")
      TempDS1820_len = Len(TempDS1820_tmp)

      'Mögliche Temperatur -55.0°C bis 125.0°C


   End If

End Sub
 
Hi,

Mal ein Auszug aus dem DS18S20 Datasheet:

NOTES:
1. Temperature conversion takes up to 500 ms

Also warte mal ein wenig länger bis die A/D Wandlung durchgeführt ist und erhöhe dein Waitms 200 nach '1wwrite &44' auf z.B. 750.

Und wenn Du dann auch noch in Bascom den richtigen Takt angibst '$crystal = 1000000' dann wirds schon passen;)
Den Rest hab ich mir garnicht erst angesehen :rolleyes:

Selbst wenn er zu kurz wartet sollte er wenigstens 85°C als Fehlermeldung vom DS1820 angezeigt bekommen. Wenn garnix angezeigt wird, dann ist irgendetwas im Programm oder dem Aufbau faul.

Bis jetzt war es immer so das oft genug der Fehler vor der Tastatur saß :p

Gruß
Dino
 
Sorry, keine Anzeige damit meinte ich Temperatur :/
OK, anders Formuliert :

Das hab ich hier aus dem Forum um mir die Adresse des Fühlers anzeigen zu lassen LINK... einmal mit dem 8ter da bekomme ich die Adresse angezeigt:
cef557cbed052f61db1cbd491ccbf5a7.jpg
und einmal mit dem 32er ... keine Adresse ... (00000....)
3c1b314262fc1365eb8b0480d00564aa.jpg
Code:
'$regfile = "m8def.dat"
'$crystal = 1000000
'$hwstack=40
'$swstack=16
'$framesize=32


'Config Lcdpin = Pin , Port = Portd , E = Portb.5 , Rs = Portb.4
'Config Lcd = 20 * 4



'Osccal = &HB2

$regfile = "m32def.dat"
$crystal = 1000000
$hwstack = 40
$swstack = 16
$framesize = 32


Config Lcdpin = Pin , Port = Portd , E = Portb.7 , Rs = Portb.6
Config Lcd = 20 * 4




 Cls

 Config 1wire = Portc.0

Dim Dsid(8) As Byte
Dim I As Byte
Dim Nr As Byte

Nr = 1
Cls

' Ersten angeschlossenen DS1820 finden und Adresse auslesen
Dsid(1) = 1wsearchfirst()

Locate 1 , 1 : Lcd "DS1820 Nr " ; Nr : Nr = Nr + 1
Locate 2 , 1
For I = 1 To 8
 Lcd Hex(dsid(i))
Next

' 10 Sekunden warten
Wait 15

Do



 ' Nächsten DS1820 suchen
 Dsid(1) = 1wsearchnext()
 ' Wenn kein Fehler, dann ausgeben
 If Err = 0 Then
  Locate 1 , 1 : Lcd "DS1820 Nr " ; Nr : Nr = Nr + 1
  Locate 2 , 1
  For I = 1 To 8
   Lcd Hex(dsid(i))
  Next
  Wait 15
 End If
Loop Until Err = 1


Do
 Waitms 100
Loop

End
 
Sorry weil das jetzt komplett OffTopic ist, aber wo hastn die Kabel her?
Hab sowas schon lange gesucht und im Endeffekt denn selber gemacht (Silberdraht an Litze gelötet und Schrumpfschlauch drüber). Aber das ist immer so eine Fummelei...
 
z.B. google -> flexible drahtbrücken -> Ergebnis: Klick

Ich selber nutze diese hier:Klick Sind allerdings um einiges Teurer :)
 
Hmm, die von Ebay sehen gut aus, zumindest für mich ausreichend, danke :)
Aber die von Conrad ... im Endeffekt das was ich selbst gemacht hab, aber zu dem Preis... Da mach ich mir die lieber selber ^^
 
Zurück zum Thema:
bei einem MHz Takt dauert ein Taktzyklus 1µs, klar. Die Anforderungen des Sensors liegen aber auch irgendwo sicher im µs-Bereich - sollte also eigentlich keine Probleme machen (soweit wird der Mega32 mit seiner Toleranz ja wohl ncht abweichen).
Trotzdem könntest Du den Controller ja mal auf 8MHz setzen (also interner RC mit 8Mhz und max. Startzeit bei den Fuses), natürlich Bascom das auch bei der Crystal-Direktive mitteilen.

Ansonsten hast Du das ja irgendwie auf'm Steckbrett - steckst Du bei Deinen Versuchen den Controller jedesmal um? Oder nur die Verbindungen vom LCD/Sensor zum Controller? Die Verbindungen (von Bein zu Bein) hast Du sicher schon durchgeklingelt. (Ich hatte bei sowas mal'n Wackelkontakt im Steckbrett - da wars aber nur der Pin, der die Hintergrundbeleuchtung eines LCD schalten sollte. Nach langer erfolgloser Fehlersuche ging das Licht plötzlich wenn man die Leitung angetippt hat...)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)