- LiTime Speicher und Akkus         
Ergebnis 1 bis 3 von 3

Thema: USART , zum xten mal!?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.02.2005
    Alter
    43
    Beiträge
    9

    USART , zum xten mal!?

    Anzeige

    Powerstation Test
    Hallo,


    folgende Frage lässt mich nicht mehr ruhig schlafen -> Was ist an dem angefügten C-Code Falsch?

    Ich möchte gerne über den Controller (ATmega32) Zeichen empfangen. Senden mit dem BRAY Terminal, vom Controller zum PC, funktioniert soweit einwandfrei. Also laut Datenblatt von Atmel muss bei einer Taktfrequenz von 7,3728 MHz und 9600 Bauds, UBRRL = 47 (dez), eingestellt werden.

    Die Fusebits hab ich schon kontrolliert. (...müssen ja stimmen, wenn das Senden funktioniert, oder?)

    Meiner Meinung nach (bitte korrigiert mich), sollte ein Interrupt ausgelöst werden, sobald ein Zeichen empfangen wird. Dieses wird nun in die Variable "Daten" gespeichert. "Daten" wird verglichen, und je nachdem erfolgt eine ausgabe am Display. (Peter Fleurys lcd libary).

    Code:
    #include <inttypes.h>
    #include <avr/io.h>
    #include "lcd.h"
    #define  LCD_LINES   2 
    #define  LCD_DISP_LENGTH   8 
    #include <avr/interrupt.h> 
    #include <avr/signal.h> 
    #include <avr/iom32.h>
    
    volatile unsigned char Daten; 
    
    int p;
    
    
    
    
    SIGNAL(SIG_UART_RECV) 
    { 
           Daten = UDR;
    } 
    
    
    
    void main(void) 
    {  
    	  
    		lcd_init(LCD_DISP_ON);
    		lcd_clrscr();
    		UBRRL = 47;
    		UBRRH = 0
    		UCSRB |= (1<<TXEN) |(1<<RXEN)|( 1<<RXCIE);		
    		UCSRC |= (1<<URSEL) | (3<<UCSZ0);
    	sei(); 
    	abfrage();
    
    }
      
            
    
    
    
    
    abfrage()
    {
     
    for(;;)
    	{
     
     
    	if(Daten == 'a') 
    		{lcd_gotoxy(1,1);
    		lcd_puts ("a"); }
    
    	if(Daten == 'd') 
    		{lcd_gotoxy(1,1);
    		lcd_puts ("d");}
    				
    
        }
    }
    Das Display flimmert kurz, wenn ich eines der beiden Zeichen sende ( also nur bei "d" und "a"). Dass lässt mich daraus schließen, das ein Interrupt ausgelöst wurde. Allerdings funktioniert das nur einmal, dann muss ich den Controller Reseten.

    Vielen Dank schon mal im Voraus


    Gruß Daniel

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    28.04.2004
    Ort
    Nähe Köln
    Alter
    57
    Beiträge
    247
    Hallo

    Der Code sieht soweit gut aus.

    Was mir jetzt so auffällt ist, das du Daten nicht zurück setzt. Einmal a empfangen, bleibt a solange in Daten bis ein neues Zeichen kommt.

    Versuch es mal so

    Code:
    if(Daten == 'a')
          {
         Daten = 0;    
         lcd_gotoxy(1,1);
          lcd_puts ("a"); }
    Oder zum eingrenzen von Fehler mal so. Dann siehst du, ob ein INT erzeugt wird.

    Code:
    SIGNAL(SIG_UART_RECV)
    {
           Daten = UDR;
           UDR = Daten +1;       //Zeichen +1 zurück senden
    }

    MFG
    Dieter

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.02.2005
    Alter
    43
    Beiträge
    9
    Hallo Dieter!

    Danke für deine schnelle Hilfe -> Es funktioniert...!

    Habe "Daten", wie du beschrieben hast, wieder auf null gesetzt und siehe da...


    Für alle, die es noch Interessiert, hab ich hier noch den leicht ausgebesserten Code:

    Code:
    #include <inttypes.h>
    #include <avr/io.h>
    #include "lcd.h"
    #define  LCD_LINES   2 
    #define  LCD_DISP_LENGTH   8 
    #include <avr/interrupt.h> 
    #include <avr/signal.h> 
    //#include <avr/iom32.h>
    
    volatile unsigned char Daten; 
    
    int p;
    
    
    
    
    SIGNAL(SIG_UART_RECV) 
    { 
           Daten = UDR;
           UDR = Daten;
    } 
    
    
    
    void main(void) 
    {  
    	  
    		lcd_init(LCD_DISP_ON);
    		lcd_clrscr();
    		lcd_puts ("Hallo");
    		UBRRL = 47;
    		UBRRH = 0;
    		UCSRB |= (1<<TXEN) |(1<<RXEN)|( 1<<RXCIE);		
    		UCSRC |= (1<<URSEL) | (3<<UCSZ0);
    	sei(); 
    	abfrage();
    
    }
      
            
    
    
    
    
    abfrage()
    {
     
    for(;;)
    	{
    
    	if(Daten == 'a') 
    		{
    		Daten = 0;
    		lcd_gotoxy(1,1);
    		lcd_puts ("a");
    		} 
    
    	
    	if(Daten == 'd') 
    		{
    		Daten = 0;
    		lcd_gotoxy(1,1);
    		lcd_puts ("d");
    		}
    
    
        }
    }
    Nochmals Danke!

    Gruß Daniel

Berechtigungen

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

LiTime Speicher und Akkus