Forum: Mikrocontroller und Digitale Elektronik ATmega8 sbic funktioniert nicht bei ZeroFlag =0


von Patt :. (patt)


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

von Dr, Pillepalle (Gast)


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

von max power (Gast)


Lesenswert?

sbic und sreg haben nichts miteinander zu tun.
ist der pull up am taster eingeschalten?

von Patt :. (patt)


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

von Drachenbändiger (Gast)


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.

von Dr, Pillepalle (Gast)


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 !

von Patt :. (patt)


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

von Patt :. (patt)


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

von Patt :. (patt)


Lesenswert?

Hallo,


komplettes Programm funktioniert :-)
Kleine Ursache große Wirkung ( Assembler :-) )
Danke für die Hilfe. Da merkt man doch den Unterschied zwischen mir
und erfahrenen µC-Leuten.

mfG patt

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.