Forum: Mikrocontroller und Digitale Elektronik Timer 8051 Verständnis Problem


von Matt S. (matze_93)


Angehängte Dateien:

Lesenswert?

Hey Leute

Ich bin Student und muss für ein Praktikum ein Lauflicht für den 8051 in 
Assembler programmieren.
Das Lauflicht soll eine LED für eine halbe sec leuchten lassen und dann 
die nächste LED.
Der 8051 ist genauer gesagt ein C515 von Infineon. also mehrere 
Interrupts Timer usw.

Nun habe ich den Port 4 (an Port 4 sind 8 LEDs vorgesehen) und mein 
Hauptprogramm denke ich soweit funktionsfähig geschrieben, allerdings 
Funktioniert mein Unterprogramm indem ich die halbe Sekunde abwarte 
nicht ganz.

Ich hab den Timer0 initialisiert und gestartet. Nun will ich solange 
eine "do-While-Schleife" laufen lassen bis eben das TF0 Bit gesetzt 
wird.
Starte ich den Debugger von Keil µ-Vision komme ich allerdings nicht 
mehr aus der Anweisung "JNB TF0, $"

Kann mir Bitte jemand einen Tipp oder Hinweis geben was ich falsch 
gemacht habe? ^^

1
sfr    P4     =  0xE8      ; Port 4 im sfr frei gegeben
2
    
3
  Cseg  AT    0000H
4
        
5
      org    0000H
6
7
      Mov    A, #080H    ; damit nur 1 Pin freigegeben ist
8
start:    
9
      Mov    P4, A      ; P4 
10
      Lcall  loop
11
      RL    A        ; den Akku um 1 schieben
12
                  ; --> 80H wird 40H
13
      sjmp  start
14
      
15
      
16
loop:    Mov    R0, # 00DH
17
again:    
18
                        lcall  wait
19
      DJnz  R0, again
20
      ret
21
      
22
      
23
wait:    
24
      Mov    TMod, #001H    ; Mode 1 aktiviert
25
      SetB  TR0
26
      JNB    TF0, $      ; Dollarzeichen Wiederholt Statement
27
      ; da 6/(f(osc) 10MHz) -> 1 Takt = 0,6µs
28
      ; 0,6µs * FFFFH = 0,039s 
29
      clr    TF0
30
      ret
31
32
      end

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Einen Timer verwendet man ganz anders.
Dein Beispiel kannst du auch mit einer normalen Delay-Schleife ganz ohne 
Timer fahren, indem du einige Register verschachtelt herunter zählst.

Lese mal etwas über Timer und Interrupt.

von Stephan H. (stephan-)


Lesenswert?

setb IE  vergessen !

Außerdem am Int Vektor die Sprungadresse auf die Int Routine ablegen.

Da ist eigentlich so ziehmlich alles falsch dran.

Am Programmbegin
- Interruptvektor setzen
- Timer laden und starten
- Interrupt erlauben

Main
do xx
jmp Main

Int:
- Pushen wenn nötig
- Int löschen
- Timer nachladen und starten falls angehalten
- Aktion
- Poppen wenn nötig
- RETI

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Route 6. schrieb:
> Einen Timer verwendet man ganz anders.

Das bestimmt wer?

Natürlich kann man auch auf den Überlauf pollen.
Der Vorteil ist, daß man keine Befehle abzählen muß.

von Peter D. (peda)


Lesenswert?

Matthias S. schrieb:
> Starte ich den Debugger von Keil µ-Vision komme ich allerdings nicht
> mehr aus der Anweisung "JNB TF0, $"

32768 Sprünge dauern halt. Mach mal ein Step-Over.
Ändert sich denn T0?

von Route_66 H. (route_66)


Lesenswert?

Peter D. schrieb:
> Route 6. schrieb:
>> Einen Timer verwendet man ganz anders.
>
> Das bestimmt wer?

Ich, der große Meister, der die Anfänger nicht bewusst in eine Sackgasse 
schickt und sich hinterher einen ru<Zensur>.

Ich habe da eine gewisse Ehre als Programmierer im Leib, die dir peda 
wohl irgendwie abhanden gekommen ist. In vielen Themen kann man das hier 
langsam feststellen.

Klar geht das Pollen eines Timers technisch. Es ist aber genau so 
dilletantisch wie ein Count-Down-Delay.
Man sollte Anfängern auf die richtige Bahn bringen und nicht Fehlwege 
bestärken!

von Peter D. (peda)


Lesenswert?

Route 6. schrieb:
> Ich habe da eine gewisse Ehre als Programmierer im Leib, die dir peda
> wohl irgendwie abhanden gekommen ist.

Da geb ich mir extra Mühe, nicht jedes Anfängerprogramm in der Luft zu 
zerreißen und dann isses auch wieder nicht recht.

Route 6. schrieb:
> Klar geht das Pollen eines Timers technisch. Es ist aber genau so
> dilletantisch wie ein Count-Down-Delay.

Bestimmt wer?
Es gibt durchaus Anwendungen, wo ein Pollen sinnvoll ist. Und sei es 
nur, um die Arbeitsweise des Timers zu verstehen.

Einfache Programme kommen ganz oft ohne Interrupts aus.
Viele MCs haben nichtmal Interrupts, aber Timer, z.B. PIC12F508.
Es ist also völlig unnötig, nem Anfänger erstmal Interrupts 
aufzuzwingen.

von Gerd (Gast)


Lesenswert?

Matthias Sebald, vielleicht hilft dem  dieses Video zum Timer.

http://et-tutorials.de/4458/timer-interrupt-des-8051-mikrocontrollers/

Geht zwar um "C", die Programmiersprache ist aber eigentlich 
nebensächlich.

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.