der befehl : cbi PortB,0 und sbi PortB,0 werden beanstandet, welcher fehler liegt hier vor. ich progge in winavr-c mfg pebisoft soft_uart_1.S: Assembler messages: soft_uart_1.S:10: Error: constant value required soft_uart_1.S:12: Error: constant value required .global soft_uart .func soft_uart soft_uart: lds r24,wert __Com1O:ldi r25,10 Com r24 sec __C1O0: brcc __C1O1 cbi PortB,0 rjmp __C1O2 __C1O1: sbi PortB,0 Nop __C1O2: ldi r23,66 rcall __Wtic ldi r23,66 rcall __Wtic lsr r24 dec r25 brne __C1O0 rjmp __ende __Wtic: dec r23 brne __Wtic ret __ende: ret .endfunc .end
korrektur : PortB.0 habe ich auch schon anders geschrieben : PORTB,0 trotzdem der fehler. mfg pebisoft
RTFM: http://www.nongnu.org/avr-libc/user-manual/assembler.html http://www.nongnu.org/avr-libc/user-manual/group__avr__sfr__notes.html #include <avr/io.h> ... sbi _SFR_IO_ADDR(PORTB), 0
jetzt habe die beiden mal reingestellt. soft_uart_1.o(.text+0x2): In function `soft_uart': soft_uart_1.S:6: undefined reference to `wert' wie kann ich den "wert" bekannt machen? die winavr-c-datei: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include #include <inttypes.h> #include <stdint.h> #include <avr/delay.h> extern void soft_uart(uint8_t wert); void warte(uint16_t wert){ for (uint16_t zeit=0;zeit<wert;zeit++) { _delay_ms(10); } } int main (void) { DDRB|=(1<<PB0); uint8_t wert; wert=34; for (;;) { soft_uart(wert); warte(100); } } die soft_uart.S : #include <avr/io.h> .global soft_uart .func soft_uart soft_uart: lds r24,wert __Com1O:ldi r25,10 Com r24 sec __C1O0: brcc __C1O1 out _SFR_IO_ADDR(PORTB), 0 rjmp __C1O2 __C1O1: out _SFR_IO_ADDR(PORTB), 1 Nop __C1O2: ldi r23,66 rcall __Wtic ldi r23,66 rcall __Wtic lsr r24 dec r25 brne __C1O0 rjmp __ende __Wtic: dec r23 brne __Wtic ret __ende: ret .endfunc .end
> wie kann ich den "wert" bekannt machen? Du lässt diese Zeile einfach weg. ;-) r24 ist ohnehin der erste Funktionsparameter. Vielleicht hättest du ja in TFM gleich weiter R'en sollen? In der FAQ steht die Registerkonvention: http://www.nongnu.org/avr-libc/user-manual/FAQ.html Das hier __C1O2: ldi r23,66 rcall __Wtic ldi r23,66 rcall __Wtic ... __Wtic: dec r23 brne __Wtic ret verstehe ich übrigens nicht. Warum nicht gleich 1: ldi r23, 132 dec r23 brne 1b ? (Ggf., die 132 noch erhöhen, weil 2x RCALL/RET wegfallen.) Statt rjmp _ende kannst du natürlich auch gleich ret schreiben. ;-)
danke, jetzt funktioniert es. die sofware_uart-senden mit dem avr16 und 8mhz ist fehlerfrei. die datei ist jetzt schön klein und handlich. hatte garnicht gedacht, das eine datei so kurz werden kann mit so einem guten resultat. #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <string.h> #include <stdint.h> #include <avr/delay.h> volatile uint8_t wert; extern void soft_uart(void); void warte(uint16_t wert){ for (uint16_t zeit=0;zeit<wert;zeit++) { _delay_ms(10); } } int main (void) { DDRB|=(1<<PB0); for (wert = 7; wert < 16; wert++) { soft_uart(); warte(50); } } soft_uart.S datei: #include <avr/io.h> .global soft_uart .func soft_uart soft_uart: lds r24,wert __Com1O:ldi r25,10 Com r24 sec __C1O0: brcc __C1O1 ldi r16,0 out _SFR_IO_ADDR(PORTB), r16 rjmp __C1O2 __C1O1: ldi r16,1 out _SFR_IO_ADDR(PORTB), r16 Nop __C1O2: ldi r23,132 __1b: dec r23 brne __1b lsr r24 dec r25 brne __C1O0 ret .endfunc .end
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.