www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Serielle-Schnittstelle (Mikrocontroller auf C#)


Autor: Richi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle mit einander,

zurzeit programmiere ich die Serielle Schnittstelle des 
Mikrocontrollers,
versuche eine Übertragung von einem analogen Wert

das ist das Programm von Mikrocontrollers:


#include <avr/io.h>           //Aus und Eingänge Bibliothek
#include <avr/interrupt.h>    //Interrupt freischalten
#include <stdio.h>        //Zeichen freischalten
#include <util/delay.h>      // verzögeruns Bibliothek aufrufen
#include <sps_lcd.h>      //lcd Bibliothek Pinbelegung
#include "sps_lcd.c"

#include "v24_poll.c"


unsigned char _analog;
char _lcd_buffer[20];

ISR(INT0_vect)
{
  PORTB|=(1<<2);
}

ISR(INT1_vect)
{
  PORTB&=~(1<<2);
}

void initAD()
{

  ADMUX|=(1<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0 
<<MUX1)|(0<<MUX0);
  /*
  ADMUX Zentraler Register,
  REFS1, REFS0 legen die Referenzspannung fest,
  ADLEAR wird bei starken Signalschwankungen und Rauschen verwendet für 
8 Bit Ergebnisse,
  MUX4...0 wird für Eingänge-Verschaltung benötigt
  */

  ADCSRA|=(1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(0<<ADIF)|(0<<ADIE)|(1<<ADPS2)|(1 
<<ADPS1)|(1<<ADPS0);
  /*
  ADCSRA ist ein Wandlungsvorgang Register,
  ADEN Analog/Digital Wandler freigeben,
  ADSC Wandler starten
  ADPS2..0 Wandlungstakt (001 – F_CPU/2, 010 - / 4, 011 – 8, ... 111 - 
F_CPU/128)
  */
}

void initv24 (void)
  {

    //UCSRC = 0b10000110;
    //UCSRB |= ((1 << TXCIE) | (0 << RXCIE));

  }

void initlcd(void)
{
  DDRD = 0xf0; // 11110000 Datenrichtigungsregister die ersten sind 
ausgänge
  PORTD =0x0f; // 00000000

  lcd_init(LCD_DISP_ON);
  lcd_clrscr();
  lcd_gotoxy(0,0);
  sprintf(_lcd_buffer,"%1d",_analog);
  lcd_puts(_lcd_buffer);
}

int main ()
{
  MCUCR|= (1<<ISC00)|(1<<ISC01)|(1<<ISC10)|(1<<ISC11);// bei steignder 
Flanke aktevieren

    DDRA=0x00;
    PORTA=0b11111110;
    DDRB=0xff;
    PORTB=0xff;
  v24_init(9600);

  while (1)
  {
    initlcd();
    initAD();
    _analog=ADCH; // PINA0 zugewiesen zu _analog Variable.
    initv24();
    if(_analog<=0)
    {
      PORTB&=~(1<<1);
      GICR|=(1<<INT1);
      sei();
      PORTB|=(1<<7);
    }
    else if(_analog>=50)
    {
      PORTB|=(1<<1);
      PORTB&=~(1<<7);
      GICR|=(1<<INT0);
    }
    else if((_analog>2)|(_analog<49))
    {
      PORTB|=(1<<1);
      PORTB|=(1<<7);
    }
    v24_putc(_analog);
  }
}


und das ist das Programm von C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void checkBox1_CheckedChanged(object sender, EventArgs 
e)
        {
            if (checkBox1.Checked == true)
            {
                serialPort1.Open();
            }
            else
            {
                serialPort1.Close();
            }
        }
            byte[] _analog = new byte[1];
        private void checkBox2_CheckedChanged(object sender, EventArgs 
e)
        {
            if (checkBox2.Checked == true)
            {
                ;
            }
            else
            {
                ;
            }

        }
        private void serialPort1_DataReceived(object sender, 
System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            serialPort1.Read(_analog, 0, 1);
        }

        private void progressBar1_Click(object sender, EventArgs e)
        {
            progressBar1 = _analog;
        }

    }
}



aus irgend einem Grund funktioniert die Kommunikation nicht

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das macht irgendwie keinen Spaß zu lesen (Formatierung,
Schreibweise, hartverdrahtete Bitwerte statt sinnvoller Namen...).
Und die Fehlerbeschreibung ist fast eine Beleidigung ("funktioniert
nicht").

Deshalb nur der allgemeine Rat: Grenze doch das Problem ein und
probiere erst mit einem Terminalprogramm etc., ob der MC etwas
sendet und empfängt.
Erst dann lohnt es sich, die Gegenseite anzuschauen.

Evtl. auch mal über volatile nachdenken.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und bitte nicht den gleichen unlesbaren Misthaufen auch noch in mehreren 
Threads aufmachen.
Beitrag "V24 Schnittstelle"

Sind wir hier die Deppen vom Dienst?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Es gibt auch ein Tutorial zu RS232 hier.

Autor: Richi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man braucht für eine Serielleübertragung

Mikrocontrollerseitig:

die Bibliothek #include                      "v24_poll.c"
Variable in Char                             char _analog;
den Befehl um die Baudrate einzustellen      v24_init(9600);
den Befehl um die Variable zu versenden      V24_putc(_analog);

c# seitig:

serialPort1.Open();
serialPort1.Read(_analog, 0, 1);

das müsste doch für die minimale Übertragung reichen ??

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Sind wir hier die Deppen vom Dienst?
Nach seiner letzten Antwort stehts wohl fest =)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael H. schrieb:
> Nach seiner letzten Antwort stehts wohl fest =)

Stimmt, aber was gibt es da zu grinsen?

Autor: Richi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit welchen Recht behauptest Du meine Meinung??

Ich halte keinen hier für einen Deppen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richi schrieb:
> mit welchen Recht behauptest Du meine Meinung??

Ich behaupte nur meine, nicht deine.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Stimmt, aber was gibt es da zu grinsen?
Zu viel ärgern gibt nur Falten. Hm, zu viel Grisen auch...
Ach dann liegts einfach am schönen Wetter.

Und bevor der Richi sich denkt, hier seien nur Trolle unterwegs: Mein 
lieber Mann, wie man in den Wald ruft...
Daher nochmal Netiquette: Klare Beschreibung des Problems
Vor allem die letzten beiden Punkte.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael H. schrieb:
> Und bevor der Richi sich denkt, hier seien nur Trolle unterwegs:

Hm, wenn meinst du jetzt? Hier sind bsiher drei Leute unterwegs:
der TE, Du und ich.
Ihn meinst du offenbar nicht, dich vermutlich auch nicht.
Mist.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richi schrieb:

> das müsste doch für die minimale Übertragung reichen ??

Radio Eriwan: Im Prinzip ja. Wenn verschiedene Kleinigkeiten 
gleichzeitig erfüllt sind. Die da wären...

1. Korrekte Programmierung der µC-seitigen Funktionen v24_init und 
v24_putc.

2. Korrekte Hardware µC-seitig, also im wesentlichen Taktrate, 
Pegelwandler, Buchse, Kabel zum PC.

3. Korrekte Programmierung PC-seitig, also im wesentlichen die 
Vorbelegung der Werte, die von Open benutzt werden. Minimal PortName und 
BaudRate. Statt Read ist bei Länge 1 Readbyte vielleicht logischer. 
Read/Readbyte können nur funktionieren, wenn das Open erfolgreich war. 
Der Rückgabewert von Open sollte also ausgewertet werden.

1. und 2. können und sollten unabhängig von 3. geprüft werden. Denn ohne 
fehlerfreies 1. und 2. kann 3. nicht funktionieren. Wie geprüft werden 
kann, hat Klaus bereits geschrieben.

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> Ihn meinst du offenbar nicht, dich vermutlich auch nicht.
> Mist.
Hehe, eigentlich meinte ich mich schon (auch).

Autor: Pfeiffy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich denke es geht hier mehr um Eitelkeiten, als um die Sache.. sollte 
eigentlich nicht so sein. Für meine erste Schaltung hatte ich 3 Monate 
gebraucht, doch jetzt gehts.
wenn du es garnicht hinbekommst, kann ich die was zusenden: ich habe 
einen analogen Wert (ADC)-Wert vom mc nach PC übertragen, die habe ich 
allerdings mit assembler und Java am PC geschrieben, auf einem Atmega8, 
wenn dir das hilft?

Gruß
Pfeiffy

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richi schrieb:
> Man braucht für eine Serielleübertragung
>
> Mikrocontrollerseitig:
>
> die Bibliothek #include                      "v24_poll.c"
> Variable in Char                             char _analog;
> den Befehl um die Baudrate einzustellen      v24_init(9600);
> den Befehl um die Variable zu versenden      V24_putc(_analog);
>
> c# seitig:
>
> serialPort1.Open();
> serialPort1.Read(_analog, 0, 1);
>
> das müsste doch für die minimale Übertragung reichen ??

Woher soll das jemand wissen außer Dir?
Wir kennen Deine "v24_poll.c" doch nicht.

Tue einfach mal so, als ob alle hier nicht auf Deine Testplatine und 
Deine PC-Festplatte gucken könnten.


Peter

P.S.:
Gibs zu, Du willst doch gar keine Antwort auf Deine Frage. Du willst 
einfach nur wissen, ob bei Dir ein Lauschangriff läuft.
Wenn also jemand ohne Informationen antworten kann, dann ist das der 
Fall.

Autor: Richi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wollte mich für eure Beiträge bedanken !!!

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael H. schrieb:
> wie man in den Wald ruft...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richi schrieb:
> void initv24 (void)
>   {
>
>     //UCSRC = 0b10000110;
>     //UCSRB |= ((1 << TXCIE) | (0 << RXCIE));
>
>   }

Ich grübele schon seit Stunden, wozu diese Funktion gut ist.
Es muß doch einen Grund haben, warum Du meinst, sie uns unbedingt zeigen 
zu müssen.

Oder willst Du einfach nur durch überflüssigen Text das Erkennen des 
Fehlers absichtlich erschweren?


Peter

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Ich grübele schon seit Stunden, wozu diese Funktion gut ist.

Selbst schuld! :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Gibs zu, Du willst doch gar keine Antwort auf Deine Frage. Du willst
> einfach nur wissen, ob bei Dir ein Lauschangriff läuft.
> Wenn also jemand ohne Informationen antworten kann, dann ist das der
> Fall.

Wie die beiden Hellseher, die sich auf der Straße treffen:
"Dir geht's gut, und wie geht's mir?"

Autor: Pfeiffy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh je! nu iss aber gut, ich denke das Problem ist ganz klar definiert, 
die Kommunikation geht nicht, als Anfänger weiss man hier nicht, wo das 
Problem liegt und kann es so auch nicht beschreiben.

Frage: so wie ich das sehe, willst du nicht auf en PC, sondern auf ein 
LCD schreiben?

Autor: Michael H. (michael_h45)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pfeiffy schrieb:
> Oh je! nu iss aber gut, ich denke das Problem ist ganz klar definiert,
Totaler Blödsinn!
Hier ist rein gar nichts klar definiert.
Oder siehst du eine Initialisierung der UART? Siehst du eine 
Hardwarebeschreibung? Siehst du auch nur eine Zeile zum Versuchaufbau?

> die Kommunikation geht nicht, als Anfänger weiss man hier nicht, wo das
Das ist billige und ungleich dumme Ausrede!
Ein denkender Mensch muss dazu in der Lage sein, ein Problem anderen 
verständlich machen zu können.

Wenn ein 5-jähriger hinfällt, muss er der Mama auch sagen können, wo es 
wehtut.

Eine stumpfe "geht nicht"-Zeile ist keine Problembeschreibung.
Hier sind einfach nur Codebatzen ohne nachzudenken hingeworfen worden 
mit folgendem offensichtlichen Gedanken im Hinterkopf: Ich bin zu faul, 
da jetzt wirklich drüber nachzudenken, sollen das mal andre machen.

Autor: Pfeiffy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tut mir leid, ich möchte mich hier nicht über die Sinnhaftigkeit einer 
Aussage unterhalten, 22 Beiträge nur darüber wie jemand eine Frage 
stellt? Ich denke so könnt Ihr hier niemandem helfen, sondern nur 
erschrecken.
Oft weiss man als Anfänger nichtmal die Frage.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pfeiffy schrieb:
> Oft weiss man als Anfänger nichtmal die Frage.

Und genau deshalb gibt es Postingregeln, Netiquette usw., die einen an 
die Hand nehmen, welche wichtigen Informationen man geben sollte.

Es gibt daher nur ein wirkliches Problem für den Anfänger: man muß sie 
lesen.


Wenn ich eine C-Frage stelle, ist es doch wohl selbstverständlich, daß 
ich zuerst den genauen MC-Typ und den Compiler angebe.

Und wenn ich eine nicht-Standard-Lib benutze, gehört die 
selbstverständlich mit als Anhang dazu. Keiner kann schließlich auf 
Deine Festplatte gucken.

Der Leser sollte alle notwendigen Informationen kriegen, damit der 
gepostete Code ohne Fehler und Warnungen compilierbar ist.
Eine große Unsitte ist daher auch, Variablen ohne Typvereinbarung zu 
benutzen.


Peter

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]
  • [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.