Forum: Mikrocontroller und Digitale Elektronik DS18s20 Probleme mit Timer 8051


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von javaFlo (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin gerade mit ein paar Klassenkameraden dabei den Temperatursensor 
DS18s20 in C zu programmieren. Wir ollen die warte Zeiten mit Hilfe des 
Timerinterrupt lösen, allerdings springt er aus folgender Schleife nicht 
mehr heraus:
void warten(int z)
{
  TR0 = 0;
  TH0=warteZeitH[z];
  TL0=warteZeitL[z];
  //ET0=1;
  flag = 0;
  TR0 = 1;
  P0 = 0x08;//debugging
    while(flag ==0)    //Der Mikrocontroller springt aus dieser schleife nicht herraus.
    {    //warteschleife
       P0=0x14;
    }
  TR0=0;    //Timer wieder beenden
  P0=0x25;//debugging
}
Die Sachen die auf P0 ausgegeben werden, sind nur für uns zur 
Überprüfung. Die Variable "flag" wird sobald der Timerinterrupt auslöst 
auf "1" gesetzt uns somit sollte der Mikrocontroller die while-Schleife 
beenden, leider passiert dies nicht.

hier die Interruptfunktion:
void interruptAusloesen(void) interrupt 1
{
  flag = 1;
  P0 = 0x80;//debugging
  //TR0 = 0;
}
Des läuft alles auf einem at89c5131, hoffentlich kann uns jemand helfen.

PS: Die meisten Beiträge die ich gefunden habe, sagen das man die 
Methode _delay_us(); benutzen soll, allerdings wissen wir nicht wie man 
auf diese zu greifen kann. Muss man dafür eine Header Datei einbinden? 
Ich hab die .c Datei auch mit Angehängt

Gruß flo

: Bearbeitet durch Moderator
von Godot (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>Wir ollen die warte

Bin gleich da, meine Alterchen!

von RedLine (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Godot schrieb:
> Bin gleich da, meine Alterchen!

Dem ist nichts mehr hinzuzufügen.

von javaFlo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Entschuldigung für meine Rechtschreibung, leider habe ich gerade andere 
Sachen im Kopf, weswegen ich nicht darauf achte =)

Aber trotzdem wäre eine Antwort auf meine Frage besser als die Korrektur 
meines Post's

Gruß Flo

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
na dann setz mal ein volatile vor die Variable
volatile unsigned char flag;

FAQ: Was hat es mit volatile auf sich

: Bearbeitet durch Moderator
von javaFlo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also hab des FAQ durch gelesen, und so weit auch eigentlich verstanden 
allerdings macht der trotzdem nichts, der bleibt ständig in der Schleife 
( seh ich daran, das an P0 die Bitkombi 0x14 ausgegeben wird).

Sollte ich dann wirklich versuchen mit der Delay_us() Methode zu 
arbeiten? Wenn ja, woher bekomm ich die ?

Gruß Flo

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
Im Prinzip könntest du das tun.
Allerdings ist es vernünftig, dem ganzen auf den Grund zu gehen.
Wird denn die Interrupt Routine überhaupt angesprungen?
void interruptAusloesen(void) interrupt 1
{
  flag = 1;
  P0 = 0x80;//debugging
  //TR0 = 0;
}

imho ist es nicht sehr vernünftig, dem P0 jeweils als ganzes etwas 
zuzuweisen. Damit sieht man recht schlecht, ob und was da passiert, weil 
diverse Codestellen, sich jeweils den P0 gegenseitig überschreiben.

Ihr solltet eure LED-Spielchen lieber mit einer Oder-Operation machen, 
die bereits gesetzte Bits dann eben nicht zwangsweise auf 0 zurücksetzt.
void interruptAusloesen(void) interrupt 1
{
  flag = 1;
  P0 |= 0x80;//debugging
  //TR0 = 0;
}

bzw. in der Wartefunktion dann ebenfalls mittels Oder die entsprechenden 
Bits setzen, damit die wieder nicht das gesetzte Bit aus der Interrupt 
Routine zurücksetzen.
...
  P0 = 0x08;//debugging

  flag = 0;
  TR0 = 1;
  while(flag ==0)    //Der Mikrocontroller springt aus dieser schleife nicht herraus.
  {    //warteschleife
    P0 |= 0x14;
  }
  TR0=0;    //Timer wieder beenden
  P0 = 0x25;//debugging
...


Wir der Interrupt ausgelöst oder nicht?

Wenn du die Variable volatile geacht hast, der Interrupt auch ausgelöst 
wird, die ISR angesprungen wird, du alles neu übersetzt und gebrannt 
hast, und der Timer dann auch noch in der richtigen Geschwindigkeit 
arbeitet, dann gibt es keinen Grund, warum das nicht funktionieren 
sollte.

: Bearbeitet durch Moderator
von Doktor Breen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
javaFlo schrieb:
> Sollte ich dann wirklich versuchen mit der Delay_us() Methode zu
> arbeiten? Wenn ja, woher bekomm ich die ?

Die steht in der Dokumentation, sollte Seite 124 sein?

von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
Wo wird denn warten() in main() aufgerufen? Wenn du Ausgaben auf einem 
Port siehst, hast du ein anderes Programm am Wickel als du uns hier 
zeigst.

von Kevin Groß (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Doktor Breen schrieb:
>> Sollte ich dann wirklich versuchen mit der Delay_us() Methode zu
>> arbeiten? Wenn ja, woher bekomm ich die ?
>
> Die steht in der Dokumentation, sollte Seite 124 sein?

Das ist richtig.

Georg G. schrieb:
> Wo wird denn warten() in main() aufgerufen? Wenn du Ausgaben auf einem
> Port siehst, hast du ein anderes Programm am Wickel als du uns hier
> zeigst.

Auch das ist richtig.

Les das mal durch ;)

von javaFlo (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also der Interrupt der des gesamte Programm startet (also eine Messung 
durchführt) wird über den Druckschalter P3.2 ausgelöst und der starte 
dann ne Methode welche die Warte-Methode aufruft und in der wird der 
Tmerinterrupt gestartet.
Der Start-Interrupt funktioniert ganz normal, nur der Timer läuft nicht 
über und wird somit nicht ausgelöst.

Falls es Hilft: es ist ein 16 Bit timer und die jeweiligen Wartezeiten 
hab ich in nem Array abgespeichert also die Zeit sollte stimmen, aber 
ich hab des Gefühl er startet den Timer nicht mal.

von Karl H. (kbuchegg) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
javaFlo schrieb:

> Falls es Hilft: es ist ein 16 Bit timer und die jeweiligen Wartezeiten
> hab ich in nem Array abgespeichert also die Zeit sollte stimmen, aber
> ich hab des Gefühl er startet den Timer nicht mal.

"Ich habe das Gefühl" ist ein ganz schlechter Ratgeber.
Tut er es oder tut er es nicht?

Wenn es nicht klar ersichtlich ist, dann muss man eben mit einem eigenen 
Testprogramm rausfinden, wie es wirklich geht.

von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
Nochmals, ganz langsam geschrieben: Zeig uns das Programm, das du 
verwendest. Der Code am Anfang des Thread startet weder den Timer noch 
geht er in die Warteschleife. Der kann nicht funktionieren.

von Kevin Groß (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hast du den ganzen Code mal da? Das ist ja sehr unvollständig hier. 
nich von dem was da ist wird aufgerufen :)

von Dieter Klausens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also ich sag mal das das so nicht so einfach zu machen ist. Ich würde 
keinen MOD 16 Timer verwenden, sondern mit einem Interrupt das lösen.

Oder hab ich da was falsch verstanden?

Grüße

Dieter

von Ulrich (Gast)


Bewertung
-3 lesenswert
nicht lesenswert
Hallo Florian,
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent 
consequat, libero dapibus pretium iaculis, lacus nisl pretium libero, 
sit amet placerat sem sem sed odio. Sed pulvinar vitae enim quis 
rhoncus. Sed eget ipsum lectus. Nunc vel nulla id arcu iaculis fringilla 
non nec dui. Nulla facilisi. Quisque consectetur leo non libero 
faucibus, ac condimentum est rutrum. Morbi malesuada vel tellus sed 
porttitor. Nullam vitae volutpat leo, vitae fermentum turpis. Duis odio 
felis, tincidunt in purus non, convallis mollis tortor. Fusce pulvinar 
diam a facilisis placerat.

Curabitur faucibus posuere erat, sed semper elit lacinia vitae. 
Phasellus sed purus in leo iaculis volutpat quis a sem. Maecenas non 
elementum metus, vitae viverra enim. Aliquam tristique nulla id luctus 
commodo. Aliquam rutrum nibh sit amet nunc pulvinar, sit amet eleifend 
diam dictum. In ultrices eget magna non tempor. In dapibus, tellus non 
scelerisque rhoncus, felis turpis feugiat tortor, ut rutrum erat metus 
quis risus. Fusce nec tellus malesuada, rutrum justo sit amet, 
vestibulum elit. Vestibulum eleifend cursus lectus vel porta. Vestibulum 
ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia 
Curae; Proin nec nulla sapien. Morbi sit amet ultrices justo.

Quisque nec justo sit amet nisi iaculis interdum. Curabitur tortor enim, 
lobortis sed diam eget, tempus luctus eros. Aenean ultrices tellus sed 
tellus rhoncus, nec mattis augue ultricies. Maecenas sed ultrices nunc. 
Donec iaculis felis nec sem egestas, in fringilla orci eleifend. Nunc 
dapibus, lectus faucibus venenatis suscipit, diam sapien lacinia mi, vel 
blandit ipsum nunc in augue. Donec pulvinar lorem id bibendum ultrices. 
Mauris massa nibh, ultricies eget euismod sit amet, rhoncus vel turpis. 
Nullam sit amet congue neque. Nulla consequat sit amet mi ac rhoncus. 
Nulla semper ullamcorper lacus, eu porta velit egestas nec. Vivamus quis 
lectus lobortis, lacinia enim id, viverra arcu. Cras diam arcu, eleifend 
eget tempor varius, vulputate a urna.

Morbi lacinia, metus et tristique vestibulum, erat quam consectetur 
nisl, eu auctor arcu magna vel orci. Donec ante ipsum, blandit nec est 
in, blandit rhoncus urna. Mauris lectus ipsum, suscipit non massa at, 
suscipit elementum massa. Donec nulla metus, tincidunt ut pulvinar quis, 
semper quis libero. Cum sociis natoque penatibus et magnis dis 
parturient montes, nascetur ridiculus mus. Morbi cursus luctus 
hendrerit. Phasellus tincidunt justo vulputate tempor imperdiet. Aliquam 
semper massa est, eu luctus mi varius vel. Duis ultricies pulvinar 
dignissim. Pellentesque sed tellus ut dui ultrices tristique.

Nulla in condimentum sem. Pellentesque vel imperdiet neque, id porta 
ante. Nam quis hendrerit massa. In tempus erat eget diam sodales, eu 
pharetra eros congue. Nulla ut erat ut tortor ultricies bibendum 
ultrices ut leo. Donec semper est sit amet est congue molestie. Vivamus 
interdum ultrices massa dictum lacinia. Cras vulputate purus et erat 
tempor, malesuada venenatis libero consectetur. Proin lobortis neque non 
nulla venenatis adipiscing. Integer vitae odio consectetur, commodo 
lorem nec, viverra diam. Duis lacinia est nec sagittis placerat. Integer 
velit augue, accumsan a augue sed, sollicitudin condimentum tortor.

Aenean tellus nulla, ornare quis dolor eget, iaculis mattis lorem. 
Suspendisse mattis libero quis magna ultrices, sed cursus massa feugiat. 
Pellentesque imperdiet pellentesque ipsum, et feugiat felis. Duis nibh 
mauris, convallis ac massa nec, condimentum tincidunt orci. Curabitur 
nunc sapien, egestas a leo sed, venenatis ultricies neque. Phasellus 
laoreet quam sem, vel aliquam ligula lobortis eu. Sed tempus nibh nunc, 
sed vestibulum orci tincidunt a. Donec diam ante, bibendum mattis risus 
placerat, rhoncus ultrices erat. Ut vitae metus vel elit feugiat 
fringilla. In consectetur justo pharetra, viverra augue at, porta massa. 
Pellentesque sed imperdiet lorem, non ultrices purus.

Sed pretium posuere urna, sit amet bibendum felis convallis a. Nulla 
tempus at orci et convallis. Ut vehicula ante interdum tristique 
volutpat. Cras sodales laoreet blandit. Proin iaculis diam quis 
vulputate laoreet. Pellentesque eu lorem tortor. Aliquam erat volutpat. 
Integer quis odio sit amet lectus consequat egestas. In venenatis 
dapibus nisi sed varius. Morbi eu ipsum scelerisque, ultrices neque at, 
tristique magna. Vestibulum mollis et ligula sit amet gravida. Sed 
pulvinar luctus velit, ut dignissim turpis tempor id. Cras ullamcorper 
sagittis dapibus. Mauris ultricies leo porta molestie malesuada. Nullam 
ut urna rutrum, sodales odio eget, facilisis erat.

Vivamus congue nulla lobortis faucibus ultricies. Sed cursus viverra 
mollis. Mauris elit tellus, gravida a bibendum nec, interdum vel ligula. 
Mauris vulputate vulputate orci sed varius. Vivamus arcu orci, fringilla 
vitae nibh sit amet, blandit congue felis. Duis ultricies accumsan dui, 
quis viverra ante. Integer vulputate pharetra pharetra. Sed varius nisi 
vel hendrerit ornare. Integer ac lacinia mauris. Vivamus tincidunt 
bibendum fringilla.

Pellentesque ac felis cursus, feugiat libero sit amet, tincidunt tellus. 
Quisque eget fringilla arcu, vel facilisis diam. Lorem ipsum dolor sit 
amet, consectetur adipiscing elit. Mauris a tempus libero. Fusce 
molestie aliquet purus id bibendum. Duis consequat tincidunt bibendum. 
Quisque non neque quis diam porta tempus. Praesent pellentesque neque 
scelerisque, congue diam non, ornare risus. Donec semper massa lorem, 
eget rhoncus tortor vulputate ut. In nunc arcu, tincidunt eu scelerisque 
at, rhoncus non nunc. Integer interdum metus gravida scelerisque 
consequat. Sed gravida nibh pretium sodales tristique. Fusce leo enim, 
auctor ac purus vel, aliquam ultrices diam. Proin pretium ligula urna. 
Nam sagittis justo elit, vitae lacinia tellus volutpat vel. Suspendisse 
rutrum et magna ut tincidunt.

Cras porttitor porta metus vitae elementum. Cras bibendum risus non 
vestibulum sagittis. Curabitur lobortis, magna nec pulvinar aliquet, 
orci ante mollis augue, pharetra pharetra lacus nibh eu augue. Proin 
mauris tellus, dictum et egestas quis, congue sed ipsum. Fusce orci 
sapien, luctus vitae quam vel, tristique faucibus nibh. Etiam tellus 
nisi, imperdiet eu ullamcorper vitae, feugiat in felis. Nunc 
sollicitudin urna sit amet tortor rhoncus, non aliquet nulla 
condimentum. Donec porta, risus ac malesuada ullamcorper, velit mi 
placerat urna, et tristique arcu lectus id quam. Pellentesque massa 
lectus, varius id facilisis sed, aliquet in dolor. Nunc molestie arcu a 
ornare vestibulum. Morbi dui nisi, condimentum consequat euismod vitae, 
elementum in massa. Pellentesque at sem et libero euismod fringilla ac 
et quam.

Mit freundlichen Größen
dein Lehrer Herr Ulrich

von javaFlo (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Kevin Groß schrieb:
> Doktor Breen schrieb:
>>> Sollte ich dann wirklich versuchen mit der Delay_us() Methode zu
>>> arbeiten? Wenn ja, woher bekomm ich die ?
>>
>> Die steht in der Dokumentation, sollte Seite 124 sein?
>
> Das ist richtig.
>
> Georg G. schrieb:
>> Wo wird denn warten() in main() aufgerufen? Wenn du Ausgaben auf einem
>> Port siehst, hast du ein anderes Programm am Wickel als du uns hier
>> zeigst.
>
> Auch das ist richtig.
>
> Les das mal durch ;)

Also in der Main wird des gar nicht aufgerufen, sondern über den 
Interrupt ( die Methode void messungStarten() interrupt 0) startet 
alles, die Main ist einfach ne Endlosscheife.
Und Ausgaben hab ich auf P0 ( wir haben da auf unserem uC 8 LED's) die 
wird auch angezeigt ( sind immer 0xNN zahlen die darauf geschoben 
werden. Hab en Bild angehängt von dem uC und nocheinmal den Code

von Doktor Breen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
> Also in der Main wird des gar nicht aufgerufen, sondern über den
> Interrupt ( die Methode void messungStarten() interrupt 0) startet
> alles, die Main ist einfach ne Endlosscheife.
> Und Ausgaben hab ich auf P0 ( wir haben da auf unserem uC 8 LED's) die
> wird auch angezeigt ( sind immer 0xNN zahlen die darauf geschoben
> werden. Hab en Bild angehängt von dem uC und nocheinmal den Code

Auch das ist richtig.

von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
Und du bist dir sicher, dass dein Prozessor nested Interrupts kann und 
auch die Prioritäten stimmen? Bei den mir bekannten x51 Derivaten geht 
dein Ansatz voll in die Beinkleider.

von Bierponk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Georg G. schrieb:
> die Beinkleider.

Was isch des

von Florian J. (javaflo)


Bewertung
0 lesenswert
nicht lesenswert
Also ja bin mir 100% sicher, da wir den schon im Unterricht bearbeitet 
haben und auch immer nur auf diesen uC programmieren. Zudem hat mein 
Lehrer auch schon einmal das Programm angeschaut und den Fehler leider 
nicht gefunden.

Der Timer hat bis jetzt immer funktioniert.

Gruß Flo

von Dieter Klausens (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Oh, hab bemerkt das meine Aussage falsch war. Das tut mir leid :(

Der Dieta

von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
Florian J. schrieb:
> Der Timer hat bis jetzt immer funktioniert.

Das bezweifele ich auch nicht. Bei den gängigen x51 hat INT0 die höchste 
Priorität (Messung auslösen). Da kann der Timer so oft er will um 
Aufmerksamkeit betteln. Er bekommt keine Chance. Du musst dann schon IP0 
und IP1 passend setzen (vor EA).

von Bierponk (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dieter Klausens schrieb:
> Oh, hab bemerkt das meine Aussage falsch war. Das tut mir leid :(
>
> Der Dieta

Einsicht ist der beste Weg zur Besserung

von Schnelle Schelle (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Esklaiert hier

von Wilhelm F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Also ein Flag im Timer-Interrupt setzen, was in Main erkannt und wieder 
gelöscht wird, geht bei 8051-ern definitiv, oft selbst eingesetzt. Eine 
Delay-Schleife braucht man wirklich nicht.

Ist der Interrupt überhaupt frei gegeben, der Timer im richtigen Mode, 
bzw. alles richtig initialisiert?

von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
Wilhelm, er will nested Interrupts und hat die Prioritäten falsch 
(nicht) gesetzt. Das ist sein Problem.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Georg G. schrieb:
> Bei den mir bekannten x51 Derivaten geht
> dein Ansatz voll in die Beinkleider.

Das müssen dann aber seltsame 8051 sein.

Alle standard 8051 haben mindestens 2 Prioritäten.
Und "IT0 =1;" setzt die des T0 höher.

von Schnelle Schelle (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Georg G. schrieb:
>> Bei den mir bekannten x51 Derivaten geht
>> dein Ansatz voll in die Beinkleider.
>
> Das müssen dann aber seltsame 8051 sein.
>
> Alle standard 8051 haben mindestens 2 Prioritäten.
> Und "IT0 =1;" setzt die des T0 höher.

Diese Aussage stimmt, auch unter Anbetracht der Quelle von Atmel: 
http://pr0gramm.com/#newest/*/113215/201
4/01/6

Eindeutig zu erkennen.

von Florian J. (javaflo)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
also ich konnte das Problem lösen, in dem ich einfach statt nen 
Interrupt ne Polling-Abfrage mach. Klappt super, allerdings gibt mir der 
MasterResetImpuls ne "1" am Datenport zurück. D.h, ich hab anscheinend 
keine Sensoren angeschlossenen.

Ich nehme an ich hab hier en Fehler:

/*Makros*/
#define LAT_DQ          LATAbits.LA4
#define DQ                 PORTAbits.RA4
#define TRIS_DQ         TRISAbits.TRISA4


des ist aus der Anleitung die ich ausn Netz hab. Der setzt den TRIS_DQ 
auf "1" bzw "0" und fragt nachher den Port DQ ab. leider weiß ich nicht 
was dieses "PORTAbits.RA4" bzw. "TRISAbits.TRISA4" bedeutet.

Ich hab den TRIS_DQ als den Datenbus-Anschluss vom Sensor genommen, aber 
was ist dann DQ?

hab wieder neue Dateien angehängt

von Wilhelm F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Georg G. schrieb:

> Wilhelm, er will nested Interrupts und hat die Prioritäten falsch
> (nicht) gesetzt. Das ist sein Problem.

Ach, OK, da hab ich wohl was übersehen, mehr als ein Interrupt. Ohne 
gesetzte Prioritäten werden die Interrupts einfach nacheinander 
abgearbeitet, oder je nach Interruptfrequenz der zweite niedriger 
priorisierte im selben Level gar nie, das müßte ich selbst mal nach 
schauen.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
javaFlo schrieb:
> PS: Die meisten Beiträge die ich gefunden habe, sagen das man die
> Methode _delay_us(); benutzen soll, allerdings wissen wir nicht wie man
> auf diese zu greifen kann.

Das bezieht sich speziell nur auf den AVR-GCC.

Zumindest mein älterer Keil C51 hat auch keine "delay.h".
Das mit dem Timer ist daher schon o.k.
Ist der Mode richtig eingestellt?

Mit den kurzen Zeiten könnte es Probleme geben, dieses ganze Gewusel mit 
den 2 Arrays und dann noch int für chars, könnte zuviel Zeit kosten.

Die Werte in den Arrays kommen mir recht seltsam vor. Laß die Konstanten 
besser den Compiler ausrechnen, d.h. schreib die Formel hin.

von Florian J. (javaflo)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also des ist en 16-Bit Timer : 2^16 = 65535 (mit 0 ) wenn ich zum 
Beispiel 755 uSekunden warten will muss ich rechnen :

x = 65535-755 = 64780 in Hex: 0xFD0C " TH0 = 0xFD; " und  " TL0= 0x0C; " 
daher die zeit =)

soll ich statt in "unsigned char" verwenden?

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Florian J. schrieb:
> /*Makros*/
> #define LAT_DQ          LATAbits.LA4
> #define DQ                 PORTAbits.RA4
> #define TRIS_DQ         TRISAbits.TRISA4

Das war wohl nix, ein 8051 ist kein PIC.

Du mußt schon die Portbeschreibung im richtigen Datenblatt lesen.

von Florian J. (javaflo)


Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Florian J. schrieb:
>> /*Makros*/
>> #define LAT_DQ          LATAbits.LA4
>> #define DQ                 PORTAbits.RA4
>> #define TRIS_DQ         TRISAbits.TRISA4
>
> Das war wohl nix, ein 8051 ist kein PIC.
>
> Du mußt schon die Portbeschreibung im richtigen Datenblatt lesen.

jub, hab blos die Anleitung gefunden und weil wir so etwas im Unterricht 
noch nicht hatte, wollte ich wissen, was sich der Programmierer dabei 
gedacht hat bzw. was er damit definiert? Weil ich muss ja wissen wie ich 
des an meine Anschlüsse anpasst.

Gruß flo

von Georg G. (df2au)


Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Und "IT0 =1;" setzt die des T0 höher.

Und da T0 der auslösende Interrupt ist, kommt dann der Timer nicht mehr 
durch. Deshalb geht es auch mit Polling.

von DirkZ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
javaFlo schrieb:
> Des läuft alles auf einem at89c5131, hoffentlich kann uns jemand helfen.

Googl kaputt? Google liefert bei "DS18s20  8051" als ersten Treffer: 
Beitrag "1-Wire-Bus-Projekt: DS1820  DS18S20  DS2450  DS2408  unter C und 8051"

1-Wire-Projekt-V1_3.zip: Dokumentation und Beispiel-Programme

von Florian J. (javaflo)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Die hatte ich schon (bzw. die neuere Version V1_1_2 ) und habe vom 
Aufbau das gleiche gemacht, bis auf das Warten-Programm.

Trotzdem geht des nicht bei mir. Ich bekomm zwar auch vom MRI zurück, 
dass sich ein Slave an dem Anschluss befindet, aber wenn ich versuch die 
Temperatur auszulesen, gibt er immer ne 0 zurück... Kann ich iwie Testen 
wo mein Fehler liegt? Zum Beispiel ob die Warte-Schleife zu lange geht?

Neuste Datei wieder angehängt, hab nur die meisten Debugging Sachen raus 
gemacht (da wo ich iwas auf P0 schieb)

Gruß flo

: Bearbeitet durch User
von Wilhelm F. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Florian J. schrieb:

> Die hatte ich schon (bzw. die neuere Version V1_1_2 )

Hauptsache, du kennst dich schon mit Verionsnumerierungen aus. Das ist 
so überhaupt das allerwichtigste, was es gibt. ;-)

von Florian J. (javaflo)


Bewertung
0 lesenswert
nicht lesenswert
Wilhelm F. schrieb:
> Florian J. schrieb:
>
>> Die hatte ich schon (bzw. die neuere Version V1_1_2 )
>
> Hauptsache, du kennst dich schon mit Verionsnumerierungen aus. Das ist
> so überhaupt das allerwichtigste, was es gibt. ;-)

Nee hab nur nochmal nach geschaut, weil hätte ja sein können, dass die 
in der neueren Version welche Fehler behoben haben =)

von Ladeluftkühler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Florian J. schrieb:
> Wilhelm F. schrieb:
>> Florian J. schrieb:
>>
>>> Die hatte ich schon (bzw. die neuere Version V1_1_2 )
>>
>> Hauptsache, du kennst dich schon mit Verionsnumerierungen aus. Das ist
>> so überhaupt das allerwichtigste, was es gibt. ;-)
>
> Nee hab nur nochmal nach geschaut, weil hätte ja sein können, dass die
> in der neueren Version welche Fehler behoben haben =)

Das funktioniert so nicht;, aber andersrum gesehen funktioniert es auch 
nicht.
Versuch mal, die JEN..LA4 zu implementieren?

von Johann (Gast)


Bewertung
-3 lesenswert
nicht lesenswert
Herzlich Willkommen bei Lafer, Lichter Lecker der Rezeptfreien 
Kochschule ja,

viele Leute sagen er ist plemplem, ich sage, herzlich Wilkommen Herr 
JavaFlo hallo ja.

Mein Lieber Herr JavaFlo heute gibt es, ja, eine superleckere Topo popo 
Natursuppe mit papanierten Garnelen zatatatates und karamelisierten 
Scharloten ist das was, jaa!

Aber ich Koche Heute nicht alleine ja, mein lieber Horst, bist du auch 
da ?


Gruß Johann Lafer

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Georg G. schrieb:
> Und da T0 der auslösende Interrupt ist, kommt dann der Timer nicht mehr
> durch.

Hä?

T0 = Timer 0.

Auslöser ist aber EX0.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Florian J. schrieb:
> Kann ich iwie Testen
> wo mein Fehler liegt? Zum Beispiel ob die Warte-Schleife zu lange geht?

Mal im Simulator laufen lassen und sich die Zyklen oder µs anzeigen 
lassen.

von Peter D. (peda)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei mal ein Codebeispiel.

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
An die Leute, die hier unbedingt ihren Müll abladen müssen:
Habt ihr nichts besseres zu tun, als das Forum in den Dreck zu ziehen?

von MatheProfi (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo Florian

Hast du es schonmal mit Java versucht?
Du musst nur die Scanner-Klasse über "import java.util.Scanner;" 
importieren und schon kannst du den Sensor einfach mit "TempSensor 
myTempSensor = new TempSensor(new Scanner());" abfragen.

Ich hoffe das hilft, Grüße

der MatheProfi

von Ladeluftkühler (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
MatheProfi schrieb:
> Hallo Florian
>
> Hast du es schonmal mit Java versucht?
> Du musst nur die Scanner-Klasse über "import java.util.Scanner;"
> importieren und schon kannst du den Sensor einfach mit "TempSensor
> myTempSensor = new TempSensor(new Scanner());" abfragen.
>
> Ich hoffe das hilft, Grüße
>
> der MatheProfi


Java ist hier nicht zielführend.

Schau doch mal auf www.pearl.de nach, da bekommst du für 20€ Einen 
Infrarotlasergrill-Thermometer, das dir bis 550 Grad Celsius die 
Temperatur anzeigt. Ohne Timer und den nervigen C5131. Und der von Pearl 
ist Wasserdicht und kommt mit einer rostfreien Edelstahlhalterung :)

von Florian J. (javaflo)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
also nachdem wir die Zeiten etwa auf us angepasst haben und es trotzdem 
nicht funktioniert, kann der Fehler meiner Meinung nach nur noch bei 
folgender Definition legen: Die Anleitung macht folgendes:

#define DQ              PORTAbits.RA4
#define TRIS_DQ         TRISAbits.TRISA4

Die setzen den TRIS_DQ auf "0" bzw. "1" aber lesen den DQ aus, wir haben 
des alles über den Port P1_1, auf den er Sensor angeschlossen ist.

Was definieren die da? Und wie muss ich des übernehmen? weil anscheinend 
kann ich des ja nicht über den gleichen Port machen oder?

von Derp (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Ladeluftkühler schrieb:
> Java ist hier nicht zielführend.
>
> Schau doch mal auf www.pearl.de nach, da bekommst du für 20€ Einen
> Infrarotlasergrill-Thermometer, das dir bis 550 Grad Celsius die
> Temperatur anzeigt. Ohne Timer und den nervigen C5131. Und der von Pearl
> ist Wasserdicht und kommt mit einer rostfreien Edelstahlhalterung :)

Das ist ABSOLUT KORREKT

von Patrick J. (ho-bit-hun-ter)


Bewertung
0 lesenswert
nicht lesenswert
DAS ist absolut ALT und der Jung wohl auch schon aus der Schule draußen 
...

von Bernhard S. (b_spitzer)


Bewertung
-1 lesenswert
nicht lesenswert
Peter D. schrieb:
> Alle standard 8051 haben mindestens 2 Prioritäten.
> Und "IT0 =1;" setzt die des T0 höher.
Der letzte Beitrag ist zwar schon etwas her, aber das kann ich nicht 
stehen lassen.
Mit IT0=1; wird der externe Interrupt 0 auf fallende Flanke 
konfiguriert. Die Priorität würde mit PX0=1; erhöht. Wenn (wie beim 
AT89C5131) 4 Prioritäts-Ebenen möglich sind, kann man das niederwertige 
Bit aus IPL0 einzeln setzen (Register ist Bitadressierbar). Die Bits in 
IPH0, IPL1 und IPH1 muss man über Maskierung setzen.

Meiner Meinung nach liegt das Hauptproblem im letzten geposteten Code an 
2 Stellen:
void main(void)
{
  //Interrupts deklarieren

  EA=1;
  
  IT0 =1;
  EX0 =1;      // Externer Interupt0 ist aktiviert, es fehlt aber die ISR
  ET0 = 1;
  TMOD =0x01;
  
  while(1)
  {
    if(P3_1==0)// P3_1 ist die TxD-Leitung der seriellen Schnittstelle.
    {          // da hat kein Entwicklungsboard der Welt einen Eingang.
      messungStarten();  // daher dürfte das hier nie aufgerufen werden
    }
    
      
  }
}
.. just my 2 cents...

: Bearbeitet durch User
von Jim M. (turboj)


Bewertung
-1 lesenswert
nicht lesenswert
Bernhard S. schrieb:
> P3_1 ist die TxD-Leitung der seriellen Schnittstelle.
>     {          // da hat kein Entwicklungsboard der Welt einen Eingang.

Bei 8051 kann man IIRC jeden Port Pin auch als Eingang benutzen, die 
sind nämlich per default nur Open Drain.

von Bernhard S. (b_spitzer)


Bewertung
0 lesenswert
nicht lesenswert
Jim M. schrieb:
> Bei 8051 kann man IIRC jeden Port Pin auch als Eingang benutzen, die
> sind nämlich per default nur Open Drain.
Das schon. Aber ich glaube nicht, dass jemand ein Entwicklungsboard für 
Schüler aufbaut und den Pin P3_1 (und P3_0) für beliebige IO nutzt.
Hiermit verbaut man sich eine einfache Debugmöglicheit über die serielle 
Schnittstelle.
Der Fragsteller war ja Schüler und hat vermutlich den falschen Portpin 
abgefragt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.