Forum: Compiler & IDEs interrupt0 für softwareuart


von karlheinz (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.