ATmega8 sbic funktioniert nicht bei ZeroFlag =0

OP #1614461
Lesenswert?

Hallo,


bin bis jetzt nur ein "Leser" des sehr guten Forums gewesen.
Leider bin ich jetzt auf ein Problem gestoßen, bei dem ich nicht 
weiterkomme.
Zu meiner Person blutiger Anfänger :-)
Arbeite als Elektrotechniker und habe in der Arbeit eigentlich nur mit 
Hardware zu tun. Mit µC´s arbeite ich nur privat ( stehe noch am Anfang 
).

Zu meinem Problem.
Verwendete Hardware ATmega8 mit externen Oszillator 7,3728Mhz
Ich verwende den Befehl sbic PINC,0 um eine Taste abzufragen um danach 
das Programm verzeigen zu lassen.
Das funktioniert auch, aber leider nur wenn im SREG das ZERO-Bit
auf 1 steht.
Das sieht man im unteren Programmausschnitt. Das ich für Testzwecke
geschrieben habe.
Wenn im Zero-Flag im SREG eine 1 steht funktioniert die Abfrage.
Falls im Zero-Flag eine 0 steht arbeitet das Programm so, als ob die 
Taste gedrückt wäre.

main:

  mov  daten,anz_baud
  rcall  twi_send
  ldi  temp,0x83  ; sbic funktioniert
;       ldi     temp,0x81  ; sbic schlägt fehl
  out  SREG,temp
  sbic  PINC,0
  breq  main
        ;Taste gedrück!
  rcall  twi_send
  rcall  warte
  rcall   ausgabe_uart_help
  rcall  warte
  ldi  anz_baud,0

rjmp main

Danke für Eure Hilfe

mfG patt
Gast #1614474
Lesenswert?

moin

Sicherst du das Statusregister beim Eintritt in
 "rcall  twi_send"
und stellst du es vor dem Rücksprung wieder her ?
Weil es ist anzunehmen das einzelne Flags in dem Unterprg. geändert 
werden.

mfg
OP #1614499
Lesenswert?

Hallo,


wenn ich diesen Teil( nur für Testzwecke )

  ldi  temp,0x83  ; sbic funktioniert
  out  SREG,temp

 im Program habe funktioniert die Abfrage.

wenn ich es so mache
    ldi     temp,0x81  ; sbic schlägt fehl
    out     SREG,temp
funktioniert die Abfrage nicht.
Ich beschreibe das SREG-Regist Zero-Flag einmal mit 1 ( 0x83 )
beim nächsten Versuch mit 0 (0x81)
Wenn ne 1 drin steht funktioniert die Abfrage
Wenn ne 0 drin steht funktioniert die Abfrage nicht.

Das ist das was ich nicht verstehe.

Und ja der Pull-Up ist eingeschalten. ( nachgemessen )
Danke für eure Hilfe

mfG patt
Gast #1614510
Lesenswert?

Natürlich wissen wir nicht, was Dein Programm genau machen soll. Ich 
rate mal, dass Du statt "breq main" eigentlich "rjmp main" meinst ... 
oder? Das würde erklären, warum der Sprung nur dann geht, wenn Z=1.
Gast #1614514
Lesenswert?

Du meinst nicht das sbic sondern das breq !
Das ist klar das breq nur verzweigt wenn das z-flag gesetzt ist

'Conditional relative branch. Tests the Zero flag (Z) and branches 
relatively to PC if Z is set.'

Warum dein sbic nicht geht ? Pull up ?

Es gab aber auch mal ein fehlverhalten bei bestimmten kombinationen von 
branch und skip befehlen ob das bei den aktuellen Chips noch so ist kann 
ich dir nicht sagen , musst du mal bei atmel die erratas lesen !
OP #1614517
Lesenswert?

Hallo,
hab das Testprogramm ein bisschen umgeschrieben.
  ldi    temp,0x81
;       ldi             temp,0x83
  out    SREG,temp
main:

  sbi    PORTB,0
  sbic  PINC,0
  breq  main

  ;Taste gedrück!
  cbi     PORTB,0
rjmp main

An PORTB(0) hängt eine LED und ein OSZI.
Wenn das Programm mit SREG 0x81 läuft. Habe ich an PORTB(0) immer
ein Rechteck stehen,egal ob die Taste gedrückt ist oder nicht.
Wenn das Programm mit SREG 0x83 läuft. Habe ich an PORTB(0) bei 
gedrückter
Taste ein Rechteck, wenn die Taste nicht gedrückt ist einen High-Pegel.

Vielleicht hilft das weiter mit zu helfen.
Danke!!!

mfG patt
OP #1614519
Lesenswert?

Dr, Pillepalle schrieb:
> Du meinst nicht das sbic sondern das breq !
> Das ist klar das breq nur verzweigt wenn das z-flag gesetzt ist
>
> 'Conditional relative branch. Tests the Zero flag (Z) and branches
> relatively to PC if Z is set.'

Oh Oh :-/
DANKE DANKE DANKE!!!!!!
keine Ahnung warum hab das total übersehen.

mfG patt

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren