Hallo, habe ein Programm auf den µC geschrieben, Am Display erscheint dass 0 DS1820 erkannt wurden. Am Oszi kann ich zwischen Datenleitung und Masse die 5V ablesen. Sonst tut sich nichts. Keine Änderung des Signals. Ist der DS1820 möglicherweise defekt? Widerstand ist zw. D und V++ und wird mit 5V versorgt. mfg
Hi, siehst Du gar nichts am Bus? Die Reset sequence wird vom Controller erzeugt, nicht vom DS18B20. PS: Schau mal ins Datenblatt, da ist schoen beschrieben, wie der reset + precence pulse (der kommt von DS18B20) aussehen muss. Gruss, rweber
zwischen der Datenleitung und Masse erkenne ich nichts, außer die 5V. Zwischen wo muss ich am µC messen, damit ich die precence puls erhalte?
Peter K. wrote: > zwischen der Datenleitung und Masse erkenne ich nichts, außer die 5V. > Zwischen wo muss ich am µC messen, damit ich die precence puls erhalte? Der 1-Wire Bus heist deshalb 1-Wire, weil sich alles auf nur einer Leitung abspielt. Also müsstest du wohl auf dieser einen Leitung die Pulse sehen.
Ja schon klar, aber das Oszi hat mal 2 Anschlüsse, zwischen wo sollte ich denn sonst messen, damit ich etwas sehe?
Stimmt dieser Codeteil?: #define MAX_DEVICES 8 /* DS1820 ROM CODE */ unsigned char rom_codes[MAX_DEVICES][9]; /* Wird überprüft wieviele DS1820 Sensoren entdeckt wurden */ devices=w1_search(0xf0,rom_codes); sprintf(lcd_buffer,"%u DS18S20\nAnzahl aktiv",devices);
Habe ich den DS1820 wie folgt richtig angeschlossen? V++... 5V Masse und zwischen Datenleitung und V++ ist der Widerstand 4,7k Datenleitung geht auf PORTA/6
>Am Oszi kann ich zwischen Datenleitung und Masse die 5V ablesen. Sonst >tut sich nichts. Keine Änderung des Signals. zeigt Dein Oszi zwischenzeitlich etwas auf der datenleitung an?
Habe jetzt den Code geschrieben: #include <mega8515.h> #include <delay.h> #include <math.h> #include <stdio.h> #include <stdlib.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=0 #endasm #include <1wire.h> // DS1820 Temperature Sensor functions #include <ds1820.h> #define MAX_DEVICES 8 unsigned char rom_code[MAX_DEVICES][9]; // Declare your global variables here void main(void) { unsigned char i,j,devices; int temp; w1_init(); UCSRA=0x00; //baud rate...übertragung RS2/32 UCSRB=0x08; UBRRL=0x33; w1_init(); while (1) { // for(i=0;i<2;) // { temp=ds1820_temperature_10(&rom_code[i][0]); j='+'; if(temp<0) { j='-'; temp=-temp; } printf("t%-u=%c%-i.%-u\xf8C\n\r",++i,j,temp/10,abs(temp%10)); // } }; } Bekomme nun am Display den Wert: -999.9 sonst nichts. Kann mir jemand bitte helfen? mfg
Bitte um dringenden Rat: Clock wurde auf 8 MHz eingestellt! Weiß keiner was hier los ist?
Kannst du den Compiler wechseln? In der Codesammlung gibt es DS1820 Routinen vom Peter Dannegger für den gcc. Hab den Code neulich mal gebraucht. Hat auf Anhieb funktioniert. Dass dein Oszi völlig ruhig ist macht mich stutzig, da ja eigentlich der AVR die Kommunikation initiiert und dabei den Pin auf 0 runterzieht. Das hier
1 | // 1 Wire Bus functions
|
2 | #asm
|
3 | .equ __w1_port=0x18 ;PORTB |
4 | .equ __w1_bit=0 |
5 | #endasm
|
6 | #include <1wire.h> |
gefällt mir überhaupt nicht. Hast du 3-mal kontrolliert ob PORTB wirklich auf der Adresse 0x18 liegt? PS: Weiter oben war es noch PORTA auf 0x18. Also irgendwas stimmt da nicht.
Also das mit dem Port müsste stimmen, da CodeVision den Port selbst zuweist wenn man PortB klickt. Bei PortA würde stehen: #asm .equ __w1_port=0x1B ;PORTA .equ __w1_bit=0 #endasm ------------------------------------------------------- Angeschlossen ist ja der DS1820 wohl richtig oder? V++... 5V GND... Masse DQ.... auf PortB - Bit0 Zwischen V++ und DQ ist ein Widerstadn 4,7k
Peter K. schrieb: > Angeschlossen ist ja der DS1820 wohl richtig oder? > > V++... 5V > GND... Masse > DQ.... auf PortB - Bit0 > > Zwischen V++ und DQ ist ein Widerstadn 4,7k Ja. Ausser das du den falschen realen Pin an die falsche Leitung anschliesst, kann da nicht viel schief gehen. Klemm mal den DS ab und sieh mit dem Oszi nach, ob sich am Pin was tut. Der Prozessor muss den Pin nach Masse ziehen um dem DS mitzuteilen: Jetzt gehts los. Wenn du das nicht siehst, bist du eventuell am falschen Prozessorpin (solls auch schon gegeben haben, dass man sich mit den Pins verzählt)
Braucht man den unbedingt? Habe ihn weggelassen und dann wird mir -999.9C angezeigt, was anscheinend auf einen Hardwarefehler rückschließen lässt!?
Peter K. schrieb:
> Braucht man den unbedingt?
Was denkst du wohl, wozu man in
1 | temp=ds1820_temperature_10(&rom_code[i][0]); |
den rom_code angibt. Und was ist eigentlich dieser rom_code? (Hinweis: wie denkst du werden mehrere DS1820 an ein und derselben Leitung unterschieden?) Und wenn man diesen rom_code schon benötigt, damit auch der richtige DS angesprochen wird, wo wird man den dann her kriegen? Und jetzt schaust du dir mal an, was w1_search macht :-)
In diesem Sinne fehlt mir dann in deinem zuallererst geposteten Programm ganz oben der Aufruf von w1_init()
Ich verwende ja nur einen DS1820. Habe nun den Code: devices=w1_search(0xf0,rom_code); printf("%-u DEVICE(S) DETECTED\n\r",devices); wieder eingefügt. Nun wird mir 0 Devices detected angezeigt!
Peter K. schrieb:
> Ich verwende ja nur einen DS1820.
Das ist aber deiner Library egal.
Die ist darauf ausgelegt maximal MAX_DEVICES Stück an einer Leitung zu
verwalten.
Und nein: DU musst nach den Regeln der Library spielen und nicht
umgekehrt.
Ja habe es nun so gemacht. wenn ich w1_init() einfüge bekomme ich gar nichts mehr am bildschirm angezeigt.
Chip type : ATmega8515 Program type : Application Clock frequency : 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 128 *****************************************************/ #include <mega8515.h> #include <delay.h> #include <math.h> #include <stdio.h> #include <stdlib.h> // 1 Wire Bus functions #asm .equ __w1_port=0x18 ;PORTB .equ __w1_bit=0 #endasm #include <1wire.h> // DS1820 Temperature Sensor functions #include <ds1820.h> #define MAX_DEVICES 8 unsigned char rom_code[MAX_DEVICES][9]; // Declare your global variables here void main(void) { unsigned char i,j,devices; int temp; UCSRA=0x00; //baud rate...übertragung RS2/32 UCSRB=0x08; UBRRL=0x33; devices=w1_search(0xf0,rom_code); printf("%-u DEVICE(S) DETECTED\n\r",devices); // 1 Wire Bus initialization w1_init(); while (1) { for(i=0;i<devices;) { temp=ds1820_temperature_10(&rom_code[i][0]); j='+'; if(temp<0) { j='-'; temp=-temp; } printf("t%-u=%c%-i.%-u\xf8C\n\r",++i,j,temp/10,abs(temp%10)); } }; } Das ist nun der Code mit dem was noch gefehlt hat!
Noch mal: Wenn du nur minimalen Code hast int main() { w1_init(); while( 1 ) w1_search(0xf0,rom_code); } dann muss der Pin, den du auserkoren hast, regelmässig auf 0 gezogen werden. Wenn dem nicht so ist, dann * bist du am falschen Pin * oder hast irgendein anderes Hardware Problem * oder die Lib hat nicht verstanden an welchem Pin sie die 1-Wire Kommunikation aufbauen soll Das sind deine Ansatzpunkte. Und solange du am Oszi nicht siehst, wie der von dir angegebene Pin auf 0 gezogen wird, hat es keinen Sinn sich über was anderes auch nur Gedanken zu machen. (*) Und zum testen würd ich den DS1820 mal abhängen, den 4k7 Widerstand aber am Portpin belassen. (*) Es könnte im Minimalprogramm auch noch ein anderer Aufruf fehlen, ich kenn weder den Compiler noch die dort verwendeten w1 Funktionen. Allerdings erscheint mir eine Sequenz zuerst das 1-Wire Modul initialisieren dann nach vorhandenen Geräten suchen als ziemlich logische Vorgehensweise. Ob das so stimmt, steht sicher auch in der Doku deines Compilers.
* bist du am falschen Pin * oder hast irgendein anderes Hardware Problem * oder die Lib hat nicht verstanden an welchem Pin sie die 1-Wire Punkt 1 und 3 sind ja denk ich die gleichen und bin mir 100% sicher dass es der richtige Pin ist! Die Hardware kann ich leider nicht ausschließen...
Peter K. schrieb:
> Die Hardware kann ich leider nicht ausschließen...
Dann schreib dir ein Testprogramm, welches am Port B, Pin 0 einfach mal
den Pin toggelt. Die 3 Minuten wirst du ja wohl haben
int main()
{
DDRB = 0xFF;
while( 1 ) {
PORTB = 0x00;
PORTB = 0x01;
}
}
lass es laufen und schon siehst du auf deinem Oszi, ob an diesem Pin
Pulse rauskommen oder nicht. Wenn nicht -> Hardware defekt oder Oszi am
falschen Pin angeklemmt oder überhaupt Oszi falsch angeklemmt.
Das habe ich gerade geschrieben. Messen tu ich zwischen GND und PORTB/0... Messe die 5V konst.
Wenn ich einen anderen Port verwende / Bit dann schwingt es am Oszi nur auf diesem Bit bleibt es auf 5V konst
>Wenn ich einen anderen Port verwende / Bit dann schwingt es am Oszi nur >auf diesem Bit bleibt es auf 5V konst --> Ferndiagnose: Fehler gefunden dann häng doch den DS1820 zunächst an einen funktionstüchtigen PIN und prüfe mit dem Oszi was geschieht
Verwendet wird der Mega8515, könnte etwas mit dem takten nicht stimmen, habe im CodeVision die 8MHz eingestellt?
>Wenn ich einen anderen Port verwende / Bit dann schwingt es am Oszi nur >auf diesem Bit bleibt es auf 5V konst >Habe auch schon einen anderen Pin verwendet, passiert aber überall das >gleiche. was denn nun, reagiert ein Ausgang oder nicht?
Wenn ich igendeinen Port im CodeVision definiere und dort nun messe, werden mir immer die 5V konst. angezeigt. Die anderen schwingen herum.
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.