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
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
sbic und sreg haben nichts miteinander zu tun. ist der pull up am taster eingeschalten?
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
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.
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 !
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.