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.