- 3D-Druck Einstieg und Tipps         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 34

Thema: ASCII-Zeichen-String auswerten in Assembler

  1. #21
    Kagerer
    Gast
    Anzeige

    Powerstation Test
    Danke hab mir das Tutorial schon mal ausgedurck, bin bloß noch nicht durch. Ich beschäftige mich ja auch erst seit kurzen mit µC.

    Momentan hab ich aber ein anderes Problem, dass ich erst lösen muss. Ich hab irgendwie meinen USBisp eliminiert. Er will nix mehr programmieren

    MfG
    Christian

  2. #22
    Kagerer
    Gast
    Ich glaub ich hab den Code jetzt gecheckt. Wenn ich beim umschreiben für meine Anwendung noch auf Probleme stoße, melde ich mich nochmal.

    MfG
    Christian

  3. #23
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    So was in der Richtung?
    Für avr-as

    Code:
    	.arch atmega8
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    	.section	.progmem.data,"a",@progbits
    	
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    	.type	STR_1, @object
    	.size	STR_1, 8
    STR_1:
    	.string	"blubb 1"
    	
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    	.type	STR_2, @object
    	.size	STR_2, 10
    STR_2:
    	.string	"blubber 2"
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    	.type	labels, @object
    	.size	labels, 12
    	
    labels:
    	.word	pm(.LABEL_1)
    	.word	STR_1
    
    	.word	pm(.LABEL_2)
    	.word	STR_2
    	
    	; ...
    
    	.word	0
    	.word	-1
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    ; my_strcmp: Vergleiche zwei Strings
    ; r25:r24 ist Adresse eines Strings im RAM
    ; r23:r22 ist Adresse eines Strings im FLASH
    ; ret=r24=0: ungleich
    ; ret=r24=1: gleich
    ; veränderte Register: 24, 25, X, Z
    
    	.text
    .global	my_strcmp
    	.type	my_strcmp, @function
    my_strcmp:
    
    	movw r26,r24
    	movw r30,r22
    0:
    	; 1 Zeichen aus RAM
    	ld r25, X+
    	
    	; 1 Zeichen aus FLASH
    	lpm r24, Z+
    	
    	; vergleichen
    	cp r25,r24
    	brne 0f
    	
    	; bei Gleichheit: ist String zu Ende?
    	tst r25
    	; nein: weiter vergleichen
    	brne 0b
    	
    	; ja: Übereinstimmung
    	ldi r24,lo8(1)
    	ret
    0:
    	; bei Ungleichheit: return 0
    	ldi r24,lo8(0)
    	ret
    
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    ; jump_if: Vergleicht den String cmd im RAM mit den 
    ; Strings STR_1, STR_2, ... ausm Flash und springt bei
    ; Übereinstimmung zu .LABEL_1 bzw LABEL_2 bzw ...
    ; ret=r24=0: cmd nicht gefunden
    ; ret=r24=1: cmd gefunden und ausgeführt
    ; Veränderte Register: 22 -- 31
    
    	.text
    .global	jump_if
    	.type	jump_if, @function
    jump_if:
    
    	ldi r28,lo8(labels)
    	ldi r29,hi8(labels)
    .loop
    	movw r30,r28
    	adiw r30,2
    
    	; Adresse eines Strings ausm Flash nach r23:r22
    	lpm r22, Z+
    	lpm r23, Z
    	
    	; Ende der Liste? (cmd nicht gefunden)
    	ldi r24,hi8(-1)
    	cpi r22,lo8(-1)
    	cpc r23,r24
    	breq .not_found
    	
    	; Zeiger auf labels 1 weiter
    	adiw r28,4
    	
    	; Adresse von cmd nach r25:r24
    	ldi r24,lo8(cmd)
    	ldi r25,hi8(cmd)
    	
    	; Vergleichen von cmd mit STR_n
    	rcall my_strcmp
    	tst r24
    	
    	; keine Übereinstimmung (r24=0): weiter suchen
    	breq .loop
    	
    	; Gefunden: Sprungadresse laden und indirekter Sprung
    	movw r30,r28
    	lpm r24, Z+
    	lpm r25, Z
    	push r24
    	push r25
    	ret
    	
    .LABEL_1:
    	; Code fuer STR_1
    	rjmp .done
    	
    .LABEL_2:
    	; Code fuer STR_2
    	rjmp .done
    
    .not_found:
    	; Code fuer cmd nicht gefunden
    	ldi r24,lo8(0)
    
    .done:
    	ret
    	
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    	.comm cmd,20,1

  4. #24
    Kagerer
    Gast
    Danke.

    Wenn ichs nicht schaffe den anderen Code für meine Anwendung anzupassen, werde ich mir deinen mal genauer anschauen.

    MfG
    Christian

  5. #25
    Kagerer
    Gast
    Hallo.

    Hab den Code anscheinend doch nicht so gut begriffen wie ich gemeint hätte.

    Ich schaffe es jetzt doch nicht den Code von Sebastian so umzuschreiben, dass er wenn er "+CBC: 0,80" anstatt wie im Beispiel "hilfe#" zu etwas springt. Bekomme es ja nicht mal hin das er anstatt bei "hilfe#" bei "hilfe" zu help springt. Kann das Ende eines Befehls mit "#" leider bei meiner Anwendung nicht realisieren. Hab nämlich ein Handy an meinem µC hängen.

    MfG
    Christian

  6. #26
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    dann nimm doch ein anderes zeichen als Abschluß.....

  7. #27
    Kagerer
    Gast
    Das ist ein gutes Argument Ich brauche ja blos eine "0" nehmen.

    Aber trozdem bekomme ich es nicht zusammen das Prog von "hilfe#" auf "test#" umzuschreiben. Muss ich da mehr austauschen als nur das "hilfe#" unter Cmds? Und wie geht es eigetlich, dass er bei "hilfe#" zu help springt und bei "test#" zu test?

    MfG
    Christian

  8. #28
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    53
    Beiträge
    2.236
    Muss ich da mehr austauschen als nur das "hilfe#" unter Cmds?

    Pass auf, ganz unten steht ja
    db "hilfe#"
    dw help

    Das heißt wenn hilfe empfangen wurde soll er zu Label help springen.
    Du kannst direkt drunter
    db "test#"
    dw test
    schreiben, dann mußt Du irgendwo in Code ein label mit test: setzen der mit ret beendet wird.
    Ich hoffe, daß du es jetzt besser verstehst.

    Gruß Sebastian
    und wenn Du # gegen was anderes wechseln willst mußt Du bei befehlauswerten5 und befehlauswerten7
    die Zeichen auch wechseln, die dürfen aber nicht im Befelh stehen, sonst klappt es nicht also nicht als abschluß 0 nehmen und dann Befehle wie fahre200

  9. #29
    Kagerer
    Gast
    OK Danke. Werd ich dann mal versuchen.

    Das mit dem # mit 0 auszutauschen war ausnahmsweise mal klar .

    Ich sehe schon, ich muss mich mehr mit Assembler beschäftigen.

    Gruß
    Christian

  10. #30
    Kagerer
    Gast
    Hallo.

    Ich hab jetzt mal versucht, dass er bei "test#" zu "test:" springt. Er gibt aber wenn ich test# eingebe immer nur aus "Ich weiss nicht, was Du von mir willst" anstatt "Das ist ein Test". Hier mal der Code:

    Code:
    .include "m16def.inc"
    
    ;Definition für Clock und Baudrate
    .equ CLOCK = 16000000 ; Processortaktfrequenz
    .equ BAUD = 9600 ; Serielle Schnittstelle Baudrate
    .equ UBRRVAL = CLOCK / (BAUD*16)-1
    ;Definition für Flagregister und Flaggen
    .def Flagregister  = R16 ; Anzeige Flag Register
    .def tmp = R17 ;universallregister
    .equ zeileempfangen  = 7 ; Eine vollständige Zeile über UART empfangen
    
    ;Definition für Zeichen
    .equ enter = $0D ; Wagenrücklauf-Zeichen für UART
    
    ;Definition für SRAM Puffer
    .equ pufferzeiger = $0060 ; UART Rx Pufferzeiger
    .equ pufferanfang = $0061 ; UART Rx Pufferanfang
    .equ pufferende = $007E ; UART Rx Pufferende
    
    
    ;Interrupt-Vektoren
    
    .org 0x000
       rjmp reset ;reset Vektor
    .org URXCaddr
       rjmp empfangen
    
    reset:
       ;Stack
       ldi tmp,HIGH(RAMEND)
       out SPH,tmp
       ldi tmp,LOW(RAMEND)
       out SPL,tmp
       
       ;UART
       ;Baudrate einstellen
       ldi tmp,UBRRVAL
       out UBRRL,tmp
       ;Frameformat 8Bit
       ldi tmp,(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0)
       out UCSRC,tmp
       ;RX aktivieren
       sbi UCSRB,RXEN
       sbi UCSRB,RXCIE
       ;TX aktivieren
       sbi UCSRB,TXEN
       sei
    
    loop: ;Hauptschleife
       tst Flagregister    ;Irgendeine Flagge gesetzt?
       breq loop      ;wenn nein langweilen
       ldi tmp,LOW(loop) ; Schleifenanfang als Rücksprungadresse auf den Stapel
       push tmp
       ldi tmp,HIGH(loop)
       push tmp
       sbrs Flagregister,zeileempfangen   ;teste, ob eine Zeile Komplet ist
       ret      ;wenn nein langweilen
    
    befehlauswerten:
       ldi tmp,LOW(UartRxRet) ; Rueckkehradresse UartRxRet auf Stapel
       push tmp
       ldi tmp,HIGH(UartRxRet)
       push tmp
       ldi ZH,HIGH(2 * Cmds) ; Z zeigt auf Befehlsliste
       ldi ZL,LOW(2 * Cmds)
    befehlauswerten1:
       lpm   ;Hole Zeichen
       mov tmp,R0
       cpi tmp,0xFF ; 0xFF signalisiert das ende der Befehlsliste   
       brne befehlauswerten3
    befehlauswerten2: ;Ende der liste, unbekannter Befehl
       ldi ZH,HIGH(2 * kennenicht)   ;Sende Fehlermeldung
       ldi ZL,LOW(2 * kennenicht)
       rjmp UARTSend
    befehlauswerten3:   ;hier fangen wir an zu vergleichen
       ldi XH,HIGH(pufferanfang)   ;X auf empfangene Zeile
       ldi XL,LOW(pufferanfang)
    befehlauswerten4:
       lds tmp,pufferzeiger;Pufferzeiger lesen
       cp XL,tmp   ;Ende des Puffers erreicht?
       brcs befehlauswerten7   ;nein weiter
    befehlauswerten5:
       lpm   ;lese nächstes Befehlszeichen   
       adiw ZL,1 ;Z auf nächstes zeichen
       mov tmp,R0
       cpi tmp,'#'   ;Endzeichen erreicht?
       brne befehlauswerten5
    befehlauswerten6:
       adiw ZL,3   ;Springe über die Adressen   
       rjmp befehlauswerten1   ;nächster Befehl
    befehlauswerten7:
       lpm
       mov tmp,R0
       cpi tmp,'#' ;Ende des Befehls?
       breq befehlauswerten8
       ld tmp,X+   ;lese nächstes Zeichen aus Puffer
       cp tmp,R0   ;Vergleiche
       brne befehlauswerten5
       adiw ZL,1   ;nächstes Zeichen
       rjmp befehlauswerten4
    befehlauswerten8:
       lds tmp,pufferzeiger ;ende des Puffers erreicht?
       cpc XL,tmp
       brcc befehlauswerten2
       adiw ZL,1
       lpm
       push R0
       adiw ZL,1
       lpm
       push R0
       ret
    
    UartSend:
       lpm;lese aus dem Flash
       adiw ZL,1
       tst R0
       brne UartSendR0
       ret
    UartSendR0:
       mov tmp,R0
       rcall UARTSendChar
       rjmp UartSend
    UartSendChar:
       sbis UCSRA,UDRE
       rjmp UartSendChar
       out UDR,tmp
       ret
    
    UartRXret:
       ldi tmp,LOW(pufferanfang)
       sts pufferzeiger,tmp
       cbr Flagregister,(1<<zeileempfangen)
       ret
       
    help:
       ldi ZH,HIGH(2*UartTxtHelp) ; Hilfetext
       ldi ZL,LOW(2*UartTxtHelp)
       rjmp UartSend   
    
    test:
       ldi ZH,HIGH(2*test_txt) ; Hilfetext
       ldi ZL,LOW(2*test_txt)
       rjmp UartSend  
    
    empfangen:
       push tmp   ;rette universallregister
       in tmp,SREG   ;rette SREG
       push tmp
       in tmp,UDR   ;Hole das empfangene Zeichen
       out UDR,tmp   ;Echo zurück
       push ZH      ;sichere Z-Register
       push ZL   ;dito
       ldi ZH,HIGH(pufferanfang) ;position fürs nächste Zeichen MSB
       lds ZL,pufferzeiger
       st Z+,tmp   ;Speichere Zeichen im sram
       cpi ZL,LOW(pufferende+1)   ;Pufferende erreicht ?
       brcc empfangen_      ;Pufferüberlauf
       sts pufferzeiger,ZL   ;speichere nächste Pufferposition
    empfangen_:
       cpi tmp,enter      ;Wagenrücklauf?
       brne empfangen__
       sbr Flagregister,(1<<zeileempfangen)
    empfangen__:
       pop ZL   ;Stelle Z-Register wieder her
       pop ZH   ;dito
       pop tmp   ;Stelle SREG wieder her
       out SREG,tmp   ;dito
       pop tmp      ;stelle tmp wieder her
       reti      ;verlasse Routine und schalte Interrupts wieder ein
       
    
             ;Hier fangen die Befehle an:
                            ;alle Befehle müssen mit # terminiert werden
    Cmds:
    .db "hilfe#"
    .dw help
    .db "test#"
    .dw test
             ;0xFFFF muß zum schluß stehen, um ende der liste zu erkennen
    .dw 0xFFFF
    
    
    ;Ende der Befehldefinition
    
    ;Texte
    UartTxtHelp:
    .db "Das ist ein Hilfe Text ",0x0D,0x0A,0x00
    test_txt:
    .db "Das ist ein Test",0x0D,0x0A,0x00
    kennenicht:
    .db "Ich weiss nicht, was Du von mir willst",0x0D,0x0A,0x00
    MfG
    Christian

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress