Forum: Mikrocontroller und Digitale Elektronik AVR Sprungtabelle


von Claude B. (claude44)


Angehängte Dateien:

Lesenswert?

Guten Tag an alle

ich habe versuche ein klein Sprungtabelle zu schreiben, aber er will 
nicht funktionieren, ich frage euch ob jemand mir erklären kann was ich 
zufällig falsch gemacht habe. Das Programm habe ich beigelegt
Vielen Danke
Claude

: Bearbeitet durch Moderator
von Peter II (Gast)


Lesenswert?

was willst du mit dieser Zeile erreichen?

> ldi  tmp,PIND

von Falk B. (falk)


Lesenswert?

1
loop:    
2
     Ldi  ZH,High(meinTab)  ; High Adresse der Tabel
3
     ldi  ZL, low(meinTab)  ; Low Adresse der Tabel
4
5
; Hier fehlt das EInlesen von PIND
6
7
     andi  tmp,0x0f    ; Lösche die obere Bits
8
     add  ZL,tmp      ; Adiere Portklavierstand zu Tabellenadresse
9
10
; das ist auch falsch, es muss in, tmp, PIND heißen
11
12
     ldi  tmp,PIND    
13
14
; eine 16 Bit Addition geht anders. Erst low byte, dann high byte
15
16
     adc  ZH, tmp
17
    
18
     icall


Siehe AVR-Tutorial: Mehrfachverzweigung

von Jürgen (Gast)


Lesenswert?

Da deine Tabelle im Flash steht, muss es heissen:
1
     Ldi  ZH,High(meinTab*2)  ; High Adresse der Tabel
2
     ldi  ZL, low(meinTab*2)  ; Low Adresse der Tabel

von Falk B. (falk)


Lesenswert?

@Jürgen (Gast)


>Da deine Tabelle im Flash steht, muss es heissen:

>     Ldi  ZH,High(meinTab*2)  ; High Adresse der Tabel
>     ldi  ZL, low(meinTab*2)  ; Low Adresse der Tabel


Nö.

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Mehrfachverzweigung#Z-Pointer_leicht_verst.C3.A4ndlich

von (prx) A. K. (prx)


Lesenswert?

Jürgen schrieb:
> Da deine Tabelle im Flash steht, muss es heissen:

Daten im Flash werden als Bytes adressiert, Code aber als Worte.

von Claude B. (claude44)


Lesenswert?

Falk B. schrieb:
> @Jürgen (Gast)
>
>
>>Da deine Tabelle im Flash steht, muss es heissen:
>
>>     Ldi  ZH,High(meinTab*2)  ; High Adresse der Tabel
>>     ldi  ZL, low(meinTab*2)  ; Low Adresse der Tabel

es fehlt nur den: "in temp, PIN"
>
>
> Nö.

von Eric B. (beric)


Lesenswert?

Magst du jetzt wo dein Scheibenwischer doch funktioniert, alles nochmal 
in Assembler schreiben?

von Claude B. (claude44)


Lesenswert?

Eric B. schrieb:
> Magst du jetzt wo dein Scheibenwischer doch funktioniert, alles nochmal
> in Assembler schreiben?
Jaein,
Mein Vertig Bascom Programm bleibe, ich werde mir das ansehen noch mal 
und weichenlich ein Möglichkeit einbauen für ein verlängerung oder 
verkürzung der Pause.
Ich hatte dieser Programm mit ASM angefangen, stillgelegt für Bascom.
Und jetzt wollte ich mit dieser Sprungtabelle funktioniert, um etwas 
andere zu machen
kein sorge der Bascom wird eingebaut. Ich habe doch noch frage darauf, 
das geht um die Steuerung meiner relais. Für sofort ich möchte noch mein 
Sprungtabelle vertigmachen
Nochmal Danke für Dein Hilfe im Bascom
Claude.

PS Ich habe doch angekündig dass ich auch in ASM machen wollte

: Bearbeitet durch User
von Claude B. (claude44)


Angehängte Dateien:

Lesenswert?

ein Sprungtabel funktioniere immer noch nicht,
Ich verstehe nicht ganz wie die SBIC Zeile aufgebaut sein soll?
Kann mir jemand helfen?

von Falk B. (falk)


Lesenswert?

@Claude Bochard (claude44)

>    Tabellen.docx (13,2 KB, 3 Downloads)

Was soll der Unsinn? Warum sendest du deinen ASSEMBLERquelltext nicht 
einfach so wie er ist, als .asm Datei?

>ein Sprungtabel funktioniere immer noch nicht,
>Ich verstehe nicht ganz wie die SBIC Zeile aufgebaut sein soll?
>Kann mir jemand helfen?

Hast du mal den Artikel gelesen? Dort steht alles drin!

AVR-Tutorial: Mehrfachverzweigung

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


Lesenswert?

Claude B. schrieb:
> Kann mir jemand helfen?

 Dir ist nicht zu helfen.

von Claude B. (claude44)


Lesenswert?

Marc V. schrieb:
> Claude B. schrieb:
>> Kann mir jemand helfen?
>
>  Dir ist nicht zu helfen.

Vielen dank
Ich bin aber der Meinung dass, wenn man Kann, ou will aber man muss 
können, helfen ist einfach.

von Claude B. (claude44)


Angehängte Dateien:

Lesenswert?

Falk B. schrieb:
> @Claude Bochard (claude44)
>
>>    Tabellen.docx (13,2 KB, 3 Downloads)
>
> Was soll der Unsinn? Warum sendest du deinen ASSEMBLERquelltext nicht
> einfach so wie er ist, als .asm Datei?
Sorry, wird so gemacht. Kein hatt mir gesagt, wusst ich nicht
>
> Hast du mal den Artikel gelesen? Dort steht alles drin!
>
> AVR-Tutorial: Mehrfachverzweigung

Vielen Danke für der Link, habe ich mir angesehen leider ist es mir 
schwirig die für mein bedürfniss einzusetzen, etwas fehlt mir.

von Kurzy (Gast)


Lesenswert?

Claude B. schrieb:
> Falk B. schrieb:
>> @Claude Bochard (claude44)
>>
>>>    Tabellen.docx (13,2 KB, 3 Downloads)
>>
>> Was soll der Unsinn? Warum sendest du deinen ASSEMBLERquelltext nicht
>> einfach so wie er ist, als .asm Datei?
> Sorry, wird so gemacht. Kein hatt mir gesagt, wusst ich nicht
>>
>> Hast du mal den Artikel gelesen? Dort steht alles drin!
>>
>> AVR-Tutorial: Mehrfachverzweigung
>
> Vielen Danke für der Link, habe ich mir angesehen leider ist es mir
> schwirig die für mein bedürfniss einzusetzen, etwas fehlt mir.

Duden?

von Jürgen_W (Gast)


Lesenswert?

1
 benutzung der Tabelle Sprung  
2
 .def  tmp    = r16
3
 .def  schleife  = r17
4
 .def  Schalter  = r18
5
6
.EQU  Portein  = PORTD
7
.EQU  PINein    = PIND
8
.equ  led1    = PIND1
9
.equ  led2    = PIND2
10
.equ  Portaus  = PORTB
11
main:
12
    /*   Initialiesierung   */
13
 ldi  tmp, low(ramend)
14
out  spl, tmp
15
        ldi tmp, 0xFF      ; Alle Pins am Port B durch Ausgabe von 0xFF ins
16
        out DDRB, tmp      ; Richtungsregister DDRB als Ausgang konfigurieren              
17
         clr tmp             ; Alle Pins am Port D durch Ausgabe von 0x00 ins
18
         out DDRD, tmp      ; Richtungsregister DDRD als Eingang konfigurieren
19
  ser tmp        ; Pulup für die Taster
20
  out Portein, tmp
21
   clr  tmp
22
  out  Portaus,  tmp    ; led löschen
23
  out  PIND,    tmp                
24
loop:    
25
  Ldi  ZH,High(meinTab)  ; High Adresse der Tabel
26
  ldi  ZL, low(meinTab)  ; Low Adresse der Tabel
27
  andi  tmp,0x0f    ; Lösche die obere Bits
28
  add  ZL,tmp      ; Adiere Portklavierstand zu Tabellenadress
29
        in  tmp,PIND         ; Pin Laden in tmp
30
  adc  ZH, tmp    ; in ZH übertragen
31
  sbic  tmp, ##    ; 
32
  icall        
33
       rjmp loop       
34
meinTab:
35
    rcall  Pos_0
36
    rcall  Pos_1
37
    rcall  Pos_2
38
    rcall  Pos_3
39
    rcall  Pos_4
40
    ret
41
Pos_0:
42
ret
43
44
Pos_1:
45
ret
46
47
Pos_2:
48
ret
49
50
Pos_3:
51
ret
52
53
Pos_4:
54
ret

Ich nehme an, dass du anhand der Ziffer in tmp nach pos_0..4 verzweigen 
willst ? Wenn Ja, probiere es mal so
1
loop:    
2
  Ldi  ZH,High(meinTab)  ; High Adresse der Tabel
3
  ldi  ZL, low(meinTab)  ; Low Adresse der Tabel
4
  andi  tmp,0x0f    ; Lösche die obere Bits
5
        lsl     tmp  ;In deiner Tab stehen Words, deshalb mal 2
6
  clr     tmp1 ;oben noch zuweisen
7
        add  ZL,tmp      ; Adiere Portklavierstand zu Tabellenadress
8
  adc  ZH, tmp1    ; Carry addieren
9
  icall        
10
       rjmp loop

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


Lesenswert?

Jürgen_W schrieb:
> willst ? Wenn Ja, probiere es mal so

 Warum Leute nichtfunktionierenden Code durch falschfunktionierende
 Änderungen noch schlechter machen, bleibt für mich ein Rätsel.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Siehe Anhang.

von Claude B. (claude44)


Lesenswert?

Falk B. schrieb:
> Siehe Anhang.
 Vielendank, Dein Erklärung mit Komentar waren sehr umfangreich,ich bin 
doch ein Schritte weiter gegangen.

von Falk B. (falk)


Lesenswert?

@ Kurzy (Gast)

>> Vielen Danke für der Link, habe ich mir angesehen leider ist es mir
>> schwirig die für mein bedürfniss einzusetzen, etwas fehlt mir.

>Duden?

Wie man am Namen des OP erahnen kann, ist er wohl Franzose und Deutsch 
nicht seine Muttersprache.

Comprenez-vous?

von Claude B. (claude44)


Lesenswert?

Falk B. schrieb:
> @ Kurzy (Gast)
>
>>> Vielen Danke für der Link, habe ich mir angesehen leider ist es mir
>>> schwirig die für mein bedürfniss einzusetzen, etwas fehlt mir.
>
>>Duden?
>
> Wie man am Namen des OP erahnen kann, ist er wohl Franzose und Deutsch
> nicht seine Muttersprache.

Genau
>
> Comprenez-vous?
oui monsieur

von Claude B. (claude44)


Lesenswert?

Falk B. schrieb:
> @ Kurzy (Gast)
>
>>> Vielen Danke für der Link, habe ich mir angesehen leider ist es mir
>>> schwirig die für mein bedürfniss einzusetzen, etwas fehlt mir.
>
>>Duden?
da verstehe ich nicht
>
> Wie man am Namen des OP erahnen kann, ist er wohl Franzose und Deutsch
> nicht seine Muttersprache.

Geeenau
>
> Comprenez-vous?
oui monsieur

von Falk B. (falk)


Lesenswert?

So ein Mist, am Ende des Programms fehlt ein ret!

von Claude B. (claude44)


Angehängte Dateien:

Lesenswert?

Ich habe mein Sprungtabelle weiter entwickelt, und mit den Simulator 
durch gesielte, aber irrgentwie wille er nicht springen wo er soolt, 
kann mir jemand sagen wo ich ein fehler gemacht habe?
Danke

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Claude B. schrieb:
> und mit den Simulator
> durch gesielte,

dann könntest du uns ja mitteilen, was du dort sieht? Dort sind doch 
alle Register sichtbar - da muss man doch sehen wenn etwas drin steht 
was man nicht erwartet? So schwer kann das doch bei 10 Zeilen code nicht 
sein.
1
adc  ZH, tmp

das sieht zumindest merkwürdig aus, auch aus dem Kommentar erschließt 
sich mir der sinn nicht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

1
  in   tmp, PIND    ; zustande der Register abfragen
2
   andi  tmp,0x04    ; Lösche die obere Bits
3
   add  ZL,tmp      ; Adiere Portklavierstand zu Tabellenadresse
4
           
5
  cpi  tmp, 0
6
  breq  Loop    ; Spring wenn 0
7
  adc  ZH, tmp    ; im Z register H Addieren

Du erlaubst durch dein 'andi tmp,0x04' nur noch genau ein Pinbeinchen, 
nämlich Bit 2. Falk hat doch schon gepostet, ein 'andi tmp,0x07' würde 
alle portpins von 0 bis 2 erlauben und dir 8 Auswahlmöglichkeiten geben.
Ein 'andi tmp,0x03' erlaubt dir 4 Möglichkeiten mit Pin0 und Pin1.

Dann ist deine 16 bit Addition nicht vollständig. Falk hat dir hier
1
     add  ZL,tmp
2
     clr  tmp
3
     adc  ZH,tmp
geschrieben, was die richtige Methode ist, um einen 8-bit Wert in tmp 
auf ein 16bit Register zu addieren.
Die Abfrage auf 0 ist unnötig, weil du in deine Sprungtabelle einfach 
ein 'ret' auf Position 0 schreiben kannst.

: Bearbeitet durch User
von Hosenmatz (Gast)


Lesenswert?

Lieber Claude,

ich empfehle Dir sehr, erst einmal zu versuchen, ein Problem detailliert 
zu beschreiben. Wenn Du das übst, dann ist es leichter für Dich ein 
Problem zu lösen. Jedenfalls ist die Beschreibung "es geht nicht", nicht 
zweckmäßig.
Wir erfahren nicht, was tatsächlich geschieht und was stattdessen 
geschehen soll. Wir können uns das zwar denken, aber wichtig ist, dass 
DU das denken kannst.

Dann empfehle ich Dir, noch einmal genau nachzulesen, was die Befehle 
"JMP", "CALL" und "RET" bzw. deren Pendants "IJMP" und "ICALL" tun. 
Beachte besonders, dass CALL und RET Paare bilden und der Ablauf durch 
den Inhalt des Stacks beeinflusst wird.

Bis jetzt läuft der Thread darauf hinaus, dass man Dir einfach vormacht, 
wie es geht. Aber davon lernst Du nichts.

Bonne chance.

von Falk B. (falk)


Lesenswert?

@  Claude Bochard (claude44)

>Ich habe mein Sprungtabelle weiter entwickelt,

Nö, du hast ein funktionierendes Beispiel ignoriert und deine alte, 
fehlerhafte Version verschlimmbessert.

>kann mir jemand sagen wo ich ein fehler gemacht habe?

Dir fehlen massiv Grundlagen.
Zeichne mal DETAILIERT auf, was dieser Befehl wohl macht und ob der 
Kommentar dahinter wirklich stimmt.

andi  tmp,0x04      ; Lösche die obere Bits

Kleiner Tip: Bitmanipulation.

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


Lesenswert?

Claude B. schrieb:
> Ich habe mein Sprungtabelle weiter entwickelt, und mit den Simulator
 Ich würde das nicht gerade weiterentwickeln nennen...

von Claude B. (claude44)


Angehängte Dateien:

Lesenswert?

Marc V. schrieb:
> Ich würde das nicht gerade weiterentwickeln nennen...

Das habe ich gemerke

Matthias S. schrieb:
> Die Abfrage auf 0 ist unnötig, weil du in deine Sprungtabelle einfach
> ein 'ret' auf Position 0 schreiben kannst.

 ich kann dann der 0 nicht benutzen. ist es aber nicht weiter schlimm, 
ich habe die abfrag weggenohmen, und auf 7 erhöhte.

Hosenmatz schrieb:
> ich empfehle Dir sehr, erst einmal zu versuchen, ein Problem detailliert
> zu beschreiben. Wenn Du das übst, dann ist es leichter für Dich ein
> Problem zu lösen. Jedenfalls ist die Beschreibung "es geht nicht", nicht
> zweckmäßig.

Danke für die Kritik,Ich versuche jetzt so zu handel, ich möchte kein 
fertig Programme bekommen

Nun mit der Simulation, spring ich zu mein Richtig RCALL, dann zu die 
richtig POS_2 aber mit ret ist nicht möglich zurück zu loop, ich habe 
versuch mit "meinTab" RJMP LOOP er sping zu MAIN. Ich habe auch versuch 
am statt "rcall pos_0", ein rjmp loop zu setzen. was funktioniere

Wie ich sehe, nach icall, der RJMP ist denke ich überflüssig so wie der 
von "meinTabel" oder sehe ich wieder Falsch?


Ich habe mir viele Programmen angesehen, und ich habe KEIN Sprungtabelle 
gesehen, gibt es ein Grund?

von Peter II (Gast)


Lesenswert?

Claude B. schrieb:
> Ich habe mir viele Programmen angesehen, und ich habe KEIN Sprungtabelle
> gesehen, gibt es ein Grund?

weil es oft einfach nicht Notwenig ist?

man könnte ja einfach
1
if wert = 1 
2
begin
3
  goto weiter:
4
end
5
6
if wert = 2
7
begin
8
  goto weiter:
9
end
10
11
weiter:
schreiben, ja das ist etwas langsamer. Aber es funktioniert sofort und 
du währst schon lange fertig.

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


Lesenswert?

Claude B. schrieb:
> Wie ich sehe, nach icall, der RJMP ist denke ich überflüssig so wie der
> von "meinTabel" oder sehe ich wieder Falsch?

 Ja.
1
meinTab:
2
    rjmp  Pos_0
3
    rjmp  Pos_1
4
...
5
...
6
Pos_0:
7
        ret
8
Pos_1:  ldi  tmp, 1
9
...
10
        ret

von Falk B. (falk)


Lesenswert?

@  Claude Bochard (claude44)

>> Die Abfrage auf 0 ist unnötig, weil du in deine Sprungtabelle einfach
>> ein 'ret' auf Position 0 schreiben kannst.

> ich kann dann der 0 nicht benutzen.

Musst du auch gar nicht!

>Nun mit der Simulation, spring ich zu mein Richtig RCALL, dann zu die
>richtig POS_2 aber mit ret ist nicht möglich zurück zu loop,

Doch!

>ich habe
>versuch mit "meinTab" RJMP LOOP er sping zu MAIN.

FALSCH! Damit läuft dir in kurzer Zeit der Stack über. Für JEDES CALL 
oder ICALL braucht man auch ein RET!

> Ich habe auch versuch
>am statt "rcall pos_0", ein rjmp loop zu setzen. was funktioniere

Unsinn.

>Wie ich sehe, nach icall, der RJMP ist denke ich überflüssig so wie der
>von "meinTabel" oder sehe ich wieder Falsch?

Wieder falsch. Du stocherst planlos rum, weil du so gut wie KEINERELEI 
Grundlagen kennst. Lass es. Du machst dir nur sinnlos Stress.

Nimm doch verdammt nochmal einfach mal mein Programm und geh es in 
Einzelschritten im Simulator durch! Dann siehst du auch, wo der 
Programmablauf langgeht!

Beitrag "Re: AVR prungtabelle"

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


Lesenswert?

Falk B. schrieb:
> FALSCH! Damit läuft dir in kurzer Zeit der Stack über. Für JEDES CALL
> oder ICALL braucht man auch ein RET!

 Genau.
 Sorry, habe gar nicht gesehen, dass du es ihm schon einmal richtig
 gepostet hast.
 Anscheinend extrem lernresistent.

: Bearbeitet durch User
von Uwe (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
habe deinen letzten Anhang mal etwas abgeändert.
schaue doch mal ob es so geht.

viel Erfolg, Uwe

von Karl M. (Gast)


Lesenswert?

Hier ist noch ein Fehler !

[c]CLR  tmp        ; TMP löschen
adc  ZH,null    ; tmp    ; im Z register C Addieren[c]

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


Lesenswert?

Karl M. schrieb:
> Hier ist noch ein Fehler !

 Nein, höchstens ein Befehl zuviel, aber das ist jetzt auch
 auskommentiert.

: Bearbeitet durch User
von Claude B. (claude44)


Lesenswert?

Ich möchte mich " als extrem lernresistent" für euer Durchalte vermögen 
bedanken.
Das Programm läuft jetzt.
Ich habe festgestell dass die Sprüngen reagieren auf binairzahl. Ich 
kann nur 4 Tasten benutzen
Taste 0 spring auf 1
Taste 1 auf 2
Taste 2 auf 4
taste 3 auf 8
ist Correkt ?

von Falk B. (falk)


Lesenswert?

@ Claude Bochard (claude44)

>Ich habe festgestell dass die Sprüngen reagieren auf binairzahl. Ich
>kann nur 4 Tasten benutzen
>Taste 0 spring auf 1
>Taste 1 auf 2
>Taste 2 auf 4
>taste 3 auf 8
>ist Correkt ?

Ja, aber nur, wenn deine Tasten HIGH aktiv sind und du exteren Pull Down 
Widerstände hast. Das widerspricht aber eine wenig der Tatsache, daß du 
die internen Pull-Up Widerstände eingeschaltet hast. Wie sieht deine 
Hardware real aus?

Wenn deine Tasten low aktiv sind (schalten nach GND), dann kann man das 
einfach ändern, indem man das Einlesen der Pins so macht
1
     in     tmp, PINein   ; Pins einlesen 
2
     com    tmp           ; alle Bits invertieren

von Claude B. (claude44)


Lesenswert?

Falk B. schrieb:
> Ja, aber nur, wenn deine Tasten HIGH aktiv sind und du exteren Pull Down
> Widerstände hast. Das widerspricht aber eine wenig der Tatsache, daß du
> die internen Pull-Up Widerstände eingeschaltet hast. Wie sieht deine
> Hardware real aus?
Ich habe da kein Hardware, dass das für mich nur ein Lerneffect haben 
soll, was aber gelungen ist

>
> Wenn deine Tasten low aktiv sind (schalten nach GND), dann kann man das
> einfach ändern, indem man das Einlesen der Pins so macht
>      in     tmp, PINein   ; Pins einlesen
>      com    tmp           ; alle Bits invertieren

Das werde ich ausprobieren

Danke

von ASM Supergenie (Gast)


Lesenswert?

Andi und Ori sind echte Raudis, die keiner so richtig mag. Deshalb nimmt 
man lieber sbr und cbr.

von Claude B. (claude44)


Angehängte Dateien:

Lesenswert?

Falk B. schrieb:
> Wenn deine Tasten low aktiv sind (schalten nach GND), dann kann man das
> einfach ändern, indem man das Einlesen der Pins so macht
>      in     tmp, PINein   ; Pins einlesen
>      com    tmp           ; alle Bits inverti

mit debuging werde das Bit 3 (8) invertirt in tmp(r16) aber nach ADD ZL 
wird tmp auf 00, und spring auf 0

kann man der Ihnhalt von ijmp sehen?
ich habe AtmelStudio 7

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


Lesenswert?

Claude B. schrieb:
> mit debuging werde das Bit 3 (8) invertirt in tmp(r16) aber nach ADD ZL
> wird tmp auf 00, und spring auf 0

 Wann hörst du endlich mit herumspielen auf ?
 Vor allem an Dingen die du anscheinend nicht verstehst ?
1
     andi  tmp, 0x08        ; Lösche die obere Bits UND Verknüpfung
 Hier hast du gerade alle bits ausser bit3 auf 0 gesetzt.
 Diese sinnlose rumhüpferei im geposteten Code ist unnötig.

 Benutze doch das erste Programm von Falk, da ist es richtig gemacht.

 Und wenn du sein Programm benutztst, dann solltest du zumindest seine
 Ratschläge befolgen.

von Claude B. (claude44)


Lesenswert?

Marc V. schrieb:
> Wann hörst du endlich mit herumspielen auf ?
>  Vor allem an Dingen die du anscheinend nicht verstehst ?

Ich spiel nicht rum. Und wenn ich nicht verstehe, versuche ich zu 
Verstehen.

Marc V. schrieb:
> Benutze doch das erste Programm von Falk, da ist es richtig gemacht.
>
>  Und wenn du sein Programm benutztst, dann solltest du zumindest seine
>  Ratschläge befolgen.

Ich benützt das Programm die Funktioniere, und nach seine Ratschläge 
habe ich mein Programm geändert.

Falk B. schrieb:
> Wenn deine Tasten low aktiv sind (schalten nach GND), dann kann man das
> einfach ändern, indem man das Einlesen der Pins so macht
>      in     tmp, PINein   ; Pins einlesen
>      com    tmp           ; alle Bits invertieren

Und gebe die Ergebnisse Aus

Marc V. schrieb:
>  andi  tmp, 0x08        ; Lösche die obere Bits UND Verknüpfung
>  Hier hast du gerade alle bits ausser bit3 auf 0 gesetzt.

Bit 3 soll doch stehen bleiben, nun ich möchte ein Sprung nicht nach 8 
sonderd nach 3. den code "Andi tmp, 08" ist von Anfangan schon in der 
Programm, die leste Änderung "in tem, PINein-- com tmp" sollte mein 
Problème lösen,

Übrigens, ich verstehe nicht dass du dich auregt, über mein Unwissen, 
diese Forum ist doch da, Für uns alle die etwas nicht verstanden haben, 
und wir versuchen mit dieser Weg unsere Probleme zu lösen
Als " extrem lernresistent" bewunder ich Falk, die mir mindensten bei 
gebrachte wie ein Sprungtabelle funktioniere.
Ich bedanke mich auch bein Dir für den Hilfe dass du bei mir geleistet 
habe für mein Bascom Programme aber ich bitte dich mich anders zu 
behandel

von Falk B. (falk)


Lesenswert?

@Claude Bochard (claude44)

>mit debuging werde das Bit 3 (8) invertirt in tmp(r16) aber nach ADD ZL
>wird tmp auf 00, und spring auf 0

Logisch. Mit

andi tmp, 8

werden ALLE Bits außer Bit#3 gelöscht. Das Ergebnis kann nur 0 oder 8 
sein, demzufolge kann man nur nach Pos_0 oder Pos_8 springen, je 
nachdem, wie der Pegel an PD3 ist.
Alle anderen Eingänge werden damit unwirksam!
1
Bit   76543210     Bitnummer
2
PIND  xxxxxxxx     Eingangsdaten  
3
0x08  00000100     Bitmaske
4
--------------
5
AND   00000x00     Ergebnis der UND-Verknüpfung

>kann man der Ihnhalt von ijmp sehen?

Sicher, im Register Z, welches aus R30 und R31 besteht. Aber das sieht 
man doch einfach im Simulator, wo die CPU hinspringt 
(Einzelschrittbetrieb mit F11!)

In deiner Skizze im Quelltext ist ein Fehler, die letzten 3 Taster 
müssen zwei Pins weiter runter
1
                                  ATtiny 2313 
2
'                                  _______
3
'                                /         |
4
'               (Reset/dW) PA2 o|  1    20 |o VCC
5
'      Taster0       (RXD) PD0 o|  2    19 |o PB7 (UCSK/SCL/PCINT7)
6
'      Taster1       (TXT) PD1 o|  3    18 |o PB6 (MISO/DO/PCINT6)
7
'                  (XTAL2) PA1 o|  4    17 |o PB5 (MOSI/DI/SDA/PCINT5)
8
'                  (XTAL1) PA2 o|  5    16 |o PB4 (OC1B/PCINT4)    LED4
9
'      Taster2     (/INT0) PD2 o|  6    15 |o PB3 (OC1A/PCINT3)    LED3
10
'      Taster3      (INT1) PD3 o|  7    14 |o PB2 (OC0A/PCINT2)    LED2
11
'      Taster4        (T0) PD4 o|  8    13 |o PB1 (AIN1/PCINT1)    LED1
12
'                (OC0B/T1) PD5 o|  9    12 |o PB0 (AIN0/PCINT0)    LED0
13
'                          GND o| 10    11 |o PD6 (ICP)
14
'                               |__________|

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


Lesenswert?

Claude B. schrieb:
> Bit 3 soll doch stehen bleiben, nun ich möchte ein Sprung nicht nach 8
> sonderd nach 3. den code "Andi tmp, 08" ist von Anfangan schon in der
> Programm, die leste Änderung "in tem, PINein-- com tmp" sollte mein
> Problème lösen,

 Wo siehst du 0x08 im Programm von Falk ?


Claude B. schrieb:
> Ich benützt das Programm die Funktioniere, und nach seine Ratschläge
> habe ich mein Programm geändert.

 Nein, tust du nicht und hast du nicht.

von Claude B. (claude44)


Lesenswert?

Falk B. schrieb:
> andi tmp, 8
>
> werden ALLE Bits außer Bit#3 gelöscht. Das Ergebnis kann nur 0 oder 8
> sein, demzufolge kann man nur nach Pos_0 oder Pos_8 springen, je
> nachdem, wie der Pegel an PD3 ist.
> Alle anderen Eingänge werden damit unwirksam!
> Bit   76543210     Bitnummer
> PIND  xxxxxxxx     Eingangsdaten
> 0x08  00000100     Bitmaske
> --------------
> AND   00000x00     Ergebnis der UND-Verknüpfung

Also wenn ich gut verstehe, der "Andi tmp" code darf nicht eingesetzt 
werden?. Aber kann man überhaupt das ding beibringen, wenn mein Bit 3 
gesetzt ist, das ein bit 3 Interpretiere und nicht ein 8? oder bit 2 
als 3 un sw. Da durch sind Natürlich mein Taster nicht korekt eingesetzt

von Uwe (Gast)


Lesenswert?

Hi,
weil:
>In deiner Skizze im Quelltext ist ein Fehler, die letzten 3 Taster
>müssen zwei Pins weiter runter
ist mir aufgefallen das deine Sprungtabelle zu kurz ist.
Mit den Bits(Tasten)0-4 sind 31 Sprungziele erreichbar. Die Tabelle hat 
aber nur 9, die anderen(höheren) gehen also nicht da hin wo du möchtest.
Mit 3 Tasten(0-2)ist dein Sprungbereich schon fast ausgelastet.
Filtere also bitte mit
andi tmp,0x07
und die Tasten 0-2 bleiben in tmp. Da langt dann auch die Sprungtabelle.

viel Erfolg, Uwe

von Falk B. (falk)


Lesenswert?

@Claude Bochard (claude44)

>Also wenn ich gut verstehe, der "Andi tmp" code darf nicht eingesetzt
>werden?.

Nein, das verstehst du nicht gut.

> Aber kann man überhaupt das ding beibringen, wenn mein Bit 3
>gesetzt ist, das ein bit 3 Interpretiere und nicht ein 8? oder bit 2
>als 3 un sw. Da durch sind Natürlich mein Taster nicht korekt eingesetzt

Ist es denn SOOO schwer, einfach die entsprechenden Unterprogramme zu 
nutzen und die anderen einfach leer zu lassen?

von Falk B. (falk)


Lesenswert?

@ Uwe (Gast)

>Filtere also bitte mit
>andi tmp,0x07
>und die Tasten 0-2 bleiben in tmp. Da langt dann auch die Sprungtabelle.

Auch dieser Hinweis besteht seit Ewigkeiten.

von Claude B. (claude44)


Lesenswert?

Uwe schrieb:
> Hi,
> weil:
>>In deiner Skizze im Quelltext ist ein Fehler, die letzten 3 Taster
>>müssen zwei Pins weiter runter
> ist mir aufgefallen das deine Sprungtabelle zu kurz ist.
> Mit den Bits(Tasten)0-4 sind 31 Sprungziele erreichbar. Die Tabelle hat
> aber nur 9, die anderen(höheren) gehen also nicht da hin wo du möchtest.
> Mit 3 Tasten(0-2)ist dein Sprungbereich schon fast ausgelastet.
> Filtere also bitte mit
> andi tmp,0x07
> und die Tasten 0-2 bleiben in tmp. Da langt dann auch die Sprungtabelle.
>
> viel Erfolg, Uwe

Danke für dein Antwort, in zwischen, sind wir weiter, mein Tabelle ist 
bis auf 8 ergänze worden, Leider ich bin davon gegangen das der Sprung 
nach BIT reagiere, nicht nach HEX zahl so taste 0 = 1, Taste 1 = 2, 
Taste 2 = 3
Taste 3 = 4, Taste 4 = 8.
dadurch sind natürlich mein Taster Falsche gelegt

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@  Claude Bochard (claude44)

>Danke für dein Antwort, in zwischen, sind wir weiter, mein Tabelle ist
>bis auf 8 ergänze worden,

Das reicht aber nicht. Denn mit 4 Bits kann man 16 verschiedene Zahlen 
darstellen, also muss man 16 Unterprogramme bereitstellen.

> Leider ich bin davon gegangen das der Sprung
>nach BIT reagiere, nicht nach HEX zahl so taste 0 = 1, Taste 1 = 2,
>Taste 2 = 3
>Taste 3 = 4, Taste 4 = 8.

>dadurch sind natürlich mein Taster Falsche gelegt

Sieht so aus. Aber um mit 5 Tasten in 5 Unterprogramme zu springen lohnt 
sich eine Sprungtabelle nicht. Das macht man besser mit 5 
Einzelabfragen.

Siehe Anhang.

von Claude B. (claude44)


Lesenswert?

Falk B. schrieb:
> Ist es denn SOOO schwer, einfach die entsprechenden Unterprogramme zu
> nutzen und die anderen einfach leer zu lassen?

ist es überhaupt nicht schwer, und ich habe es verstanden(Ausnameweise) 
aber für 4 Taster, ich brauch 8 Sprünge, wieviel für 5, oder 6 Tasten? 
Deswegen meine Frage, kann man das so machen daß wir bit0 = 0, bit 1 = 
1, Bit 2 = 2 esw.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

@  Claude Bochard (claude44)

>Danke für dein Antwort, in zwischen, sind wir weiter, mein Tabelle ist
>bis auf 8 ergänze worden,

Das reicht aber nicht. Denn mit 4 Bits kann man 16 verschiedene Zahlen
darstellen, also muss man 16 Unterprogramme bereitstellen.

> Leider ich bin davon gegangen das der Sprung
>nach BIT reagiere, nicht nach HEX zahl so taste 0 = 1, Taste 1 = 2,
>Taste 2 = 3
>Taste 3 = 4, Taste 4 = 8.

>dadurch sind natürlich mein Taster Falsche gelegt

Sieht so aus. Aber um mit 5 Tasten in 5 Unterprogramme zu springen lohnt
sich eine Sprungtabelle nicht. Das macht man besser mit 5
Einzelabfragen.

Siehe Anhang. Jetzt mit richtigem Portzugriff 8-0

von Claude B. (claude44)


Lesenswert?

Falk B. schrieb:
> Sieht so aus. Aber um mit 5 Tasten in 5 Unterprogramme zu springen lohnt
> sich eine Sprungtabelle nicht. Das macht man besser mit 5
> Einzelabfragen.
>
> Siehe Anhang.

Vielen Dankefür die Anhang, du beanwortet genau meine Frage, und daß ist 
weichenlich der Grund warum es nie oder fast nie benutzt wird

von Peter II (Gast)


Lesenswert?

Claude B. schrieb:
> kann man das so machen daß wir bit0 = 0, bit 1 =
> 1, Bit 2 = 2 esw.

und was soll bei Bit0 und Bit1 passieren? Das musst du dann sicher 
verhindert.

Warum willst du es zwingend mit einer Sprungtabelle machen, du hast doch 
schon selber festgellt das es andere ohne machen. Wird wohl einen Grund 
haben.

von Karl (Gast)


Lesenswert?

Claude B. schrieb:
> ist es überhaupt nicht schwer, und ich habe es verstanden(Ausnameweise)
> aber für 4 Taster, ich brauch 8 Sprünge, wieviel für 5, oder 6 Tasten?
> Deswegen meine Frage, kann man das so machen daß wir bit0 = 0, bit 1 =
> 1, Bit 2 = 2 esw.

Die Formel für die Anzahl der Sprung Tabelleneinträge ist 2^N mit N für 
die Anzahl der Taster.

N=3 ==> 3 Taster
2^N = 2^3 = 8, also muss man von 0,1,..,7 die Sprung Tabelleneinträge 
anlegen.

von Claude B. (claude44)


Lesenswert?

Peter II schrieb:
> Warum willst du es zwingend mit einer Sprungtabelle machen, du hast doch
> schon selber festgellt das es andere ohne machen. Wird wohl einen Grund
> haben.

Nein, ich hatte gedacht, dass 16 Sprünge die funktionieren wie die 
case-Anweisung das soll doch toll sein, pech gehabt
und Vielen Dank für Deine Hilfe und die von alle Andere
Claude

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.