hallo, ich möchte am interrupt0 vom avr16 (int0 falling) serielle daten empfangen. die eingebundene asm.S ist auch im anhang, da habe ich das register30 genommen???richtig??. ich weis nicht, ob ich jetzt mit den int0-befehlen richtig liege. das problem, nach aufruf des int0 muss der der portd.2 auf ausgang geschaltet werden und danach wieder vorbereitet werden für den int0. es geht zur zeit mit meinen code nicht. woran leigt das? der c-code: #include <inttypes.h> #include <avr/pgmspace.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include "lcd.h" #include "lcd.c" #include <avr/delay.h> #define delay_us(us) _delayFourCycles_( ( ( 1*(F_CPU/4000) )*us)/1500 ) uint8_t x; volatile uint8_t wert_empf; extern void soft_uart_empf(void); SIGNAL(SIG_INTERRUPT0) { char buffer[7]; GICR|=0x00; DDRD=4; soft_uart_empf(); x=wert_empf; itoa( x , buffer, 10); lcd_clrscr(); lcd_puts("Wert: "); lcd_puts(buffer); DDRD=0; GICR|=0x40; } static inline void _delayFourCycles_(uint16_t z) { uint16_t i; for (i=0; i<z; i++) asm volatile("nop"); } static inline void delay_ms(uint16_t z) { uint16_t i; for (i=0; i<z; i++) delay_us(999); } int main(void) { DDRD=0; MCUCR|=2; GICR|=0x40; sei(); lcd_init(LCD_DISP_ON); lcd_clrscr(); for(;;) { delay_ms(100); } } die asm.S : #include <avr/io.h> .global soft_uart_empf .func soft_uart_empf soft_uart_empf: __Com1I: ldi r24,0x09 rcall __Wtic_1 __C1I2: rcall __Wtic_1 clc ldi r16,4 out _SFR_IO_ADDR(PORTD), r16 sec dec r24 breq __ende_1 ror r30 rjmp __C1I2 __Wtic_1: ldi R17, 130 WGLOOP1: dec R17 brne WGLOOP1 ret __ende_1: sts wert_empf,r30 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.