- LiFePO4 Speicher Test         
Ergebnis 1 bis 8 von 8

Thema: Frage zum Befehl outp!

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2005
    Ort
    Berlin
    Alter
    43
    Beiträge
    23

    Frage zum Befehl outp!

    Anzeige

    E-Bike
    Hallo!

    Habe schon zu meiner Zufriedenheit kleine Programme geschrieben und habe mir jetzt die serielle Schnittstelle aufgebaut um mit dem UART was zu machen.

    1. Mir ist schon bei kleinen Programmen aufgefallen das mein WinAVR den Befehl "outp" nicht compiliert. Warum nicht?

    2. Hier wollte ich ein kleines Bsp. Programm ausprobieren um den UART zu testen:

    /************************************************** *********
    Funktion zur Initialisierung des USARTs des Atmega8
    (Senden von Controller an PC)
    ************************************************** *********/

    #define F_CPU 4000000
    #define USART_BAUD_RATE 9600
    #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)


    void USART_Init_TXD (void) {
    UCSRB |= (1<<TXEN); //UART Control Register Laden
    UBRR = (unsigned char) UART_BAUD_SELECT; // Baudrate setzen
    }

    /************************************************** *********
    Funktion zum Senden eines Zeichens
    (Senden von Controller an PC)
    ************************************************** *********/

    void USART_transmit (unsigned char c) {
    UDR = c;
    }

    Und hier aktzeptiert WinAVR UBRR und UCSRB nicht. Muss ich da noch etwas installieren (wie giveio.bat um i/o zu nutzen) oder eine bestimmte Bibliothek haben?

    Danke
    Grüße Marco

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.11.2003
    Beiträge
    991
    1.) outp() gibts seit der dem neusten WinAVR Release nicht mehr. Du kannst aber wie schon getan PORTB = 0xff; oder so benutzten.

    2.) Da fehlt ein #include <avr/io.h>
    Dann sollte auch die Registernamen bekannt sein...
    UBRR kann man glaube ich nicht als 16-Bit Register ansprechen. Je nachdem welchen AVR du nutzt brauchst du hier evntl. UBRRL und UBRRH.

    MfG Kjion

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2005
    Ort
    Berlin
    Alter
    43
    Beiträge
    23
    Danke für die Antwort!

    Durch die Bibliothek io.h sind jetzt fast alle Fehlermeldungen weg.
    Es bleibt nur noch ein Fehler bei UBRR. Ich habe beide Varianten ausprobiert und keine funktioniert (UBRRL u. UBRRH). Im Datenblatt steht auch UBRRL! Ich benutze übrigens ein ATmega8.

    Gruß Marco

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    24.02.2005
    Ort
    Berlin
    Alter
    43
    Beiträge
    23
    Mir ist noch ein kleiner Schreibfehler aufgefallen.

    UBRRH = (unsigned char) (USART_BAUD_SELECT>>;
    UBRRL = (unsigned char) USART_BAUD_SELECT;

    bei USART_BAUD.... hatte ich geschr. UART_B......
    gut, das Problem ist soweit gelöst das keine Fehlermeldungen mehr erscheinen aber beim compilieren kommt ein schönes Error 1 u. Exit Code: 2 bei Linking uart.elf...

    Ich habe UBBRL u. UBBRH eingefügt weil es im DB als Bsp. angegeben war.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hier ist noch einmal ein beispiel-code aus dem "avr-forum":
    Code:
    #include <inttypes.h> 
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    #include <avr/signal.h> 
    
    #define Pin1 0 
    #define Pin2 1 
    #define Pin3 2 
    #define Pin4 3 
    #define Pin5 4 
    #define Pin6 5 
    #define Pin7 6 
    #define Pin8 7 
    
    #define READ  1 
    #define WRITE 2 
    
    #define F_CPU 				8000000 
    #define USART_BAUD_RATE 	9600 
    #define USART_BAUD_SELECT 	(F_CPU/(USART_BAUD_RATE*16l)-1) 
    
    //static unsigned char 	changed	= 0;
    //static unsigned char 	data	= 0;
    volatile unsigned char 	changed	= 0;
    volatile unsigned char 	data	= 0;
    
    void usart_init(int Enable, int Interupts) 
    { 
    	if (Enable & READ)         		UCSRB = (1<<RXEN); 
    	if (Enable & WRITE)        		UCSRB |= (1<<TXEN); 
    
        if (Interupts & READ)         		UCSRB |= (1<<RXCIE); 
    	if (Interupts & WRITE)        		UCSRB |= (1<<TXCIE); 
        UBRRL = (unsigned char) USART_BAUD_SELECT; 
    } 
    
    void usart_writeChar(unsigned char c) 
    { 
       while (!(UCSRA & (1<<UDRE))) {} 
       UDR = c; 
       while(!(UCSRA & (1<<TXC))) {} 
    } 
    
    unsigned char usart_readChar(void) 
    { 
        while(!(UCSRA & (1<<RXC))) {} 
        return UDR; 
    } 
    
    void usart_writeString(unsigned char *string) { 
        while (!(UCSRA & (1<<UDRE))) {} 
    	while ( *string) 
          usart_writeChar(*string++); 
    } 
    
    SIGNAL (SIG_UART_RECV) 
    {       
       data = UDR; 
       changed = 1; 
       usart_writeChar('['); 
       usart_writeChar(data); 
       usart_writeChar(']'); 
    } 
    
    int main (void) 
    { 
    	usart_init( (READ + WRITE) , READ); 
    	DDRD  = 0xFF; 
    	PORTD = 0x00;  
    	changed = 0; 
    	usart_writeString("\nHello World  \'l\'->left  \'r\'->right \'s\'->stop \n"); 
    	sei(); 
      
      
    	while (1) 
    	{ 
    		if (changed == 1) 
    		{ 
    			data |= 0x20;
    			if (data == 'l') 
    			{ 
    				PORTD = (1 << Pin6); 
    				usart_writeString("[Motor left]\n"); 
    			} 
    			else 
    			{
    				if (data == 'r') 
    				{ 
    					PORTD = (1 << Pin7); 
    					usart_writeString("[Motor right]\n"); 
    				} 
    				else 
    				{
    					if (data == 's') 
    					{ 
    						PORTD = 0x00; 
    						usart_writeString("[Motor stop]\n"); 
    					} 
    					else 
    					{
    						usart_writeChar(data); 
    					}
    				}
    			}
    			changed = 0; 
    		} 
    	} 
    }

    mfg pebisoft

  6. #6
    @pebi Na toll, was bringt es denn, wenn du nen Code copy&paste'test, der aufgabenspezifisch ist, und mit dem hier geschliderten Problem kaum was zu tun hat?

    Und da die von dir immer soooo gewünschte Ordentlichkeit durch's einfache copy&paste'n verloren gegangen ist und die ganzen wegkommentierten Variablen, etc. das Ganze auch nicht gerade durchblickbarer machen, pack ich hier mal den funktionierenden Codeschnippsel den ich damals daraufhin entwickelt hatte:

    Code:
    #define F_CPU 8000000
    #define USART_BAUD_RATE 9600
    #define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)
    
    #define READ  1
    #define WRITE 2
    
    void usart_init(int Enable, int Interupts)   // USART init'n zB mit usart_init(READ + WRITE, READ);
     { 
    	if (Enable & READ)     UCSRB = (1<<RXEN); 
    	if (Enable & WRITE)    UCSRB |= (1<<TXEN); 
    
        if (Interupts & READ)  UCSRB |= (1<<RXCIE); 
    	if (Interupts & WRITE) UCSRB |= (1<<TXCIE); 
    	
        UBRRL = (unsigned char) USART_BAUD_SELECT; 
     } 
     
    
    void usart_writeChar(unsigned char c) // Zeichen mit dem USART senden
     {
    	while (!(UCSRA & (1<<UDRE))) {}
    	UDR = c;
     }
    
    
    void usart_writeString(unsigned char *string) // String mit dem USART senden
     {
        while (!(UCSRA & (1<<UDRE))) {}
    	while ( *string)
    		usart_writeChar(*string++);
     }
    
    
    void usart_crlf(void) // CarriageReturn + LineFeed = Neue Zeile
     {
    	usart_writeChar(0x0D);  // CR #13
    	usart_writeChar(0x0A); //  LF #10
     }
    
    
    unsigned char usart_readChar(void) // Interrupt-unabhängig ein Zeichen lesen
     {
        while(!(UCSRA & (1<<RXC))) {}
        return UDR;
     }
    Zum Problem kann ich leider nicht wirklich viel beitragen.
    Nebenbei, aber das wird das Problem net lösen:
    Der errechnete Wert, der in UBBR gespeichert wird, ist in fast allen Fällen so klein, dass man nur das UBBRL braucht.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    gut, endlich ein vernünftiger programmierer. saubere arbeit. gut gemacht.
    mfg pebisoft

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.11.2004
    Ort
    Karlsruhe
    Beiträge
    223
    @Decca: wie sieht der Fehler denn genau aus? Kannst du mal etwas mehr von der Fehlermeldung posten?

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad