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
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
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
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
Danke.
Wenn ichs nicht schaffe den anderen Code für meine Anwendung anzupassen, werde ich mir deinen mal genauer anschauen.
MfG
Christian
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
dann nimm doch ein anderes zeichen als Abschluß.....
Das ist ein gutes ArgumentIch 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
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
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
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:
MfGCode:.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
Christian
Lesezeichen