Forum: Mikrocontroller und Digitale Elektronik Kein Erfolg mit Timer


von Brutzel (Gast)


Lesenswert?

Ich möchte 5 LEDs zählen lassen, dazu verwende ich einen 8 Bit Timer.
Das Ziel ist es eine Funktion mit 3Hz aufzurufen (ca 3 mal pro Sek)

Mein Chip taktet mit geringen  16kHz hinzu kommt ein Vorteiler von 1024 
bedeutet mein Timer arbeitet mit 15Hz
Das ist auch richtig bis dahin, die LEDs blinken mit 15Hz nun kam ich 
auf den Gedanken diese Funktion im Timer nur alle 5 mal aufzurufen.

Der Code auf Pastebin: http://pastebin.com/DYL4LH8A

Mein Problem ist, die LEDs leuchten dauerhaft als würde die Funktion 
Loop nie aufgerufen werden.

von Dieter F. (Gast)


Lesenswert?

Brutzel schrieb:
> Mein Chip taktet mit geringen  16kHz

Sieht nach einem ATTiny 2313 aus - und der soll mit 16 kHz takten? Ich 
habe da 8 MHz (Megahertz) per Default im Hinterkopf ...

Oh, Assembler - ein Fall für den C-Hater :-)

von Meckerziege (Gast)


Lesenswert?

Brutzel schrieb:
> Der Code auf Pastebin: http://pastebin.com/DYL4LH8A

Geht bei dir die Funktion für Foren-Anhänge nicht?

von Rolf M. (rmagnus)


Lesenswert?

Brutzel schrieb:
> Mein Chip taktet mit geringen  16kHz hinzu kommt ein Vorteiler von 1024
> bedeutet mein Timer arbeitet mit 15Hz
> Das ist auch richtig bis dahin, die LEDs blinken mit 15Hz nun kam ich
> auf den Gedanken diese Funktion im Timer nur alle 5 mal aufzurufen.

Wie sorgst du denn dafür, daß dein Timer bei jedem Takt einen Overflow 
bekommt?

> Mein Problem ist, die LEDs leuchten dauerhaft als würde die Funktion
> Loop nie aufgerufen werden.

Was hat die Funktion Loop denn mit den LEDs zu tun? Sie beeinflußt diese 
doch gar nicht. Nach der Initialiserung in main wird der Status der LEDs 
nie wieder verändert.

von c-hater (Gast)


Lesenswert?

Brutzel schrieb:

> Ich möchte 5 LEDs zählen lassen

LEDs können nicht zählen.

> dazu verwende ich einen 8 Bit Timer.

Der zählt. Eigentlich ist das nämlich ein Timer/Counter.

> Das Ziel ist es eine Funktion mit 3Hz aufzurufen (ca 3 mal pro Sek)

OK.

> Mein Chip taktet mit geringen  16kHz

Hoffentlich stimmt das... Aber immerhin: es wäre zumindest möglich. 
Könntest du bitte die Hexwerte der Fuses posten, damit das überprüfbar 
wird?

> Der Code auf Pastebin: http://pastebin.com/DYL4LH8A

Dieser Code wird sich sicher nicht übersetzen lassen. Da dürfte es 
mehrere Fehlermeldungen hageln. Schon beim ersten Überfliegen des Code 
würde ich folgende Fehler vorhersagen (sinngemäß in's deutsche 
Übersetzt): "konnte Include-Datei nicht finden" und "unbekanntes Makro".

> Mein Problem ist, die LEDs leuchten dauerhaft als würde die Funktion
> Loop nie aufgerufen werden.

Oder so schnell, dass du es mit deinen begrenzten Sehfähigkeiten als 
Dauerlicht siehst...

von Brutzel (Gast)


Lesenswert?

Der code Lässt sich problemlos übersetzen, die 16khz stimmen in soweit, 
dass ich als Takt 128kHz eingestellt habe, mit CKDIV8 was 16kHz ergibt, 
dies lässt sich in soweit auch überprüfen.
Schreibe ich bei einem Timeraufruf nur:
inc leds

und gehe dann wieder raus, so blinken die LEDs mit 15Hz bzw sie Zählen 
binär nun kann man argumentieren wie habe ich das kontrolliert, ganz 
einfach die 3. LED stehend für das 3. bit Leuchtet ca 3,5mal Pro sek das 
kann man Zählen.

Darum denke ich nicht, das die Leds mit einfügen meines Versuches 
plötzlich so schnell blinken, dass ich nicht sehe.

Des weiteren denke ich, dass die Funktion Main immer nach Rückkehr des 
Interrupt aufgerufen wird, das muss auch geschehen da ich es ja sehen 
kann, wie sie mit 15Hz zählen.

von Heinz V. (heinz_v)


Lesenswert?

'Teiler' wird nur einmal vor der Main mit 0x05 geladen, in deiner 
Interruptroutine wird der auf 0 runtergezählt, und dann?

von ohne Worte (Gast)


Lesenswert?

Brutzel schrieb:
> Des weiteren denke ich, dass die Funktion Main immer nach Rückkehr des
> Interrupt aufgerufen wird, das muss auch geschehen da ich es ja sehen
> kann, wie sie mit 15Hz zählen.

dein Hauptprogramm wird nur ein Mal gestartet und hängt dann in der 
Schleife
END
JMP END

und bloß weil du ein Register mit leds bezeichnest leuchtet noch lange 
keine (siehe Rolf)

von c-hater (Gast)


Lesenswert?

ohne Worte schrieb:

> dein Hauptprogramm wird nur ein Mal gestartet und hängt dann in der
> Schleife
> END
> JMP END

Und genau hier würde jeder Assembler meckern, der was auf sich hält. END 
ist keine Sprungmarke (dazu fehlt der Doppelpunkt), also würde es der 
Assembler für ein Makro halten. Das ist aber nirgends definiert, also 
würde es die Fehlermeldung "unbekanntes Makro" geben.

von Rolf M. (rmagnus)


Lesenswert?

Mal ganz davon abgesehen, daß es einen Befehl JMP beim tiny2313 gar 
nicht gibt.

von Karl H. (kbuchegg)


Lesenswert?

Und bitte spar dir den Mist mit pastebin.
Du kannst, darfst und sollst Code hier direkt posten.
Kurzen Code kannst du in dein Posting mit einbauen (bitte die 
Codeformatiertags benutzen), längeren Code kannst du ganz einfach als 
Dateianhang anhängen (so wie die Quellcodedatei ist, kein Umformatieren, 
nicht als Word-Dokument, kein PDF, einfach nur die Datei).
1
.include "2313def.inc"
2
 
3
.def temp  = r16
4
.def leds  = r17 // Ausgaberegister
5
.def teiler = r18
6
.def counter = r19 // Was ist der Nächste Schritt der Scene
7
 
8
.org 0x0000
9
        rjmp    main                  ; Reset Handler
10
.org OVF0addr
11
        rjmp    timer0_overflow       ; Timer Overflow Handler
12
 
13
 
14
ldi     teiler, 0x05  
15
main:
16
 
17
        ldi     temp, LOW(RAMEND)    
18
        out     SPL, temp
19
 
20
                ldi     temp, 0xFF  
21
        out     DDRB, temp
22
 
23
                   
24
        out     PORTB, leds
25
 
26
                ldi     temp, (1<<CS00)|(1<<CS02); CS00 setzen: Teiler 1024
27
        out     TCCR0, temp
28
 
29
        ldi     temp, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow
30
        out     TIMSK, temp
31
                sei
32
 
33
                END
34
                jmp END
35
 
36
timer0_overflow:
37
 
38
                dec teiler
39
                breq Loop
40
                reti
41
                Loop:
42
                inc leds
43
                ldi     teiler, 0x05  
44
                reti

von Karl H. (kbuchegg)


Lesenswert?

>
1
> timer0_overflow:
2
> 
3
>                 dec teiler
4
>                 breq Loop
5
>                 reti
6
>                 Loop:
7
>                 inc leds
8
>

Schön.
Und? Weiter?
Wie bzw. wo kommt 'leds' jetzt an die Portpins?

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.