Forum: Mikrocontroller und Digitale Elektronik Probleme mit avr-gcc stdout unter Linux


von koro (Gast)


Lesenswert?

Hallo zusammen,
ich habe nach einigem hin und her zu Linux gewechselt und versuche 
gerade meine AVR Toolchain einzurichten. Konkret will ich einfach grad 
nur ein simples Testprogramm schreiben, dass über den UART zeichen 
empfängt und sendet. Dafür will ich stdin und stdout mit meine Streams 
laden und printf, scanf nutzen. Leider funktioniert das nicht wirklich. 
Der Controller sendet einfach immer '>' und erwartet keine Eingabe.. 
Wenn ich den Code mit AVR Studio compaliere funktioniert alles und wenn 
ich das elf file von AVR Studio mit avr dude flashe funkioniert auch 
alles.  Hat jemand eine Ahnung woran das liegen könnte
Grüße koro

main.c
1
#include <avr/io.h>
2
#include <stdio.h>
3
#include "usart.h"
4
5
int main(){
6
  FILE uart_output = FDEV_SETUP_STREAM(&iUSARTPutChar, NULL, _FDEV_SETUP_WRITE);
7
        FILE uart_input = FDEV_SETUP_STREAM(NULL, &iUSARTGetChar, _FDEV_SETUP_READ);  
8
  char cZeichen;
9
  vUSARTInit();
10
  stdout = &uart_output;
11
  stdin = &uart_input;
12
  while(1){
13
    printf(">\n\r");
14
    scanf("%c",&cZeichen);
15
    printf("%c",cZeichen);
16
  }
17
  return 0;
18
}

usart.c
1
#include "usart.h"
2
3
void vUSARTInit(){
4
  UCSRA = 0x00;
5
  UCSRB = (1<<RXEN) | (1<<TXEN);
6
  UCSRC = (1<<UCSZ1) | (1<<UCSZ0) | (1<<URSEL);
7
  UBRRL = 7;
8
  UBRRH = 0;
9
}
10
11
int iUSARTPutChar(char _cZeichen, FILE *_ptStream){
12
  while(!(UCSRA & (1<<UDRE)));
13
  UDR = _cZeichen;
14
  return 0;
15
}
16
17
int  iUSARTGetChar(FILE *_ptStream){
18
  while(!(UCSRA & (1<<RXC)));
19
  return UDR;
20
}

Kommand line befehle
avr-gcc -c -mmcu=atmega16 usart.c -o usart.o
avr-gcc -c -mmcu=atmega16 main.c -o main.o
avr-gcc main.o usart.o -o dummy.elf

von Stefan F. (Gast)


Lesenswert?

Schau mal, wie ich in meiner Hello-World Kopiervorlage die standard 
Streams mit dem seriellen Port verbunden habe. 
http://stefanfrings.de/avr_hello_world/index.html

Ich habe FDEV_SETUP_STREAM nur einmal verwendet, kombiniert für read und 
write Operationen. Vielleicht ist das der Knackpunkt.

Ansonsten würde ich mal prüfen, ob die Funktion iUSARTGetChar() wartet, 
bis sie ein Zeichen empfangen hat. Denn das soll sie tun.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.