PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum Befehl outp!



Decca
02.03.2005, 17:11
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

Kjion
02.03.2005, 17:31
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

Decca
02.03.2005, 17:48
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

Decca
02.03.2005, 18:13
Mir ist noch ein kleiner Schreibfehler aufgefallen.

UBRRH = (unsigned char) (USART_BAUD_SELECT>>8);
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.

pebisoft
02.03.2005, 19:53
hier ist noch einmal ein beispiel-code aus dem "avr-forum":

#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

noNeed 4 aNick
03.03.2005, 14:25
@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:



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

pebisoft
03.03.2005, 14:51
gut, endlich ein vernünftiger programmierer. saubere arbeit. gut gemacht.
mfg pebisoft

bluebrother
03.03.2005, 14:52
@Decca: wie sieht der Fehler denn genau aus? Kannst du mal etwas mehr von der Fehlermeldung posten?