Forum: Compiler & IDEs UART Peter Fleury empfangen


von Mike (Gast)


Lesenswert?

Hallo

Ich habe mir nun die Lib von Peter Fleury auf einen Mega8 gepackt. nun 
will ich über AVRTerm eine Zahl senden die mir der Mega wieder zurück 
senden soll. Soweit ich diese Lib verstanden habe soll es mit dieser 
auch funktionieren. Ist AVRTerm da nicht das richtige Programm oder wie 
kann ich diese Lib testen? Oder gibt es andere Libs mid denen ich das 
Senden und Empfangen von Zeichen testen kann?

von Stefan (Gast)


Lesenswert?

"AvrTerm ist ein spezielles Terminalprogramm für Windows 9x/ME (NT nur 
mit Treiber userport.sys), das speziell für die Zusammenarbeit mit 
meinem DL7UNO-AVR-Testboard entwickelt wurde. Es dient vor allem zum 
Kennenlernen der verschiedenen AVR-Features, zum Testen von Programmen 
und zum Debuggen. Neben verschiedenen Darstellungsformen für die Daten, 
die von der seriellen Schnittstelle eintreffen, ist eine der 
Besonderheiten, daß man die Stromversorgung der Schaltung 
TwinAVR/SP12-kompatibel ein- und ausschalten kann. Außerdem können die 
CTS/RTS-Handshake-Leitungen wie auf dem DL7UNO-Testboard vorgesehen zum 
Debuggen verwendet werden (diese Leitungen funktionieren dann schlicht 
wie eine "Software"-Leuchtdiode bzw. ein "Software"-Ein/Aus-Schalter)."
http://www.rowalt.de/mc/avr/toolsd.htm

Ich verwende statt AVRTerm ein anderes Terminalprogramm auf dem PC. 
Meistens wenn es um einfache Texte geht Hyperterminal (bei Windows 
dabei) oder, wenn ich die Daten auch als Hexadezimalwert oder Binärwert 
sehen will, das Bray-Terminal oder das HTerm. Wenn ich mehr als serielle 
Schnittstelle machen will, also z.B. über TCP/IP arbeite, habe ich noch 
das Hercules-Terminal.

von Mike (Gast)


Lesenswert?

kann ich über hyperterminal auch daten senden? ich habe das noch nicht 
geschaft? Ich möchte nur mal sehen ob ich daten empfangen und auch 
wieder senden kann über dem mega.

von Stefan (Gast)


Lesenswert?

Sicher kannst du über Hyperterminal auch Daten senden. Entweder durch 
Eintippen oder durch Senden (Übertragen) einer Datei.

Dabei siehst du allerdings nichts auf dem PC-Bildschirm, wenn das 
angeschlossene Gerät an der seriellen Schnittstelle (dein AVR) nichts 
zurücksendet.

Du kannst, glaube ich, schneller weiterkommen, wenn du deinen Sourcecode 
und ein Schaltbild von deinem Hardwareaufbau (muss nicht perfekt 
layoutet sein. Handzeichnung geht auch!) hier bekannt gibst. Im Moment 
ist die Ferndiagnose ein Raten im Nebel.

von Karl H. (kbuchegg)


Lesenswert?

> ich habe das noch nicht geschaft?

Das könnte zur Ursache haben, dass du vergessen hast
im Hyperterminal das Handshaking abzuschalten. Default-
mässig ist das auf 'Hardware' eingestellt und wenn du
die entsprechenden Pins an der Seriellen nicht verschaltet
hast, wartet der PC bis zum St.Nimmerleinstag dass ihm das
andere Gerät die Freigabe zum senden gibt.

von Mike (Gast)


Lesenswert?

Habe nun mein Problem gelöst. Ich kann nun mit AVRTerm ein String an 
meinen Mega senden. Nun will ich diesen am LCD ausgeben. Doch der LCD 
gibt mir nicht den ganzen string aus sondern nur immer die letzte 
Ziffer.

#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>

#include "lcd.h"

#include "uart.h"


/* define CPU frequency in Mhz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 16000000UL
#endif

/* 9600 baud */
#define UART_BAUD_RATE      9600


int main(void)
{
    lcd_init(LCD_DISP_ON);
  unsigned int c;
    char buffer[7];
    int  num=134;


    /*
     *  Initialize UART library, pass baudrate and AVR cpu clock
     *  with the macro
     *  UART_BAUD_SELECT() (normal speed mode )
     *  or
     *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
     */
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );

    /*
     * now enable interrupt, since UART library is interrupt controlled
     */
    sei();

    /*
     *  Transmit string to UART
     *  The string is buffered by the uart library in a circular buffer
     *  and one character at a time is transmitted to the UART using 
interrupts.
     *  uart_puts() blocks if it can not write the whole string to the 
circular
     *  buffer
     */
    uart_puts("String stored in SRAM\n");

    /*
     * Transmit string from program memory to UART
     */
    uart_puts_P("String stored in FLASH\n");


    /*
     * Use standard avr-libc functions to convert numbers into string
     * before transmitting via UART
     */
    itoa( num, buffer, 10);   // convert interger into string (decimal 
format)
    uart_puts(buffer);        // and transmit string to UART


    /*
     * Transmit single character to UART
     */
    uart_putc('\r');

    for(;;)
    {
        /*
         * Get received character from ringbuffer
         * uart_getc() returns in the lower byte the received character 
and
         * in the higher byte (bitmask) the last receive error
         * UART_NO_DATA is returned when no data is available.
         *
         */
        c = uart_getc();

    if ( c & UART_NO_DATA )
        {


      /*
             * no data available from UART
             */
        }
        else
        {
            /*
             * new data available from UART
             * check for Frame or Overrun error
             */
            if ( c & UART_FRAME_ERROR )
            {
                /* Framing Error detected, i.e no stop bit detected */
                uart_puts_P("UART Frame Error: ");
            }
            if ( c & UART_OVERRUN_ERROR )
            {
                /*
                 * Overrun, a character already present in the UART UDR 
register was
                 * not read by the interrupt handler before the next 
character arrived,
                 * one or more received characters have been dropped
                 */
                uart_puts_P("UART Overrun Error: ");
            }
            if ( c & UART_BUFFER_OVERFLOW )
            {
                /*
                 * We are not reading the receive buffer fast enough,
                 * one or more received character have been dropped
                 */
                uart_puts_P("Buffer overflow error: ");
            }
            /*
             * send received character back
             */



        /* put converted string to display */


       lcd_clrscr();

      lcd_putc( (unsigned char)c );
      uart_putc( (unsigned char)c );
        }
    }

}

warum gibt mir die uart den ganzen String wieder und der LCD nur die 
letzte Ziffer?

von Karl H. (kbuchegg)


Lesenswert?

> warum gibt mir die uart den ganzen String wieder und der LCD
> nur die letzte Ziffer?

Weil du hier
1
        /* put converted string to display */
2
3
4
       lcd_clrscr();
5
6
      lcd_putc( (unsigned char)c );
7
      uart_putc( (unsigned char)c );

das Display löscht, bevor du ein Zeichen ausgibst.

Sag jetzt nichts. Dummer Fehler. Sowas sieht man selber
nicht, während es für andere nur eine Frage von Sekunden
ist.

von Mike (Gast)


Lesenswert?

ohman wie kommt denn das da rein?
Danke für deinen Tip.

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.