mikrocontroller.net

Forum: FPGA, VHDL & Co. NiosII - Änderung der UART-Baudrate


Autor: Luggi S__ (mmpls)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich habe nach einigem Hin und Her nun endlich mein UART auf dem NEEK zum 
Laufen gebracht. Jetzt komm ich aber wieder nicht mehr weiter:

Habe meinem SoPC-System den Altera UART-Controller hinzugefügt (Kreuz 
bei "...change baudrate per SW..." und möchte jetzt in meinem 
NiosII-C-Programm die Baudrate ändern. Dies mache ich so:
 
#include <stdio.h>
#include <string.h>
#include <system.h>
#include <altera_avalon_uart_regs.h>

int main()
{
    FILE* fp;
    char prompt;
    char* ende = "Ende";
    int divi = 3472;        //soll Baudrate von 14400 ergeben (divisor=(clock/baudrate)+0,5)
   
    IOWR_ALTERA_AVALON_UART_DIVISOR(UART_NAME, divi);
    fp = fopen ("/dev/uart", "r+b");  //Open file for reading and writing
    if(fp)  
    {
        printf("fopen hat funktioniert\n");
        printf("2. Versuch printf()\n");
                
        while(prompt != 'a')        //bis irgendwann ein 'a' empfangen wird
                {
                    prompt = getc(fp);      //Lese von UART
                                            //gib den gelesenen Wert auf UART wieder aus
                                            //Rückgabewert der putc() zur Konsole
                    printf("Rückgabe der putc-Funktion: %c\n", (char)putc((int)prompt, fp));
                }
        printf("Jetzt wurde a empfangen");
        fwrite(ende, strlen(ende), 1, fp);
    }
    else
    {
        printf("Fehler beim Öffnen\n");
        fclose(fp);
    }  
  return 0;
} 

Jetzt passiert folgendes:
Ändere das Divisor-Reg über IOWR_ALTERA..., so funktioniert das darauf 
folgende printf ("fopen hat...") nicht, auf der Konsole erscheint ein 
merkwürdiges Sonderzeichen, das ich nichtmal in der ASCII-Tab finden 
kann. Das zweite printf("2.Versuch...") funktioniert dann.
Meiner eigentlichen Absicht - dem Ändern der Baudrate - wird der Code 
aber auch nicht gerecht. Stell ich am Terminal-Prog 14400 ein, so kommt 
nur Müll bei der Kommunikation raus, stell ichs auf 9600 (Default im 
SoPC-Builder), funzt es einwandfrei.

Ich hab schon begriffen, dass man die Register wohl nicht direkt 
ansprechen sollte, sondern über Treiber hantieren soll, aber wie das 
geht, versteh ich nich...

Freu mich auf Eure Hilfe,
Grüße, Luggi.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ändere das Divisor-Reg über IOWR_ALTERA..., so funktioniert das darauf
> folgende printf ("fopen hat...") nicht, auf der Konsole erscheint ein
> merkwürdiges Sonderzeichen, das ich nichtmal in der ASCII-Tab finden
> kann.
Das sieht nach falscher Baudrate aus. Hast Du auch in deinem 
Terminalprogramm die Baudrate umgestellt?

> Das zweite printf("2.Versuch...") funktioniert dann.
Also dann doch noch die richtige Baudrate. Hmm, eventuell musst Du erst 
einen Puffer leeren (flush o.ä).

Schau Dir übrigens mal den ersten google-Treffer mit 
IOWR_ALTERA_AVALON_UART_DIVISOR an.


Duke

Autor: Luggi S__ (mmpls)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Duke,

danke für Deine Antwort!

> Das sieht nach falscher Baudrate aus. Hast Du auch in deinem
> Terminalprogramm die Baudrate umgestellt?
Das hielt ich nicht für nötig, printf() wirkt doch auf stdout, dieser 
ist in syslib-proberties mit JTAG verknüpft (geht dann über den 
USB-Blaster auf meinen PC).
War von mir vielleicht etwas blöd ausgedrückt, also mit printf() 
schreibe ich über stdout->jtag->usbblaster auf die NiosIDE-Console, mit 
putc(...,fp) und fwrite(...,fp) auf UART->RS232->PC->Terminalprogramm

> Also dann doch noch die richtige Baudrate. Hmm, eventuell musst Du erst
> einen Puffer leeren (flush o.ä).
Auf die Idee einen Puffer zu leeren kam ich noch nicht, hättest Du da 
konkretere Tipps, kann mir da grad noch nichts so recht vorstellen.

> Schau Dir übrigens mal den ersten google-Treffer mit
> IOWR_ALTERA_AVALON_UART_DIVISOR an.
Ja das hab ich mir auch schon gegeben, habs aber noch gar nicht 
probiert, weils mir wiederstrebt irgendeinen Code einzubauen, den ich 
nicht begreife und von der ganzen Sache mit Filedescriptoren hab ich 
noch nie was gehört - also bis vor ein paar Tagen nicht - und bemüh mich 
da gerade erst darum. Kannst Du mir die Wirkungsweise von Fischers Code 
erklären? Bzw, wo finde denn die Bedeutung, zb. des Flags 'O_NOCTTY'?

Schöne Grüße,
Luggi.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok. Du hast also zwei "serielle" Schnittstellen:

1. stdout -> jtag -> usbblaster
2. UART -> RS232 -> PC -> Terminalprogramm

Die 1. nimmst Du für's debugging, richtig?
Und bei der 2. willst Du die Geschwindigkeit ändern?!

Deine Zeilen:
IOWR_ALTERA_AVALON_UART_DIVISOR(UART_NAME, divi);
fp = fopen ("/dev/uart", "r+b");  //Open file for reading and writing
sehen sehr nach einem Mix zwischen der simplen und der 
Filedescriptor-Methode aus.

Mit den Filedescriptoren kenne ich mich nicht aus, sieht aber so ähnlich 
aus wie in Unix.

Duke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.