Hallo liebe Gemeinde, ich versuche mit folgendem Code einen DS18B20 auszulesen! Leider erhalte ich immer eine Ausgabe von 1111 1111 1111 1111 ! Der Sensor ist per +5V, 1-Wire-Bus mit 4,7k an +5V und GND angeschlossen. Der 1-Wire Bus ist an PA7 angeschlossen! uC ist ein ATmega 16, mit internem Takt 1Mhz betrieben Wäre super wenn jemand einen Tipp hat! Gruß Fabian
Echt keiner eine Idee?
Ich habe es mit der lcd-routines.asm aus dem AVR-Tutorial im Simulator laufen lassen. Die doppelte Definition von r22/r23 habe ich bereinigt. 1/ Wesentlicher Bug in sensor.asm: ConT läuft in SendScratchpad weil ein ret fehlt. Es sieht auch so aus, als ob du an der Stelle das Original geändert hast. 2/ Nachsehen: Hast du die Wartezeiten selbst implementiert? Die sind etwas ungenau: Soll/ist 480/487 10/17 58/65 2/9. Weiter habe ich nicht simuliert.
Danke, ich werde es gleich mal probieren! Womit hast du das ganze simuliert?
> Womit hast du das ganze simuliert? AVR Studio. Weitere siehe AVR-Simulation. Du musst es nur schaffen, dein Programm in den Simulator reinzuschaffen und dass es Funktionen für Step (Einzelschritt) und fürs bequeme Simulieren Step Over (Überspringen wg. der langen Wartefunktionen) dort gibt.
Erstmal vielen Dank für die Tipps, ich kann nun den Sensor auslesen und den Wert Binär auf dem Display ausgeben! Nun habe ich zum Beispiel den Wert: 0000 0010 0101 1110 - was ja 37,875°C laut Datenblatt entspricht. Nun möchte ich eine Verzweigung haben, welche zwischen Über- und Unterschreitung dieser Temperatur entscheidet. Kann mir da noch einmal jemand auf die Sprünge helfen?! Wäre super! Danke Fabian
Sorry ASM debuggen OK, schreiben tue ich es nur, wenn es nicht anders geht :) http://www.mikrocontroller.net/articles/AVR-Tutorial:_Vergleiche http://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung
So, ich habe mich damit noch mal ein wenig auseinandergesetzt! In 8 Bit würde es dann ja ca. so Aussehen, angenommen r16 wäre der gelesene Wert:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
allerdings habe ich ja leider einen Wert von 0000 0010 0101 1110 als "Soll-Wert" und den Wert vom DS18B20 aus "Ist-Wert". Wie kann ich diese beiden nun direkt vergleichen?
Ich denke der CPC Befehl ist dein Freund! Hier aus der Hilfe des AVR Studios: Syntax: Operands: Program Counter: CPC Rd,Rr 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 PC <- PC + 1 Operation: Rd - Rr - C Example:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Du liest ja in r25 das Highbyte und Lowbyte des Sensors ja nacheinander aus. Wenn du freie Register hast, kannst du die füllen und vergleichen. so etwa (ohne Rücksicht auf effiziente Registernutzung!)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
Danke dir, habe eben auch gerade eine funktionierende Lösung geschrieben!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.