Timer 8051 Verständnis Problem

OP #4425161
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
Angehängte Dateien:
#4425526
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
#4426403
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!
#4426656
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren