Ich möchte einen Microcontroller für ein Projekt Programmieren. bin ziemlich neu auf dem Gebiet. hab mir ein kleines Programm zusammengestellt, wo 4 Eingänge ausgelesen werden und dann als uebergabe ausgewertet werden soll. Soweit so gut, es funktioniert im Simulator ohne Fehler, nur nach dem Brennen und Test life geht nichts. Scheint an diesen Zeilen zu scheitern. Für Hilfe wäre ich sehr Dankbar. ;++++++++++++übergabe wird auf nicht erlaubt geprüft+++++++++++ cpi uebergabe,3 breq nichterlaubt;sprung wird nur ausgeführt wenn Werte gleich sind cpi uebergabe,12 brsh nichterlaubt ;sprung wird nur ausgeführt wenn Werte gleich oder ;höher sind ;+++++++++++übergabe wird auf time ab und totmann wenden geprüf cpi uebergabe,1 breq timeab ;sprung wird nur ausgeführt wenn Werte gleich ;+++++++++++übergabe wird auf time auf geprüft++++++++++++ cpi uebergabe,2 breq timeauf ;sprung wird nur ausgeführt wenn Werte gleich ;+++++++++++übergabe wird auf totmann auf geprüft+++++++++++ cpi uebergabe,4 breq totmannauf ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,5 breq totmannauf ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,6 breq totmannauf ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,7 breq totmannauf ;sprung wird nur ausgeführt wenn Werte gleich ;+++++++++++übergabe wird auf totmann ab geprüft+++++ cpi uebergabe,8 breq totmannab ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,9 breq totmannab ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,10 breq totmannab ;sprung wird nur ausgeführt wenn Werte gleich cpi uebergabe,11 breq totmannab ;sprung wird nur ausgeführt wenn Werte gleich ;+++++++++++übergabe wird auf null geprüft++++++++++++++ cpi uebergabe,0 breq nullstellung ;sprung wird nur ausgeführt wenn Werte gleich
Hi >...wo 4 Eingänge ausgelesen werden und dann als uebergabe ausgewertet >werden soll. Und was hängt an diesen Eingängen? MfG Spess
Ich nehm mal an, es handelt sich um einem AVR. Soweit ich mich recht erinnere, geht cpi nur mit Registern 16-31. nicht mit den Registern 0-15, und auch nicht mit Variablen. Kann mich aber irren.
Hi >Soweit ich mich recht erinnere, geht cpi nur mit Registern 16-31. >nicht mit den Registern 0-15, und auch nicht mit Variablen. Stimmt. Aber solche Fehler meckert der Assembler an. MfG Spess
A...aha Soooo. schrieb: > Ich nehm mal an, es handelt sich um einem AVR. Soweit ich mich recht > erinnere, geht cpi nur mit Registern 16-31. nicht mit den Registern > 0-15, und auch nicht mit Variablen. Kann mich aber irren. stimmt so. Allerdings gibt der Assembler dann ja eine Fehlermeldung aus, da die Operanden nicht passen. Wärs möglich den Code mal komplett als Anhang hier zu posten? Weil in diesen paar Zeilen sind nur die Sprünge angegeben, nicht die Sprungziele und auch nicht, wie du die Eingaben auf die "übergabe" speicherst. :-)
Tasten einzulesen und einen ganzen Port zu vergleichen, ist gelinde gesagt äußerst unklug. Es interessiert Dich doch nur ein einziger Pin. Also darfst Du auch nur diesen einen testen, die andern müssen als egal angesehen werden. Sobald Dein Programm nur etwas größer wird, wirst Du nicht mehr wissen, was die anderen 7 Pins für einen Zustand haben. Sie können z.B. PWM-Ausgänge sein. Peter
Ich bewundere den blinden Glauben an den Assembler. Ich hatte schon Atmel-AVR-Assembler, die erkannten nicht einmal doppelte Labels. Oder probiert auf einem AT90USB162 mal lds r16,GPIOR2 oder sts GPIOR2,r16 Das meckert der Assembler auch nicht an, aber die Nebeneffekte sind beeindruckend.
Hi >Oder probiert auf einem AT90USB162 mal >lds r16,GPIOR2 >oder >sts GPIOR2,r16 >Das meckert der Assembler auch nicht an, aber die >Nebeneffekte sind beeindruckend. Warum sollte es das anmeckern? Da ist erst mal kein Fehler drin. Woher soll der Assembler wissen, das du ihm eine falsch Adresse angibst? MfG Spess
woher wissen wir, wo "uebergabe" her kommt?
Hi
>woher wissen wir, wo "uebergabe" her kommt?
Vielleicht sollte man das hier ruhen lassen, bis sich der TO mal wieder
meldet.
MfG Spess
> Warum sollte es das anmeckern? Da ist erst mal kein Fehler drin. Woher > soll der Assembler wissen, das du ihm eine falsch Adresse angibst? Vielleicht weil GPIOR2 > 0x003F und .equ IOEND = 0x00ff in dem defines-include den problematischen Bereich klar definiert? Diese Falle führt zu sehr unangenehmen Überraschungen, die nicht nur mit falsch eingelesen Werten zu tun haben. Der Programmzähler läuft irr...
sollte natürlich heißen GPIOR2 <= 0x003F lds r16,GPIOR2 sts GPIOR2,r16 kann/könnte der Assembler leicht abfangen oder wenigstens mit einem warning versehen. Tut er aber nicht.
Hi >GPIOR2 > 0x003F >und >.equ IOEND = 0x00ff lds und sts haben nichts mit IO zu tun. GPIOR2 hat zwei Adressen. 0x2B wenn mit in/out darauf zugegriffen wird und 0x4B für den Zugriff mit lds/sts. Im Includefile steht: .equ GPIOR2 = 0x2b Das ist die IO-Adresse. Also produziert ein lds/sts auf GPIOR2 einen Zugriff auf PortD (IO-Adresse $2B) Verständlich? MfG Spess
Hallo Leute ersteinmal herzlichen Dank für die vielen Antworten. find ich echt toll. Stelle fest habe noch recht viel zu lernen. Spess53 schrieb: Und was hängt an diesen Eingängen? Hier sind vier entprellte Taster asngeschlossen, aktiv high guest schrieb: > und wofür steht "uebergabe" ? die Eingänge werden in einer Interruproutine abgefragt und in uebergabe gespeichert. .def uebergabe = r20 A...aha Soooo. schrieb: > Ich nehm mal an, es handelt sich um einem AVR. Soweit ich mich recht > erinnere, geht cpi nur mit Registern 16-31. nicht mit den Registern > 0-15, und auch nicht mit Variablen. Kann mich aber irren es handelt sich um einen ATtiny 2313, Register ist ja r20." Auch nicht mit Variablen", wie meinst du das? es wird ja Register mit einer Konstanten verglichen. Peter Dannegger schrieb: > Tasten einzulesen und einen ganzen Port zu vergleichen, ist gelinde > gesagt äußerst unklug. Ich weiß schon das hier noch jede Menge Kinderkrankheiten vorhanden sind. Ist ja auch mein erster Versuch, bin auf jeden Fall dankbar für jede Hilfe bzw Vorschläge für Änderungen. Einen ganzen Port zu vergleichen ist sicher nicht gut, wie du schreibst, aber es ist mein Startprojekt, und da genügend Hardware vorhanden ist, wollte ich mich noch nicht mit den einzelen Pins beim einlesen herumschlagen. Weiters ist ja auch wichtig das verschiedene Schleifen angesprungen werden wenn zwei oder mehr Taster zugleich gedrückt werden. zum testen hab ich mal die Vergleichsroutine umgeschrieben. sbrs uebergabe,0 rjmp timeab oder sbrs uebergabe,1 rjmp timeauf rjmp nullstellung und wenn ich es teste funktionierts auch am Chip. Muß wohl meine Abfrage komplett umschreiben, nur auf vier Pins, und nur die Bits abfragen und auswerten. Wäre erst Lernziel Nummer 2 gewesen. Intressiret mich aber trotzdem warum die CPI Variante nicht funktioniert, bzw wo der Fehler ist. nochmal Dank für die raschen Antworten mit denen ich eigentlich nicht gerechnetet hatte mfg edi
Hi >Muß wohl meine Abfrage komplett umschreiben, nur auf vier Pins, und nur >die Bits abfragen und auswerten. Soll das heissen, du liest den ganzen Port in 'uebergabe' ein und verarbeitest das weiter? Wenn ja, dann maskiere die Bits einfach aus: in uebergabe,Pinx andi uebergabe,0b00001111 ; Pin0...3 .... dann enthält 'uebergabe' nur noch deine Taster. MfG Spess
Hi Spess53 schrieb: > in uebergabe,Pinx > andi uebergabe,0b00001111 ; Pin0...3 > .... > > dann enthält 'uebergabe' nur noch deine Taster. stimmt schon, muß dann aber erst die Tasterstellung vergleichen um die richtige Aktion folgen zu lassen. folgendes Problem: Taster eins ein Aktion1 uebergabe 0b00000001 Tster zwei ein Akt.2 uebergabe 0b00000010 Taster drei ein Akt.3 uebergabe 0b00000100 Taster vier ein Akt.4 uebergabe 0b00001000 Taster eins und zwei ein Akt.5 uebergabe 0b00000011 Taster eins und drei ein Akt.3 uebergabe 0b00000101 Taster eins und vier ein Akt.4 uebergabe 0b00001001 Taster zwei und drei ein Akt.3 uebergabe 0b00000110 Taster zwei und vier ein Akt.4 uebergabe 0b00001010 Taster drei und vier ein Akt.5 uebergabe 0b00001100 Taster eins, zwei und drei ein Akt.3 uebergabe 0b00000111 Taster eins, zwei und vier ein Akt.4 uebergabe 0b00001011 Taster zwei, drei und vier ein Akt.5 uebergabe 0b00001110 alle vier Taster ein Akt.5 uebergabe 0b00001111 kein Taster ein Akt.6 uebergabe 0b00000000 ich vergleiche mit cpi funktioniert am Simulator einwandfrei nur ab Chip nicht. mfg edi
Hi >ich vergleiche mit cpi funktioniert am Simulator einwandfrei nur ab Chip >nicht. 'cpi' funktioniert im Controller genauso. Dein Fehler steckt im dem Programmteil, den du nicht gezeigt hast. Stell mal dein komplettes Programm im Anhang rein. MfG Spess
Du gehst in der Tabelle davon aus, dass eine gedrückte Taste eine 1 liefert. Wie ist es denn in deiner Hardware realisiert? Meistens schalten die Tasten einen Pullup gegen Masse, das wäre dann gerade anders herum. Grüße, Peter
Hi Du kannst dir das ganze Vergleichen auch komplett ersparen
1 | in r16,PinB |
2 | andi r16,$0F |
3 | |
4 | clr r17 |
5 | ldi ZL, Low(action_list<<1) ;Zeiger auf |
6 | ldi ZH,High(action_list<<1) ;action_list |
7 | |
8 | add ZL,r16 |
9 | adc ZH,r17 ; Offset addieren |
10 | lpm r16,Z ; action-Nummer holen |
11 | dec r16 ; um bei 0 anzufangen |
12 | |
13 | ldi ZL, Low(action_jmp) ; Adresse |
14 | ldi ZH,High(action_jmp) ; Sprungtabelle |
15 | add ZL,r16 ; aktion-Nummer |
16 | adc ZH,r17 ; addieren |
17 | icall |
18 | .... ; hier gehts weiter |
19 | |
20 | action_list: .db 6,1,2,5,3,3,3,3,4,4,4,4,5,7,5,5 |
21 | ; ^ fehlt bei dir |
22 | |
23 | action_jmp: rjmp action1 |
24 | rjmp action2 |
25 | rjmp action3 |
26 | rjmp action4 |
27 | rjmp action5 |
28 | rjmp action6 |
29 | rjmp action7 |
30 | |
31 | |
32 | action1: ret ; da muss der Code |
33 | action2: ret ; für deine Aktionen |
34 | action3: ret ; hin |
35 | action4: ret |
36 | action5: ret |
37 | action6: ret |
38 | action7: ret |
MfG Spess
Hallo das ganze Programm im Anhang. hoffe es hilft weiter. mfg edi
Hi >in M1, pinb >com m1 >mov uebergabe,m1 >clr m1 Wozu der Umweg über M1?
1 | in uebergabe, pinb |
2 | com uebergabe |
3 | andi uebergabe,$0F ; nur deine Tasten |
MfG Spess
hallo tolle Anregung,noch zu hoch für mich, werd mich mal kräftig reinknien. funktioniert das auch suf dem ATtiny2313? mfg Edi Spess53 schrieb: > Hi > > Du kannst dir das ganze Vergleichen auch komplett ersparen >
Spess53 schrieb: > Hi > > >>in M1, pinb >>com m1 >>mov uebergabe,m1 >>clr m1 > > Wozu der Umweg über M1? > >
1 | > in uebergabe, pinb |
2 | > com uebergabe |
3 | > andi uebergabe,$0F ; nur deine Tasten |
4 | |
5 | |
6 | > |
7 | > |
> > MfG Spess Hallo OK ist klar der Umwweg ist am Anfang entstanden kann mann weglassen. das mit andi ist auch klar hab dann nur mehr 16 Möglichkeiten die verglichen werden müssen um eine Aktion zu setzen. Also mit cpi oder deine andere Variante muss mich noch einmal ordenlich reinhauen. mfg Edi
Hi >tolle Anregung,noch zu hoch für mich, werd mich mal kräftig reinknien. Ist eigentlich relativ einfach: In der .db Direktive steht zu jeder Tastenkombination die zugehörige Aktionsnummer. Z wird mit dem Tabellenanfang geladen und die Tastennummer addiert. Mit lpm wird dann die zugehörige Aktions-Nummer geholt. Im nächsten Schritt wird aus der Aktions-Nummer der Offset in der Sprungtabelle errechnet. 'icall' macht einen 'call' auf die Adresse in Z, der über die Sprungtabelle zu deiner Aktions-Routine führt. >funktioniert das auch suf dem ATtiny2313? Ja. MfG Spess
Eduard Singer schrieb: > ich vergleiche mit cpi funktioniert am Simulator einwandfrei nur ab Chip > nicht. kann es sein, das dein Problem ist, das im wirklichen leben die Taster NIE 100% zur gleichen Zeit ein Signal liefern, du im Simulator aber die Eingänge beliebig setzen kannst, ohne das das Programm läuft. Auf dem Controller wird dann aus LINKS+OBEN z.B. LINKS und danach LINKS+OBEN. Sascha
Hallo Leute Vielen Dank für die vielen Antworten und Vorschläge, besonders an Spess für die Idee mit der Actionlist, Hab das Programmerl umgeschrieben wie du vorgeschlagen hast. Es funktioniert am Simulator UND am Controller!!! Ich stells als Anhang rein, vielleicht gibts ein paar Verbesserungsvorschläge. Also nochmal Dank an alle und Spess mfg edi
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.