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:
1
voidwarten(intz)
2
{
3
TR0=0;
4
TH0=warteZeitH[z];
5
TL0=warteZeitL[z];
6
//ET0=1;
7
flag=0;
8
TR0=1;
9
P0=0x08;//debugging
10
while(flag==0)//Der Mikrocontroller springt aus dieser schleife nicht herraus.
11
{//warteschleife
12
P0=0x14;
13
}
14
TR0=0;//Timer wieder beenden
15
P0=0x25;//debugging
16
}
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:
1
voidinterruptAusloesen(void)interrupt1
2
{
3
flag=1;
4
P0=0x80;//debugging
5
//TR0 = 0;
6
}
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
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
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
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?
1
voidinterruptAusloesen(void)interrupt1
2
{
3
flag=1;
4
P0=0x80;//debugging
5
//TR0 = 0;
6
}
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.
1
voidinterruptAusloesen(void)interrupt1
2
{
3
flag=1;
4
P0|=0x80;//debugging
5
//TR0 = 0;
6
}
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.
1
...
2
P0=0x08;//debugging
3
4
flag=0;
5
TR0=1;
6
while(flag==0)//Der Mikrocontroller springt aus dieser schleife nicht herraus.
7
{//warteschleife
8
P0|=0x14;
9
}
10
TR0=0;//Timer wieder beenden
11
P0=0x25;//debugging
12
...
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.
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?
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 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.
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.
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.
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
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
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
> 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.
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.
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
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).
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?
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.
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.
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
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.
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.
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?
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.
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
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.
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
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. ;-)
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 =)
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?
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
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.
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
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 :)
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?
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
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:
1
voidmain(void)
2
{
3
//Interrupts deklarieren
4
5
EA=1;
6
7
IT0=1;
8
EX0=1;// Externer Interupt0 ist aktiviert, es fehlt aber die ISR
9
ET0=1;
10
TMOD=0x01;
11
12
while(1)
13
{
14
if(P3_1==0)// P3_1 ist die TxD-Leitung der seriellen Schnittstelle.
15
{// da hat kein Entwicklungsboard der Welt einen Eingang.
16
messungStarten();// daher dürfte das hier nie aufgerufen werden
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.
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.