Beim Auslesen der Temperatur des LM75 hängt sich der Prozessor auf, wenn ein Signal über USART reinkommt, versteh das nicht wirklich.
Usart funktioniert Problemlos wenn ich die Zeile auskommentiere:
// temperatur = TWI_empf(ADRESSE_R);
wenn ich sie drinlasse, hängt sich der Prozessor ab und zu auf, wenn über USART etwas empfangen wird während diesen Befehls.
Ist sehr strange, habt ihr da eine Idee?
Programm:
#define F_CPU 16000000UL //Takt 16MHz
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <util/twi.h>
#include "i2c.h"
/* Programm Libs */
#include "defines.h"
volatile uint8_t IRFlag;
volatile uint8_t IR_zaehl=0;
volatile uint8_t RxData;
int main(void)
{
/* TIMER INIT */
SETBIT(TCCR0,CS00);// Prescaler von 1024 16MHz/1024 = 15,6kHz = 64us
SETBIT(TCCR0,CS02);
TCNT0 = 255; // Reload Wert 0-255 250*4us*8 = 8ms = 125Hz
SETBIT(TIMSK,TOIE0); // Timer IR Aktivieren
// DDRD=0xFB; //D0-D1 & D3-D7 as Output
// SETBIT(MCUCR,ISC01); //Fallende Flanke
// SETBIT(GICR,INT0); //Taster IR Aktivieren
sei(); //Globale IRs aktivieren
/* Lokale Variablen: */
/* Ports as Outputs: */
DDRA=0xFF;
DDRB=0xFF;
DDRC=0xFF;
uart_init();
//SETBIT(PORTB,1);
SETBIT(PORTA,3);//VCC für Temp
TWI_init(FAKTOR, TEILER);
unsigned char temperatur=0;
unsigned char komma=0;
char test=0;
while (1)
{
if(IRFlag == 1 && !((UCSRA & (1<<RXC))))
{
IRFlag=0;
SETBIT(PORTB,1);//LED
// temperatur = TWI_empf(ADRESSE_R);
komma=dat2;
CLEARBIT(PORTB,1);//LED
}
//if ( (UCSRA & (1<<RXC)) ) //Zeichen Empfangen?
else
{
RxData=uart_getc();
if(RxData=='R') //Relais Einschalten
{
// SETBIT(PORTB,1);//LED
SETBIT(PORTA,6);//Relais
uart_putc('R');
}
if(RxData=='S') //Relais Ausschalten
{
// CLEARBIT(PORTB,1);//LED
CLEARBIT(PORTA,6);//Relais
uart_putc('S');
}
if(RxData=='T') //Relais Ausschalten
{
if(temperatur)
uart_putc(temperatur);
}
if(RxData=='U') //Relais Ausschalten
{
if(komma)
uart_putc(komma);
}
RxData=0;
}
_delay_ms(20);
/*
uart_putc('f');
_delay_ms(1000);
uart_putc('A');
_delay_ms(1000);
uart_putc(uart_getc());*/
}
}
/* TIMER 0 IR HANDLER */
ISR( TIMER0_OVF_vect ) //Wenn Timer IR kommt Led ausschalten + IR Flag auf 1
{
IR_zaehl++;
if(IR_zaehl==160)
{
IRFlag=1;
IR_zaehl=0;
}
}
/* Taster 0 IR HANDLER */
ISR( INT0_vect )
{
}
Lesezeichen