Forum: Mikrocontroller und Digitale Elektronik Was mache ich hier Falsch??


von Kaveh D. (kaveh)


Lesenswert?

Hallo zusammen,
Was mache ich an dieser Stelle falsch? können überhaupt zwei Timer in 
einem Programm verwendet werden?. (bin Anfänger auf diesem Gebiet).
mfg
Kaveh


.include"m32def.inc"
rjmp        main
.ORG    OVF0addr  rjmp  Timer_0_interrupt
.ORG    OVF1addr  rjmp  Timer_1_interrupt

main:          ;Hauptprogramm
;Stack Initialisieren

ldi    r17,high(ramend)
out    sph,r17
ldi    r17,low(ramend)
out    spl,r17
;-------------------------------------------------------------------
ldi    r16,0xff
out    ddra,r16
ldi    r16,0xff
out    ddrb,r16

;----------------------------------------------------------------------
;Timer0 von Atmega32 konfigurieren (overflow-Interrupt)
;
;Ldi    r16,0X05  ;Vorteiler CK/1024
out    TCCR0,r16
Ldi    r16,0X01  ;Interrupt einschalten
out    TIMSK,r16
;
;----------------------------------------------------------------------
;Timer1 von Atmega32 konfigurieren (overflow-Interrupt)
ldi    r18,0x00
out    TCCR1A,r18
ldi    r18,0b00000100
out    TCCR1B,r18
ldi    r18,0b00000100
out    TIMSK,r18

Ldi    r16,0X00  ;r16 mit Null laden
ldi    r19,0
Sei        ;Interrupt erlauben
;
;----------------------------------------------------------------------
mainloop:  rjmp mainloop   ;endlose Schleiffe
;
;----------------------------------------------------------------------
Timer_0_interrupt:    ;Beginn der Timer-Interrupt an dieser stelle
      com  r16
      out  PORTA,r16
      reti

Timer_1_interrupt:    ;Beginn der Timer-Interrupt an dieser stelle

      com  r19
      out  PORTB,r19
      reti

von Guru (Gast)


Lesenswert?

Woher sollen wir das wissen? Wir wissen ja nicht, was Du beabsichtigst 
und inwiefern das Programm sich anders verhält als Du erwartest.

Siehe: http://www.mikrocontroller.net/articles/Netiquette

von spess53 (Gast)


Lesenswert?

Hi

Das Programm lässt sich nicht fehlerfrei assemblieren.

Die org-Anweisungen für die Interruptvektoren sind in der falschen 
Reihenfolge.

MfG Spess

von Kaveh D. (kaveh)


Lesenswert?

Hallo nochmal,
entschuldige  da hast Du recht. Also das programm, was ich oben zusammen 
geschusstert habe, ist im Prinzip ein Test Programm um zu wissen, ob ich 
Timer 0 bzw. Timer 1 hier benutzen kann (Interrupt overflow). nun meldet 
AVR-Studio diese Meldung:
error: Overlap in .cseg: addr=0x16 conflicts with 0x16:0x17.
und da weiß ich nicht, wie das beheben kann.
mfg
Kaveh

von Kaveh D. (kaveh)


Lesenswert?

Vielen Dank für die Antwort. die Reihenfolge. ich dachte erst 0 und dann 
die 1. aber gut man kann nie genug lernen.
Danke
Kaveh

von Guru (Gast)


Lesenswert?

>...entschuldige ...

Keine Entschuldigung nötig. :-)

>lso das programm, was ich oben zusammen
>geschusstert habe, ist im Prinzip ein Test Programm um zu wissen, ob ich
>Timer 0 bzw. Timer 1 hier benutzen kann (Interrupt overflow).

Das ist leider eine zu allgemeine Erklärung. Vor allem geht nicht aus 
ihr hervor, auf welche Weise genau Du das testen willst.
Nun hat Dir ja Peter schon einen eklatanten Punkt genannt. Korrigiere 
den erstmal.

Für die Zukunft:
Was soll das Programm machen? woran erkennst Du das es nicht läuft? 
Welche Teile des Programmes sollen was tun? An welcher Stelle weicht das 
Programm von dem ab, was es Deiner Meinung nach tun soll? Woran genau 
stellst Du das fest.

Im konkreten Fall noch der Hinweis:
Schau Dir mal genau an, was die .org-Anweisung bewirkt. Dann wirst Du 
auch merken was schief läuft.

von spess53 (Gast)


Lesenswert?

Hi

>und da weiß ich nicht, wie das beheben kann.

>.ORG    OVF0addr  rjmp  Timer_0_interrupt  -> Adresse $012
>.ORG    OVF1addr  rjmp  Timer_1_interrupt  -> Adresse $00C

Du kannst die diese Org-Anweisungen nicht bunt durcheinander würfeln. 
Zumindest muss die, mit der höchsten Adresse am Ende stehen.

Oder du setzt

  .org INT_VECTORS_SIZE

vor deine 'main'.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Und sieh dir mal folgende Zeilen an:

>Ldi    r16,0X01  ;Interrupt einschalten
>out    TIMSK,r16
....
>ldi    r18,0b00000100|0X01
>out    TIMSK,r18

MfG Spess

von Kaveh D. (kaveh)


Lesenswert?

Hallo nochmal,
um Funktion des Timers besser zu verstehen, habe ich folgendes programm 
geschrieben, was auch hier gestern korrigiert wurde.ich will eigentlich 
hier mit zwei Timmern arbeiten.
Nun wenn Timer0 (8-Bit) und Timer1 (16-Bit) vom Atmega32 so konfiguriet 
werden, dass nach jedem Überlauf einen Interrupt ausgelöst wird, dann 
wird Timer0 ofter überlaufen und den Interrupt auslösen als der Timmer 
1. nun habe ich das unten stehende Programm im AVR-Studio simuliert und 
sehe, dass der Timmer0 nach jedem überlauf den Interrupt aufruft. 
parallel dazu läuft der Timmer1 auch da wird gezählt aber dann beim 
überlaufen vom Timmer1 passiert garnicht und der beginnt wieder von Null 
hochzuzählen und er löst auch keinen Interrupt aus. nur der Timer0 macht 
das. Ich habe den Timer1 so vorgeladen, dass er früher überläuft als 
Timer0 und da klappt es mit Intterrupt aber nun ist die Sache genau 
andersum. Mit anderen Worten, es funktionier entweder Mit Timmer0 oder 
Timmer1 (der Interrupt).
Die Frage ist, ob so etwas überhaupt geht ? oder mit dem Programm stimmt 
etwas nicht?
mfg
kaveh

.include"m32def.inc"
rjmp        main

.ORG    OVF1addr  rjmp  Timer_1_interrupt
.ORG    OVF0addr  rjmp  Timer_0_interrupt
.def    temp=r16


main:          ;Hauptprogramm
;Stack Initialisieren

ldi    temp,high(ramend)
out    sph,temp
ldi    temp,low(ramend)
out    spl,temp
;-------------------------------------------------------------------
ldi    temp,0xff
out    ddra,temp    ;Port A als Ausgang konfig
ldi    temp,0xff
out    ddrb,temp    ;Port B als Ausgang konfig



;----------------------------------------------------------------------
;Timer1 von Atmega32 konfigurieren (overflow-Interrupt)
ldi     temp,0x00
out     TCCR1A,temp
ldi     temp,0b00000001
out     TCCR1B,temp
ldi     temp,0b00000100
out     TIMSK,temp

;ldi     temp,0xff  ;Z.B TCNT1(16-bit) mit Wert Hex=fffb vorladen
;out     TCNT1h,temp
;ldi     temp,0xfb
;out     TCNT1L,temp



;----------------------------------------------------------------------
;Timer0 von Atmega32 konfigurieren (overflow-Interrupt)
;
Ldi     temp,0X01  ;Vorteiler CK/1
out     TCCR0,temp
Ldi     temp,0X01  ;Interrupt einschalten
out     TIMSK,temp

;ldi    temp,0xf8  ; Z.B TCNT0 mit Wert Hex= f8 vorladen
;out    TCNT0,temp



Sei      ;Interrupt erlauben
;
;----------------------------------------------------------------------
mainloop:  rjmp mainloop   ;endlose Schleiffe
;
;----------------------------------------------------------------------


Timer_1_interrupt:  ;Beginn der Timer-Interrupt an dieser stelle

      sbi    portA,0   ;portA.0 auf 1
      reti

Timer_0_interrupt:    ;Beginn der Timer-Interrupt an dieser stelle
      sbi    portB,0   ;portB.0 auf 1
      reti

von Vlad T. (vlad_tepesch)


Lesenswert?

Kaveh Deiport schrieb:
> Was mache ich an dieser Stelle falsch?

Es fing damit an, dass du den Thread keinen vernünftigen Titel gabst

von spess53 (Gast)


Lesenswert?

Hi

>Die Frage ist, ob so etwas überhaupt geht ?

Das geht problemlos. Sogar mit noch mehr Timernn

> oder mit dem Programm stimmt etwas nicht?

Genau. Du machst zwei mal ein 'out TIMSK,temp. Mit dem zweiten out 
überschreibst du die erste Zuweisung. Das muss so aussehen:
1
    ldi r16,1<<TOIE0|1<<TOIE1
2
    out TIMSK,r16

Benutze bitte die vordefinierten Bitkonstenten statt kryptischer 
Bitkombinationen.

MfG Spess

von Kaveh D. (kaveh)


Lesenswert?

Hi,
danke und ein schönes Wochenende.
mfg
kaveh

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.