Forum: Mikrocontroller und Digitale Elektronik LDS Befehl funktioniert im controller nicht.


von haderlump (Gast)


Lesenswert?

Hallo zusammen

bei folgendem Programmteil geht offensichtlich der lds (1. Zeile nach 
Timer1_comp_B:)Befehl nicht.
Im Simulator klappt alles, aber die serielle Schnittstelle gibt nur hx00 
aus. Wenn ich temp3 mit anderen Werten lade funktioniert alles.
Kann es sein dass man den Timer nicht auslesen kann, oder was mache ich 
denn da verkehrt. Und warum geht das im Simulator??
Der Timer läuft definitif, denn an PORTD,2  bekomme ich ein schönes 
Signal.

  Timer1_overflow:    //Beginn einer neuen PCM-Periode
  push  temp1
  in    temp1,sreg
  push  temp1
  cbi    PORTD,2      ;LED ausschalten(Lebenszeichen)
  clr     temp1
  sts    TCNT1H,temp1
  sts    TCNT1L,temp1
  ldi    temp1,0b00111111
  out    PORTB,temp1      ;Bits setzen
  out    PORTC,temp1
  sbi    PORTD,4
  sbi    PORTD,5
  ldi    status,0
  pop    temp1
  out    sreg,temp1
  pop    temp1
  reti
;*******************************************************
Timer1_comp_B:
  lds    temp3,TCNT1H
  sts    udr0,temp3
  sbi    PORTD,2      ;LED einschalten(Lebenszeichen)
  reti

von Karl M. (Gast)


Lesenswert?

Und wie sprechen von was ?

von chris (Gast)


Lesenswert?

probier mal

IN   yyy,TCNT1H
OUT  TCNT1H,yyyy

bei anderen AVR's mit mehreren Timern ab 3 muss aber der LDS-Befehl 
genutzt werden....

von Mikki M. (mmerten)


Lesenswert?

welcher Atmel Prozessor ?
TCNT1H liegt nicht bei einigen AVR im I/O Bereich, dann ist bei LDS 
Zugriff ein Offset von 0x20 zu addieren.
Oder der Compare B Wert ist < 256, dann ist TCNT1H immer 0

von Inkognito (Gast)


Lesenswert?

Kommentiere mal das Programm etwas besser und fang mit einer
CPU-Legende an. Ich bin nicht sicher, aber gibts im Simulator
keinen Interruptkonflikt gegenüber der Hardware ?

von chris (Gast)


Lesenswert?

Mikki M. schrieb:
> welcher Atmel Prozessor ?

Atmega328 war einer von denen die ich so mitbekommen habe...

Hatte das Problem selber mal gehabt und gerade nochmal kurz in paar SW's 
geschaut finds aber gereade nicht..

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

haderlump schrieb:
> Kann es sein dass man den Timer nicht auslesen kann, oder was mache ich
> denn da verkehrt. Und warum geht das im Simulator??

 AVR Simulator ist sowieso Sch...

 Und man soll nicht versuchen erst TCNT1H zu lesen...

 Versuche es erst mit TCNT1L und dann TCNT1H ;-)

: Bearbeitet durch User
von Sebastian S. (amateur)


Lesenswert?

Ich freu' mich schon auf den ersten Aufruf von Timer1_comp_B, außerhalb 
der Entwicklungsumgebung.

von MWS (Gast)


Lesenswert?

Sebastian S. schrieb:
> Ich freu' mich schon auf den ersten Aufruf von Timer1_comp_B,
> außerhalb
> der Entwicklungsumgebung.

Da passiert nichts, keiner der Befehle verändert SREG.

@haderlump, Zitat DB: "Accessing the low byte triggers the 16-bit read 
or write operation."

von haderlump (Gast)


Lesenswert?

Hallo Leute
Ich habe den Fehler gefunden. Man muss zuerst das Low-Byte lesen, auch 
wenn man das nicht braucht. Dan klappt es. Der Simulator berücksichtigt 
das nicht, sondern gibt einfach das High-Byte zurück.

Gruß Fritz

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

haderlump schrieb:
> Hallo Leute
> Ich habe den Fehler gefunden. Man muss zuerst das Low-Byte lesen, auch
> wenn man das nicht braucht. Dan klappt es. Der Simulator berücksichtigt

 Wow.
 Wie bist du nur darauf gekommen ?

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.