Anbei das komplette Programm, Schaltplan und die Platine. Die Uhr ist mit Sommerzeit und bis zum 31.12.2099. Das File indexg.htm enthält eine ausführliche Erklärung der Funktion und aller Programmmodule. Außerdem habe ich noch ein paar Praxistips zum einfacheren Programmieren gegeben und ich denke auch recht gut in diesem Programmbeispiel angewendet. Daher könnte dieser Beitrag auch jene interessieren, die nichts mit dem AVR, LCD, 1-Wire, RTC usw. machen wollen. Kommentare und Anregungen sind herzlich wilkommen. Peter
sehr schönes und hauptsache sinnvolles programm; die doku hat mir auch sehr gut gefallen - easy-going, verständlich und doch lernreich! ach ja, das ist bestimmt eine meisterleistung: tiny12 hat 1024bytes rom und das programm belegt exakt 1024bytes :) danke, peter, reife leistung, werde bestimmt etwas davon "klauen" :) nicht böse sein :) emil
@Emil Danke. Das mit den 1024 Bytes täuscht aber. Warscheinlich, weil ich das Calibrationsbyte ans Ende geschrieben habe. Es sind in Wirklichkeit noch etwa 7% (74 Bytes) frei. Peter
Hallo Peter, gerne würde ich diese Schaltung nachbauen (die Hardware ist schon fertig) jedoch zickt das Programm beim compilieren :-( Ich arbeite mit dem AVR Studio 4; die erste Fehlermeldung ist in der Tiny12 Definitionsdatei aufgetreten : ".equ E2END =3F" mag er nicht; ich habe es auf $03F umgeschrieben,bekomme dann aber folgende Fehler : Building project... AVRASM: AVR macro assembler 2.0.28 (build 121 Jan 11 2005 10:28:51) Copyright (C) 1995-2005 ATMEL Corporation C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(20): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\lcdtrtc.h' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\lcdtrtc.h(2): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\tn12def.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\lcdtrtc.h(62): warning: Register r23 already defined by the .DEF directive C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(20): C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\lcdtrtc.h included from here C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\lcdtrtc.h(71): warning: Register r31 already defined by the .DEF directive C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(20): C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\lcdtrtc.h included from here C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(21): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\hardware.h' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(22): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\macro.mac' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(30): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\ovf0int.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(92): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\lcd164.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(93): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\1w_rtc.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(94): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\ds1994.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(95): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\gettime.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(96): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\1wire.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(97): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\outval.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(98): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\disptime.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(99): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\dispwday.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(100): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\dispdate.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(101): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\disptemp.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(102): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\measure.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(104): Including file 'C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\calc12_5.inc' C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\disptime.inc(19): error: Undefined symbol: display_clock_ret C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(98): C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\disptime.inc included from here C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\dispdate.inc(21): error: Undefined symbol: display_date_ret C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(100): C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\dispdate.inc included from here C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\disptemp.inc(35): error: Undefined symbol: display_temp_ret C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(101): C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\disptemp.inc included from here C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\measure.inc(50): error: Undefined symbol: measure_ret C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\2temp.asm(102): C:\Dokumente und Einstellungen\Christian Schumann\Desktop\Temptime\measure.inc included from here Assembly failed, 4 errors, 2 warnings Ich denke du arbeitest mit einem Macroassembler und habe mir schon mal die "ASM" Batch Datei angesehen und die Pfade umgeschrieben; jedoch leider ohne Erfolg ... Bitte hilf mir... sonst muß ich die Hardware entsorgen .... Thanks in advance !! Christian
Ich vermute mal, Du hast irgendwas am Quelltext geändert. Mach mal ein komplettes Listing mit .list und .listmac und schau es Dir in Ruhe an, warum er die Labels nicht findet. Peter
Hallo Peter, sorry to bother you again !! Also erst mal : Geniales, kurzes Programm !! Habe mal das Hex File "gebrannt" und die Hardware spielt einwandfrei; leider nur mit falschem Datum und Uhrzeit da das *.asm file noch immer zickt und auch ich die fehlenden Labels : display_clock_ret display_date_ret display_temp_ret measure_ret in keiner der Include Dateien finden kann; fehlt bei dem Zip_file evtl. eine Datei ?? Ich schwöre dir den Quellcode (noch nicht) verändert zu haben !!! All diese _ret Labels sind die Beendigung von .inc Dateien; die müssten dann ja im *.asm File oder anderen *.inc Dateien auftauchen, oder ?? Ein Freund von mir (mit viel AVR Erfahrung) hat die gleichen Probleme ... Bitte schau dir dein *zip File noch mal an oder maile mir die Datei welche die fehlenden Befehle enthält. 1000 Dank im voraus !!! Christian P.S. ohne vollständige Assemblierung macht mein AVR Studio 4 leider kein *.lst File
Hallo Peter, jetzt läuft's (fast). Das Problem war wohl das Macro File welches vom doofen XP Rechner als Macromedia File interpretiert wurde; habe es dann als *.txt File gespeichert; diverse Sachen damit ausprobiert... anyway; nun wird's gelesen und implementiert. Aber ..... sobald ich versuche das Startdate, Time etc. zu verändern hängt sich das Programm im AVR (anscheinend) auf. Das LCD wird initialisiert und das war's ...die Assemblierung läuft fehlerfrei. Mit den Originaldaten funktioniert's einwandfrei, aber wehe ich ändere ein einziges Parameter ... Hast du da 'ne Erklärung für ?? Muss der RTC erst wieder initalisiert werden wenn er mal mit anderem Datum lief ?? Thanks in advance !! Christian P.S. LCD mit nur drei Ports und einem supergeilem Treiberprogramm; danke !!! Ich werde nie wieder 11 Ports opfern müssen !!!!!
Hallo Peter, sorry ich immer noch...... Also, ich habe die Return-labels manuell so gesetzt wie in deinem listfile; nun funktioniert's 100% ig. Als Magic_key (o.ä) muss man nur nach einer Änderung der Daten eine X-beliebige, aber andere, Zahl als vor der Änderung eingeben; that's it !! Ich habe (leider ohne Erfolg) versucht deinen LCD-Teiber auf einen Mega-8 zu übertragen (4 MHz); ich kann an allen Konstanten "herumschrauben" wie ich will und bekomme einfach die "Enable" Zeit nicht lang genug ... Vielelicht ein Thema für einen anderen Thread ?? Mit 2 Stück 74HCT590 und 16 Bit seriell wobei die ersten 4 bit für den Kontrast, die zweiten 4 Bit für die LED Hintergrundbeleuchtung und die restlichen 8 Bit für das LCD sind ?? Ein Platinenlayout kann ich gerne zur Verfügung stellen .... Oder das LSB als Enable wenn die Bits seriell eingetroffen sind ?? Alles Gute wünscht Christian
Hallo Christian, den Fehler bei ".equ E2END =3F" bekomme ich nicht nur bei diesem Beispiel sondern auch bei anderen Codes, wenn ich AVR-Studio verwende. In diesem Fall hbe ich es mal mit WAVRASM übersetzt und erhalte keinen Fehler. Also liegt es wohl am Assembler- oder ? Gruß Klaus
Hallo Christian und Klaus, daß Problem mit ".equ E2END ..." habe ich gelöst durch Löschen der tn12def.inc. Seit einiger Zeit sind beim AVRStudio Partdefinitionfiles als xml-Dateien eingeführt, die der Assembler automatisch benutzt, wenn die entsprechende ".include" Direktive ge-setzt ist. Danke nochmals an Christian für die Lösung des "ret"-Problems. Hat mir viel Zeit gespart. Unklar ist mir noch die Sache mit dem Magic-Byte. Ich bin nicht so sicher, daß man dieses bei Verwendung anderer Angaben für die Start-zeit nur "irgendwie" ändern muß. Peter D. schreibt, daß es angepaßt werden muß, also stellt sich die Frage nach dem Algoritmus. Hat da schon jemand dran gearbeitet? Gruß Werner
Das Magic ist nur dazu da, damit die CPU weiß, ob die RTC schon gestartet wurde. Wenn es nicht stimmt, wird die im Programm definierte Startzeit geladen und die RTC gestartet. Das Stellen der RTC erfolgt also dadurch, daß man die Uhr zum richtigen Zeitpunkt einschaltet. Will man sie neu stellen, muß man ein anderes Magic nehmen. Man kann sich natürlich auch andere Stellmethoden ausdenken, das sollte ja nur als Beispiel für eigenen Versuche dienen. Peter
Hallo, ich habe mich mit dem Nachbau des Projekts befaßt und möchte hier einige Tipps geben, die Probleme vermeiden helfen können. Zunächst zur Hardware: Die Schaltung wurde 2003 entwickelt. Mittlerweile ist der DS1820 nicht mehr in der Produktion. Als Ersatz dürfte sich der DS18S20 anbieten, der weitgehend kompatibel ist. Ungeeignet ist hingegen der DS18B20, da er einen anderen Aufbau des Temperatur-Registers besitzt. Auch hatte ich Probleme mit der Beschaffung des DS1994 (jedenfalls zu vernünftigen Preisen). Der DS2404 kann hier als Ersatz dienen. Er benötigt einen externen 6pF Quarz. Sodann für Benutzer des Studio4: Beim Assemblieren treten die oben beschriebenen Fehler auf. Also zunächst nur der Fehler mit der tn12def.inc. Wird dieser Fehler korrigiert entweder über ".equ E2END =3F" in "....=$03F" oder durch Löschen der tn12def.inc findet der Assembler die Label display_clock_ret display_date_ret display_temp_ret measure_ret nicht mehr, d.h. er kann die entsprechende Zeile in dem Macro incall in der macro.mac nicht mehr richtig interpretieren. Meine Lösung: Verwendung des tiny13 mit Software-Stack Hierzu: in der init-Routine den Stack lokalisieren Änderung der .include Direktive in tn13.... Das Macro incall löschen in der macro.mac in den Dateien measure.inc etc. die entsprechenden Routinen mit "ret" abschließen in der asm-Datei aus den Makro-Aufrufen rcall-Aufrufe machen Damit funktioniert das Programm dann auch im Studio4 einwandfrei. Allerdings läuft meine RTC cirka 10 Sekunden pro Tag zu schnell, was vielleicht damit zusammen hängt, daß ich entgegen der Spezifikation einen 12,5pF Quarz verwende. PS: Wer im übrigen an den Hintergründen für die Merkwürdigkeiten bei der Abarbeitung des Makros incall interessiert ist, wird vielleicht in der nächsten Zeit hier etwas erfahren können: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=32820 Gruß Werner
Hallo, ich vergaß darauf hinzuweisen, daß die Timer-Register im tiny13 anders bezeichnet sind. Dies ist auch noch zu ändern, wenn man auf diesen Chip umsteigen möchte. Gruß Werner
Hallo, ich werde den Thread mal wiederbeleben. Erstmal danke an Peter für den Code! Ich bin ziemlicher Anfänger und versuche gerade mich da reinzuarbeiten. Ich habe versucht den Code für mich anzupassen. Ich brauche aber nur den 1-wire-Teil. Ich habe versucht, das auf den 1-wire zu beschränken und mit meinem LCD zu kombinieren. Jetzt hab ich das Programm zumindest soweit, daß ich beim Compilieren keine Fehler mehr bekomme und im Sim. siehts auch ganz gut aus(zumindest mal der Anfang). Wenn ich das Programm jedoch in den ATMega16 rüberschiebe, tut sich auf dem Display mal gar nichts. Es läuft noch nicht mal bis zum clear-Befehl, und die Initialation und der clear des LCD funktioniert einzeln, aber nicht in dem kompletten Programm. Ich bin grad ratlos und stelle den Code mal hier rein, vielleicht erbarmt sich ja jemand und schaut sich den mal an... ;-) Vielen Dank schonmal, ->Sanlo
hm... 18 Leute haben sich den Quellcode gezogen, aber keiner schreibt nen Komentar dazu???? Ist mein Code so schlecht, daß es sich nicht lohnt darüber zu schreiben, oder findet keiner einen Fehler? (Ich hab doch sicher einige gemacht) ->Sanlo
also da der Quellcode wohl zu schlecht und keiner Antwort wert war, hab ich die Sache nochmal von vorn angefangen. Jetzt bin ich soweit, dass mir mein LCD "Temp1: 20.0°C" anzeigt, aber der Wert stimmt nicht, und ich bekomme auch keine Änderung der Anzeige bei Temp.änd. Bin grad ein bisschen ratlos, was wohl daran liegt, dass ich PD´s Code nicht vollständig verstehe (z.B. ROM_search ist mir völlig schleierhaft, ich nehms als gegeben und i.O. hin) Ich hoffe, diesmal hat jemand den ein oder anderen Tip. Danke ->Sanlo
Hallo Sanlo, sorry, ich habe seit diesem Projekt keine weiteren AVRs mehr programmiert; Peter's Programm ist super professionell, leider aber nicht wirklich "anfängergeeignet". Ich suche gerade eine Routine für 2 Stück 1-wire Temperatursensoren um eine Differenzmessung machen zu können; d.h. dieses Projekt ohne die Zeitkomponente ... leider fehlt mir auch die Zeit dazu ... Falls mir was am Programm auffällt melde ich mich; falls du 'ne Lösung hast lass es mich bitte wissen. Hang loose Christian
mein Projekt ist ja ohne die Zeitkomponente, und die Voraussetzungen für mehrere DS18s20 sind auch vorhanden. Bei mir soll es dann so aussehen, dass drei Sensoren ausgelesen und angezeigt werden. Zwei davon werden zum Ansteuern eines Ventils verwendet. ( Das wird dann eine Steuerung für eine Solar-Poolheizung) Ich weiß allerdings auch noch nicht, wie ich das dann mit der Hysterese programmiere. Aber jetzt muss erstmal das Auslesen funktionieren, jetzt der eine und danach für alle drei Sensoren. ->Sanlo
@Sanlo, ich kann nur ZIP im Explorer öffnen (kein RAR). Die Quarzfrequenz hast Du angepaßt (max 3,7MHz) ? Bei über 3,7MHz müssen die Warteschleifen in w1_reset angepaßt werden (weiteres Register nehmen). JTAG-Fuses aus ? w1_reset liefert present zurück ? w1_rom_search liefert 00 .. 7F zurück ? Peter
@Peter: habs gezippt... Die Frequenz von 1 Mhz ist bei xtal eingetragen. Dann müsste der Rest so klappen. ups... nachdem ich die JTAG-Fuse ausgeschaltet habe, gibt mein LCD nur noch eine flackernde Anzeige von sich. Die Zeichen aus der Anzeige hüpfen jetzt wild durcheinender. Was w1_reset und w1_rom_rearch zurückgibt weiß ich leider nicht, oder kann man das über die ser. Schnittstelle irgendwie mit Ponyprog auslesen? ->Sanlo
Verdammt! meine Anzeige lässt sich auch durch Rücksetzten auf den vorherigen Zustand vom JTAG nicht wiederherstellen.
hmmm... die 50us Pause in den LCD-Routinen war plötzlich zu kurz. Jetzt klappts wieder. ->Sanlo
"hmmm... die 50us Pause in den LCD-Routinen war plötzlich zu kurz." Plötzlich gibt es nicht, Du must was geändert haben. Versuche herauszufinden, was Du geändert hattest. Dazu ist es sinnvoll bei der Entwicklung z.B. täglich die letzte Version zu sichern (nicht die alte überschreiben !). Versuche mal systematisch vorzugehen. Bringe erstmal das LCD zum laufen, dann eine Funktion zur Zahlenausgabe und dann kannst Du debuggen. D.h. an den Stellen, wo Du etwas bestimmtes erwartest aber etwas falsches vermutest, lasse Dir den Wert ausgeben. Peter
das kuriose ist, daß ich nur JTAG verändert habe und sonst nichts. Vorher ging das LCD super. Ich hänge jetzt grad beim Einlesen. In measure wird die ausgelesene Temp. doch in temp2l und temp2h abgelegt, aber in display_temp ist "z" der Temp.wert. Da gibt es kein temp2l und temp2h??? ->Sanlo
Hi Sanlo, hi Peter, ich finde, dass der Thread sich langsam etwas vom Grundthemaentfernt; inzwischen arbeitet Sanlo auf einem Mega-16 ... Sanlo, schau dir mal bei "avrfreaks.net" Peter's Projekt an: (du mußt dich erst als User anmelden) "Multiple DS18[B]20 on LCD" auf dem Tiny 12; ich denke, dass ist eine gute Grundlage für deine Aufgabe. Es ist ja gerade interessant auf kleinen AVRs große Projekte zu verwirklichen. Ansonsten nutze die Analogports des Mega-16 und gehe einfach mit Thermosensoren drauf ... aber die 1820 sind einfach geiler.. x-cuse my language ! Peter, danke, dass du noch immer Threads bearbeitest !! Viel Spass und gutes Gelingen !! Christian
"aber in display_temp ist "z" der Temp.wert." Nein, ist es nicht ! Z ist nur der Zeiger darauf. Schau Dir mal den LD-Befehl genau an. Zeiger nimmt man immer dann, wenn verschiedene Werte mit der gleichen Funktion bearbeitet werden sollen. Peter
@Peter: also dein Code klingt für mich plausibel, ich kann keinen Fehler finden (hätte mich auch gewundert). Ich hab mit Sicherheit ein Timing-Problem. Ich muss wohl mal irgendwie die Taktfrequenz checken. Rein theoretisch müsste das mit dieser xtal-Formel super funktionieren (wenn ich sie richtig verstanden habe: Zeit in us * Frequenz 1000000 Länge der Schleife(Anzahl Takte). Ich hab auch auf der Befehlsliste nochmal die Anzahl der Takte überprüft, eigentlich müsste es passen. Aber wenn ich das mal als Probe auf die Warteschleifen vom LCD übertrage (50 us), dann ist das viel zu kurz. Ich komme laut Formel 50 * 1000000 / 1000000 /3 gibt 16,67. Ich hab jetzt mal getestet, bis wohin die Schleife zählen muss, um eine stabile Anzeige zu erhalten. Das ist bei 77 Dez, oder 4d hex. Irgendwo ist da der Wurm drin. Die Takteinstellungen im ATMega hab ich auf Standart gelassen. d.h. 1 Mhz interner Oszi. Vielleicht stimmt damit was nicht. Sanlo
so... der ATMega hat irgendwie ne Macke, trotz eingestellter Standart-Werte hat er ne größere Freq.,ich hab zum Glück mehrere davon. Ich hab jetzt einen Neuen genommen und jetzt passt das mit der xtal-Formel. jetzt zeigt er dauernd -110.5 °C an. Das kann ja wohl auch nicht ganz sein... ->Sanlo
aha... der Zeiger ist schuld! Ich hab die Pointeradressen vergessen. Wonach geht man beim Einstellen der Adressen? Welche Werte nimmt man? ->Sanlo
"Wonach geht man beim Einstellen der Adressen? Welche Werte nimmt man?" Na genau die Adresse, wo man vorher den Wert abgelegt hat, den man nun anzeigen will. Schau mal ins *.h-File (temp_ptr). Peter
so jetzt zeigt er eine Temp. an, und wenn ich alle drei Sensoren anschließe bekomme ich nur den letzten Sensor angezeigt (Vermute ich zumindest, da es der mit der längsten Leitung ist. Was muss ich jetzt machen, um alle drei Werte angezeigt zu bekommen? Sorry, daß ich nerve Peter, aber dein Programm ist so komplex, daß ich manche Sachen echt nicht verstehe. Ich hoffe, du hast Mitleid und hilfst mir noch ein bisschen. ;-) Danke, Sanlo
ok teilweise gefunden. Hab in lcd_data den lcd_count nicht hochgezählt. Jetzt hab ich zwei Werte. ...und den dritten krieg ich auch noch... :-) ->Sanlo
ist das Prog nur für 2 Sens. geeignet? Ich hab jetzt zum Testen mal aus display_temp den Teil rauskopiert, der die Temp. anzeigt, also von "get low byte" bis zur Anzeige von "°C". Interessanterweise zeigt er für den dritten Sensor 0.0°C an. Ich glaub, ich werd erstmal den Sensor checken. ->Sanlo
"ist das Prog nur für 2 Sens. geeignet?" So siehts aus. Der Tiny12 hat ja nicht viel Speicher. Und so werden die 2 letzten Lesungen gespeichert:
1 | rcall w1_byte_rd ;low byte |
2 | mov temp2l, temp1l |
3 | mov temp1l, a0 |
4 | rcall w1_byte_rd ;high byte |
5 | mov temp2h, temp1h |
6 | mov temp1h, a0 |
Sollte leicht auf 3 erweiterbar sein. Man könnts natürlich auch für Pointer umschreiben. Peter
juhuuuuu... Danke Peter, du hast mir wieder den richtigen Tip gegeben. Jetzt zeigt er alle drei Temps richtig an! ->Sanlo
so fall es jemanden interessiert... meine Variante mit Bild vom Versuchsaufbau ->Sanlo
hey könnts ma da weiter helfen,versuch ds180 auszulesen,schaff des ned mit dem 1 wire port,muss des in c programmiern. bitte,bin schon verzweifelt
Wer mich kennt weiß, daß ich keinen Entrarer installiert hab. Bezieht sich die Frage denn wirklich auf meinen Beispielkode ? Ansonsten, Hijacker verkrümeln sich bitte ins Fragen-Forum. Wie lautet überhaupt die Frage ? Ohne konkrete Frage keine Antwort. Peter
hey,was könnte da nicht stimmen,wenn er immer schreibt SCON undefined indentifier #include<reg517.h> #include<stdio.h> //--------------------------------------- // Initialize serial port //--------------------------------------- void InitSerial(void) { TMOD = 0x20; // Timer 1=8-Bit-relod TH1 = 0xFD; // TH1 TR1 = 1; // Timer 1 starten SCON = 0x52; // Freigabe von Sender & Empfänger } jedoch bin ich der meinung,dass der quellcode korrekt ist!
Och nö, nochn Hijacker. Ein bischen Benimmse schadet auch in Foren nicht. Peter
Einen schönen Guten Morgen, bin seit heut morgen neu hier im Forum. Ich beschäftige mich seit gut einer Woche mit dem Thema microcontrollern und habe auch schon die ersten klein Versuche sprich LED Blinken zu lassen und auch Lauflicht erfolgreich zu programmieren. Besitze folgende Hardware. Die Atmega 16, 32 und den 644. Das AtmelmStudio 6. Habe dann noch ein LCD Modul AV 2040 von Conrad. Jetzt wollte ich ganz gern auf dem LCD Modul Uhrzeit Datum und Temperatur anzeigen lassen. Kann ich den, den hier oben zur Verfügung stehenden Quellcode benutzen, wie gesagt habe nur die drei Controller zur Verfügung. Oder muss ich das Programm dann noch anpassen . Würde mich über Antworten freuen. Bis dahin wünsche ich euch noch ein schönes Weihnachtsfest. Mit Freundlich Grüßen Jens Grumme
Hallo, Benutzen kanst Du den Code natürlich. Du wirst die PORT-Ein- und Ausgänge an die von Dir aufgebaute Schaltung anpassen müssen sowie einige Registernamen an deine Mega-Typen anpassen müssen. Dabei hilft Dir die Registertabelle am Ende des Datenblattes weiter. Du suchst also das Register des originalen Prozessors in dessen Datenblatt heraus und suchst im Datenblatt des neuen Prozessors das Register mit der gleichen Funktionalität heraus. Dann fehlerfrei compilieren für Deinen Prozessor und in den Flash des µC laden. Gruß
Hallo Peter D. (peda) und alle anderen Interessierten, ich weiß es ist schon sehr, sehr, sehr lange her, aber weißt du noch welchen Algoryhtmus ( ROM Search ) du damals für dieses AVR8ASM-Projekt verwendest hattest oder hattest du dir selbst etwas ausgedacht ? Diesen aus der Maxim App. Note 187 anscheinend nicht: Beitrag "Re: DS1820 DS18S20 1-wire Suchalgorithmus Suchalgorithmen" Bernd_Stein
:
Bearbeitet durch User
Hier ist doch was faul. Einsprung bei dec_out: Bei einer dreistelligen Zahl z.B. 255, werden die Hunderter richtig angezeigt, für die Zehner wird Space ( $32 ) erzeugt und ...
1 | ; |
2 | ;************************************************************************/ |
3 | ;* */ |
4 | ;* Display values on LCD */ |
5 | ;* */ |
6 | ;* */ |
7 | ;* Author: Peter Dannegger */ |
8 | ;* danni@specs.de */ |
9 | ;* */ |
10 | ;************************************************************************/ |
11 | ;************************************************************************/ |
12 | ;------------------------------------------------------------------------- |
13 | ; Display value as "00" ... "255" |
14 | ;------------------------------------------------------------------------- |
15 | ;input: a0 = value 0..255 |
16 | ; |
17 | dec_out00: |
18 | set |
19 | mov a3, a0 |
20 | subi a3, 100 |
21 | brcs _dou2 ;if < 100 |
22 | ;------------------------------------------------------------------------- |
23 | ; Display value as "0" ... "255" |
24 | ;------------------------------------------------------------------------- |
25 | ;input: a0 = value 0..255 |
26 | ;used: a0, a1, a2, a3 |
27 | ; |
28 | dec_out: |
29 | mov a3, a0 |
30 | clt ;to suppress preceding zero |
31 | ldi a0, '0' - 1 |
32 | _dou1: inc a0 |
33 | subi a3, 100 |
34 | brcc _dou1 |
35 | rcall _dou6 ;output hundrets |
36 | _dou2: ldi a0, '0' + 10 |
37 | _dou3: dec a0 |
38 | subi a3, -10 |
39 | brcs _dou3 |
40 | rcall _dou6 ;output tens |
41 | subi a3, -'0' |
42 | mov a0, a3 ;output ones |
43 | _dou4: set |
44 | _dou5: rjmp lcd_data |
45 | ; |
46 | _dou6: brts _dou5 ;check preceding zero |
47 | cpi a0, '0' |
48 | brne _dou4 |
49 | ret |
50 | ;------------------------------------------------------------------------- |
Bernd_Stein [Mod: Formatierung angepasst]
:
Bearbeitet durch Moderator
Hi Peter, ich weiss nicht ob es schon jemand gemeldet hat. In den Komentaren in GETTIME.INC ist ein Fehler. Du schreibst bei der Zeitumstellung von September cpi month, 10 brne _iti4 ;not march / september: no change clt ;prepare for winter if september vergleichst es dann aber -korrekterweise- mit Oktober ;) Ist also nur im Kommentar falsch beschrieben.
Beitrag #6904096 wurde vom Autor gelöscht.
Beitrag #6904101 wurde vom Autor gelöscht.
Bernd S. schrieb: > Hier ist doch was faul. Einsprung bei dec_out: hacker-tobi schrieb: > ich weiss nicht ob es schon jemand gemeldet hat. In den Komentaren in > GETTIME.INC ist ein Fehler. man kann dem Peter eine PN schicken! Er muss ja hier nicht immer mitlesen! simpel ist doch, kleines Steckbrett, Arduino nano328, LCD5110, RTC 3231 oder DS18B20
Bernd S. schrieb: > Hier ist doch was faul. Bitte verwende die Tags [ code ] bzw. [ /code ] (ohne Leerzeichen), um den Code zu formatieren. Sonst sieht das nämlich so aus wie im angehängten Bild - zumindest auf mobilen Geräten. Ich habe Deinen Beitrag mal angepaast, siehe oben.
:
Bearbeitet durch Moderator
1 | ;************************************************************************/ |
2 | ;* */ |
3 | ;* Display values on LCD */ |
4 | ;* */ |
5 | ;* Author: Peter Dannegger */ |
6 | ;* danni@specs.de */ |
7 | ;* mit Aenderungen f. Temperatursensor ( DS18B20 ) von Unbekannt */ |
8 | ;************************************************************************/ |
9 | ;************************************************************************/ |
10 | ;------------------------------------------------------------------------- |
11 | ; Anzeige ohne fuehrende Nullen |
12 | ;------------------------------------------------------------------------- |
13 | ;input: a = value 0..255 |
14 | ;used: a, b, c |
15 | ; |
16 | _dec_out: |
17 | tst a ;Negativer Wert ? |
18 | brpl _positiv ;Nein -> springen |
19 | mov c,a ;Wert sichern |
20 | ldi a,$10 ;Cursor einen nach links um bei Minus Anzeige.. |
21 | rcall _lcd_cmd ;..noch formatiert zu bleiben |
22 | ldi a,'-' |
23 | rcall _dou4 ;Zeichen ausgeben |
24 | mov a,c ;gesicherten Wert zurueck holen |
25 | neg a ;In positives Aquivalent umwandeln |
26 | _positiv: |
27 | mov c, a ;Wert f. weiterverarbeitung kopieren |
28 | subi c, 100 ;Hunderter ermitteln |
29 | brcc _hunderter ;if > = 100, die hunderter Stelle auswerten.. |
30 | ldi a,' ' ;..ansonsten die hunderter Stelle durch Space ersetzen.. |
31 | rjmp _dou2 ;..und dies ausgeben |
32 | _hunderter: |
33 | mov c, a ;Wert wieder neu laden und.. |
34 | ldi a, '0' - 1 ;..Hunderter zaehlen.. |
35 | _dou1: |
36 | inc a ;..wobei die Ziffer in ASCII umgewandelt wird |
37 | subi c, 100 ;100 subtrahieren |
38 | brcc _dou1 ;< 100 -> Nein -> weiter zaehlen |
39 | _dou2: |
40 | rcall _dou4 ;output hundrets |
41 | _zehner: |
42 | ldi a, '0' +10 ;Zehnerstelle in ASCII umwandeln.. |
43 | _dou3: |
44 | dec a ;..und ASCII rueckwaerts von '9' |
45 | subi c, -10 ;Zehner x +10 |
46 | brcs _dou3 ;Zehner gezaehlt ? NEIN -> weiter zaehlen |
47 | rcall _dou5 ;output tens |
48 | subi c,-'0' ;Einerstelle in ASCII uberfuehren |
49 | mov a, c ;output ones |
50 | _dou4: |
51 | rjmp _lcd_data ;ASCII-Zeichen ausgeben |
52 | _dou5: |
53 | cpi a, '0' ;Ist die Ziffer eine Null ?.. |
54 | brne _dou4 ;..Nein -> Ziffer ausgeben.. |
55 | ldi a,' ' ;..ansonsten erst durch Space ersetzen und.. |
56 | rjmp _dou4 ;..jetzt ausgeben |
57 | ;------------------------------------------------------------------------- |
Mich stört ein wenig, dass das Minuszeichen nicht direkt an dem Wert steht, aber da ich durch PeDa's Code sowieso nicht ganz durchblicke muss ich wohl damit leben. Formatierung sieht in der Vorschau fast gut aus, das muss jetzt reichen, habe keine Lust immer zu gucken wie es in diesem Fenster aussieht und dann in der Vorschau. Bernd_Stein
Ganz blöde Idee. Man denke jetzt mal an 101°C -> 1 1°C. Bernd_Stein
Bernd S. schrieb: > Ganz blöde Idee. > Man denke jetzt mal an 101°C -> 1 1°C. > Ok, diesen Fehler konnte ich mit Hilfte des T-Flags, korrigieren. Bleibt leider immer noch der Schönheitsfehler mit dem Minuszeichen, welches nicht direkt vor dem Wert steht. Außer natürlich es ist ein hunderter Wert. Ach, übrigens - auch wenn am Ende, bzw. überhaupt kein RET-Befehl steht, ist diese Routine mit einem RCALL,- oder CALL-Befehl aufzurufen.
1 | ;************************************************************************/ |
2 | ;* */ |
3 | ;* Display values on LCD */ |
4 | ;* */ |
5 | ;* Author: Peter Dannegger */ |
6 | ;* danni@specs.de */ |
7 | ;* mit Aenderungen f. Temperatursensor ( DS18B20 ) von Unbekannt */ |
8 | ;************************************************************************/ |
9 | ;************************************************************************/ |
10 | ;------------------------------------------------------------------------- |
11 | ; Anzeige ohne fuehrende Nullen |
12 | ;------------------------------------------------------------------------- |
13 | ;input: a = value 0..255 |
14 | ;used: a, b, c |
15 | ; |
16 | _dec_out: |
17 | tst a ;Negativer Wert ? |
18 | brpl _positiv ;Nein -> springen |
19 | mov c,a ;Wert sichern |
20 | ldi a,$10 ;Cursor einen nach links um bei Minus Anzeige.. |
21 | rcall _lcd_cmd ;..noch formatiert zu bleiben |
22 | ldi a,'-' |
23 | rcall _dou4 ;Zeichen ausgeben |
24 | mov a,c ;gesicherten Wert zurueck holen |
25 | neg a ;In positives Aquivalent umwandeln |
26 | _positiv: |
27 | mov c, a ;Wert f. weiterverarbeitung kopieren |
28 | subi c, 100 ;Hunderter ermitteln |
29 | brcc _hunderter ;if > = 100, die hunderter Stelle auswerten.. |
30 | ldi a,' ' ;..ansonsten die hunderter Stelle durch Space ersetzen.. |
31 | clt ;Keine Hunderter vorahanden |
32 | rjmp _dou2 ;..und dies ausgeben |
33 | _hunderter: |
34 | set ;Hunderter vorhanden |
35 | mov c, a ;Wert wieder neu laden und.. |
36 | ldi a, '0' - 1 ;..Hunderter zaehlen.. |
37 | _dou1: |
38 | inc a ;..wobei die Ziffer in ASCII umgewandelt wird |
39 | subi c, 100 ;100 subtrahieren |
40 | brcc _dou1 ;< 100 -> Nein -> weiter zaehlen |
41 | _dou2: |
42 | rcall _dou4 ;output hundrets |
43 | _zehner: |
44 | ldi a, '0' +10 ;Zehnerstelle in ASCII umwandeln.. |
45 | _dou3: |
46 | dec a ;..und ASCII rueckwaerts von '9' |
47 | subi c, -10 ;Zehner x +10 |
48 | brcs _dou3 ;Zehner gezaehlt ? NEIN -> weiter zaehlen |
49 | rcall _dou5 ;output tens |
50 | subi c,-'0' ;Einerstelle in ASCII uberfuehren |
51 | mov a, c ;output ones |
52 | _dou4: |
53 | rjmp _lcd_data ;ASCII-Zeichen ausgeben |
54 | _dou5: |
55 | cpi a, '0' ;Ist die Zehnerziffer eine Null ?.. |
56 | brne _dou4 ;..Nein -> Zehnerziffer ausgeben.. |
57 | brts _dou4 ;Waren vorher Hunderter vorhanden ? Ja -> Null ausgeben |
58 | ldi a,' ' ;..Nein -> Null durch Space ersetzen und.. |
59 | rjmp _dou4 ;..jetzt ausgeben |
60 | ;------------------------------------------------------------------------------ |
Bernd_Stein
:
Bearbeitet durch User
Hallo, wegen deiner Frage Beitrag "Re: Assembler lernen für Mikrocontroller-Programmierung" Entweder die Anzahl der Ziffern vorm Komma ermitteln und dann vor deren Ausgabe '-' oder Leerzeichen ausgeben. Oder die Ziffern in einen Buffer schreiben und vor dessen Ausgabe '-' oder Leerzeichen ausgeben. Dazu passend vorher die Spalte berechnen/korrigieren.
Veit D. schrieb: > Hallo, > > wegen deiner Frage > Beitrag "Re: Assembler lernen für Mikrocontroller-Programmierung" > > Entweder die Anzahl der Ziffern vorm Komma ermitteln und dann vor deren > Ausgabe '-' oder Leerzeichen ausgeben. Oder die Ziffern in einen Buffer > schreiben und vor dessen Ausgabe '-' oder Leerzeichen ausgeben. Dazu > passend vorher die Spalte berechnen/korrigieren. > Ok, die vorhandene Routine kann ich also hierzu nicht anpassen bzw. nur mit grösserem Aufwand. Habe mal wieder einen Fehler korrigiert. Wenn vorher ein negativer Wert angezeigt wurde und danach ein positiver an dieser Stelle, blieb das Minuszeichen weiterhin angezeigt. Bernd_Stein
Hallo, Assembler kann ich nicht. Kann nur C/C++. Vielleicht kannste folgendes in Assembler umsetzen. Lege dir einen Buffer für die maximal mögliche Zeichenlänge an. Damit wäre das stehen lassen von alten Zeichen automatisch behoben. Dann die Anzahl der Ziffern ermitteln. Position vor der ersten Ziffer ermitteln und ggf. '-' einfügen. Also am Besten von hinten nach vorn in den Buffer die Ziffern und Komma schreiben. Den Rest davor mit Leerzeichen auffüllen. Damit hätte man alles sortiert im Buffer stehen. Damit bleibt die Cursorposition auf dem Display immer gleich. Damit wird immer alles auf dem Display ab Cursorposition überschrieben. Wäre das machbar?
Veit D. schrieb: > Vielleicht kannste folgendes > in Assembler umsetzen. [...] Dein Hilfsbedürfnis in allen Ehren, aber bei Bernd S. verpufft das vollkommen nutzlos. OK, wenn du selber kein Assembler kannst, kannst du seine Werke sicherlich nicht kompetent einschätzen, aber zum Vergleich: was würdest du von einem C-Programmierer halten, der nach nachweislich mindestens 10 Jahren(!!!) Praxis immer noch nicht in der Lage ist, so eine einfache Aufgabe alleine zu lösen? Genau... Und das ist auch von Bernd S. und seinen Assembler-Programmierfähigkeiten zu halten...
Hallo, wenn das verpuffen würde wäre es in der Tat sehr Schade. Bernd kann ich nicht einschätzen. Ich kann nur einschätzen wie das Forum tickt. Gibt es überhaupt keine Antworten, dann ist das Problem bzw. dessen Lösung zu einfach und es fordert niemanden heraus. Was dann schon zum Eigenen umdenken führte. ;-) @ Bernd, nur Mut, rein in die Kartoffeln ...
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.