Forum: Mikrocontroller und Digitale Elektronik AVR ASM Timer-Interrupt


von Martin F. (martin_f70)


Lesenswert?

Hallo!

Ich habe mir wie im folgenden Code zu sehen eine Interrupt-Routine 
gebaut die eine LED blinken lasen soll. Die timer1: Funktion 
funktioniert auch, habe ich mal in der loop Schleife mit nem delay 
getestet. Ich nutze den atmega8. Ich nutze den Timer1 (16bit) bei einem 
Takt von 1MHz und einem Vorteielr von 8. Dadurch komme ich per Rechnung 
auf eine halbe Sekunde. Aber die LED blinkt nicht...was habe ich nicht 
beachtet?
1
.org 0x008              ;timer1
2
  rjmp timer1
3
  
4
sei                     ;enable interrupt
5
ldi r16, 0xbb
6
out 0x31, r16           ;int. osc. calibration
7
ldi r16, 0x04
8
ldi r17, 0x5f
9
out 0x3e, r16
10
out 0x3d, r17           ;init stackpointers
11
12
ser r16
13
out 0x17, r16           ;set output
14
15
lds r16, 0x4e
16
ori r16, 0b00000010     ;set CS11 (teiler8)
17
18
lds r16, 0x59
19
ori r16, 0b00000100     ;activate timer1
20
21
loop:
22
  rjmp loop
23
  
24
timer1:
25
  eor r16, 0x08
26
  out 0x18, r16
27
  reti

Gruß, MArtin

von adenin (Gast)


Lesenswert?

Sollte man das nicht auch in irgendwelche register schreiben? ;)
[avrasm]

lds r16, 0x4e
ori r16, 0b00000010     ;set CS11 (teiler8)

lds r16, 0x59
ori r16, 0b00000100     ;activate timer1
[/avrsam]

von Loki (Gast)


Lesenswert?

Martin Fischer schrieb:
> lds r16, 0x4e
> ori r16, 0b00000010     ;set CS11 (teiler8)
>
> lds r16, 0x59
> ori r16, 0b00000100     ;activate timer1

Muß das nicht auch in so ein komisches 0x Register geschrieben werden.

Bin gespannt, wer die ganzen Hex-Zahlen aufdröselt. Sowas kann man auch 
mit Registernamen und Bitnamen schreiben und mit viel mehr Kommentaren 
versehen.

von Oliver (Gast)


Lesenswert?

Jetzt spielst du mal Prozessor, und gehst Schritt für Schritt durch, was 
nach einem Reset passiert. Das Programm fängt bei Adresse 0 an...

Oliver

von Martin F. (martin_f70)


Lesenswert?

Ja, ich muss die noch schreiben^^
Hatte ich ganz vergessen^^

Ich kann keine Registernamen nutzen weil ich mit avr-as compiliere

von Ich (Gast)


Lesenswert?

adenin schrieb:
> Sollte man das nicht auch in irgendwelche register schreiben? ;)
 [avrasm]
>
 lds r16, 0x4e
 ori r16, 0b00000010     ;set CS11 (teiler8)

 lds r16, 0x59
 ori r16, 0b00000100     ;activate timer1


Ja eben.
lds r16, 0x4e       ;kopiere geheimnissvolles SFRegister des unbekannten 
AVR ins Arbeitsregister

ori r16,0b0000_0100 ;Setze geheimnisvolles Bit 2

->>> STS r16, 0x4e ; schreibe geänderten Registerinhalt wieder ins 
geheimnisvolle SFRegister des unbekannten AVR zurück

 [/avrsam]

;-)

von Martin F. (martin_f70)


Lesenswert?

Ich schrieb:
> des unbekannten
> AVR ins Arbeitsregister

Ich sagte was von einem atmega8

DAnke du, jetzt leuchtet sie schonmal, aber warum blinkt sie nicht? ;(

von Oliver (Gast)


Lesenswert?

Oliver schrieb:
> Jetzt spielst du mal Prozessor, und gehst Schritt für Schritt durch, was
> nach einem Reset passiert. Das Programm fängt bei Adresse 0 an...

Oliver

von Martin F. (martin_f70)


Lesenswert?

ja? bei mir (wenn ich prozessor bin) funktioniert alles?

von Loki (Gast)


Lesenswert?

Martin Fischer schrieb:
> ja? bei mir (wenn ich prozessor bin) funktioniert alles?

Oliver möchte, daß du dir deutlich machst, was bei dir an Adresse 0 
steht. Was steht bei dir an Adresse 0? An 8 steht ein Interrupt Vektor.

von Martin F. (martin_f70)


Lesenswert?

Richtig.

Entschuldigung, aber muss ich was an Adresse 0 setzten? DAs wusste ich 
net Sorry, was muss den da hin?

von Loki (Gast)


Lesenswert?


von Martin F. (martin_f70)


Lesenswert?

Toll. Habe ich, trotzdem kein blinken...
1
.org 0x0000
2
  rjmp main
3
.org 0x0008              ;timer1
4
  rjmp timer1
5
6
main:
7
  ldi r16, 0xbb
8
  out 0x31, r16           ;int. osc. calibration
9
  ldi r16, 0x04
10
  ldi r17, 0x5f
11
  out 0x3e, r16
12
  out 0x3d, r17           ;init stackpointers
13
14
  ser r16
15
  out 0x17, r16           ;set output
16
17
  lds r16, 0x4e
18
  ori r16, 0b00000010     ;set CS11 (teiler8)
19
  sts 0x4e, r16
20
21
  lds r16, 0x59
22
  ori r16, 0b00000100     ;activate timer1
23
  sts 0x59, r16
24
  
25
  sei                     ;enable interrupt
26
  
27
loop:
28
  rjmp loop
29
  
30
timer1:
31
  eor r16, 0x08
32
  out 0x18, r16
33
  reti

von BattMan (Gast)


Lesenswert?

Das sollte zumindest so oder ähnlich aussehen:
Du solltest Dir aber auf jeden Fall das Atmelstudio installieren.
1
init_timer1:
2
3
    ldi tempreg,TIMER1A
4
    out TCCR1A,tempreg
5
    ldi tempreg,TIMER1B
6
    out TCCR1B,tempreg
7
    clr tempreg
8
    out TCNT1H,tempreg      ; Nullen
9
    out TCNT1L,tempreg
10
    ldi tempreg,OCRH
11
    out OCR1AH,tempreg      ; mit vergleichswert laden
12
    ldi tempreg,OCRL
13
    out OCR1AL,tempreg      
14
    ldi tempreg,(TIMER1MASK  | ( 1 << TOIE0))  ; ISR bit
15
    out TIMSK,tempreg      ; 
16
17
    sei              ; enable all interrupts
18
    ret
19
20
/** ISR für OCR1A **/
21
tim1_comp1A:
22
23
    sbis PIND,LEDBIT    ; Toggle LED
24
    sbi  PORTD,LEDBIT  ; 
25
    sbic PIND,LEDSBIT
26
    cbi  PORTD,LEDBIT  ; 
27
    reti          ; return

von Martin F. (martin_f70)


Lesenswert?

Ich nutze Linux, da wird das nichts mit AtmelStudio

von BattMan (Gast)


Lesenswert?

Martin Fischer schrieb:
> Ich kann keine Registernamen nutzen weil ich mit avr-as compiliere

Davon
.include "tn2313def.inc"
schon mal was gehört?

Lies erst einmal das Tutorial.......

von Martin F. (martin_f70)


Lesenswert?

Geht net. Bei avr-as geht das net!

von Loki (Gast)


Lesenswert?

Martin Fischer schrieb:
> Toll. Habe ich, trotzdem kein blinken...
.
> timer1:
>   eor r16, 0x08
>   out 0x18, r16
>   reti

Wie genau soll das funktionieren? eor geht doch nur mit zwei Registern. 
Macht der Assembler da keine Fehlerausgabe?

von Karl H. (kbuchegg)


Lesenswert?

Martin Fischer schrieb:
> Geht net. Bei avr-as geht das net!

glaub ich dir nicht.
Wo hast du denn den avr-as her? Damit man sich die Installation mal 
ansehen kann. Auf irgend einem Subverzeichnis gibt es da mit SIcherheit 
Include Dateien, in denen die Symbole für deinen µC definiert sind.

So hat das doch keinen Sinn. Das ist doch ausser fehleranfällig nur noch 
fehleranfällig. Abgesehen davon, dass man im Code überhaupt nichts 
sieht, weil man jedes Bit einzeln überprüfen müsste.

von BattMan (Gast)


Lesenswert?

Martin Fischer schrieb:
> Geht net. Bei avr-as geht das net!

Klar geht das: 
http://ccrma.stanford.edu/planetccrma/man/man1/avr-as.1.html
Dort ist beschrieben:

      -I dir
           Add directory dir to the search list for ".include" 
directives.

Also?
Lerne erst einmal, wie der Assembler richtig installiert und bedient 
wird.
Danach liest Du das Datenblatt von dem AVR richtig durch, danach das 
gute Tutorial das er hier im Forum gibt.
Und erst dann(!), solltest Du hier wieder Deine Problemchen posten.

von Martin F. (martin_f70)


Lesenswert?

Ich nutze diese Toolchain: 
http://www.atmel.com/System/BaseForm.aspx?target=tcm:26-51628

Und auf meinem PC befindet sich keine m8def.inc!!

von Oliver S. (oliverso)


Lesenswert?

Tja, warum nur passt der Link zum Rest des Theeads?

Dein Programm will nicht, und du hast ein Problem. Sonst niemand. Also 
nimmst du entweder die Hinweise hier an, und versuchst rauszufinden, was 
bei deiner Installation fehlt bzw. was du falsch machst, oder du lässt 
es. Denn ganz ehrlich, ob deine LED nun blinkt oder nicht, ist dem Rest 
der Welt ziemlich egal.

Oliver

von Martin F. (martin_f70)


Lesenswert?

Ic hhabe doch schon mein Toolchain gesendet, da sind die net mit drin!!

Wo soll ich die denn herbekommen, finde nichts??

von Loki (Gast)


Lesenswert?

Geht es noch um die Fehlersuche?

Loki schrieb:
> Martin Fischer schrieb:
>> Toll. Habe ich, trotzdem kein blinken...
> .
>> timer1:
>>   eor r16, 0x08
>>   out 0x18, r16
>>   reti
>
> Wie genau soll das funktionieren? eor geht doch nur mit zwei Registern.
> Macht der Assembler da keine Fehlerausgabe?

von gerd (Gast)


Lesenswert?

Hallo Linuxer,

def.inc-Dateien kriegt nur wenn man das Studio mit seinen tools 
(schlappe 400 MB, wenn ich mich richtig erinnere) im Windoof 
installiert. In Wine habe ich das noch nicht versucht, wäre aber ein 
echtes Wunder, wenn es auch da drunter installierbar wäre.

Das hat mich unter Linux so geärgert, dass ich meinen eigenen Assembler 
mit sämtlichen verfügbaren def.inc ausgestattet habe. Den gibt es auch 
für 64-Bit-Linux und der braucht diese Quatschdateien dann nicht mehr.

Einfach gavrasm nehmen, dann ist das Problem wie weggeblasen.

gerd

von Oliver (Gast)


Lesenswert?

Martin Fischer schrieb:
> Ic hhabe doch schon mein Toolchain gesendet, da sind die net mit drin!!

Du hast einen völlig nutzlosen link geposted, der auf eine 
Registrierungseite bei Atmel zeigt.

Die toolchain nutzt die avrlibc. Für die gibt es eine wunderbare Doku. 
Darin findet sich au.a das Kapitel:

http://www.nongnu.org/avr-libc/user-manual/assembler.html

Lesen, nachdenken, verstehen, und alles wird gut.

Oliver

von Martin F. (martin_f70)


Lesenswert?

Mein Code hatte funktioniert, ich hatte die LED am Falschen Port dran ^^

Nur noch eine Frage..wie mache ich es in ASM dass man die Overflows 
Zählt und dann erst beim 10. Die LED toggelt?
In c geht das mit einer if...else anweisung, aber in ASM? Ich habe 
nochnicht so die erfahrung mit ASM, kann mir jemand nen Tip geben?

von Ich (Gast)


Lesenswert?

Martin Fischer schrieb:
> In c geht das mit einer if...else anweisung, aber in ASM? Ich habe
> nochnicht so die erfahrung mit ASM, kann mir jemand nen Tip geben?

Naja, einfach mal überlegen wie der uC  rauskriegen kann, dass der 
Overflow x mal stattgefunden hat.

Tip: Register vom einem gesetzten Startwert runterzählen, (INC Rn)
Bei Null die gewünschte Aktion ausführen usw....

Such dir also mal die Befehle, die das Z-Flag auswerten.

Im "sauberen" Programmierstil zählt die ISR nur die Variable (Register) 
runter. Der Rest kommt in die Loop.

Da es sich aber hier um keine zeitkritische Aktion handelt, kann sogar 
die ganze Auswertlogik mit in die ISR. Aber nur hier in deinem Fall.

von Ich (Gast)


Lesenswert?

Ich schrieb:
> (INC Rn)

natürlich DEC Rn, INC zählt hoch, geht auch. Hochzählen und mit Zielwert 
vergleichen.  Bei Gleichheit Aktion ...

von afroman (Gast)


Lesenswert?

Hallo
Versuch es mal so:
1
.org 0x0000
2
  rjmp main
3
.org 0x0008              ;timer1
4
  rjmp timer1
5
6
main:
7
8
  clr r18                 ;r18 wird ein Zahler
9
10
  ldi r16, 0xbb
11
  out 0x31, r16           ;int. osc. calibration
12
  ldi r16, 0x04
13
  ldi r17, 0x5f
14
  out 0x3e, r16
15
  out 0x3d, r17           ;init stackpointers
16
17
  ser r16
18
  out 0x17, r16           ;set output
19
20
  lds r16, 0x4e
21
  ori r16, 0b00000010     ;set CS11 (teiler8)
22
  sts 0x4e, r16
23
24
  lds r16, 0x59
25
  ori r16, 0b00000100     ;activate timer1
26
  sts 0x59, r16
27
  
28
  sei                     ;enable interrupt
29
  
30
loop:
31
  rjmp loop
32
  
33
timer1:
34
  push r16                 ; sichere r16
35
  inc r18                  ; incrementiere r18
36
  cpi r18, 10              ; prüfe ob r18 10 ist
37
  brne timer1_1            ; wenn nicht 10 dann springe zu timer1_1
38
  clr r18                  ; setze r18 auf 0 zurück
39
  eor r16, 0x08
40
  out 0x18, r16
41
  pop r16                  ; setze r16 zurück
42
  reti
43
44
timer1_1:
45
  pop r16                  ; setze r16 zurück
46
  reti                     ; springe zurück

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

gerd schrieb:
> Einfach gavrasm nehmen, dann ist das Problem wie weggeblasen.

Danke, den kannte ich noch nicht.

Ich verwende den Assembler avra - und zwar unter Linux und (sofern ich 
mal mit Windows arbeiten muss) auch unter Windows. Es ist ein 
vollwertiger Assembler, weitgehend kompatibel zum Original von Atmel, 
und voll makrofähig (kann da sogar mehr als das Original).

Wenn mir Include-Dateien fehlen, finde ich sie meistens im Netz. 
Notfalls auch im Monster-Paket Atmel-Studio, das ich aber zum 
Programmieren nicht verwende. Atmel hat zwar schon vor zwei Jahren 
versprochen, die Includes einzeln verfügbar zu machen, aber zuletzt 
geschrieben, dass sie leider noch nicht dazu gekommen sind. Scheint 
schon sehr kompliziert zu sein. :-(

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

Das ist die Include Datei für den Mega8 (aus dem AVR Studio 4).

Sieh zu, dass du die mit deinem Assembler zum Laufen kriegst, auch wenn 
du an der Syntax das ein oder andere anpassen musst.

so etwas
1
  out 0x18, r16
ist doch Quatsch erster Güte!

Das musst du doch selber sehen, dass das sinnlos ist, so zu arbeiten und 
das es da einen gravierenden Unterschied zu
1
  out PORTB, r16
in der Lesbarkeit und Wartbarkeit und damit dem Potential Fehler zu 
machen gibt.

Wundert mich eigentlich, dass du dir noch nicht selbst ein paar 
Definements für die von dir verwendeten Register gemacht hast. Sogar 
dazu warst du zu faul. Statt dessen nimmst du lieber Chaos in Kauf.
Du musst noch viel lernen, was die Organisation der Programmier-Arbeit 
anlangt. Wer zu faul ist, die 5 Minuten zu investieren, die er benötigt 
um sich wenigstens ein bisschen zu organisieren, wird mit stundenlangem 
Fehlersuchen "belohnt".

Organisier dich. Denn auf Dauer wirst du hier keine bzw. kaum Hilfe 
bekommen. Niemand hier hat nämlich Lust, bei dann etwas größeren 
Programmen erst mal all deine Hex-Zahlen mittels Tabelle in die 
entsprechenden Register zurückzubennen, nur um dann endlich nach einer 
halben Stunde mit der Analyse anfangen zu können, wo du das falsche 
Register erwischt hast. So wichtig ist es den meisten dann nicht, ob bei 
dir eine LED blinkt oder nicht, dass sie sich diese Strafarbeit 
freiwillig antun würden. So ein Programm würde ich meinem ärgsten Feind 
nicht zumuten.

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.