Forum: Mikrocontroller und Digitale Elektronik Anfänger braucht Hilfe


von Martin O. (frontal)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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...

von jonny (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Das übliche:

Wenns ein AVR sein darf:
http://www.mikrocontroller.net/articles/AVR-Tutorial

von MC (Gast)


Lesenswert?

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

von Martin O. (frontal)


Lesenswert?

Salli,

vielen dank ich werde mir die Sachen anschaun! Wir haben einen 8051 ( 
Infinion SAB 80C537 ) und proggen in Assembler.

Gruß

von MC (Gast)


Lesenswert?

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

von Martin O. (frontal)


Lesenswert?

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

von Johannes S. (johanness)


Lesenswert?

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.

von Martin O. (frontal)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

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.

von Martin O. (frontal)


Lesenswert?

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?

von domi (Gast)


Lesenswert?

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...

von Martin O. (frontal)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael Wilhelm (Gast)


Lesenswert?

@ Karl heinz:
>wenn ihr "3 aber nicht gerade die allerhellsten auf diesem Gebiet"
>seid.

bist Du hell genug (zu lange in Tschernobyl programmiert)?

MW

von Karl H. (kbuchegg)


Lesenswert?

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.

von Martin O. (frontal)


Lesenswert?

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 )

von Sven S. (Gast)


Lesenswert?

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

von Martin O. (frontal)


Lesenswert?

:) 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ß

von Sven S. (Gast)


Lesenswert?

normal springt man aus den Vektoradresse raus so wie bei ljmp start.
war mal das erste was mir aufgefallen ist les dann mal weiter...

von Martin O. (frontal)


Lesenswert?


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
Noch kein Account? Hier anmelden.