Hi Leute, ich bin totaler Anfänger und besuche seit 2 Jahren ein ITG ( Informations Technische Gymnasium ) unteranderem haben wir dort auch Hardware Labor. Ich und 2 Klassenkameraden sollen jetzt bis Ende des laufendes Schuljahres ( ich glaub Juni oder so is Abgabe ) ein Projekt machen. Da wir 3 aber nicht gerade die allerhellsten auf diesem Gebiet sind hoffe ich, ihr könnt uns helfen. Wir wollen ( müssen ) einen Digitalen Wecker bauen. Er soll in etwa die Funktionen: -Uhrzeit anzeige ( die ganzen Anzeigen sollen auf einem LCD angezeigt werden ) -Uhrzeit sollte einstellbar sein :-) -Wecker ein/aus Weckzeit einstellen -da muss dann wohl auch noch ne kleine Box oder nen Beeper (keine Ahnung) dran damit es auch wirklich klingelt -Stoppuhr -Timer Zwischen diesen Modi sollte hin und her geswitcht werden können, is das besser pro Mode eine Taste oder einfach mit einer Taste von Mode zu Mode springen zu können? Wenn wir damit zurecht kommen oder wir einen Geistesblitz vom lieben Gott bekommen und es alles kapieren möglicherweise noch: -Temperatur So hm also wie gesagt wir sind absolute beginner. Wie würdet ihr da rangehn? Habt ihr Tipps wie wir darauf hinarbeiten können? Ist das zu viel/wenig? Ich bitte um Hilfe und bedanke mich schonmal. Gruß Martin PS: Bin ich richtig hier in der Kategorie? Wenn nicht, tut mir leid sagt mir wo ich es reinmachen soll oder verschiebt es.
ich würd einfach mal hier im Forum suchen und eine entsprechende Schaltung nachbasteln. Scheint aber nicht so einfach zu sein, sonst käme ja auch mal einer der vielen Anfänger auf eine solche Idee...
Also ich würde so vorgehen. Das Tutorial auf dieser Seite durchmachen: http://www.mikrocontroller.net/articles/AVR-Tutorial Da bekommste Infos zur Uhr, Taster, LCD usw. aus den Informationen habe ich auch meine erste Uhr gebaut ist zwar ohne LCD (Binär mit LED-Matrix), aber es sollte aufjedenfall das Wissen vermitteln, was ihr braucht. jonny
Tag Martin, mit welchem Controller (8051, AVR, PIC, ...) und welcher Sprache (C, Basic, Assembler, ...) wollt ihr arbeiten? Ich würde für euer Projekt einen 8051 in Assembler empfehlen, sofern ihr in Assembler fit seit. Dann benötigt ihr nicht viel mehr als einen Timer-Interrupt mit entsprechenden Zählschleifen für Zeit, Timer, Stoppuhr sowie eine Prozedur zum Aufrufen der einzelnen Funktionen. Bis irgendwann, MC
Salli, vielen dank ich werde mir die Sachen anschaun! Wir haben einen 8051 ( Infinion SAB 80C537 ) und proggen in Assembler. Gruß
Mit dem Controller sollte es gar kein Problem sein, euer Projekt in Assembler zu schreiben. Seine Ausstattung schafft das Vorgesehene locker. Falls ihr noch Fragen mit der Programmierung in Assembler habt, könnt ihr die ja hier posten. Bis irgendwann, MC
Halli Hallo ich habe mich geirrt wir benutzen einen "Atmel 89S8252", den haben wir aus der Schule bekommen. Geht es mit dem auch? Frage: Ich verstehe nicht wie es funktioniert das wenn: Ich habe einen Mode, zB die Uhr und die läuft und läuft und läuft, aber wie mach is das wenn ich in einen anderen Mode, zB Timer gehe das sie ( die Uhr ) trotzdem weiterläuft dh nicht einfach bei der Uhrzeit bei der ich in den andern Mode geschaltet hab weiter läuft? .... danke schon mal im Vorraus Gruß Martin
Der AT89S8252 gehört zu den 8051-Nachfolgern. Der ist zwar nicht der neueste, sollte aber reichen. Für Uhren verwendet man Timer, die rufen ab und zu einen Interrupt auf, ganz unabhängig von deinem Programm. Das wird dann jeweils kurz angehalten, bis die Interruptroutine, in der z.B. die Sekunden weitergezählt werden, abgearbeitet ist.
aha :) merci, dass ich das jetzt richtig verstehe: also jedesmal wenn ich etwas Anderes aufrufe wird die Uhr "langsamer" weil es erst die Befehle abarbeitet bei denen ich durch das Interrupt hingesprungen bin? Wie würdet ihr das machen? Die Uhr als Hauptprogramm machen und die anderen Modi dann immer mit Interrupt aufrufen oder hm ich weiß nicht wie es noch realisierbar währe. Frage zu dem Tutorial^ ldi R17, 15 ; Die Konstante "15" wird in das Register "R17" geladen. mov R16, R17 ; Das Register "R17" wird in das Register "R16" kopiert. out PORTB, R16 ; Der Inhalt des Registers "R16" wird in das IO-Register "PORTB" kopiert. in R16, PIND ; Der Inhalt des IO-Registers "PIND" wird in das Register "R16" kopiert. also wir benutzen in der schule für kopieren oder einschreiben nur den mov-Befehl. Ist das dann von Controller zu Controller unterschiedlich, von Assembler zu Assembler anders oder einfach nur veraltet? gruß martin
Martin Obrecht wrote: > aha :) merci, dass ich das jetzt richtig verstehe: also jedesmal wenn > ich etwas Anderes aufrufe wird die Uhr "langsamer" weil es erst die > Befehle abarbeitet bei denen ich durch das Interrupt hingesprungen bin? > > Wie würdet ihr das machen? Die Uhr als Hauptprogramm machen und die > anderen Modi dann immer mit Interrupt aufrufen oder hm ich weiß nicht > wie es noch realisierbar währe. Genau anders rum: Die Uhr per Interrupt realisieren. Der Interrupt ist 'die Unruhe' der Uhr, die für einen regelmässigen Takt sorgt. Jedesmal wenn er auftritt, ist eine definierte, konstante Zeiteinheit vergangen. Diese Zeiteinheit wird aufsummiert und ergibt Sekunden, Minuten, Stunden und Tage. > also wir benutzen in der schule für kopieren oder einschreiben nur den > mov-Befehl. Ist das dann von Controller zu Controller unterschiedlich, > von Assembler zu Assembler anders oder einfach nur veraltet? Das ist von Assembler zu Assembler anders.
Da Du einen 8051er nutzt (falls Du immer noch mit dem oben erwähnten 89S8252 arbeitest), nützen Dir die AVR-Assembler-Befehle aus dem Tutorial nicht viel. Da musst Du schon in 8051er-Assembler programmieren. Die Unterschiede liegen u.a. auch in dem unterschiedlichen Aufbau der Controller begründet, weshalb AVR und 8051er so gut wie überhaupt nicht kompatibel sind.
Karl heinz Buchegger wrote: > > Genau anders rum: > Die Uhr per Interrupt realisieren. > > Der Interrupt ist 'die Unruhe' der Uhr, die für einen > regelmässigen Takt sorgt. Jedesmal wenn er auftritt, ist > eine definierte, konstante Zeiteinheit vergangen. Diese > Zeiteinheit wird aufsummiert und ergibt Sekunden, Minuten, > Stunden und Tage. > achso, aber kann ich so auch zB eine Stoppuhr ( Timer, Wecker....) paralell laufen lassen?
eine stopuhr "paralell" laufen zu lassen ist an sich kein problem. meine wenn du über einen interrupt die zeit hochzählst, kennst du ja den wert, wo du mit stoppen beginnst... den endwert dann ebenfall, ist somit eine einfache division...
ich glaube ich komme dem ganzen etwas näher :) man benutz den interrupt um die zeit hoch zuzählen und diese zeitfrequenz verwendet man dann für alle funktionen ... dankeschön :) gruß
Martin Obrecht wrote: > Karl heinz Buchegger wrote: > >> >> Genau anders rum: >> Die Uhr per Interrupt realisieren. >> >> Der Interrupt ist 'die Unruhe' der Uhr, die für einen >> regelmässigen Takt sorgt. Jedesmal wenn er auftritt, ist >> eine definierte, konstante Zeiteinheit vergangen. Diese >> Zeiteinheit wird aufsummiert und ergibt Sekunden, Minuten, >> Stunden und Tage. >> > > achso, aber kann ich so auch zB eine Stoppuhr ( Timer, Wecker....) > paralell laufen lassen? Sicher kannst du. In der Interruptfunktion hast du normalerweise jede Menge Zeit. Ob du da 1 Satz Variablen (Sekunden,Minuten,Stunden) hochzählst oder deren 2 spielt keine grosse Rolle. Und ein Wecker ist sowieso kein grosses Problem. Das ist einfach nur das Verlgeichen der momentanen Zeit mit der Weckzeit. Ganz ehrlich: An eurer Stelle würde ich mal die Stoppuhr und den Wecker aussen vor lassen. Beschäftigt euch nur damit eine Uhr hinzukriegen. Das ist fürs Erste schon mal schwierig genug. Vor allem wenn ihr "3 aber nicht gerade die allerhellsten auf diesem Gebiet" seid.
@ Karl heinz: >wenn ihr "3 aber nicht gerade die allerhellsten auf diesem Gebiet" >seid. bist Du hell genug (zu lange in Tschernobyl programmiert)? MW
Michael Wilhelm wrote: > @ Karl heinz: >>wenn ihr "3 aber nicht gerade die allerhellsten auf diesem Gebiet" >>seid. > > bist Du hell genug (zu lange in Tschernobyl programmiert)? > Schau dir das Ursprungsposting an. Ist ein Zitat von dort.
salli leute, das ist unser code ist der so in ordnung? was meint ihr dazu? start ORG 0x0000 ;schreibe ganz an Anfang, ljmp start ;dass er zum Start des Hauptprogramm springen soll ORG 0x000B ;schreibe an Vektoradresse des Timer0 isr_t0: clr TR0 ;stoppe Timer0 mov TH0,#0x3C ;65536-50000 = 15536 = 0x3CB0 mov TL0,#0xB0 ;entspricht 50 ms setb TR0 ;starte Timer0 djnz R7,end_isr ;beende Interruptserviceroutine, wenn noch keine 20 Aufrufe vergangen mov R7,#20 ;50ms * 20 = 1s cjne R6,#59, sek_hoch ;wenn die Sekunden bei 59 sind, dann mov R6,#0 ;setze Sekunde auf 0 cjne R5,#59, min_hoch ;wenn die Minuten bei 59 sind, dann mov R5,#0 ;setze Minuten auf 0 cjne R4,#23, st_hoch ;wenn die Stunden bei 23 sind, dann mov R4,#0 ;setze Stunden auf 0 ljmp end_isr ;beende Interrupt sek_hoch: inc R6 ;wenn die Sekunden noch nicht bei 59 sind, erhöhe Sekunden ljmp end_isr ;dann beende Interrupt min_hoch: inc R5 ;wenn die Minuten noch nicht bei 59 sind, erhöhe Minuten ljmp end_isr ;dann beende Interrupt st_hoch: inc R4 ;wenn die Stunden noch nicht bei 23 sind, erhöhe Stunden end_isr: reti ;beende Interrupt ORG 0x0100 ;überspringe die ersten 100h Adressen, dass sich das Hauptprogramm nicht mit der Service Routine überschneidet 7_seg: db 0x60,0xDA,0xF2,0x6E,0xB6,0xBE,0xE0,0xFE,0xF6 ;speichere Muster für die Ausgabe an der 7-SegmentAnzeige start: mov DPTR,#7_seg ;lade die Adresse des Musters für die Ausgabe im DataPointer mov R6,#0 ;setze Sekunden auf 0 mov R5,#0 ;setze Minuten auf 0 mov R4,#0 ;setze Stunden auf 0 mov TMOD,#0x01 ; Timer 0 als 16 Bit Timer mit internem Start mov TH0,#0x3C ; 65536-50000 = 15536 = 0x3CB0 mov TL0,#0xB0 ; entspricht 50 ms mov R7,#20 ;setze Interruptaufrufzähler auf 20 --> 20 * 50 ms = 1s setb ET0 ;Interruptfreigabe für Timer setb EAL ;Allgemeine Interruptfreigabe setb TR0 ;starte Timer ausgabe:mov A,R6 ;dividiere die Minuten durch 10 mov B10 ;sodass in A die Minuten-Zehner stehen div AB ; und in B die Minuten-Einer movc A,@A+DPTR ;hole das Muster, für die 7-Segment-Anzeige mov steuer,#0xFF ;schalte alle Anzeigen aus mov daten,A ;lege das Muster an Datenbus an mov steuer,#0xFD ;schalte 2. Anzeige von rechts an (Minuten-Zehner) mov A,B ;hole die Minuten-Einer in Akku movc A,@A+DPTR ;wiederhole das gleiche wie oben mov steuer,#0xFF mov daten,A mov steuer,#0xFE ;schalte die Anzeige ganz rechts an (Minuten-Einer) mov A,R5 ;wiederhole das gleiche nur mit Stunden anstatt Minuten mov B,10 div AB movc A,@A+DPTR mov steuer,#0xFF mov daten,A mov steuer,#0xF7 ;schalte 4. Anzeige von rechts an (Stunden-Zehner) mov A,B movc A,@A+DPTR mov steuer,#0xFF mov daten,A mov steuer,#0xFB ;schalte 3. Anzeige von rechts an (Stunden-Einer) ljmp ausgabe ;wiederhole die Ausgabe ständig end gruß martin PS: kennt sich wer mit häufigen problemen bei ponyprog aus? -> ihrgendwie will nicht draufgeladen werden ( schreibfehler )
ist ja grausam zu lesen. einwenig struktur wär nicht schlecht. wenn der code funktionierd wird er wohl gut sein aber so les ich mir den nich durch. gruss sven
:) ich habs schon voll oft probiert zu ändern aber es funktioniert nicht ... ich hab versucht es als dateinanhang rein zumachen aber es fust nicht, oder ihrgendwas mach ich falsch.in der vorschau ist er auch noch strukturiert aber wenn ich ihn dann absende verzieht es ihn hier nochmal: ohne kommentare B0h data daten (P3) 90h data steuer (P1) ORG 0x0000 ljmp start ORG 0x000B isr_t0: clr TR0 ;stoppe Timer mov TH0,#0x3C mov TL0,#0xB0 setb TR0 djnz R7,end_isr ;beende Interruptserviceroutine, wenn noch keine 20 Aufrufe vergangen mov R7,#20 ;50ms * 20 = 1s cjne R6,#59, sek_hoch mov R6,#0 cjne R5,#59, min_hoch mov R5,#0 cjne R4,#23, st_hoch mov R4,#0 sek_hoch: inc R6 ljmp end_isr min_hoch: inc R5 ljmp end_isr st_hoch: inc R4 end_isr: reti ORG 0x0100 7_seg: db 0x60,0xD A,0xF2,0x6E,0xB6,0xBE,0xE0,0xFE,0xF6 start: mov DPTR,#7_seg mov R6,#0 ;Sekunden mov R5,#0 ;Minuten mov R4,#0 ;Stunden mov R7,#20 ; mov TMOD,#0x01 ;Timer 0 als 16 Bit Timer mit internem Start mov TH0,#0x3C ;65536-50000 = 15536 = 0x3CB0 mov TL0,#0xB0 ;entspricht 50 ms setb ET0 ;Interruptfreigabe für Timer setb EAL ;Allgemeine Interruptfreigabe setb TR0 ;starte Timer ausgabe: mov A,R6 mov B,10 div AB movc A,@A+DPTR mov steuer,#0xFF mov daten,A mov steuer,#0xFE mov A,B movc A,@A+DPTR steuer,#0xFF mov daten,A mov steuer,#0xFD mov A,R5 mov B,10 div AB mov DPTR,#7_seg movc A,@A+DPTR mov steuer,#0xFF mov daten,A mov steuer,#0xFB mov A,B movc A,@A+DPTR mov steuer,#0xFF mov daten,A mov steuer,#0xF7 ljmp ausgabe end gruß
normal springt man aus den Vektoradresse raus so wie bei ljmp start. war mal das erste was mir aufgefallen ist les dann mal weiter...
sallü, wir versuchen gerade das programm auf unsern microcontroller zu bekommen, leider zeigt es uns in der zeile setb EAL ;Allgemeine Interruptfreigabe einen fehler: Build target 'Target 1' assembling UHR.a51.. UHR.a51(44): error A45: UNDEFINED SYMBOL (PASS-2) Target not created wir sind ratlos ... bitte helft uns :) der befehl EAL stimmt doch oder ?! gruß martin ...
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.