PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS-232 verursacht absturz...



Silence07
23.09.2007, 13:48
Hy

ich habe folgenden Code auf deinem Mega8 laufen. PWM funktioniert auch wunderbar aber jedesmal, wenn ich neue Werte per RS-232 (Hterm in Hex) senden will, bleibt das Prog hängen.

ich finde den Fehler nicht!! könnt ihr mir helfen?




#define F_CPU 8000000UL // MP-Takt
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>


#define BAUD 19200UL //Baundrate definieren

#define UBRR_BAUD ((F_CPU)/(16*(BAUD))-1) //Autoberechnung bei Änderung des MP-Takt



char out[15];
int in = 1;
int Zahl = 15;
long int i = 1;
int n = 1;
int Daten =100;


// Ausgaberoutinen

int uart_putc(unsigned char c)
{
while (!(UCSRA & (1<<UDRE)));

UDR = c;
return 0;
}

int uart_puts( char* str )
{
while( *str )
uart_putc( *str++ );
return 0;
}

int wait()
{
for (i=0;i<200000;)
{
i=i+1;
}
}

// Main-Funktion
int main (void)
{

// Programm

// RS232 aktivieren
UCSRB |= (1 << TXEN) | ( 1 << RXEN ) | ( 1 << RXCIE ) ; // UART TX, RX einschalten
UCSRC |= ( 1 << URSEL ) | ( 1<<UCSZ1 ) | ( 1<<UCSZ0 ) | ( 1<<UPM1 ); // Asynchron 8N1, Parity even
UBRRH = (uint8_t) (UBRR_BAUD>>8); // USART Baud
UBRRL = (uint8_t) UBRR_BAUD;

TCCR1A = (1 << WGM11) | (1 << WGM10) | ( 1 << COM1A1);
TCCR1B = ( 1 << CS11) ;
OCR1A = 0;

sei();
DDRB = 0xFF;

for (;;)
{
while (!(UCSRA & (1<<UDRE)));
UDR = Daten;
OCR1A = Daten;
wait();
Daten=Daten+20;
}
}



ISR(SIG_USART_RECV)
{
Daten = UDR;
}

Superhirn
23.09.2007, 19:59
soweit ich das erkant hab willst du die daten die du zum avr sendest sofort zurückschicken.

und am timer1 hängt irgendwas was du mit pwm regeln willst denk ich mal.

ich finde den fehler nicht genau. aber nimm mal Daten als datentyp char oder unsinged char.
und im empfangs sig sofort zurücksenden und den ocr1a setzen.

ISR(SIG_USART_RECV)
{
Daten = UDR;
while (!(UCSRA & (1<<UDRE)));
UDR = Daten;
OCR1A = Daten;
}

die for(;;) schaut dann nur mehr so aus:
for (;;)
{
wait();
Daten=Daten+20;
}

wobei ich die richtigkeit aller register und der art wie du empfängst nicht geprüft habe.

mfg
Thomas

Silence07
23.09.2007, 21:19
ja das stimmt soweit. Über OC1A soll eine LED gesteuert werden. per RS232 will ich den Startwert setzen, der dann automatisch einfach jede Loop sich steigert um die LED heller leuchten lässt. sollte einfach nur zum testen der Transistoren sein.

Ich frage mich nur ob evtl. meine AVR Platine defekt ist oder ob ich einfach nur nen dummen Fehlergemacht habe.

Senden tue ich in HEX nur "0x30" oder "0x60". Leider übernimmt er diesen diese nicht sondern hört einfach auf...

Superhirn
24.09.2007, 10:37
wie du sendest ist egal. er sendet 8bit. dein terminal erlaubt es dir dann die 8 bit als hex, dezimal , binär, oder zeichen anzuzeigen.
überprüfe mal was du sendest.
der avr bleibt vieleicht "hängen" (er tuts eigendlich nicht) weil du 4 zeichen sendest: 0x30 und 0x60.
wenn jetzt der 0er kommt wird daten auf 0 gesetzt, dann wird es auf x, dann auf 6 und dann wieder auf 0 gesetzt. somit bleibts immer 0.