-         

Ergebnis 1 bis 4 von 4

Thema: RS-232 verursacht absturz...

  1. #1

    RS-232 verursacht absturz...

    Anzeige

    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?


    Code:
    #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;
    }

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    26
    Beiträge
    995
    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

  3. #3
    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...

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.03.2005
    Ort
    Villach
    Alter
    26
    Beiträge
    995
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •