- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 10

Thema: Ausgabe über COM

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119

    Ausgabe über COM

    Hallo,

    ich wollte mit "printf("meine Ausgabe");" eine Mitteilung über die COM-schnittstelle am RN Control schicken, jedoch wird leider nix ausgegeben.

    Was muss ich beachten ? Die Com ist ok, in Bascom funktioniert alles...

    Danke

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Die printf-Funktion spricht in C nicht automatisch die UART-Schnittstelle an.
    Du kannst aber wohl mit fdevopen() definieren, dass printf auf die UART schreibt. Die Funktion, die ein Zeichen an die UART ausgibt, musst Du aber dann noch selber implementieren.

    Hier mal ein bißchen Code wie's eventuell funktionieren könnte. Ich hab's allerdings selber noch nicht ausprobiert.

    Code:
    int uart_putchar(char c)
    {
    
      if (c == '\n')
        uart_putchar('\r');
      loop_until_bit_is_set(UCSRA, UDRE);
      UDR = c;
      return 0;
    }
    
    int main(void)
    {
    ioinit(); //Schnittstelle initialisieren
    fdevopen(uart_putchar, NULL, 0);
    printf ("Hello World");
    return 0;
    }
    Gruß,
    askazo

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Hab's jetzt mal getestet.
    Das funktioniert so!

    Gruß,
    askazo

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    Hallo, bei mir funktioniert es leider nicht, ich bekomme auch den Compilerfeher:
    Code:
     undefined reference to `ioinit'
    also, er kennt die ioinit nicht... welche include benötige ich ?

    Danke


    Alecs

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Gar keines, ioinit() implementierst du selber und nimmst die Initialisierungen vor, die du brauchst. Oder nimmst ein ioinit von jemand anderem, welches das tut was du brauchst.

    ioinit ist keine vordefinierte Funktion, du kannst die genausogut hamsterrad nennen.
    Disclaimer: none. Sue me.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    also ich hab nun folgendes Programm:
    Code:
    #include <../avr/include/io.h>
    #include <../avr/include/stdio.h>
    
    #define USART_BAUD_RATE 	9600 
    #define USART_BAUD_SELECT 	(F_CPU/(USART_BAUD_RATE*16L)-1) 
    
    int uart_putchar(char c);
    
    int uart_putchar(char c)
    {
    
      if (c == '\n')
      uart_putchar('\r');
      loop_until_bit_is_set(UCSRA, UDRE);
      UDR = c;
      return 0;
    } 
    
    int main(void) 
    {
       int zeichen;
       fdevopen(uart_putchar, NULL, 0); 
       zeichen=printf("Hallo Welt");
       printf(" enthaelt %d Zeichen\n",zeichen);  //10 Zeichen
       return 0;
    }
    doch leider kommt keine Ausgabe über die COM

    was ist da falsch, es kommen keine Fehler beim compilieren!!!

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    17.01.2005
    Ort
    Obertraun
    Alter
    36
    Beiträge
    194
    Dir fehlt die Initialisierung der COM-Schnittstelle.
    -> siehe
    http://www.mikrocontroller.net/artic...n_mit_dem_UART

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Sorry, ich dachte, Du kennst Dich durch Bascom schon ein wenig mit den Registern der UART aus.
    Hier mal ein Programm, das Du direkt kompilieren kannst:

    Code:
    #include <io.h> 
    #include <stdio.h> 
    
    #define F_CPU        8000000       // 8 MHz Taktfrequenz 
    #define UART_BAUD_RATE      2400 
    #define UART_BAUD_SELECT    (F_CPU/(UART_BAUD_RATE*16l)-1) 
    
    int uart_putchar(char c) 
    { 
    
      if (c == '\n') 
        uart_putchar('\r'); 
      loop_until_bit_is_set(UCSR0A, UDRE); 
      UDR0 = c; 
      return 0; 
    } 
    
    void ioinit(void) 
      { 
      UCSRB = 0x08   //UART Transmitter aktivieren
      UBRRL = UART_BAUD_SELECT;     //Baud Rate einstellen
      } 
    
    
    int main (void) 
    { 
    
    UartInit(); //Schnittstelle initialisieren 
    fdevopen(uart_putchar, NULL, 0); 
    
    printf ("HelloWorld"); 
    
    }

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    119
    @ askazo: Leider funktionierte dein Code nicht sofort und ich musst diesen nen bisl abändern, doch nun funktioniert er ohne Probleme:
    Code:
    #include <io.h>
    #include <stdio.h>
    
    #define F_CPU        16000000       // 8 MHz Taktfrequenz
    #define UART_BAUD_RATE      9600
    #define UART_BAUD_SELECT    (F_CPU/(UART_BAUD_RATE*16l)-1)
    
    int uart_putchar(char c)
    {
      if (c == '\n')
      uart_putchar('\r');
      while (!(UCSRA & (1<<UDRE))); 
      UDR = c;
      return 0;
    }
    
    void ioinit(void)
      {
      UCSRB = 0x08;   //UART Transmitter aktivieren
      UBRRL = UART_BAUD_SELECT;     //Baud Rate einstellen
      }
    
    int main (void)
    {
    
    ioinit(); //Schnittstelle initialisieren
    fdevopen(uart_putchar, NULL, 0);
    printf ("Hello World \n");
    }
    Vielen Dank =D> noch mal für die Hilfe, ich hab dieses Beispiel im Fall das noch jemand mal diese Hilfe brauch gepostet!!!!

    Alecs

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Naja, Taktfrequenz und Baud-Rate kann ich ja nicht erraten, da habe ich einfach mal Werte angenommen.
    Die 0 bei den Registern UDR und UCSRA sind Copy&Paste-Fehler - hatte das Programm auf dem Mega128 getestet und vergessen, das wieder umzuschreiben...

    Aber schön, dass ich Dir helfen konnte

    askazo

Berechtigungen

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

Labornetzteil AliExpress