- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Daten Senden Empfangen Ic -> Pc -> Ic

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    27.06.2008
    Beiträge
    185
    Hallo knoddelpusch,

    sehr konfus das Ganze, aber ich probiere es.

    Zuerst zur Namenskonvention: IC heißt Integrated Circuit -> meist ist der IC ein (dummer) Baustein in einer Schaltung.
    Was Du meinst ist ein Mikrokontroller (auch MCU oder µC genannt). Bleiben wir in deinem Fall beim ATmega16.

    Also:
    Ich gehe jetzt stark davon aus, daß Du keine Ahnung von der internen Verarbeitung von Daten hast.
    Ein Computer kann nur binäre Zahlen verarbeiten. Das heisst 0 oder 1. 0 = aus 1 = ein.

    Da aber der Mensch mit binären Zahlen nicht sehr viel anfangen kann hat man die hexadezimale Darstellung eingeführt.
    Damit aber alle den gleichen binären Wert für jedes Zeichen verwenden wurde (zumindest auf PC und µC) der ASCII Code eingeführt
    (es gibt da auch noch den EBCDIC Code).

    Also wenn Du ein Zeichen "A" an den Atmega16 schickst dann sendet der PC 10000001 an den µC.
    binär 10000001 = hex 41 dezimal 65 = A (der PC malt dir dann ein A auf den Schirm).

    Warum willst Du das dann noch einmal in ASCII konvertieren?

    Zum programmieren: ich kenne weder VB noch irgendeine C** Sprache (und werde es auch nicht lernen).

    Ich habe mir dein Programm angesehen. was mir fehlt ist die genaue Einstellung der
    Übertragungsrate (BAUD) auf beiden Seiten (PC UND Atmega16).

    Ich hoffe, ich konnte dich verwirren.

    P.S. welche Werte willst Du an den µC senden?
    MfG
    Hans

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2015
    Beiträge
    11
    Hallo,

    Ich will Zeitwerte an meine uC senden, wo ich warte Zeiten ändern kann.
    Dachte das es in ASCII konvertieren einfacher geht. Ich gebe eine Zahl auf dem PC ein, wandele die dann in den ASCII-Code um
    Auf dem uC wieder zurück und nehme die Zahl mal x das ich auf meine Wartezeit komme.
    Die Übertragungsrate habe ich auf PC auf 9600 und auf dem uC auch (unter der CPU Definition).

    Habe mich jetzt im Internet noch etwas recherchierte habe auch ein paar Fehler gefunden, aber es funktioniert immer noch nicht, ich bin am Verzweifeln.
    Hier ist noch mal mein Programm.
    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include <inttypes.h>
    #include <util/delay.h>
    
    
    #define F_CPU 1200000	 /* evtl. bereits via Compilerparameter definiert */
    #define BAUD 9600UL      // Baudrate
     
    // Berechnungen
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) 		// Fehler in Promille, 1000 = kein Fehler.
     
    #include <util/setbaud.h>
    
    //----------------------------------------------------------------------------------------------------
    
    // UART konfig
    
    void uart_init (void)
    {
    	UBRRH = UBRR_VAL >> 8;
    	UBRRL = UBRR_VAL & 0xFF;
    	
    	UCSRB |= (1<<TXEN) | (1<<RXEN);					//UART TX und RX einschalten
    	UCSRC = (1<<URSEL) |(1<<UCSZ1) | (1<<UCSZ0);	// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    }
    
    //----------------------------------------------------------------------------------------------------
    
    //Zeichen Senden
    int uart_putc(unsigned char c)
    {
    	while (!(UCSRA & (1<<UDRE)))
    	{
    	}
    	UDR = c;
    	return 0;
    }
    
    //----------------------------------------------------------------------------------------------------
    
    void uart_puts (char *s)
    {
        while (*s)
        {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
            uart_putc(*s);
            s++;
        }
    }
    
    
    //----------------------------------------------------------------------------------------------------
    
    //Zeichen Empfanen 
    uint8_t uart_getc(void)
    {
    	while (!(UCSRA & (1<<RXC)))	//warten bis Zeichen verfügbar 
    	;
    	return UDR;					//Zeichen aus UDR an Aufrufer zurückgeben
    }
    
    //----------------------------------------------------------------------------------------------------
    
    
    void uart_gets( char* Buffer, uint8_t MaxLen )
    {
      uint8_t NextChar;
      uint8_t StringLen = 0;
     
      NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
     
                                      // Sammle solange Zeichen, bis:
                                      // * entweder das String Ende Zeichen kam
                                      // * oder das aufnehmende Array voll ist
      while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
        *Buffer++ = NextChar;
        StringLen++;
        NextChar = uart_getc();
      }
     
                                      // Noch ein '\0' anhängen um einen Standard
                                      // C-String daraus zu machen
      *Buffer = '\0';
    }
    
    
    //----------------------------------------------------------------------------------------------------
    
    int main (void) 
    {
    	
    	DDRB = 0xFF;
    	PORTB = 0xFF;
    
    int Line [8];			//Array vom Typ int
    
    char Buffer[9];			//String mit maximal 8 zeichen
    
    int a;
    
    uart_init();			// UART einstellen
    	
      	while (1)
       	{
    
    
    	if ( (UCSRA & (1<<RXC)))			//überprüfen ob neue Zeichen vorhanden sind
    	{									//Zeichen wurden empfangen, jetzt abholen
    		uart_gets (Line, sizeof(Line));
    
    	
    		a=atoi(Line);					//aus Text eine Zahl machen
    	
    		itoa (Line, Buffer, 10);		// Aus der Variablen a ein Text erstellen
    
    		uart_puts(Buffer);				//Senden Text aus Buffer
    
    	}
    	else
    	{
    	
    		PORTB = 0b00000000;			//Port B schalten
    		_delay_ms(1000);			//WarteZeit t
    		PORTB =0b11111111;			//Port B ausschalten
    		_delay_ms(1000);			//WarteZeit t
    		PORTB = 0b00000000;			//Port B schalten
    		_delay_ms(1000);			//WarteZeit t
    		PORTB =0b11111111;			//Port B ausschalten
    	}
       }
     
       return 0; // never reached 
    
     
    }

  3. #3
    Unregistriert
    Gast
    Hallo,

    Wenn Du Zeichen an den Atmega sendest, was kommt dort an?
    Bist Du sicher, das Du den richtigen COM-Port eingestellt hast?

    Versuche einfach nur Zeichen zu senden z.B. "AAAA". Über die Zahlen sprechen wir später.

    Übrigens ist mir im ersten Post ein Fehler unterlaufen: ein "A" hat den Binäwert 01000001 und NICHT 10000001!
    Da hat der Calculator eine Null verschluckt und ich habe es auch noch falsch abgeschrieben.

    M.f.G.
    Hans

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2015
    Beiträge
    11
    Hallo,

    Mit dem Com-Port bin ich mir sicher, habe nur den einen zur Auswahl und ich bekomme ja schon komisches Zeug zurück.
    Ja was kommt dor an, das ist eine gute Frage, wo ich mir definitiv sicher bin ist das bei mir auch der Buchstabe raus geht wo ich will.
    Habe zwei Pc's mit einem Nullmodem Kabel verbunde, und habe Buchstaben und Zahlen hin und her geschickt und sind immer die angekommen
    wo ich los geschickt habe.
    Habe auch schon das HyperTerminal von Win XP benutzt, ist aber immer das selbe, kommt immer unterschiedliche Buchstaben oder Zahlen an.
    Habe da auch Porbleme mit dem Auswerten von dem Endzeichen eines Srings (\n) das funktioniert auch nicht.

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    36
    Beiträge
    5.070
    Versuche einmal vom uC etwas fixes zu übertragen. Also z.b. A, B, C, 1, 2, 3,...
    Somit kannst du herausfinden ob es an der Wandlung (int»ascii oder ascii»int) liegt oder der Übertragung.

    MfG Hannes

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.686
    Code:
      #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)    // clever runden
    Wer hat denn diese Formel erfunden - genauer den offset BAUD*8 ? Bisher dachte ich immer (und bei mir läufts) dass die richtige Formel, z.B. auf Datenblatt mega16A 8154B–AVR–07/09 - Seite 150 Tabelle 19-1 steht.

    Zitat Zitat von hans99 Beitrag anzeigen
    .. wenn Du ein Zeichen "A" an den Atmega16 schickst dann sendet der PC 10000001 an den µC ..
    ASCII ist im Ursprung siebenbittig. Daher ist in ASCII ein 'A' (0)100 0001. Die (meisten?) C-Konventionen erlauben aber stattdessen die Syntax 'A' - Buchstabe mit Strichelchen. Wie es Hans schon als Gastredner dargestellt hat.
    Geändert von oberallgeier (25.10.2015 um 09:32 Uhr) Grund: Die Sache mit dem ASCII 'A'
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von oberallgeier Beitrag anzeigen
    Wer hat denn diese Formel erfunden - genauer den offset BAUD*8 ?
    Das ist das, was im Kommentar steht. Es sorgt dafür, dass bei der Integer-Division eine Rundung stattfindet. Aus X/Y wird (X+Y/2)/Y gemacht, so wird das Ergebnis von (z.B.) 9/5 zu 2 statt 1.

    - - - Aktualisiert - - -

    Code:
            itoa (Line, Buffer, 10);        // Aus der Variablen a ein Text erstellen
    Diese Zeile ist Unsinn.
    MfG
    Stefan

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2015
    Beiträge
    11
    Hallo

    Ich habe es mal mit den festen Variablen probiert, aber da kommt alles nur nicht das an wo ich los geschickt habe. Habe das HyperTerminal von Win XP benutzt.
    Also kann es an der Umwandlung nicht liegen oder?
    Habe auch mal den uC getauscht hätte ja sein könne das der ein defekt hat, hat sich aber nichts geändert.

    Warum ist diese Zeile Unsinn?
    Code:
    itoa (Line, Buffer, 10);        // Aus der Variablen a ein Text erstellen
    Ich muss doch meine Variable in einen Text umwandeln damit ich diesen übertragen kann oder nicht?

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von knoddelpusch Beitrag anzeigen
    Ich muss doch meine Variable in einen Text umwandeln damit ich diesen übertragen kann oder nicht?
    Und dir kommt es nicht irgendwie merkwürdig vor, dass der Kommentar sagt, dass etwas mit der Variable a getan werden soll, diese aber gar nicht in der Code-Zeile vorkommt?
    MfG
    Stefan

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    161
    Hallo,
    Da gibt es doch den alten Trick bei der RS232, dass man RX und TX verbindet. Dann wird das auf dem Terminal empfangen, was man gerade gesendet hat.
    Auf die Weise kann man testen, wie weit die Übertragung noch gut gegangen ist. (Vor dem Pegelwandler, direkt auf der Platine, ...)

    Man kann aber nicht erkennen, ob die eingestellte Baudrate auf dem Controller zu der auf dem PC passt. (Komisches Zeug auf der RS232 hört sich irgendwie nach falscher Baudrate an.)


Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Daten senden und empfangen mit IR
    Von GerdM im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 21.06.2009, 13:40
  2. RS232 daten empfangen, senden und auswerten
    Von Crischan im Forum Software, Algorithmen und KI
    Antworten: 62
    Letzter Beitrag: 20.03.2009, 17:10
  3. USART Senden und Empfangen von Daten.
    Von Ferdinand im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 05.02.2009, 23:13
  4. Daten senden/empfangen
    Von FSTII im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 29.12.2006, 17:25
  5. Antworten: 1
    Letzter Beitrag: 22.09.2006, 17:33

Berechtigungen

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

Solar Speicher und Akkus Tests