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.
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 :-)
Brutzel schrieb: > Der Code auf Pastebin: http://pastebin.com/DYL4LH8A Geht bei dir die Funktion für Foren-Anhänge nicht?
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.
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...
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.
'Teiler' wird nur einmal vor der Main mit 0x05 geladen, in deiner Interruptroutine wird der auf 0 runtergezählt, und dann?
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)
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.
Mal ganz davon abgesehen, daß es einen Befehl JMP beim tiny2313 gar nicht gibt.
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 |
>
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.